1/*
2 * Copyright (C) 2011 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 "IDBKey.h"
28
29#if ENABLE(INDEXED_DATABASE)
30
31#include "IDBKeyData.h"
32
33namespace WebCore {
34
35IDBKey::~IDBKey()
36{
37}
38
39bool IDBKey::isValid() const
40{
41    if (m_type == InvalidType)
42        return false;
43
44    if (m_type == ArrayType) {
45        for (size_t i = 0; i < m_array.size(); i++) {
46            if (!m_array[i]->isValid())
47                return false;
48        }
49    }
50
51    return true;
52}
53
54int IDBKey::compare(const IDBKey* other) const
55{
56    ASSERT(other);
57    if (m_type != other->m_type)
58        return m_type > other->m_type ? -1 : 1;
59
60    switch (m_type) {
61    case ArrayType:
62        for (size_t i = 0; i < m_array.size() && i < other->m_array.size(); ++i) {
63            if (int result = m_array[i]->compare(other->m_array[i].get()))
64                return result;
65        }
66        if (m_array.size() < other->m_array.size())
67            return -1;
68        if (m_array.size() > other->m_array.size())
69            return 1;
70        return 0;
71    case StringType:
72        return -codePointCompare(other->m_string, m_string);
73    case DateType:
74    case NumberType:
75        return (m_number < other->m_number) ? -1 :
76                (m_number > other-> m_number) ? 1 : 0;
77    case InvalidType:
78    case MinType:
79    case MaxType:
80        ASSERT_NOT_REACHED();
81        return 0;
82    }
83
84    ASSERT_NOT_REACHED();
85    return 0;
86}
87
88bool IDBKey::isLessThan(const IDBKey* other) const
89{
90    ASSERT(other);
91    return compare(other) == -1;
92}
93
94bool IDBKey::isEqual(const IDBKey* other) const
95{
96    if (!other)
97        return false;
98
99    return !compare(other);
100}
101
102#ifndef NDEBUG
103String IDBKey::loggingString() const
104{
105    return IDBKeyData(this).loggingString();
106}
107#endif
108
109} // namespace WebCore
110
111#endif
112