tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

mozStorageRow.cpp (5990B)


      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/. */
      6 
      7 #include "mozStorageRow.h"
      8 
      9 #include "nsString.h"
     10 
     11 #include "sqlite3.h"
     12 #include "mozStoragePrivateHelpers.h"
     13 #include "Variant.h"
     14 
     15 namespace mozilla {
     16 namespace storage {
     17 
     18 ////////////////////////////////////////////////////////////////////////////////
     19 //// Row
     20 
     21 nsresult Row::initialize(sqlite3_stmt* aStatement) {
     22  // Get the number of results
     23  mNumCols = ::sqlite3_column_count(aStatement);
     24 
     25  // Start copying over values
     26  for (uint32_t i = 0; i < mNumCols; i++) {
     27    // Store the value
     28    nsIVariant* variant = nullptr;
     29    int type = ::sqlite3_column_type(aStatement, i);
     30    switch (type) {
     31      case SQLITE_INTEGER:
     32        variant = new IntegerVariant(::sqlite3_column_int64(aStatement, i));
     33        break;
     34      case SQLITE_FLOAT:
     35        variant = new FloatVariant(::sqlite3_column_double(aStatement, i));
     36        break;
     37      case SQLITE_TEXT: {
     38        const char16_t* value = static_cast<const char16_t*>(
     39            ::sqlite3_column_text16(aStatement, i));
     40        nsDependentString str(
     41            value, ::sqlite3_column_bytes16(aStatement, i) / sizeof(char16_t));
     42        variant = new TextVariant(str);
     43        break;
     44      }
     45      case SQLITE_NULL:
     46        variant = new NullVariant();
     47        break;
     48      case SQLITE_BLOB: {
     49        const void* data = ::sqlite3_column_blob(aStatement, i);
     50        int size = ::sqlite3_column_bytes(aStatement, i);
     51        variant = new BlobVariant(std::pair<const void*, int>(data, size));
     52        break;
     53      }
     54      default:
     55        return NS_ERROR_UNEXPECTED;
     56    }
     57    NS_ENSURE_TRUE(variant, NS_ERROR_OUT_OF_MEMORY);
     58 
     59    // Insert into our storage array
     60    NS_ENSURE_TRUE(mData.InsertObjectAt(variant, i), NS_ERROR_OUT_OF_MEMORY);
     61 
     62    // Associate the name (if any) with the index
     63    const char* name = ::sqlite3_column_name(aStatement, i);
     64    if (!name) break;
     65    nsAutoCString colName(name);
     66    mNameHashtable.InsertOrUpdate(colName, i);
     67  }
     68 
     69  return NS_OK;
     70 }
     71 
     72 /**
     73 * Note:  This object is only ever accessed on one thread at a time.  It it not
     74 *        threadsafe, but it does need threadsafe AddRef and Release.
     75 */
     76 NS_IMPL_ISUPPORTS(Row, mozIStorageRow, mozIStorageValueArray)
     77 
     78 ////////////////////////////////////////////////////////////////////////////////
     79 //// mozIStorageRow
     80 
     81 NS_IMETHODIMP
     82 Row::GetResultByIndex(uint32_t aIndex, nsIVariant** _result) {
     83  ENSURE_INDEX_VALUE(aIndex, mNumCols);
     84  NS_ADDREF(*_result = mData.ObjectAt(aIndex));
     85  return NS_OK;
     86 }
     87 
     88 NS_IMETHODIMP
     89 Row::GetResultByName(const nsACString& aName, nsIVariant** _result) {
     90  uint32_t index;
     91  NS_ENSURE_TRUE(mNameHashtable.Get(aName, &index), NS_ERROR_NOT_AVAILABLE);
     92  return GetResultByIndex(index, _result);
     93 }
     94 
     95 ////////////////////////////////////////////////////////////////////////////////
     96 //// mozIStorageValueArray
     97 
     98 NS_IMETHODIMP
     99 Row::GetNumEntries(uint32_t* _entries) {
    100  *_entries = mNumCols;
    101  return NS_OK;
    102 }
    103 
    104 NS_IMETHODIMP
    105 Row::GetTypeOfIndex(uint32_t aIndex, int32_t* _type) {
    106  ENSURE_INDEX_VALUE(aIndex, mNumCols);
    107 
    108  uint16_t type = mData.ObjectAt(aIndex)->GetDataType();
    109  switch (type) {
    110    case nsIDataType::VTYPE_INT32:
    111    case nsIDataType::VTYPE_INT64:
    112      *_type = mozIStorageValueArray::VALUE_TYPE_INTEGER;
    113      break;
    114    case nsIDataType::VTYPE_DOUBLE:
    115      *_type = mozIStorageValueArray::VALUE_TYPE_FLOAT;
    116      break;
    117    case nsIDataType::VTYPE_ASTRING:
    118      *_type = mozIStorageValueArray::VALUE_TYPE_TEXT;
    119      break;
    120    case nsIDataType::VTYPE_ARRAY:
    121      *_type = mozIStorageValueArray::VALUE_TYPE_BLOB;
    122      break;
    123    default:
    124      *_type = mozIStorageValueArray::VALUE_TYPE_NULL;
    125      break;
    126  }
    127  return NS_OK;
    128 }
    129 
    130 NS_IMETHODIMP
    131 Row::GetInt32(uint32_t aIndex, int32_t* _value) {
    132  ENSURE_INDEX_VALUE(aIndex, mNumCols);
    133  return mData.ObjectAt(aIndex)->GetAsInt32(_value);
    134 }
    135 
    136 NS_IMETHODIMP
    137 Row::GetInt64(uint32_t aIndex, int64_t* _value) {
    138  ENSURE_INDEX_VALUE(aIndex, mNumCols);
    139  return mData.ObjectAt(aIndex)->GetAsInt64(_value);
    140 }
    141 
    142 NS_IMETHODIMP
    143 Row::GetDouble(uint32_t aIndex, double* _value) {
    144  ENSURE_INDEX_VALUE(aIndex, mNumCols);
    145  return mData.ObjectAt(aIndex)->GetAsDouble(_value);
    146 }
    147 
    148 NS_IMETHODIMP
    149 Row::GetUTF8String(uint32_t aIndex, nsACString& _value) {
    150  ENSURE_INDEX_VALUE(aIndex, mNumCols);
    151  return mData.ObjectAt(aIndex)->GetAsAUTF8String(_value);
    152 }
    153 
    154 NS_IMETHODIMP
    155 Row::GetString(uint32_t aIndex, nsAString& _value) {
    156  ENSURE_INDEX_VALUE(aIndex, mNumCols);
    157  return mData.ObjectAt(aIndex)->GetAsAString(_value);
    158 }
    159 
    160 NS_IMETHODIMP
    161 Row::GetBlob(uint32_t aIndex, uint32_t* _size, uint8_t** _blob) {
    162  ENSURE_INDEX_VALUE(aIndex, mNumCols);
    163 
    164  uint16_t type;
    165  nsIID interfaceIID;
    166  return mData.ObjectAt(aIndex)->GetAsArray(&type, &interfaceIID, _size,
    167                                            reinterpret_cast<void**>(_blob));
    168 }
    169 
    170 NS_IMETHODIMP
    171 Row::GetBlobAsString(uint32_t aIndex, nsAString& aValue) {
    172  return DoGetBlobAsString(this, aIndex, aValue);
    173 }
    174 
    175 NS_IMETHODIMP
    176 Row::GetBlobAsUTF8String(uint32_t aIndex, nsACString& aValue) {
    177  return DoGetBlobAsString(this, aIndex, aValue);
    178 }
    179 
    180 NS_IMETHODIMP
    181 Row::GetIsNull(uint32_t aIndex, bool* _isNull) {
    182  ENSURE_INDEX_VALUE(aIndex, mNumCols);
    183  NS_ENSURE_ARG_POINTER(_isNull);
    184 
    185  uint16_t type = mData.ObjectAt(aIndex)->GetDataType();
    186  *_isNull = type == nsIDataType::VTYPE_EMPTY;
    187  return NS_OK;
    188 }
    189 
    190 NS_IMETHODIMP
    191 Row::GetSharedUTF8String(uint32_t, uint32_t*, char const**) {
    192  return NS_ERROR_NOT_IMPLEMENTED;
    193 }
    194 
    195 NS_IMETHODIMP
    196 Row::GetSharedString(uint32_t, uint32_t*, const char16_t**) {
    197  return NS_ERROR_NOT_IMPLEMENTED;
    198 }
    199 
    200 NS_IMETHODIMP
    201 Row::GetSharedBlob(uint32_t, uint32_t*, const uint8_t**) {
    202  return NS_ERROR_NOT_IMPLEMENTED;
    203 }
    204 
    205 }  // namespace storage
    206 }  // namespace mozilla