Bug 867089 - Validate the playbackRate before using it. r=ehsan
[gecko.git] / storage / src / mozStorageRow.cpp
blobc7d748b738336cdf0851573c8ee7f5ef9eb9a5eb
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 * vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ :
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "nsString.h"
9 #include "sqlite3.h"
10 #include "mozStoragePrivateHelpers.h"
11 #include "Variant.h"
12 #include "mozStorageRow.h"
14 namespace mozilla {
15 namespace storage {
17 ////////////////////////////////////////////////////////////////////////////////
18 //// Row
20 nsresult
21 Row::initialize(sqlite3_stmt *aStatement)
23 // Initialize the hash table
24 mNameHashtable.Init();
26 // Get the number of results
27 mNumCols = ::sqlite3_column_count(aStatement);
29 // Start copying over values
30 for (uint32_t i = 0; i < mNumCols; i++) {
31 // Store the value
32 nsIVariant *variant = nullptr;
33 int type = ::sqlite3_column_type(aStatement, i);
34 switch (type) {
35 case SQLITE_INTEGER:
36 variant = new IntegerVariant(::sqlite3_column_int64(aStatement, i));
37 break;
38 case SQLITE_FLOAT:
39 variant = new FloatVariant(::sqlite3_column_double(aStatement, i));
40 break;
41 case SQLITE_TEXT:
43 nsDependentString str(
44 static_cast<const PRUnichar *>(::sqlite3_column_text16(aStatement, i))
46 variant = new TextVariant(str);
47 break;
49 case SQLITE_NULL:
50 variant = new NullVariant();
51 break;
52 case SQLITE_BLOB:
54 int size = ::sqlite3_column_bytes(aStatement, i);
55 const void *data = ::sqlite3_column_blob(aStatement, i);
56 variant = new BlobVariant(std::pair<const void *, int>(data, size));
57 break;
59 default:
60 return NS_ERROR_UNEXPECTED;
62 NS_ENSURE_TRUE(variant, NS_ERROR_OUT_OF_MEMORY);
64 // Insert into our storage array
65 NS_ENSURE_TRUE(mData.InsertObjectAt(variant, i), NS_ERROR_OUT_OF_MEMORY);
67 // Associate the name (if any) with the index
68 const char *name = ::sqlite3_column_name(aStatement, i);
69 if (!name) break;
70 nsAutoCString colName(name);
71 mNameHashtable.Put(colName, i);
74 return NS_OK;
77 /**
78 * Note: This object is only ever accessed on one thread at a time. It it not
79 * threadsafe, but it does need threadsafe AddRef and Release.
81 NS_IMPL_THREADSAFE_ISUPPORTS2(
82 Row,
83 mozIStorageRow,
84 mozIStorageValueArray
87 ////////////////////////////////////////////////////////////////////////////////
88 //// mozIStorageRow
90 NS_IMETHODIMP
91 Row::GetResultByIndex(uint32_t aIndex,
92 nsIVariant **_result)
94 ENSURE_INDEX_VALUE(aIndex, mNumCols);
95 NS_ADDREF(*_result = mData.ObjectAt(aIndex));
96 return NS_OK;
99 NS_IMETHODIMP
100 Row::GetResultByName(const nsACString &aName,
101 nsIVariant **_result)
103 uint32_t index;
104 NS_ENSURE_TRUE(mNameHashtable.Get(aName, &index), NS_ERROR_NOT_AVAILABLE);
105 return GetResultByIndex(index, _result);
108 ////////////////////////////////////////////////////////////////////////////////
109 //// mozIStorageValueArray
111 NS_IMETHODIMP
112 Row::GetNumEntries(uint32_t *_entries)
114 *_entries = mNumCols;
115 return NS_OK;
118 NS_IMETHODIMP
119 Row::GetTypeOfIndex(uint32_t aIndex,
120 int32_t *_type)
122 ENSURE_INDEX_VALUE(aIndex, mNumCols);
124 uint16_t type;
125 (void)mData.ObjectAt(aIndex)->GetDataType(&type);
126 switch (type) {
127 case nsIDataType::VTYPE_INT32:
128 case nsIDataType::VTYPE_INT64:
129 *_type = mozIStorageValueArray::VALUE_TYPE_INTEGER;
130 break;
131 case nsIDataType::VTYPE_DOUBLE:
132 *_type = mozIStorageValueArray::VALUE_TYPE_FLOAT;
133 break;
134 case nsIDataType::VTYPE_ASTRING:
135 *_type = mozIStorageValueArray::VALUE_TYPE_TEXT;
136 break;
137 case nsIDataType::VTYPE_ARRAY:
138 *_type = mozIStorageValueArray::VALUE_TYPE_BLOB;
139 break;
140 default:
141 *_type = mozIStorageValueArray::VALUE_TYPE_NULL;
142 break;
144 return NS_OK;
147 NS_IMETHODIMP
148 Row::GetInt32(uint32_t aIndex,
149 int32_t *_value)
151 ENSURE_INDEX_VALUE(aIndex, mNumCols);
152 return mData.ObjectAt(aIndex)->GetAsInt32(_value);
155 NS_IMETHODIMP
156 Row::GetInt64(uint32_t aIndex,
157 int64_t *_value)
159 ENSURE_INDEX_VALUE(aIndex, mNumCols);
160 return mData.ObjectAt(aIndex)->GetAsInt64(_value);
163 NS_IMETHODIMP
164 Row::GetDouble(uint32_t aIndex,
165 double *_value)
167 ENSURE_INDEX_VALUE(aIndex, mNumCols);
168 return mData.ObjectAt(aIndex)->GetAsDouble(_value);
171 NS_IMETHODIMP
172 Row::GetUTF8String(uint32_t aIndex,
173 nsACString &_value)
175 ENSURE_INDEX_VALUE(aIndex, mNumCols);
176 return mData.ObjectAt(aIndex)->GetAsAUTF8String(_value);
179 NS_IMETHODIMP
180 Row::GetString(uint32_t aIndex,
181 nsAString &_value)
183 ENSURE_INDEX_VALUE(aIndex, mNumCols);
184 return mData.ObjectAt(aIndex)->GetAsAString(_value);
187 NS_IMETHODIMP
188 Row::GetBlob(uint32_t aIndex,
189 uint32_t *_size,
190 uint8_t **_blob)
192 ENSURE_INDEX_VALUE(aIndex, mNumCols);
194 uint16_t type;
195 nsIID interfaceIID;
196 return mData.ObjectAt(aIndex)->GetAsArray(&type, &interfaceIID, _size,
197 reinterpret_cast<void **>(_blob));
200 NS_IMETHODIMP
201 Row::GetIsNull(uint32_t aIndex,
202 bool *_isNull)
204 ENSURE_INDEX_VALUE(aIndex, mNumCols);
205 NS_ENSURE_ARG_POINTER(_isNull);
207 uint16_t type;
208 (void)mData.ObjectAt(aIndex)->GetDataType(&type);
209 *_isNull = type == nsIDataType::VTYPE_EMPTY;
210 return NS_OK;
213 NS_IMETHODIMP
214 Row::GetSharedUTF8String(uint32_t,
215 uint32_t *,
216 char const **)
218 return NS_ERROR_NOT_IMPLEMENTED;
221 NS_IMETHODIMP
222 Row::GetSharedString(uint32_t,
223 uint32_t *,
224 const PRUnichar **)
226 return NS_ERROR_NOT_IMPLEMENTED;
229 NS_IMETHODIMP
230 Row::GetSharedBlob(uint32_t,
231 uint32_t *,
232 const uint8_t **)
234 return NS_ERROR_NOT_IMPLEMENTED;
237 } // namespace storage
238 } // namespace mozilla