test_binding_arrays.cpp (5993B)
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 "storage_test_harness.h" 8 9 #include "mozStorageHelper.h" 10 11 using namespace mozilla; 12 13 /** 14 * This file tests binding and reading out array parameters through the 15 * mozIStorageStatement API. 16 */ 17 18 TEST(storage_binding_arrays, Integers) 19 { 20 nsCOMPtr<mozIStorageConnection> db(getMemoryDatabase()); 21 22 (void)db->ExecuteSimpleSQL("CREATE TABLE test (val BLOB)"_ns); 23 24 nsCOMPtr<mozIStorageStatement> insert, select; 25 (void)db->CreateStatement( 26 "INSERT INTO test (val) SELECT value FROM carray(?1)"_ns, 27 getter_AddRefs(insert)); 28 (void)db->CreateStatement("SELECT val FROM test WHERE val IN carray(?1)"_ns, 29 getter_AddRefs(select)); 30 31 nsTArray<int64_t> inserted = {1, 2}; 32 { 33 mozStorageStatementScoper scoper(insert); 34 bool hasResult; 35 do_check_true( 36 NS_SUCCEEDED(insert->BindArrayOfIntegersByIndex(0, inserted))); 37 do_check_true(NS_SUCCEEDED(insert->ExecuteStep(&hasResult))); 38 do_check_false(hasResult); 39 } 40 41 nsAutoCString result; 42 { 43 mozStorageStatementScoper scoper(select); 44 do_check_true( 45 NS_SUCCEEDED(select->BindArrayOfIntegersByIndex(0, inserted))); 46 bool hasResult; 47 for (auto expected : inserted) { 48 do_check_true(NS_SUCCEEDED(select->ExecuteStep(&hasResult))); 49 do_check_true(hasResult); 50 int64_t result; 51 do_check_true(NS_SUCCEEDED(select->GetInt64(0, &result))); 52 do_check_true(result == expected); 53 } 54 } 55 } 56 57 TEST(storage_binding_arrays, Doubles) 58 { 59 nsCOMPtr<mozIStorageConnection> db(getMemoryDatabase()); 60 61 (void)db->ExecuteSimpleSQL("CREATE TABLE test (val BLOB)"_ns); 62 63 nsCOMPtr<mozIStorageStatement> insert, select; 64 (void)db->CreateStatement( 65 "INSERT INTO test (val) SELECT value FROM carray(?1)"_ns, 66 getter_AddRefs(insert)); 67 (void)db->CreateStatement("SELECT val FROM test WHERE val IN carray(?1)"_ns, 68 getter_AddRefs(select)); 69 70 nsTArray<double> inserted = {1.1, 2.2}; 71 { 72 mozStorageStatementScoper scoper(insert); 73 bool hasResult; 74 do_check_true(NS_SUCCEEDED(insert->BindArrayOfDoublesByIndex(0, inserted))); 75 do_check_true(NS_SUCCEEDED(insert->ExecuteStep(&hasResult))); 76 do_check_false(hasResult); 77 } 78 79 nsAutoCString result; 80 { 81 mozStorageStatementScoper scoper(select); 82 do_check_true(NS_SUCCEEDED(select->BindArrayOfDoublesByIndex(0, inserted))); 83 bool hasResult; 84 for (auto expected : inserted) { 85 do_check_true(NS_SUCCEEDED(select->ExecuteStep(&hasResult))); 86 do_check_true(hasResult); 87 double result; 88 do_check_true(NS_SUCCEEDED(select->GetDouble(0, &result))); 89 do_check_true(result == expected); 90 } 91 } 92 } 93 94 TEST(storage_binding_arrays, UTF8Strings) 95 { 96 nsCOMPtr<mozIStorageConnection> db(getMemoryDatabase()); 97 98 (void)db->ExecuteSimpleSQL("CREATE TABLE test (val BLOB)"_ns); 99 100 nsCOMPtr<mozIStorageStatement> insert, select; 101 (void)db->CreateStatement( 102 "INSERT INTO test (val) SELECT value FROM carray(?1)"_ns, 103 getter_AddRefs(insert)); 104 (void)db->CreateStatement("SELECT val FROM test WHERE val IN carray(?1)"_ns, 105 getter_AddRefs(select)); 106 107 nsTArray<nsCString> inserted = {"test1"_ns, "test2"_ns}; 108 { 109 mozStorageStatementScoper scoper(insert); 110 bool hasResult; 111 do_check_true( 112 NS_SUCCEEDED(insert->BindArrayOfUTF8StringsByIndex(0, inserted))); 113 do_check_true(NS_SUCCEEDED(insert->ExecuteStep(&hasResult))); 114 do_check_false(hasResult); 115 } 116 117 nsAutoCString result; 118 { 119 mozStorageStatementScoper scoper(select); 120 bool hasResult; 121 do_check_true( 122 NS_SUCCEEDED(select->BindArrayOfUTF8StringsByIndex(0, inserted))); 123 for (const auto& expected : inserted) { 124 do_check_true(NS_SUCCEEDED(select->ExecuteStep(&hasResult))); 125 do_check_true(hasResult); 126 nsCString result; 127 do_check_true(NS_SUCCEEDED(select->GetUTF8String(0, result))); 128 do_check_true(result.Equals(expected)); 129 } 130 } 131 } 132 133 TEST(storage_binding_arrays, AsyncStatement_BindingParamsArray) 134 { 135 nsCOMPtr<mozIStorageConnection> db(getMemoryDatabase()); 136 137 (void)db->ExecuteSimpleSQL("CREATE TABLE test (val BLOB)"_ns); 138 139 nsCOMPtr<mozIStorageAsyncStatement> insert; 140 (void)db->CreateAsyncStatement( 141 "INSERT INTO test (val) SELECT value FROM carray(:values)"_ns, 142 getter_AddRefs(insert)); 143 nsTArray<int64_t> insertedIntegers = {1, 2}; 144 nsTArray<nsCString> insertedStrings = {"test1"_ns, "test2"_ns}; 145 nsCOMPtr<mozIStorageBindingParamsArray> paramsArray; 146 insert->NewBindingParamsArray(getter_AddRefs(paramsArray)); 147 nsCOMPtr<mozIStorageBindingParams> intParams; 148 paramsArray->NewBindingParams(getter_AddRefs(intParams)); 149 do_check_true(NS_SUCCEEDED( 150 intParams->BindArrayOfIntegersByName("values"_ns, insertedIntegers))); 151 do_check_true(NS_SUCCEEDED(paramsArray->AddParams(intParams))); 152 intParams = nullptr; 153 nsCOMPtr<mozIStorageBindingParams> strParams; 154 paramsArray->NewBindingParams(getter_AddRefs(strParams)); 155 do_check_true(NS_SUCCEEDED( 156 strParams->BindArrayOfUTF8StringsByName("values"_ns, insertedStrings))); 157 do_check_true(NS_SUCCEEDED(paramsArray->AddParams(strParams))); 158 strParams = nullptr; 159 do_check_true(NS_SUCCEEDED(insert->BindParameters(paramsArray))); 160 paramsArray = nullptr; 161 blocking_async_execute(insert); 162 insert->Finalize(); 163 164 nsCOMPtr<mozIStorageStatement> select; 165 (void)db->CreateStatement("SELECT count(*) FROM test"_ns, 166 getter_AddRefs(select)); 167 bool hasResult; 168 do_check_true(NS_SUCCEEDED(select->ExecuteStep(&hasResult))); 169 do_check_true(hasResult); 170 do_check_true(select->AsInt64(0) == 4); 171 select->Finalize(); 172 173 blocking_async_close(db); 174 }