LCOV - code coverage report
Current view: top level - storage - mozStorageArgValueArray.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 28 81 34.6 %
Date: 2017-07-14 16:53:18 Functions: 8 18 44.4 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13