1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/storage/src/mozStorageRow.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,235 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- 1.5 + * vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ : 1.6 + * This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "nsString.h" 1.11 + 1.12 +#include "sqlite3.h" 1.13 +#include "mozStoragePrivateHelpers.h" 1.14 +#include "Variant.h" 1.15 +#include "mozStorageRow.h" 1.16 + 1.17 +namespace mozilla { 1.18 +namespace storage { 1.19 + 1.20 +//////////////////////////////////////////////////////////////////////////////// 1.21 +//// Row 1.22 + 1.23 +nsresult 1.24 +Row::initialize(sqlite3_stmt *aStatement) 1.25 +{ 1.26 + // Get the number of results 1.27 + mNumCols = ::sqlite3_column_count(aStatement); 1.28 + 1.29 + // Start copying over values 1.30 + for (uint32_t i = 0; i < mNumCols; i++) { 1.31 + // Store the value 1.32 + nsIVariant *variant = nullptr; 1.33 + int type = ::sqlite3_column_type(aStatement, i); 1.34 + switch (type) { 1.35 + case SQLITE_INTEGER: 1.36 + variant = new IntegerVariant(::sqlite3_column_int64(aStatement, i)); 1.37 + break; 1.38 + case SQLITE_FLOAT: 1.39 + variant = new FloatVariant(::sqlite3_column_double(aStatement, i)); 1.40 + break; 1.41 + case SQLITE_TEXT: 1.42 + { 1.43 + nsDependentString str( 1.44 + static_cast<const char16_t *>(::sqlite3_column_text16(aStatement, i)) 1.45 + ); 1.46 + variant = new TextVariant(str); 1.47 + break; 1.48 + } 1.49 + case SQLITE_NULL: 1.50 + variant = new NullVariant(); 1.51 + break; 1.52 + case SQLITE_BLOB: 1.53 + { 1.54 + int size = ::sqlite3_column_bytes(aStatement, i); 1.55 + const void *data = ::sqlite3_column_blob(aStatement, i); 1.56 + variant = new BlobVariant(std::pair<const void *, int>(data, size)); 1.57 + break; 1.58 + } 1.59 + default: 1.60 + return NS_ERROR_UNEXPECTED; 1.61 + } 1.62 + NS_ENSURE_TRUE(variant, NS_ERROR_OUT_OF_MEMORY); 1.63 + 1.64 + // Insert into our storage array 1.65 + NS_ENSURE_TRUE(mData.InsertObjectAt(variant, i), NS_ERROR_OUT_OF_MEMORY); 1.66 + 1.67 + // Associate the name (if any) with the index 1.68 + const char *name = ::sqlite3_column_name(aStatement, i); 1.69 + if (!name) break; 1.70 + nsAutoCString colName(name); 1.71 + mNameHashtable.Put(colName, i); 1.72 + } 1.73 + 1.74 + return NS_OK; 1.75 +} 1.76 + 1.77 +/** 1.78 + * Note: This object is only ever accessed on one thread at a time. It it not 1.79 + * threadsafe, but it does need threadsafe AddRef and Release. 1.80 + */ 1.81 +NS_IMPL_ISUPPORTS( 1.82 + Row, 1.83 + mozIStorageRow, 1.84 + mozIStorageValueArray 1.85 +) 1.86 + 1.87 +//////////////////////////////////////////////////////////////////////////////// 1.88 +//// mozIStorageRow 1.89 + 1.90 +NS_IMETHODIMP 1.91 +Row::GetResultByIndex(uint32_t aIndex, 1.92 + nsIVariant **_result) 1.93 +{ 1.94 + ENSURE_INDEX_VALUE(aIndex, mNumCols); 1.95 + NS_ADDREF(*_result = mData.ObjectAt(aIndex)); 1.96 + return NS_OK; 1.97 +} 1.98 + 1.99 +NS_IMETHODIMP 1.100 +Row::GetResultByName(const nsACString &aName, 1.101 + nsIVariant **_result) 1.102 +{ 1.103 + uint32_t index; 1.104 + NS_ENSURE_TRUE(mNameHashtable.Get(aName, &index), NS_ERROR_NOT_AVAILABLE); 1.105 + return GetResultByIndex(index, _result); 1.106 +} 1.107 + 1.108 +//////////////////////////////////////////////////////////////////////////////// 1.109 +//// mozIStorageValueArray 1.110 + 1.111 +NS_IMETHODIMP 1.112 +Row::GetNumEntries(uint32_t *_entries) 1.113 +{ 1.114 + *_entries = mNumCols; 1.115 + return NS_OK; 1.116 +} 1.117 + 1.118 +NS_IMETHODIMP 1.119 +Row::GetTypeOfIndex(uint32_t aIndex, 1.120 + int32_t *_type) 1.121 +{ 1.122 + ENSURE_INDEX_VALUE(aIndex, mNumCols); 1.123 + 1.124 + uint16_t type; 1.125 + (void)mData.ObjectAt(aIndex)->GetDataType(&type); 1.126 + switch (type) { 1.127 + case nsIDataType::VTYPE_INT32: 1.128 + case nsIDataType::VTYPE_INT64: 1.129 + *_type = mozIStorageValueArray::VALUE_TYPE_INTEGER; 1.130 + break; 1.131 + case nsIDataType::VTYPE_DOUBLE: 1.132 + *_type = mozIStorageValueArray::VALUE_TYPE_FLOAT; 1.133 + break; 1.134 + case nsIDataType::VTYPE_ASTRING: 1.135 + *_type = mozIStorageValueArray::VALUE_TYPE_TEXT; 1.136 + break; 1.137 + case nsIDataType::VTYPE_ARRAY: 1.138 + *_type = mozIStorageValueArray::VALUE_TYPE_BLOB; 1.139 + break; 1.140 + default: 1.141 + *_type = mozIStorageValueArray::VALUE_TYPE_NULL; 1.142 + break; 1.143 + } 1.144 + return NS_OK; 1.145 +} 1.146 + 1.147 +NS_IMETHODIMP 1.148 +Row::GetInt32(uint32_t aIndex, 1.149 + int32_t *_value) 1.150 +{ 1.151 + ENSURE_INDEX_VALUE(aIndex, mNumCols); 1.152 + return mData.ObjectAt(aIndex)->GetAsInt32(_value); 1.153 +} 1.154 + 1.155 +NS_IMETHODIMP 1.156 +Row::GetInt64(uint32_t aIndex, 1.157 + int64_t *_value) 1.158 +{ 1.159 + ENSURE_INDEX_VALUE(aIndex, mNumCols); 1.160 + return mData.ObjectAt(aIndex)->GetAsInt64(_value); 1.161 +} 1.162 + 1.163 +NS_IMETHODIMP 1.164 +Row::GetDouble(uint32_t aIndex, 1.165 + double *_value) 1.166 +{ 1.167 + ENSURE_INDEX_VALUE(aIndex, mNumCols); 1.168 + return mData.ObjectAt(aIndex)->GetAsDouble(_value); 1.169 +} 1.170 + 1.171 +NS_IMETHODIMP 1.172 +Row::GetUTF8String(uint32_t aIndex, 1.173 + nsACString &_value) 1.174 +{ 1.175 + ENSURE_INDEX_VALUE(aIndex, mNumCols); 1.176 + return mData.ObjectAt(aIndex)->GetAsAUTF8String(_value); 1.177 +} 1.178 + 1.179 +NS_IMETHODIMP 1.180 +Row::GetString(uint32_t aIndex, 1.181 + nsAString &_value) 1.182 +{ 1.183 + ENSURE_INDEX_VALUE(aIndex, mNumCols); 1.184 + return mData.ObjectAt(aIndex)->GetAsAString(_value); 1.185 +} 1.186 + 1.187 +NS_IMETHODIMP 1.188 +Row::GetBlob(uint32_t aIndex, 1.189 + uint32_t *_size, 1.190 + uint8_t **_blob) 1.191 +{ 1.192 + ENSURE_INDEX_VALUE(aIndex, mNumCols); 1.193 + 1.194 + uint16_t type; 1.195 + nsIID interfaceIID; 1.196 + return mData.ObjectAt(aIndex)->GetAsArray(&type, &interfaceIID, _size, 1.197 + reinterpret_cast<void **>(_blob)); 1.198 +} 1.199 + 1.200 +NS_IMETHODIMP 1.201 +Row::GetIsNull(uint32_t aIndex, 1.202 + bool *_isNull) 1.203 +{ 1.204 + ENSURE_INDEX_VALUE(aIndex, mNumCols); 1.205 + NS_ENSURE_ARG_POINTER(_isNull); 1.206 + 1.207 + uint16_t type; 1.208 + (void)mData.ObjectAt(aIndex)->GetDataType(&type); 1.209 + *_isNull = type == nsIDataType::VTYPE_EMPTY; 1.210 + return NS_OK; 1.211 +} 1.212 + 1.213 +NS_IMETHODIMP 1.214 +Row::GetSharedUTF8String(uint32_t, 1.215 + uint32_t *, 1.216 + char const **) 1.217 +{ 1.218 + return NS_ERROR_NOT_IMPLEMENTED; 1.219 +} 1.220 + 1.221 +NS_IMETHODIMP 1.222 +Row::GetSharedString(uint32_t, 1.223 + uint32_t *, 1.224 + const char16_t **) 1.225 +{ 1.226 + return NS_ERROR_NOT_IMPLEMENTED; 1.227 +} 1.228 + 1.229 +NS_IMETHODIMP 1.230 +Row::GetSharedBlob(uint32_t, 1.231 + uint32_t *, 1.232 + const uint8_t **) 1.233 +{ 1.234 + return NS_ERROR_NOT_IMPLEMENTED; 1.235 +} 1.236 + 1.237 +} // namespace storage 1.238 +} // namespace mozilla