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/. */
7 // Note: we are already in the namepace mozilla::storage
9 // Note 2: whoever #includes this file must provide implementations of
12 ////////////////////////////////////////////////////////////////////////////////
13 //// variantToSQLiteT Implementation
16 int variantToSQLiteT(T aObj
, nsIVariant
* aValue
) {
17 // Allow to return nullptr not wrapped to nsIVariant for speed.
18 if (!aValue
) return sqlite3_T_null(aObj
);
20 uint16_t valueType
= aValue
->GetDataType();
22 case nsIDataType::VTYPE_INT8
:
23 case nsIDataType::VTYPE_INT16
:
24 case nsIDataType::VTYPE_INT32
:
25 case nsIDataType::VTYPE_UINT8
:
26 case nsIDataType::VTYPE_UINT16
: {
28 nsresult rv
= aValue
->GetAsInt32(&value
);
29 NS_ENSURE_SUCCESS(rv
, SQLITE_MISMATCH
);
30 return sqlite3_T_int(aObj
, value
);
32 case nsIDataType::VTYPE_UINT32
: // Try to preserve full range
33 case nsIDataType::VTYPE_INT64
:
34 // Data loss possible, but there is no unsigned types in SQLite
35 case nsIDataType::VTYPE_UINT64
: {
37 nsresult rv
= aValue
->GetAsInt64(&value
);
38 NS_ENSURE_SUCCESS(rv
, SQLITE_MISMATCH
);
39 return sqlite3_T_int64(aObj
, value
);
41 case nsIDataType::VTYPE_FLOAT
:
42 case nsIDataType::VTYPE_DOUBLE
: {
44 nsresult rv
= aValue
->GetAsDouble(&value
);
45 NS_ENSURE_SUCCESS(rv
, SQLITE_MISMATCH
);
46 return sqlite3_T_double(aObj
, value
);
48 case nsIDataType::VTYPE_BOOL
: {
50 nsresult rv
= aValue
->GetAsBool(&value
);
51 NS_ENSURE_SUCCESS(rv
, SQLITE_MISMATCH
);
52 return sqlite3_T_int(aObj
, value
? 1 : 0);
54 case nsIDataType::VTYPE_CHAR
:
55 case nsIDataType::VTYPE_CHAR_STR
:
56 case nsIDataType::VTYPE_STRING_SIZE_IS
:
57 case nsIDataType::VTYPE_UTF8STRING
:
58 case nsIDataType::VTYPE_CSTRING
: {
60 // GetAsAUTF8String should never perform conversion when coming from
61 // 8-bit string types, and thus can accept strings with arbitrary encoding
62 // (including UTF8 and ASCII).
63 nsresult rv
= aValue
->GetAsAUTF8String(value
);
64 NS_ENSURE_SUCCESS(rv
, SQLITE_MISMATCH
);
65 return sqlite3_T_text(aObj
, value
);
67 case nsIDataType::VTYPE_WCHAR
:
68 case nsIDataType::VTYPE_WCHAR_STR
:
69 case nsIDataType::VTYPE_WSTRING_SIZE_IS
:
70 case nsIDataType::VTYPE_ASTRING
: {
72 // GetAsAString does proper conversion to UCS2 from all string-like types.
73 // It can be used universally without problems (unless someone implements
74 // their own variant, but that's their problem).
75 nsresult rv
= aValue
->GetAsAString(value
);
76 NS_ENSURE_SUCCESS(rv
, SQLITE_MISMATCH
);
77 return sqlite3_T_text16(aObj
, value
);
79 case nsIDataType::VTYPE_VOID
:
80 case nsIDataType::VTYPE_EMPTY
:
81 case nsIDataType::VTYPE_EMPTY_ARRAY
:
82 return sqlite3_T_null(aObj
);
83 case nsIDataType::VTYPE_ARRAY
: {
88 nsresult rv
= aValue
->GetAsArray(&arrayType
, &iid
, &count
, &data
);
89 NS_ENSURE_SUCCESS(rv
, SQLITE_MISMATCH
);
90 if (arrayType
== nsIDataType::VTYPE_UINT8
) {
91 // The function should free the array accordingly!
92 return sqlite3_T_blob(aObj
, data
, count
);
94 // Empty array is handled as NULL.
96 return sqlite3_T_null(aObj
);
98 if (arrayType
== nsIDataType::VTYPE_INT32
||
99 arrayType
== nsIDataType::VTYPE_INT64
) {
100 return sqlite3_T_array(aObj
, data
, count
, CARRAY_INT64
);
102 if (arrayType
== nsIDataType::VTYPE_FLOAT
||
103 arrayType
== nsIDataType::VTYPE_DOUBLE
) {
104 return sqlite3_T_array(aObj
, data
, count
, CARRAY_DOUBLE
);
106 if (arrayType
== nsIDataType::VTYPE_UTF8STRING
) {
107 return sqlite3_T_array(aObj
, data
, count
, CARRAY_TEXT
);
110 MOZ_DIAGNOSTIC_CRASH("Unsupported type in Storage bound array");
111 // Technically this could leak with certain data types, but somebody was
112 // being incautious passing us this anyway.
114 return SQLITE_MISMATCH
;
116 // Maybe, it'll be possible to convert these
118 case nsIDataType::VTYPE_ID
:
119 case nsIDataType::VTYPE_INTERFACE
:
120 case nsIDataType::VTYPE_INTERFACE_IS
:
122 return SQLITE_MISMATCH
;