6c84e4286747330e7fb4513f249eb52a46e10f1f
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBKeyData.h
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef IDBKeyData_h
27 #define IDBKeyData_h
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "IDBKey.h"
32
33 namespace WebCore {
34
35 class KeyedDecoder;
36 class KeyedEncoder;
37
38 struct IDBKeyData {
39     IDBKeyData()
40         : type(KeyType::Invalid)
41         , numberValue(0)
42         , isNull(true)
43     {
44     }
45
46     WEBCORE_EXPORT IDBKeyData(const IDBKey*);
47
48     static IDBKeyData minimum()
49     {
50         IDBKeyData result;
51         result.type = KeyType::Min;
52         result.isNull = false;
53         return result;
54     }
55
56     static IDBKeyData maximum()
57     {
58         IDBKeyData result;
59         result.type = KeyType::Max;
60         result.isNull = false;
61         return result;
62     }
63
64     WEBCORE_EXPORT PassRefPtr<IDBKey> maybeCreateIDBKey() const;
65
66     IDBKeyData isolatedCopy() const;
67
68     WEBCORE_EXPORT void encode(KeyedEncoder&) const;
69     WEBCORE_EXPORT static bool decode(KeyedDecoder&, IDBKeyData&);
70
71     // compare() has the same semantics as strcmp().
72     //   - Returns negative if this IDBKeyData is less than other.
73     //   - Returns positive if this IDBKeyData is greater than other.
74     //   - Returns zero if this IDBKeyData is equal to other.
75     WEBCORE_EXPORT int compare(const IDBKeyData& other) const;
76
77     void setArrayValue(const Vector<IDBKeyData>&);
78     void setStringValue(const String&);
79     void setDateValue(double);
80     WEBCORE_EXPORT void setNumberValue(double);
81
82     template<class Encoder> void encode(Encoder&) const;
83     template<class Decoder> static bool decode(Decoder&, IDBKeyData&);
84     
85 #ifndef NDEBUG
86     WEBCORE_EXPORT String loggingString() const;
87 #endif
88
89     KeyType type;
90     Vector<IDBKeyData> arrayValue;
91     String stringValue;
92     double numberValue;
93     bool isNull;
94 };
95
96 template<class Encoder>
97 void IDBKeyData::encode(Encoder& encoder) const
98 {
99     encoder << isNull;
100     if (isNull)
101         return;
102
103     encoder.encodeEnum(type);
104
105     switch (type) {
106     case KeyType::Invalid:
107         break;
108     case KeyType::Array:
109         encoder << arrayValue;
110         break;
111     case KeyType::String:
112         encoder << stringValue;
113         break;
114     case KeyType::Date:
115     case KeyType::Number:
116         encoder << numberValue;
117         break;
118     case KeyType::Max:
119     case KeyType::Min:
120         // MaxType and MinType are only used for comparison to other keys.
121         // They should never be encoded/decoded.
122         ASSERT_NOT_REACHED();
123         break;
124     }
125 }
126
127 template<class Decoder>
128 bool IDBKeyData::decode(Decoder& decoder, IDBKeyData& keyData)
129 {
130     if (!decoder.decode(keyData.isNull))
131         return false;
132
133     if (keyData.isNull)
134         return true;
135
136     if (!decoder.decodeEnum(keyData.type))
137         return false;
138
139     switch (keyData.type) {
140     case KeyType::Invalid:
141         break;
142     case KeyType::Array:
143         if (!decoder.decode(keyData.arrayValue))
144             return false;
145         break;
146     case KeyType::String:
147         if (!decoder.decode(keyData.stringValue))
148             return false;
149         break;
150     case KeyType::Date:
151     case KeyType::Number:
152         if (!decoder.decode(keyData.numberValue))
153             return false;
154         break;
155     case KeyType::Max:
156     case KeyType::Min:
157         // MaxType and MinType are only used for comparison to other keys.
158         // They should never be encoded/decoded.
159         ASSERT_NOT_REACHED();
160         decoder.markInvalid();
161         return false;
162     }
163
164     return true;
165 }
166
167 } // namespace WebCore
168
169 #endif // ENABLE(INDEXED_DATABASE)
170 #endif // IDBKeyData_h