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 * ***** BEGIN LICENSE BLOCK *****
4 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 1.1 (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 * http://www.mozilla.org/MPL/
11 * Software distributed under the License is distributed on an "AS IS" basis,
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 * for the specific language governing rights and limitations under the
16 * The Original Code is Oracle Corporation code.
18 * The Initial Developer of the Original Code is
20 * Portions created by the Initial Developer are Copyright (C) 2004
21 * the Initial Developer. All Rights Reserved.
24 * Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
26 * Alternatively, the contents of this file may be used under the terms of
27 * either the GNU General Public License Version 2 or later (the "GPL"), or
28 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29 * in which case the provisions of the GPL or the LGPL are applicable instead
30 * of those above. If you wish to allow use of your version of this file only
31 * under the terms of either the GPL or the LGPL, and not to allow others to
32 * use your version of this file under the terms of the MPL, indicate your
33 * decision by deleting the provisions above and replace them with the notice
34 * and other provisions required by the GPL or the LGPL. If you do not delete
35 * the provisions above, a recipient may use your version of this file under
36 * the terms of any one of the MPL, the GPL or the LGPL.
38 * ***** END LICENSE BLOCK ***** */
44 #include "mozStoragePrivateHelpers.h"
45 #include "mozStorageArgValueArray.h"
50 ////////////////////////////////////////////////////////////////////////////////
53 ArgValueArray::ArgValueArray(PRInt32 aArgc
,
54 sqlite3_value
**aArgv
)
65 ////////////////////////////////////////////////////////////////////////////////
66 //// mozIStorageValueArray
69 ArgValueArray::GetNumEntries(PRUint32
*_size
)
76 ArgValueArray::GetTypeOfIndex(PRUint32 aIndex
,
79 ENSURE_INDEX_VALUE(aIndex
, mArgc
);
81 int t
= ::sqlite3_value_type(mArgv
[aIndex
]);
84 *_type
= VALUE_TYPE_INTEGER
;
87 *_type
= VALUE_TYPE_FLOAT
;
90 *_type
= VALUE_TYPE_TEXT
;
93 *_type
= VALUE_TYPE_BLOB
;
96 *_type
= VALUE_TYPE_NULL
;
99 return NS_ERROR_FAILURE
;
106 ArgValueArray::GetInt32(PRUint32 aIndex
,
109 ENSURE_INDEX_VALUE(aIndex
, mArgc
);
111 *_value
= ::sqlite3_value_int(mArgv
[aIndex
]);
116 ArgValueArray::GetInt64(PRUint32 aIndex
,
119 ENSURE_INDEX_VALUE(aIndex
, mArgc
);
121 *_value
= ::sqlite3_value_int64(mArgv
[aIndex
]);
126 ArgValueArray::GetDouble(PRUint32 aIndex
,
129 ENSURE_INDEX_VALUE(aIndex
, mArgc
);
131 *_value
= ::sqlite3_value_double(mArgv
[aIndex
]);
136 ArgValueArray::GetUTF8String(PRUint32 aIndex
,
139 ENSURE_INDEX_VALUE(aIndex
, mArgc
);
141 if (::sqlite3_value_type(mArgv
[aIndex
]) == SQLITE_NULL
) {
142 // NULL columns should have IsVoid set to distinguish them from an empty
145 _value
.SetIsVoid(PR_TRUE
);
148 _value
.Assign(reinterpret_cast<const char *>(::sqlite3_value_text(mArgv
[aIndex
])),
149 ::sqlite3_value_bytes(mArgv
[aIndex
]));
155 ArgValueArray::GetString(PRUint32 aIndex
,
158 ENSURE_INDEX_VALUE(aIndex
, mArgc
);
160 if (::sqlite3_value_type(mArgv
[aIndex
]) == SQLITE_NULL
) {
161 // NULL columns should have IsVoid set to distinguish them from an empty
164 _value
.SetIsVoid(PR_TRUE
);
166 _value
.Assign(static_cast<const PRUnichar
*>(::sqlite3_value_text16(mArgv
[aIndex
])),
167 ::sqlite3_value_bytes16(mArgv
[aIndex
]) / 2);
173 ArgValueArray::GetBlob(PRUint32 aIndex
,
177 ENSURE_INDEX_VALUE(aIndex
, mArgc
);
179 int size
= ::sqlite3_value_bytes(mArgv
[aIndex
]);
180 void *blob
= nsMemory::Clone(::sqlite3_value_blob(mArgv
[aIndex
]), size
);
181 NS_ENSURE_TRUE(blob
, NS_ERROR_OUT_OF_MEMORY
);
183 *_blob
= static_cast<PRUint8
*>(blob
);
189 ArgValueArray::GetIsNull(PRUint32 aIndex
,
192 // GetTypeOfIndex will check aIndex for us, so we don't have to.
194 nsresult rv
= GetTypeOfIndex(aIndex
, &type
);
195 NS_ENSURE_SUCCESS(rv
, rv
);
197 *_isNull
= (type
== VALUE_TYPE_NULL
);
202 ArgValueArray::GetSharedUTF8String(PRUint32 aIndex
,
204 const char **_string
)
207 *_length
= ::sqlite3_value_bytes(mArgv
[aIndex
]);
209 *_string
= reinterpret_cast<const char *>(::sqlite3_value_text(mArgv
[aIndex
]));
214 ArgValueArray::GetSharedString(PRUint32 aIndex
,
216 const PRUnichar
**_string
)
219 *_length
= ::sqlite3_value_bytes(mArgv
[aIndex
]);
221 *_string
= static_cast<const PRUnichar
*>(::sqlite3_value_text16(mArgv
[aIndex
]));
226 ArgValueArray::GetSharedBlob(PRUint32 aIndex
,
228 const PRUint8
**_blob
)
230 *_size
= ::sqlite3_value_bytes(mArgv
[aIndex
]);
231 *_blob
= static_cast<const PRUint8
*>(::sqlite3_value_blob(mArgv
[aIndex
]));
235 } // namespace storage
236 } // namespace mozilla