1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/storage/src/mozStorageArgValueArray.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,203 @@ 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 "nsError.h" 1.11 +#include "nsMemory.h" 1.12 +#include "nsString.h" 1.13 + 1.14 +#include "mozStoragePrivateHelpers.h" 1.15 +#include "mozStorageArgValueArray.h" 1.16 + 1.17 +namespace mozilla { 1.18 +namespace storage { 1.19 + 1.20 +//////////////////////////////////////////////////////////////////////////////// 1.21 +//// ArgValueArray 1.22 + 1.23 +ArgValueArray::ArgValueArray(int32_t aArgc, 1.24 + sqlite3_value **aArgv) 1.25 +: mArgc(aArgc) 1.26 +, mArgv(aArgv) 1.27 +{ 1.28 +} 1.29 + 1.30 +NS_IMPL_ISUPPORTS( 1.31 + ArgValueArray, 1.32 + mozIStorageValueArray 1.33 +) 1.34 + 1.35 +//////////////////////////////////////////////////////////////////////////////// 1.36 +//// mozIStorageValueArray 1.37 + 1.38 +NS_IMETHODIMP 1.39 +ArgValueArray::GetNumEntries(uint32_t *_size) 1.40 +{ 1.41 + *_size = mArgc; 1.42 + return NS_OK; 1.43 +} 1.44 + 1.45 +NS_IMETHODIMP 1.46 +ArgValueArray::GetTypeOfIndex(uint32_t aIndex, 1.47 + int32_t *_type) 1.48 +{ 1.49 + ENSURE_INDEX_VALUE(aIndex, mArgc); 1.50 + 1.51 + int t = ::sqlite3_value_type(mArgv[aIndex]); 1.52 + switch (t) { 1.53 + case SQLITE_INTEGER: 1.54 + *_type = VALUE_TYPE_INTEGER; 1.55 + break; 1.56 + case SQLITE_FLOAT: 1.57 + *_type = VALUE_TYPE_FLOAT; 1.58 + break; 1.59 + case SQLITE_TEXT: 1.60 + *_type = VALUE_TYPE_TEXT; 1.61 + break; 1.62 + case SQLITE_BLOB: 1.63 + *_type = VALUE_TYPE_BLOB; 1.64 + break; 1.65 + case SQLITE_NULL: 1.66 + *_type = VALUE_TYPE_NULL; 1.67 + break; 1.68 + default: 1.69 + return NS_ERROR_FAILURE; 1.70 + } 1.71 + 1.72 + return NS_OK; 1.73 +} 1.74 + 1.75 +NS_IMETHODIMP 1.76 +ArgValueArray::GetInt32(uint32_t aIndex, 1.77 + int32_t *_value) 1.78 +{ 1.79 + ENSURE_INDEX_VALUE(aIndex, mArgc); 1.80 + 1.81 + *_value = ::sqlite3_value_int(mArgv[aIndex]); 1.82 + return NS_OK; 1.83 +} 1.84 + 1.85 +NS_IMETHODIMP 1.86 +ArgValueArray::GetInt64(uint32_t aIndex, 1.87 + int64_t *_value) 1.88 +{ 1.89 + ENSURE_INDEX_VALUE(aIndex, mArgc); 1.90 + 1.91 + *_value = ::sqlite3_value_int64(mArgv[aIndex]); 1.92 + return NS_OK; 1.93 +} 1.94 + 1.95 +NS_IMETHODIMP 1.96 +ArgValueArray::GetDouble(uint32_t aIndex, 1.97 + double *_value) 1.98 +{ 1.99 + ENSURE_INDEX_VALUE(aIndex, mArgc); 1.100 + 1.101 + *_value = ::sqlite3_value_double(mArgv[aIndex]); 1.102 + return NS_OK; 1.103 +} 1.104 + 1.105 +NS_IMETHODIMP 1.106 +ArgValueArray::GetUTF8String(uint32_t aIndex, 1.107 + nsACString &_value) 1.108 +{ 1.109 + ENSURE_INDEX_VALUE(aIndex, mArgc); 1.110 + 1.111 + if (::sqlite3_value_type(mArgv[aIndex]) == SQLITE_NULL) { 1.112 + // NULL columns should have IsVoid set to distinguish them from an empty 1.113 + // string. 1.114 + _value.Truncate(0); 1.115 + _value.SetIsVoid(true); 1.116 + } 1.117 + else { 1.118 + _value.Assign(reinterpret_cast<const char *>(::sqlite3_value_text(mArgv[aIndex])), 1.119 + ::sqlite3_value_bytes(mArgv[aIndex])); 1.120 + } 1.121 + return NS_OK; 1.122 +} 1.123 + 1.124 +NS_IMETHODIMP 1.125 +ArgValueArray::GetString(uint32_t aIndex, 1.126 + nsAString &_value) 1.127 +{ 1.128 + ENSURE_INDEX_VALUE(aIndex, mArgc); 1.129 + 1.130 + if (::sqlite3_value_type(mArgv[aIndex]) == SQLITE_NULL) { 1.131 + // NULL columns should have IsVoid set to distinguish them from an empty 1.132 + // string. 1.133 + _value.Truncate(0); 1.134 + _value.SetIsVoid(true); 1.135 + } else { 1.136 + _value.Assign(static_cast<const char16_t *>(::sqlite3_value_text16(mArgv[aIndex])), 1.137 + ::sqlite3_value_bytes16(mArgv[aIndex]) / 2); 1.138 + } 1.139 + return NS_OK; 1.140 +} 1.141 + 1.142 +NS_IMETHODIMP 1.143 +ArgValueArray::GetBlob(uint32_t aIndex, 1.144 + uint32_t *_size, 1.145 + uint8_t **_blob) 1.146 +{ 1.147 + ENSURE_INDEX_VALUE(aIndex, mArgc); 1.148 + 1.149 + int size = ::sqlite3_value_bytes(mArgv[aIndex]); 1.150 + void *blob = nsMemory::Clone(::sqlite3_value_blob(mArgv[aIndex]), size); 1.151 + NS_ENSURE_TRUE(blob, NS_ERROR_OUT_OF_MEMORY); 1.152 + 1.153 + *_blob = static_cast<uint8_t *>(blob); 1.154 + *_size = size; 1.155 + return NS_OK; 1.156 +} 1.157 + 1.158 +NS_IMETHODIMP 1.159 +ArgValueArray::GetIsNull(uint32_t aIndex, 1.160 + bool *_isNull) 1.161 +{ 1.162 + // GetTypeOfIndex will check aIndex for us, so we don't have to. 1.163 + int32_t type; 1.164 + nsresult rv = GetTypeOfIndex(aIndex, &type); 1.165 + NS_ENSURE_SUCCESS(rv, rv); 1.166 + 1.167 + *_isNull = (type == VALUE_TYPE_NULL); 1.168 + return NS_OK; 1.169 +} 1.170 + 1.171 +NS_IMETHODIMP 1.172 +ArgValueArray::GetSharedUTF8String(uint32_t aIndex, 1.173 + uint32_t *_length, 1.174 + const char **_string) 1.175 +{ 1.176 + if (_length) 1.177 + *_length = ::sqlite3_value_bytes(mArgv[aIndex]); 1.178 + 1.179 + *_string = reinterpret_cast<const char *>(::sqlite3_value_text(mArgv[aIndex])); 1.180 + return NS_OK; 1.181 +} 1.182 + 1.183 +NS_IMETHODIMP 1.184 +ArgValueArray::GetSharedString(uint32_t aIndex, 1.185 + uint32_t *_length, 1.186 + const char16_t **_string) 1.187 +{ 1.188 + if (_length) 1.189 + *_length = ::sqlite3_value_bytes(mArgv[aIndex]); 1.190 + 1.191 + *_string = static_cast<const char16_t *>(::sqlite3_value_text16(mArgv[aIndex])); 1.192 + return NS_OK; 1.193 +} 1.194 + 1.195 +NS_IMETHODIMP 1.196 +ArgValueArray::GetSharedBlob(uint32_t aIndex, 1.197 + uint32_t *_size, 1.198 + const uint8_t **_blob) 1.199 +{ 1.200 + *_size = ::sqlite3_value_bytes(mArgv[aIndex]); 1.201 + *_blob = static_cast<const uint8_t *>(::sqlite3_value_blob(mArgv[aIndex])); 1.202 + return NS_OK; 1.203 +} 1.204 + 1.205 +} // namespace storage 1.206 +} // namespace mozilla