8b5d48b4d3b7f9a0ec1ed8a9bd3bd441f78d5ae3
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBKeyRange.cpp
1 /*
2  * Copyright (C) 2010 Google 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "IDBKeyRange.h"
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "IDBBindingUtilities.h"
32 #include "IDBDatabaseException.h"
33 #include "IDBKey.h"
34 #include "IDBKeyData.h"
35 #include "ScriptExecutionContext.h"
36 #include <runtime/JSCJSValue.h>
37
38 using namespace JSC;
39
40 namespace WebCore {
41
42 Ref<IDBKeyRange> IDBKeyRange::create(RefPtr<IDBKey>&& lower, RefPtr<IDBKey>&& upper, bool isLowerOpen, bool isUpperOpen)
43 {
44     return adoptRef(*new IDBKeyRange(WTFMove(lower), WTFMove(upper), isLowerOpen, isUpperOpen));
45 }
46
47 Ref<IDBKeyRange> IDBKeyRange::create(RefPtr<IDBKey>&& key)
48 {
49     auto upper = key;
50     return create(WTFMove(key), WTFMove(upper), false, false);
51 }
52
53 IDBKeyRange::IDBKeyRange(RefPtr<IDBKey>&& lower, RefPtr<IDBKey>&& upper, bool isLowerOpen, bool isUpperOpen)
54     : m_lower(WTFMove(lower))
55     , m_upper(WTFMove(upper))
56     , m_isLowerOpen(isLowerOpen)
57     , m_isUpperOpen(isUpperOpen)
58 {
59 }
60
61 IDBKeyRange::~IDBKeyRange()
62 {
63 }
64
65 RefPtr<IDBKeyRange> IDBKeyRange::only(RefPtr<IDBKey>&& key, ExceptionCode& ec)
66 {
67     if (!key || !key->isValid()) {
68         ec = IDBDatabaseException::DataError;
69         return nullptr;
70     }
71
72     return create(WTFMove(key));
73 }
74
75 RefPtr<IDBKeyRange> IDBKeyRange::only(ExecState& state, JSValue keyValue, ExceptionCode& ec)
76 {
77     return only(scriptValueToIDBKey(state, keyValue), ec);
78 }
79
80 RefPtr<IDBKeyRange> IDBKeyRange::only(ScriptExecutionContext& context, JSValue keyValue, ExceptionCode& ec)
81 {
82     auto exec = context.execState();
83     if (!exec)
84         return nullptr;
85
86     return only(scriptValueToIDBKey(*exec, keyValue), ec);
87 }
88
89 RefPtr<IDBKeyRange> IDBKeyRange::lowerBound(ExecState& state, JSValue boundValue, bool open, ExceptionCode& ec)
90 {
91     auto bound = scriptValueToIDBKey(state, boundValue);
92     if (!bound->isValid()) {
93         ec = IDBDatabaseException::DataError;
94         return nullptr;
95     }
96
97     return create(WTFMove(bound), nullptr, open, true);
98 }
99
100 RefPtr<IDBKeyRange> IDBKeyRange::upperBound(ExecState& state, JSValue boundValue, bool open, ExceptionCode& ec)
101 {
102     auto bound = scriptValueToIDBKey(state, boundValue);
103     if (!bound->isValid()) {
104         ec = IDBDatabaseException::DataError;
105         return nullptr;
106     }
107
108     return create(nullptr, WTFMove(bound), true, open);
109 }
110
111 RefPtr<IDBKeyRange> IDBKeyRange::bound(ExecState& state, JSValue lowerValue, JSValue upperValue, bool lowerOpen, bool upperOpen, ExceptionCode& ec)
112 {
113     auto lower = scriptValueToIDBKey(state, lowerValue);
114     auto upper = scriptValueToIDBKey(state, upperValue);
115
116     if (!lower->isValid() || !upper->isValid()) {
117         ec = IDBDatabaseException::DataError;
118         return nullptr;
119     }
120     if (upper->isLessThan(lower.get())) {
121         ec = IDBDatabaseException::DataError;
122         return nullptr;
123     }
124     if (upper->isEqual(lower.get()) && (lowerOpen || upperOpen)) {
125         ec = IDBDatabaseException::DataError;
126         return nullptr;
127     }
128
129     return create(WTFMove(lower), WTFMove(upper), lowerOpen, upperOpen);
130 }
131
132 bool IDBKeyRange::isOnlyKey() const
133 {
134     return m_lower && m_upper && !m_isLowerOpen && !m_isUpperOpen && m_lower->isEqual(*m_upper);
135 }
136
137 } // namespace WebCore
138
139 #endif // ENABLE(INDEXED_DATABASE)