1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/indexed_db/indexed_db_key_builders.h"
6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <algorithm>
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string>
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <vector>
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/logging.h"
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebVector.h"
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKey;
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyRange;
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeArray;
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeBinary;
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeDate;
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeInvalid;
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeMin;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeNull;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeNumber;
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKeyTypeString;
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector;
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString;
26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic content::IndexedDBKey::KeyArray CopyKeyArray(const WebIDBKey& other) {
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  content::IndexedDBKey::KeyArray result;
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (other.keyType() == WebIDBKeyTypeArray) {
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const WebVector<WebIDBKey>& array = other.array();
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    for (size_t i = 0; i < array.size(); ++i)
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      result.push_back(content::IndexedDBKeyBuilder::Build(array[i]));
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return result;
35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)static std::vector<base::string16> CopyArray(
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const WebVector<WebString>& array) {
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> copy(array.size());
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (size_t i = 0; i < array.size(); ++i)
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    copy[i] = array[i];
42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return copy;
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content {
47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IndexedDBKey IndexedDBKeyBuilder::Build(const blink::WebIDBKey& key) {
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  switch (key.keyType()) {
50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeArray:
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return IndexedDBKey(CopyKeyArray(key));
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case WebIDBKeyTypeBinary:
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return IndexedDBKey(
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          std::string(key.binary().data(), key.binary().size()));
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeString:
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return IndexedDBKey(key.string());
57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeDate:
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return IndexedDBKey(key.date(), WebIDBKeyTypeDate);
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeNumber:
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return IndexedDBKey(key.number(), WebIDBKeyTypeNumber);
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeNull:
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeInvalid:
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return IndexedDBKey(key.keyType());
64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeMin:
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    default:
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      NOTREACHED();
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return IndexedDBKey();
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochWebIDBKey WebIDBKeyBuilder::Build(const IndexedDBKey& key) {
72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  switch (key.type()) {
73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeArray: {
74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const IndexedDBKey::KeyArray& array = key.array();
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebVector<WebIDBKey> web_array(array.size());
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      for (size_t i = 0; i < array.size(); ++i) {
77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        web_array[i] = Build(array[i]);
78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      }
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return WebIDBKey::createArray(web_array);
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case WebIDBKeyTypeBinary:
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return WebIDBKey::createBinary(key.binary());
83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeString:
84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return WebIDBKey::createString(key.string());
85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeDate:
86ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return WebIDBKey::createDate(key.date());
87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeNumber:
88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return WebIDBKey::createNumber(key.number());
89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeInvalid:
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return WebIDBKey::createInvalid();
91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeNull:
92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return WebIDBKey::createNull();
93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case WebIDBKeyTypeMin:
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    default:
95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      NOTREACHED();
96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return WebIDBKey::createInvalid();
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIndexedDBKeyRange IndexedDBKeyRangeBuilder::Build(
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const WebIDBKeyRange& key_range) {
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return IndexedDBKeyRange(
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    IndexedDBKeyBuilder::Build(key_range.lower()),
104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    IndexedDBKeyBuilder::Build(key_range.upper()),
105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    key_range.lowerOpen(),
106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    key_range.upperOpen());
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochIndexedDBKeyPath IndexedDBKeyPathBuilder::Build(
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebIDBKeyPath& key_path) {
111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  switch (key_path.keyPathType()) {
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebIDBKeyPathTypeString:
113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return IndexedDBKeyPath(key_path.string());
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebIDBKeyPathTypeArray:
115ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return IndexedDBKeyPath(CopyArray(key_path.array()));
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebIDBKeyPathTypeNull:
117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return IndexedDBKeyPath();
11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    default:
11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      NOTREACHED();
12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return IndexedDBKeyPath();
121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
122ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebIDBKeyPath WebIDBKeyPathBuilder::Build(
125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const IndexedDBKeyPath& key_path) {
126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  switch (key_path.type()) {
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebIDBKeyPathTypeString:
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebIDBKeyPath::create(WebString(key_path.string()));
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebIDBKeyPathTypeArray:
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebIDBKeyPath::create(CopyArray(key_path.array()));
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case blink::WebIDBKeyPathTypeNull:
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return blink::WebIDBKeyPath::createNull();
13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    default:
13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      NOTREACHED();
13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return blink::WebIDBKeyPath::createNull();
136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace content
140