tor-browser

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

mozStorageArgValueArray.cpp (5028B)


      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 "nsError.h"
      8 #include "nsString.h"
      9 
     10 #include "mozStoragePrivateHelpers.h"
     11 #include "mozStorageArgValueArray.h"
     12 
     13 namespace mozilla {
     14 namespace storage {
     15 
     16 ////////////////////////////////////////////////////////////////////////////////
     17 //// ArgValueArray
     18 
     19 ArgValueArray::ArgValueArray(int32_t aArgc, sqlite3_value** aArgv)
     20    : mArgc(aArgc), mArgv(aArgv) {}
     21 
     22 NS_IMPL_ISUPPORTS(ArgValueArray, mozIStorageValueArray)
     23 
     24 ////////////////////////////////////////////////////////////////////////////////
     25 //// mozIStorageValueArray
     26 
     27 NS_IMETHODIMP
     28 ArgValueArray::GetNumEntries(uint32_t* _size) {
     29  *_size = mArgc;
     30  return NS_OK;
     31 }
     32 
     33 NS_IMETHODIMP
     34 ArgValueArray::GetTypeOfIndex(uint32_t aIndex, int32_t* _type) {
     35  ENSURE_INDEX_VALUE(aIndex, mArgc);
     36 
     37  int t = ::sqlite3_value_type(mArgv[aIndex]);
     38  switch (t) {
     39    case SQLITE_INTEGER:
     40      *_type = VALUE_TYPE_INTEGER;
     41      break;
     42    case SQLITE_FLOAT:
     43      *_type = VALUE_TYPE_FLOAT;
     44      break;
     45    case SQLITE_TEXT:
     46      *_type = VALUE_TYPE_TEXT;
     47      break;
     48    case SQLITE_BLOB:
     49      *_type = VALUE_TYPE_BLOB;
     50      break;
     51    case SQLITE_NULL:
     52      *_type = VALUE_TYPE_NULL;
     53      break;
     54    default:
     55      return NS_ERROR_FAILURE;
     56  }
     57 
     58  return NS_OK;
     59 }
     60 
     61 NS_IMETHODIMP
     62 ArgValueArray::GetInt32(uint32_t aIndex, int32_t* _value) {
     63  ENSURE_INDEX_VALUE(aIndex, mArgc);
     64 
     65  *_value = ::sqlite3_value_int(mArgv[aIndex]);
     66  return NS_OK;
     67 }
     68 
     69 NS_IMETHODIMP
     70 ArgValueArray::GetInt64(uint32_t aIndex, int64_t* _value) {
     71  ENSURE_INDEX_VALUE(aIndex, mArgc);
     72 
     73  *_value = ::sqlite3_value_int64(mArgv[aIndex]);
     74  return NS_OK;
     75 }
     76 
     77 NS_IMETHODIMP
     78 ArgValueArray::GetDouble(uint32_t aIndex, double* _value) {
     79  ENSURE_INDEX_VALUE(aIndex, mArgc);
     80 
     81  *_value = ::sqlite3_value_double(mArgv[aIndex]);
     82  return NS_OK;
     83 }
     84 
     85 NS_IMETHODIMP
     86 ArgValueArray::GetUTF8String(uint32_t aIndex, nsACString& _value) {
     87  ENSURE_INDEX_VALUE(aIndex, mArgc);
     88 
     89  if (::sqlite3_value_type(mArgv[aIndex]) == SQLITE_NULL) {
     90    // NULL columns should have IsVoid set to distinguish them from an empty
     91    // string.
     92    _value.SetIsVoid(true);
     93  } else {
     94    _value.Assign(
     95        reinterpret_cast<const char*>(::sqlite3_value_text(mArgv[aIndex])),
     96        ::sqlite3_value_bytes(mArgv[aIndex]));
     97  }
     98  return NS_OK;
     99 }
    100 
    101 NS_IMETHODIMP
    102 ArgValueArray::GetString(uint32_t aIndex, nsAString& _value) {
    103  ENSURE_INDEX_VALUE(aIndex, mArgc);
    104 
    105  if (::sqlite3_value_type(mArgv[aIndex]) == SQLITE_NULL) {
    106    // NULL columns should have IsVoid set to distinguish them from an empty
    107    // string.
    108    _value.SetIsVoid(true);
    109  } else {
    110    const char16_t* string =
    111        static_cast<const char16_t*>(::sqlite3_value_text16(mArgv[aIndex]));
    112    _value.Assign(string,
    113                  ::sqlite3_value_bytes16(mArgv[aIndex]) / sizeof(char16_t));
    114  }
    115  return NS_OK;
    116 }
    117 
    118 NS_IMETHODIMP
    119 ArgValueArray::GetBlob(uint32_t aIndex, uint32_t* _size, uint8_t** _blob) {
    120  ENSURE_INDEX_VALUE(aIndex, mArgc);
    121 
    122  int size = ::sqlite3_value_bytes(mArgv[aIndex]);
    123  void* blob = moz_xmemdup(::sqlite3_value_blob(mArgv[aIndex]), size);
    124  *_blob = static_cast<uint8_t*>(blob);
    125  *_size = size;
    126  return NS_OK;
    127 }
    128 
    129 NS_IMETHODIMP
    130 ArgValueArray::GetBlobAsString(uint32_t aIndex, nsAString& aValue) {
    131  return DoGetBlobAsString(this, aIndex, aValue);
    132 }
    133 
    134 NS_IMETHODIMP
    135 ArgValueArray::GetBlobAsUTF8String(uint32_t aIndex, nsACString& aValue) {
    136  return DoGetBlobAsString(this, aIndex, aValue);
    137 }
    138 
    139 NS_IMETHODIMP
    140 ArgValueArray::GetIsNull(uint32_t aIndex, bool* _isNull) {
    141  // GetTypeOfIndex will check aIndex for us, so we don't have to.
    142  int32_t type;
    143  nsresult rv = GetTypeOfIndex(aIndex, &type);
    144  NS_ENSURE_SUCCESS(rv, rv);
    145 
    146  *_isNull = (type == VALUE_TYPE_NULL);
    147  return NS_OK;
    148 }
    149 
    150 NS_IMETHODIMP
    151 ArgValueArray::GetSharedUTF8String(uint32_t aIndex, uint32_t* _byteLength,
    152                                   const char** _string) {
    153  *_string = reinterpret_cast<const char*>(::sqlite3_value_text(mArgv[aIndex]));
    154  if (_byteLength) {
    155    *_byteLength = ::sqlite3_value_bytes(mArgv[aIndex]);
    156  }
    157  return NS_OK;
    158 }
    159 
    160 NS_IMETHODIMP
    161 ArgValueArray::GetSharedString(uint32_t aIndex, uint32_t* _byteLength,
    162                               const char16_t** _string) {
    163  *_string =
    164      static_cast<const char16_t*>(::sqlite3_value_text16(mArgv[aIndex]));
    165  if (_byteLength) {
    166    *_byteLength = ::sqlite3_value_bytes16(mArgv[aIndex]);
    167  }
    168  return NS_OK;
    169 }
    170 
    171 NS_IMETHODIMP
    172 ArgValueArray::GetSharedBlob(uint32_t aIndex, uint32_t* _byteLength,
    173                             const uint8_t** _blob) {
    174  *_blob = static_cast<const uint8_t*>(::sqlite3_value_blob(mArgv[aIndex]));
    175  if (_byteLength) {
    176    *_byteLength = ::sqlite3_value_bytes(mArgv[aIndex]);
    177  }
    178  return NS_OK;
    179 }
    180 
    181 }  // namespace storage
    182 }  // namespace mozilla