1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/common/indexed_db/indexed_db_key.h"
8 #include "base/logging.h"
12 using blink::WebIDBKey
;
13 using blink::WebIDBKeyType
;
14 using blink::WebIDBKeyTypeArray
;
15 using blink::WebIDBKeyTypeBinary
;
16 using blink::WebIDBKeyTypeDate
;
17 using blink::WebIDBKeyTypeInvalid
;
18 using blink::WebIDBKeyTypeMin
;
19 using blink::WebIDBKeyTypeNull
;
20 using blink::WebIDBKeyTypeNumber
;
21 using blink::WebIDBKeyTypeString
;
25 // Very rough estimate of minimum key size overhead.
26 const size_t kOverheadSize
= 16;
28 static size_t CalculateArraySize(const IndexedDBKey::KeyArray
& keys
) {
30 for (size_t i
= 0; i
< keys
.size(); ++i
)
31 size
+= keys
[i
].size_estimate();
36 int Compare(const T
& a
, const T
& b
) {
37 // Using '<' for both comparisons here is as generic as possible (for e.g.
38 // objects which only define operator<() and not operator>() or operator==())
39 // and also allows e.g. floating point NaNs to compare equal.
42 return (b
< a
) ? 1 : 0;
46 static IndexedDBKey::KeyArray
CopyKeyArray(const T
& array
) {
47 IndexedDBKey::KeyArray result
;
48 result
.reserve(array
.size());
49 for (size_t i
= 0; i
< array
.size(); ++i
) {
50 result
.push_back(IndexedDBKey(array
[i
]));
57 IndexedDBKey::IndexedDBKey()
58 : type_(WebIDBKeyTypeNull
),
61 size_estimate_(kOverheadSize
) {}
63 IndexedDBKey::IndexedDBKey(WebIDBKeyType type
)
64 : type_(type
), date_(0), number_(0), size_estimate_(kOverheadSize
) {
65 DCHECK(type
== WebIDBKeyTypeNull
|| type
== WebIDBKeyTypeInvalid
);
68 IndexedDBKey::IndexedDBKey(double number
, WebIDBKeyType type
)
72 size_estimate_(kOverheadSize
+ sizeof(number
)) {
73 DCHECK(type
== WebIDBKeyTypeNumber
|| type
== WebIDBKeyTypeDate
);
76 IndexedDBKey::IndexedDBKey(const KeyArray
& array
)
77 : type_(WebIDBKeyTypeArray
),
78 array_(CopyKeyArray(array
)),
81 size_estimate_(kOverheadSize
+ CalculateArraySize(array
)) {}
83 IndexedDBKey::IndexedDBKey(const std::string
& binary
)
84 : type_(WebIDBKeyTypeBinary
),
86 size_estimate_(kOverheadSize
+
87 (binary
.length() * sizeof(std::string::value_type
))) {}
89 IndexedDBKey::IndexedDBKey(const base::string16
& string
)
90 : type_(WebIDBKeyTypeString
),
92 size_estimate_(kOverheadSize
+
93 (string
.length() * sizeof(base::string16::value_type
))) {}
95 IndexedDBKey::IndexedDBKey(const IndexedDBKey
& other
) = default;
96 IndexedDBKey::~IndexedDBKey() = default;
97 IndexedDBKey
& IndexedDBKey::operator=(const IndexedDBKey
& other
) = default;
99 bool IndexedDBKey::IsValid() const {
100 if (type_
== WebIDBKeyTypeInvalid
|| type_
== WebIDBKeyTypeNull
)
103 if (type_
== WebIDBKeyTypeArray
) {
104 for (size_t i
= 0; i
< array_
.size(); i
++) {
105 if (!array_
[i
].IsValid())
113 bool IndexedDBKey::IsLessThan(const IndexedDBKey
& other
) const {
114 return CompareTo(other
) < 0;
117 bool IndexedDBKey::Equals(const IndexedDBKey
& other
) const {
118 return !CompareTo(other
);
121 int IndexedDBKey::CompareTo(const IndexedDBKey
& other
) const {
123 DCHECK(other
.IsValid());
124 if (type_
!= other
.type_
)
125 return type_
> other
.type_
? -1 : 1;
128 case WebIDBKeyTypeArray
:
129 for (size_t i
= 0; i
< array_
.size() && i
< other
.array_
.size(); ++i
) {
130 int result
= array_
[i
].CompareTo(other
.array_
[i
]);
134 return Compare(array_
.size(), other
.array_
.size());
135 case WebIDBKeyTypeBinary
:
136 return binary_
.compare(other
.binary_
);
137 case WebIDBKeyTypeString
:
138 return string_
.compare(other
.string_
);
139 case WebIDBKeyTypeDate
:
140 return Compare(date_
, other
.date_
);
141 case WebIDBKeyTypeNumber
:
142 return Compare(number_
, other
.number_
);
143 case WebIDBKeyTypeInvalid
:
144 case WebIDBKeyTypeNull
:
145 case WebIDBKeyTypeMin
:
152 } // namespace content