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/. */
10 #include "mozStoragePrivateHelpers.h"
12 #include "mozStorageRow.h"
17 ////////////////////////////////////////////////////////////////////////////////
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
++) {
32 nsIVariant
*variant
= nullptr;
33 int type
= ::sqlite3_column_type(aStatement
, i
);
36 variant
= new IntegerVariant(::sqlite3_column_int64(aStatement
, i
));
39 variant
= new FloatVariant(::sqlite3_column_double(aStatement
, i
));
43 nsDependentString
str(
44 static_cast<const PRUnichar
*>(::sqlite3_column_text16(aStatement
, i
))
46 variant
= new TextVariant(str
);
50 variant
= new NullVariant();
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
));
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
);
70 nsAutoCString
colName(name
);
71 mNameHashtable
.Put(colName
, i
);
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(
87 ////////////////////////////////////////////////////////////////////////////////
91 Row::GetResultByIndex(uint32_t aIndex
,
94 ENSURE_INDEX_VALUE(aIndex
, mNumCols
);
95 NS_ADDREF(*_result
= mData
.ObjectAt(aIndex
));
100 Row::GetResultByName(const nsACString
&aName
,
101 nsIVariant
**_result
)
104 NS_ENSURE_TRUE(mNameHashtable
.Get(aName
, &index
), NS_ERROR_NOT_AVAILABLE
);
105 return GetResultByIndex(index
, _result
);
108 ////////////////////////////////////////////////////////////////////////////////
109 //// mozIStorageValueArray
112 Row::GetNumEntries(uint32_t *_entries
)
114 *_entries
= mNumCols
;
119 Row::GetTypeOfIndex(uint32_t aIndex
,
122 ENSURE_INDEX_VALUE(aIndex
, mNumCols
);
125 (void)mData
.ObjectAt(aIndex
)->GetDataType(&type
);
127 case nsIDataType::VTYPE_INT32
:
128 case nsIDataType::VTYPE_INT64
:
129 *_type
= mozIStorageValueArray::VALUE_TYPE_INTEGER
;
131 case nsIDataType::VTYPE_DOUBLE
:
132 *_type
= mozIStorageValueArray::VALUE_TYPE_FLOAT
;
134 case nsIDataType::VTYPE_ASTRING
:
135 *_type
= mozIStorageValueArray::VALUE_TYPE_TEXT
;
137 case nsIDataType::VTYPE_ARRAY
:
138 *_type
= mozIStorageValueArray::VALUE_TYPE_BLOB
;
141 *_type
= mozIStorageValueArray::VALUE_TYPE_NULL
;
148 Row::GetInt32(uint32_t aIndex
,
151 ENSURE_INDEX_VALUE(aIndex
, mNumCols
);
152 return mData
.ObjectAt(aIndex
)->GetAsInt32(_value
);
156 Row::GetInt64(uint32_t aIndex
,
159 ENSURE_INDEX_VALUE(aIndex
, mNumCols
);
160 return mData
.ObjectAt(aIndex
)->GetAsInt64(_value
);
164 Row::GetDouble(uint32_t aIndex
,
167 ENSURE_INDEX_VALUE(aIndex
, mNumCols
);
168 return mData
.ObjectAt(aIndex
)->GetAsDouble(_value
);
172 Row::GetUTF8String(uint32_t aIndex
,
175 ENSURE_INDEX_VALUE(aIndex
, mNumCols
);
176 return mData
.ObjectAt(aIndex
)->GetAsAUTF8String(_value
);
180 Row::GetString(uint32_t aIndex
,
183 ENSURE_INDEX_VALUE(aIndex
, mNumCols
);
184 return mData
.ObjectAt(aIndex
)->GetAsAString(_value
);
188 Row::GetBlob(uint32_t aIndex
,
192 ENSURE_INDEX_VALUE(aIndex
, mNumCols
);
196 return mData
.ObjectAt(aIndex
)->GetAsArray(&type
, &interfaceIID
, _size
,
197 reinterpret_cast<void **>(_blob
));
201 Row::GetIsNull(uint32_t aIndex
,
204 ENSURE_INDEX_VALUE(aIndex
, mNumCols
);
205 NS_ENSURE_ARG_POINTER(_isNull
);
208 (void)mData
.ObjectAt(aIndex
)->GetDataType(&type
);
209 *_isNull
= type
== nsIDataType::VTYPE_EMPTY
;
214 Row::GetSharedUTF8String(uint32_t,
218 return NS_ERROR_NOT_IMPLEMENTED
;
222 Row::GetSharedString(uint32_t,
226 return NS_ERROR_NOT_IMPLEMENTED
;
230 Row::GetSharedBlob(uint32_t,
234 return NS_ERROR_NOT_IMPLEMENTED
;
237 } // namespace storage
238 } // namespace mozilla