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 #ifndef IDBKey_h
27 #define IDBKey_h
28 
29 #if ENABLE(INDEXED_DATABASE)
30 
31 #include "PlatformString.h"
32 #include <wtf/Forward.h>
33 #include <wtf/Threading.h>
34 
35 namespace WebCore {
36 
37 class IDBKey : public ThreadSafeRefCounted<IDBKey> {
38 public:
createNull()39     static PassRefPtr<IDBKey> createNull()
40     {
41         RefPtr<IDBKey> idbKey(new IDBKey());
42         idbKey->m_type = NullType;
43         return idbKey.release();
44     }
45 
createNumber(double number)46     static PassRefPtr<IDBKey> createNumber(double number)
47     {
48         RefPtr<IDBKey> idbKey(new IDBKey());
49         idbKey->m_type = NumberType;
50         idbKey->m_number = number;
51         return idbKey.release();
52     }
53 
createString(const String & string)54     static PassRefPtr<IDBKey> createString(const String& string)
55     {
56         RefPtr<IDBKey> idbKey(new IDBKey());
57         idbKey->m_type = StringType;
58         idbKey->m_string = string;
59         return idbKey.release();
60     }
61 
createDate(double date)62     static PassRefPtr<IDBKey> createDate(double date)
63     {
64         RefPtr<IDBKey> idbKey(new IDBKey());
65         idbKey->m_type = DateType;
66         idbKey->m_date = date;
67         return idbKey.release();
68     }
69 
70     ~IDBKey();
71 
72     // In order of the least to the highest precedent in terms of sort order.
73     enum Type {
74         NullType = 0, // FIXME: Phase out support for null keys.
75         StringType,
76         DateType,
77         NumberType
78     };
79 
type()80     Type type() const { return m_type; }
81 
string()82     const String& string() const
83     {
84         ASSERT(m_type == StringType);
85         return m_string;
86     }
87 
date()88     double date() const
89     {
90         ASSERT(m_type == DateType);
91         return m_date;
92     }
93 
number()94     double number() const
95     {
96         ASSERT(m_type == NumberType);
97         return m_number;
98     }
99 
100     bool isLessThan(const IDBKey* other) const;
101     bool isEqual(const IDBKey* other) const;
102 
103     using ThreadSafeRefCounted<IDBKey>::ref;
104     using ThreadSafeRefCounted<IDBKey>::deref;
105 
106 private:
107     IDBKey();
108 
109     Type m_type;
110     String m_string;
111     double m_date;
112     double m_number;
113 };
114 
115 }
116 
117 #endif // ENABLE(INDEXED_DATABASE)
118 
119 #endif // IDBKey_h
120