Bug 441233 Missing focus events in Thunderbird account wizard dialog r=surkov.alexander
[wine-gecko.git] / storage / src / mozStorageStatementWrapper.cpp
blob661ab25ec997965aedde81b9838d131f2254fe47
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 * vim: sw=4 ts=4 sts=4
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
14 * License.
16 * The Original Code is Oracle Corporation code.
18 * The Initial Developer of the Original Code is
19 * Oracle Corporation
20 * Portions created by the Initial Developer are Copyright (C) 2004
21 * the Initial Developer. All Rights Reserved.
23 * Contributor(s):
24 * Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
25 * Shawn Wilsher <me@shawnwilsher.com>
27 * Alternatively, the contents of this file may be used under the terms of
28 * either the GNU General Public License Version 2 or later (the "GPL"), or
29 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30 * in which case the provisions of the GPL or the LGPL are applicable instead
31 * of those above. If you wish to allow use of your version of this file only
32 * under the terms of either the GPL or the LGPL, and not to allow others to
33 * use your version of this file under the terms of the MPL, indicate your
34 * decision by deleting the provisions above and replace them with the notice
35 * and other provisions required by the GPL or the LGPL. If you do not delete
36 * the provisions above, a recipient may use your version of this file under
37 * the terms of any one of the MPL, the GPL or the LGPL.
39 * ***** END LICENSE BLOCK ***** */
41 #include "nsMemory.h"
42 #include "nsString.h"
44 #include "mozStorageStatementWrapper.h"
46 #include "jsapi.h"
47 #include "jsdate.h"
49 #include "sqlite3.h"
51 /**
52 ** mozStorageStatementRow
53 **/
54 class mozStorageStatementRow : public mozIStorageStatementRow,
55 public nsIXPCScriptable
57 public:
58 mozStorageStatementRow(mozIStorageStatement *aStatement,
59 int aNumColumns,
60 const nsStringArray *aColumnNames);
62 // nsISupports interface
63 NS_DECL_ISUPPORTS
65 // mozIStorageStatementRow interface (empty)
66 NS_DECL_MOZISTORAGESTATEMENTROW
68 // nsIXPCScriptable interface
69 NS_DECL_NSIXPCSCRIPTABLE
70 protected:
71 sqlite3_stmt* NativeStatement() {
72 return mStatement->GetNativeStatementPointer();
75 nsCOMPtr<mozIStorageStatement> mStatement;
76 int mNumColumns;
77 const nsStringArray *mColumnNames;
80 /**
81 ** mozStorageStatementParams
82 **/
83 class mozStorageStatementParams : public mozIStorageStatementParams,
84 public nsIXPCScriptable
86 public:
87 mozStorageStatementParams(mozIStorageStatement *aStatement);
89 // interfaces
90 NS_DECL_ISUPPORTS
91 NS_DECL_MOZISTORAGESTATEMENTPARAMS
92 NS_DECL_NSIXPCSCRIPTABLE
94 protected:
95 nsCOMPtr<mozIStorageStatement> mStatement;
96 PRUint32 mParamCount;
99 static PRBool
100 JSValStorageStatementBinder (JSContext *cx,
101 mozIStorageStatement *aStatement,
102 int aIdx,
103 jsval val)
105 if (JSVAL_IS_INT(val)) {
106 int v = JSVAL_TO_INT(val);
107 (void)aStatement->BindInt32Parameter(aIdx, v);
108 } else if (JSVAL_IS_DOUBLE(val)) {
109 double d = *JSVAL_TO_DOUBLE(val);
110 (void)aStatement->BindDoubleParameter(aIdx, d);
111 } else if (JSVAL_IS_STRING(val)) {
112 JSString *str = JSVAL_TO_STRING(val);
113 (void)aStatement->BindStringParameter(aIdx, nsDependentString(reinterpret_cast<PRUnichar*>(JS_GetStringChars(str)), JS_GetStringLength(str)));
114 } else if (JSVAL_IS_BOOLEAN(val)) {
115 (void)aStatement->BindInt32Parameter(aIdx, (val == JSVAL_TRUE) ? 1 : 0);
116 } else if (JSVAL_IS_NULL(val)) {
117 (void)aStatement->BindNullParameter(aIdx);
118 } else if (JSVAL_IS_OBJECT(val)) {
119 JSObject *obj = JSVAL_TO_OBJECT(val);
120 // some special things
121 if (js_DateIsValid (cx, obj)) {
122 double msecd = js_DateGetMsecSinceEpoch(cx, obj);
123 msecd *= 1000.0;
124 PRInt64 msec;
125 LL_D2L(msec, msecd);
127 (void)aStatement->BindInt64Parameter(aIdx, msec);
128 } else {
129 return PR_FALSE;
131 } else {
132 return PR_FALSE;
135 return PR_TRUE;
139 /*************************************************************************
140 ****
141 **** mozStorageStatementWrapper
142 ****
143 *************************************************************************/
145 NS_IMPL_ISUPPORTS2(mozStorageStatementWrapper, mozIStorageStatementWrapper, nsIXPCScriptable)
147 mozStorageStatementWrapper::mozStorageStatementWrapper()
148 : mStatement(nsnull)
152 mozStorageStatementWrapper::~mozStorageStatementWrapper()
154 mStatement = nsnull;
157 NS_IMETHODIMP
158 mozStorageStatementWrapper::Initialize(mozIStorageStatement *aStatement)
160 NS_ASSERTION(mStatement == nsnull, "mozStorageStatementWrapper is already initialized");
161 NS_ENSURE_ARG_POINTER(aStatement);
163 mStatement = aStatement;
165 // fetch various things we care about
166 mStatement->GetParameterCount(&mParamCount);
167 mStatement->GetColumnCount(&mResultColumnCount);
169 for (unsigned int i = 0; i < mResultColumnCount; i++) {
170 const void *name = sqlite3_column_name16 (NativeStatement(), i);
171 mColumnNames.AppendString(nsDependentString(static_cast<const PRUnichar*>(name)));
174 return NS_OK;
177 NS_IMETHODIMP
178 mozStorageStatementWrapper::GetStatement(mozIStorageStatement **aStatement)
180 NS_IF_ADDREF(*aStatement = mStatement);
181 return NS_OK;
184 NS_IMETHODIMP
185 mozStorageStatementWrapper::Reset()
187 if (!mStatement)
188 return NS_ERROR_FAILURE;
190 return mStatement->Reset();
193 NS_IMETHODIMP
194 mozStorageStatementWrapper::Step(PRBool *_retval)
196 if (!mStatement)
197 return NS_ERROR_FAILURE;
199 PRBool hasMore = PR_FALSE;
200 nsresult rv = mStatement->ExecuteStep(&hasMore);
201 if (NS_SUCCEEDED(rv) && !hasMore) {
202 *_retval = PR_FALSE;
203 mStatement->Reset();
204 return NS_OK;
207 *_retval = hasMore;
208 return rv;
211 NS_IMETHODIMP
212 mozStorageStatementWrapper::Execute()
214 if (!mStatement)
215 return NS_ERROR_FAILURE;
217 return mStatement->Execute();
220 NS_IMETHODIMP
221 mozStorageStatementWrapper::GetRow(mozIStorageStatementRow **aRow)
223 NS_ENSURE_ARG_POINTER(aRow);
225 if (!mStatement)
226 return NS_ERROR_FAILURE;
228 PRInt32 state;
229 mStatement->GetState(&state);
230 if (state != mozIStorageStatement::MOZ_STORAGE_STATEMENT_EXECUTING)
231 return NS_ERROR_FAILURE;
233 if (!mStatementRow) {
234 mozStorageStatementRow *row = new mozStorageStatementRow(mStatement, mResultColumnCount, &mColumnNames);
235 if (!row)
236 return NS_ERROR_OUT_OF_MEMORY;
237 mStatementRow = row;
240 NS_ADDREF(*aRow = mStatementRow);
241 return NS_OK;
244 NS_IMETHODIMP
245 mozStorageStatementWrapper::GetParams(mozIStorageStatementParams **aParams)
247 NS_ENSURE_ARG_POINTER(aParams);
249 if (!mStatementParams) {
250 mozStorageStatementParams *params = new mozStorageStatementParams(mStatement);
251 if (!params)
252 return NS_ERROR_OUT_OF_MEMORY;
253 mStatementParams = params;
256 NS_ADDREF(*aParams = mStatementParams);
257 return NS_OK;
260 /*** nsIXPCScriptable interface ***/
262 /* readonly attribute string className; */
263 NS_IMETHODIMP
264 mozStorageStatementWrapper::GetClassName(char * *aClassName)
266 NS_ENSURE_ARG_POINTER(aClassName);
267 *aClassName = (char *) nsMemory::Clone("mozStorageStatementWrapper", 27);
268 if (!*aClassName)
269 return NS_ERROR_OUT_OF_MEMORY;
270 return NS_OK;
273 /* readonly attribute PRUint32 scriptableFlags; */
274 NS_IMETHODIMP
275 mozStorageStatementWrapper::GetScriptableFlags(PRUint32 *aScriptableFlags)
277 *aScriptableFlags =
278 nsIXPCScriptable::WANT_CALL |
279 nsIXPCScriptable::USE_JSSTUB_FOR_SETPROPERTY |
280 nsIXPCScriptable::WANT_NEWRESOLVE |
281 nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE;
282 return NS_OK;
285 /* PRBool call (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
286 NS_IMETHODIMP
287 mozStorageStatementWrapper::Call(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
288 JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
290 if (!mStatement) {
291 *_retval = PR_TRUE;
292 return NS_ERROR_FAILURE;
295 if (argc != mParamCount) {
296 *_retval = PR_FALSE;
297 return NS_ERROR_FAILURE;
300 // reset
301 mStatement->Reset();
303 // bind parameters
304 for (int i = 0; i < (int) argc; i++) {
305 if (!JSValStorageStatementBinder(cx, mStatement, i, argv[i])) {
306 *_retval = PR_FALSE;
307 return NS_ERROR_INVALID_ARG;
311 // if there are no results, we just execute
312 if (mResultColumnCount == 0)
313 mStatement->Execute();
315 *vp = JSVAL_TRUE;
316 *_retval = PR_TRUE;
317 return NS_OK;
320 /* PRBool getProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
321 NS_IMETHODIMP
322 mozStorageStatementWrapper::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
323 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
325 *_retval = PR_FALSE;
326 return NS_OK;
330 /* PRBool setProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
331 NS_IMETHODIMP
332 mozStorageStatementWrapper::SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
333 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
335 *_retval = PR_FALSE;
336 return NS_OK;
339 /* void preCreate (in nsISupports nativeObj, in JSContextPtr cx, in JSObjectPtr globalObj, out JSObjectPtr parentObj); */
340 NS_IMETHODIMP
341 mozStorageStatementWrapper::PreCreate(nsISupports *nativeObj, JSContext * cx,
342 JSObject * globalObj, JSObject * *parentObj)
344 return NS_ERROR_NOT_IMPLEMENTED;
347 /* void create (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
348 NS_IMETHODIMP
349 mozStorageStatementWrapper::Create(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj)
351 return NS_ERROR_NOT_IMPLEMENTED;
354 /* void postCreate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
355 NS_IMETHODIMP
356 mozStorageStatementWrapper::PostCreate(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj)
358 return NS_ERROR_NOT_IMPLEMENTED;
361 /* PRBool addProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
362 NS_IMETHODIMP
363 mozStorageStatementWrapper::AddProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
364 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
366 return NS_ERROR_NOT_IMPLEMENTED;
369 /* PRBool delProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
370 NS_IMETHODIMP
371 mozStorageStatementWrapper::DelProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
372 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
374 return NS_ERROR_NOT_IMPLEMENTED;
377 /* PRBool enumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
378 NS_IMETHODIMP
379 mozStorageStatementWrapper::Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
380 JSObject * obj, PRBool *_retval)
382 return NS_ERROR_NOT_IMPLEMENTED;
385 /* PRBool newEnumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 enum_op, in JSValPtr statep, out JSID idp); */
386 NS_IMETHODIMP
387 mozStorageStatementWrapper::NewEnumerate(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
388 JSObject * obj, PRUint32 enum_op, jsval * statep, jsid *idp, PRBool *_retval)
390 return NS_ERROR_NOT_IMPLEMENTED;
393 /* PRBool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 flags, out JSObjectPtr objp); */
394 NS_IMETHODIMP
395 mozStorageStatementWrapper::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
396 JSObject * obj, jsval id, PRUint32 flags, JSObject * *objp, PRBool *_retval)
398 *_retval = PR_TRUE;
399 return NS_OK;
402 /* PRBool convert (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 type, in JSValPtr vp); */
403 NS_IMETHODIMP
404 mozStorageStatementWrapper::Convert(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
405 JSObject * obj, PRUint32 type, jsval * vp, PRBool *_retval)
407 return NS_ERROR_NOT_IMPLEMENTED;
410 /* void finalize (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
411 NS_IMETHODIMP
412 mozStorageStatementWrapper::Finalize(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
413 JSObject * obj)
415 return NS_ERROR_NOT_IMPLEMENTED;
418 /* PRBool checkAccess (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 mode, in JSValPtr vp); */
419 NS_IMETHODIMP
420 mozStorageStatementWrapper::CheckAccess(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
421 JSObject * obj, jsval id, PRUint32 mode, jsval * vp, PRBool *_retval)
423 return NS_ERROR_NOT_IMPLEMENTED;
426 /* PRBool construct (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
427 NS_IMETHODIMP
428 mozStorageStatementWrapper::Construct(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
429 JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
431 return NS_ERROR_NOT_IMPLEMENTED;
434 /* PRBool hasInstance (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal val, out PRBool bp); */
435 NS_IMETHODIMP
436 mozStorageStatementWrapper::HasInstance(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
437 JSObject * obj, jsval val, PRBool *bp, PRBool *_retval)
439 return NS_ERROR_NOT_IMPLEMENTED;
442 /* void trace (in nsIXPConnectWrappedNative wrapper, in JSTracerPtr trc, in JSObjectPtr obj); */
443 NS_IMETHODIMP
444 mozStorageStatementWrapper::Trace(nsIXPConnectWrappedNative *wrapper,
445 JSTracer *trc, JSObject *obj)
447 return NS_ERROR_NOT_IMPLEMENTED;
450 /* PRBool equality(in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal val); */
451 NS_IMETHODIMP
452 mozStorageStatementWrapper::Equality(nsIXPConnectWrappedNative *wrapper,
453 JSContext *cx, JSObject *obj, jsval val,
454 PRBool *_retval)
456 return NS_ERROR_NOT_IMPLEMENTED;
459 /* JSObjectPtr outerObject(in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
460 NS_IMETHODIMP
461 mozStorageStatementWrapper::OuterObject(nsIXPConnectWrappedNative *wrapper,
462 JSContext *cx, JSObject *obj,
463 JSObject **_retval)
465 return NS_ERROR_NOT_IMPLEMENTED;
468 /* JSObjectPtr innerObject(in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
469 NS_IMETHODIMP
470 mozStorageStatementWrapper::InnerObject(nsIXPConnectWrappedNative *wrapper,
471 JSContext *cx, JSObject *obj,
472 JSObject **_retval)
474 return NS_ERROR_NOT_IMPLEMENTED;
477 /*************************************************************************
478 ****
479 **** mozStorageStatementRow
480 ****
481 *************************************************************************/
483 NS_IMPL_ISUPPORTS2(mozStorageStatementRow, mozIStorageStatementRow, nsIXPCScriptable)
485 mozStorageStatementRow::mozStorageStatementRow(mozIStorageStatement *aStatement,
486 int aNumColumns,
487 const nsStringArray *aColumnNames)
488 : mStatement(aStatement),
489 mNumColumns(aNumColumns),
490 mColumnNames(aColumnNames)
495 * nsIXPCScriptable impl
498 /* readonly attribute string className; */
499 NS_IMETHODIMP
500 mozStorageStatementRow::GetClassName(char * *aClassName)
502 NS_ENSURE_ARG_POINTER(aClassName);
503 *aClassName = (char *) nsMemory::Clone("mozStorageStatementRow", 23);
504 if (!*aClassName)
505 return NS_ERROR_OUT_OF_MEMORY;
506 return NS_OK;
509 /* readonly attribute PRUint32 scriptableFlags; */
510 NS_IMETHODIMP
511 mozStorageStatementRow::GetScriptableFlags(PRUint32 *aScriptableFlags)
513 *aScriptableFlags =
514 nsIXPCScriptable::WANT_GETPROPERTY |
515 nsIXPCScriptable::WANT_NEWRESOLVE |
516 nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE;
517 return NS_OK;
520 /* PRBool getProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
521 NS_IMETHODIMP
522 mozStorageStatementRow::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
523 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
525 *_retval = PR_FALSE;
527 if (JSVAL_IS_STRING(id)) {
528 nsDependentString jsid((PRUnichar *)::JS_GetStringChars(JSVAL_TO_STRING(id)),
529 ::JS_GetStringLength(JSVAL_TO_STRING(id)));
531 for (int i = 0; i < mNumColumns; i++) {
532 if (jsid.Equals(*(*mColumnNames)[i])) {
533 int ctype = sqlite3_column_type(NativeStatement(), i);
535 if (ctype == SQLITE_INTEGER || ctype == SQLITE_FLOAT) {
536 double dval = sqlite3_column_double(NativeStatement(), i);
537 if (!JS_NewNumberValue(cx, dval, vp)) {
538 *_retval = PR_FALSE;
539 return NS_ERROR_OUT_OF_MEMORY;
541 } else if (ctype == SQLITE_TEXT) {
542 JSString *str = JS_NewUCStringCopyN(cx,
543 (jschar*) sqlite3_column_text16(NativeStatement(), i),
544 sqlite3_column_bytes16(NativeStatement(), i)/2);
545 if (!str) {
546 *_retval = PR_FALSE;
547 return NS_ERROR_OUT_OF_MEMORY;
549 *vp = STRING_TO_JSVAL(str);
550 } else if (ctype == SQLITE_BLOB) {
551 JSString *str = JS_NewStringCopyN(cx,
552 (char*) sqlite3_column_blob(NativeStatement(), i),
553 sqlite3_column_bytes(NativeStatement(), i));
554 if (!str) {
555 *_retval = PR_FALSE;
556 return NS_ERROR_OUT_OF_MEMORY;
558 } else if (ctype == SQLITE_NULL) {
559 *vp = JSVAL_NULL;
560 } else {
561 NS_ERROR("sqlite3_column_type returned unknown column type, what's going on?");
564 *_retval = PR_TRUE;
565 break;
570 return NS_OK;
574 /* PRBool setProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
575 NS_IMETHODIMP
576 mozStorageStatementRow::SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
577 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
579 return NS_ERROR_NOT_IMPLEMENTED;
582 /* void preCreate (in nsISupports nativeObj, in JSContextPtr cx, in JSObjectPtr globalObj, out JSObjectPtr parentObj); */
583 NS_IMETHODIMP
584 mozStorageStatementRow::PreCreate(nsISupports *nativeObj, JSContext * cx,
585 JSObject * globalObj, JSObject * *parentObj)
587 return NS_ERROR_NOT_IMPLEMENTED;
590 /* void create (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
591 NS_IMETHODIMP
592 mozStorageStatementRow::Create(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj)
594 return NS_ERROR_NOT_IMPLEMENTED;
597 /* void postCreate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
598 NS_IMETHODIMP
599 mozStorageStatementRow::PostCreate(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj)
601 return NS_ERROR_NOT_IMPLEMENTED;
604 /* PRBool addProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
605 NS_IMETHODIMP
606 mozStorageStatementRow::AddProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
607 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
609 return NS_ERROR_NOT_IMPLEMENTED;
612 /* PRBool delProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
613 NS_IMETHODIMP
614 mozStorageStatementRow::DelProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
615 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
617 return NS_ERROR_NOT_IMPLEMENTED;
620 /* PRBool enumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
621 NS_IMETHODIMP
622 mozStorageStatementRow::Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
623 JSObject * obj, PRBool *_retval)
625 return NS_ERROR_NOT_IMPLEMENTED;
628 /* PRBool newEnumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 enum_op, in JSValPtr statep, out JSID idp); */
629 NS_IMETHODIMP
630 mozStorageStatementRow::NewEnumerate(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
631 JSObject * obj, PRUint32 enum_op, jsval * statep, jsid *idp, PRBool *_retval)
633 return NS_ERROR_NOT_IMPLEMENTED;
636 /* PRBool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 flags, out JSObjectPtr objp); */
637 NS_IMETHODIMP
638 mozStorageStatementRow::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
639 JSObject * obj, jsval id, PRUint32 flags, JSObject * *objp, PRBool *_retval)
641 if (JSVAL_IS_STRING(id)) {
642 JSString *str = JSVAL_TO_STRING(id);
643 nsDependentString name((PRUnichar *)::JS_GetStringChars(str),
644 ::JS_GetStringLength(str));
646 for (int i = 0; i < mNumColumns; i++) {
647 if (name.Equals(*(*mColumnNames)[i])) {
648 *_retval = ::JS_DefineUCProperty(cx, obj, ::JS_GetStringChars(str),
649 ::JS_GetStringLength(str),
650 JSVAL_VOID,
651 nsnull, nsnull, 0);
652 *objp = obj;
653 return *_retval ? NS_OK : NS_ERROR_FAILURE;
658 *_retval = PR_TRUE;
659 return NS_OK;
662 /* PRBool convert (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 type, in JSValPtr vp); */
663 NS_IMETHODIMP
664 mozStorageStatementRow::Convert(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
665 JSObject * obj, PRUint32 type, jsval * vp, PRBool *_retval)
667 return NS_ERROR_NOT_IMPLEMENTED;
670 /* void finalize (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
671 NS_IMETHODIMP
672 mozStorageStatementRow::Finalize(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
673 JSObject * obj)
675 return NS_ERROR_NOT_IMPLEMENTED;
678 /* PRBool checkAccess (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 mode, in JSValPtr vp); */
679 NS_IMETHODIMP
680 mozStorageStatementRow::CheckAccess(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
681 JSObject * obj, jsval id, PRUint32 mode, jsval * vp, PRBool *_retval)
683 return NS_ERROR_NOT_IMPLEMENTED;
686 /* PRBool call (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
687 NS_IMETHODIMP
688 mozStorageStatementRow::Call(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
689 JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
691 return NS_ERROR_NOT_IMPLEMENTED;
694 /* PRBool construct (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
695 NS_IMETHODIMP
696 mozStorageStatementRow::Construct(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
697 JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
699 return NS_ERROR_NOT_IMPLEMENTED;
702 /* PRBool hasInstance (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal val, out PRBool bp); */
703 NS_IMETHODIMP
704 mozStorageStatementRow::HasInstance(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
705 JSObject * obj, jsval val, PRBool *bp, PRBool *_retval)
707 return NS_ERROR_NOT_IMPLEMENTED;
710 /* void trace (in nsIXPConnectWrappedNative wrapper, in JSTracerPtr trc, in JSObjectPtr obj); */
711 NS_IMETHODIMP
712 mozStorageStatementRow::Trace(nsIXPConnectWrappedNative *wrapper,
713 JSTracer * trc, JSObject * obj)
715 return NS_ERROR_NOT_IMPLEMENTED;
718 /* PRBool equality(in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal val); */
719 NS_IMETHODIMP
720 mozStorageStatementRow::Equality(nsIXPConnectWrappedNative *wrapper,
721 JSContext *cx, JSObject *obj, jsval val,
722 PRBool *_retval)
724 return NS_ERROR_NOT_IMPLEMENTED;
727 /* JSObjectPtr outerObject(in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
728 NS_IMETHODIMP
729 mozStorageStatementRow::OuterObject(nsIXPConnectWrappedNative *wrapper,
730 JSContext *cx, JSObject *obj,
731 JSObject **_retval)
733 return NS_ERROR_NOT_IMPLEMENTED;
736 /* JSObjectPtr innerObject(in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
737 NS_IMETHODIMP
738 mozStorageStatementRow::InnerObject(nsIXPConnectWrappedNative *wrapper,
739 JSContext *cx, JSObject *obj,
740 JSObject **_retval)
742 return NS_ERROR_NOT_IMPLEMENTED;
745 /*************************************************************************
746 ****
747 **** mozStorageStatementParams
748 ****
749 *************************************************************************/
751 NS_IMPL_ISUPPORTS2(mozStorageStatementParams, mozIStorageStatementParams, nsIXPCScriptable)
753 mozStorageStatementParams::mozStorageStatementParams(mozIStorageStatement *aStatement)
754 : mStatement(aStatement)
756 NS_ASSERTION(mStatement != nsnull, "mStatement is null");
757 mStatement->GetParameterCount(&mParamCount);
761 * nsIXPCScriptable impl
764 /* readonly attribute string className; */
765 NS_IMETHODIMP
766 mozStorageStatementParams::GetClassName(char * *aClassName)
768 NS_ENSURE_ARG_POINTER(aClassName);
769 *aClassName = (char *) nsMemory::Clone("mozStorageStatementParams", 26);
770 if (!*aClassName)
771 return NS_ERROR_OUT_OF_MEMORY;
772 return NS_OK;
775 /* readonly attribute PRUint32 scriptableFlags; */
776 NS_IMETHODIMP
777 mozStorageStatementParams::GetScriptableFlags(PRUint32 *aScriptableFlags)
779 *aScriptableFlags =
780 nsIXPCScriptable::WANT_SETPROPERTY |
781 nsIXPCScriptable::WANT_NEWRESOLVE |
782 nsIXPCScriptable::ALLOW_PROP_MODS_DURING_RESOLVE;
783 return NS_OK;
786 /* PRBool getProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
787 NS_IMETHODIMP
788 mozStorageStatementParams::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
789 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
791 return NS_ERROR_NOT_IMPLEMENTED;
795 /* PRBool setProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
796 NS_IMETHODIMP
797 mozStorageStatementParams::SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
798 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
800 if (JSVAL_IS_INT(id)) {
801 int idx = JSVAL_TO_INT(id);
803 *_retval = JSValStorageStatementBinder (cx, mStatement, idx, *vp);
804 } else if (JSVAL_IS_STRING(id)) {
805 sqlite3_stmt *stmt = mStatement->GetNativeStatementPointer();
807 JSString *str = JSVAL_TO_STRING(id);
808 nsCAutoString name(":");
809 name.Append(NS_ConvertUTF16toUTF8(nsDependentString((PRUnichar *)::JS_GetStringChars(str),
810 ::JS_GetStringLength(str))));
812 // check to see if there's a parameter with this name
813 if (sqlite3_bind_parameter_index(stmt, name.get()) == 0) {
814 *_retval = PR_FALSE;
815 return NS_ERROR_INVALID_ARG;
818 *_retval = PR_TRUE;
819 // You can use a named parameter more than once in a statement...
820 int count = sqlite3_bind_parameter_count(stmt);
821 for (int i = 0; (i < count) && (*_retval); i++) {
822 // sqlite indices start at 1
823 const char *pName = sqlite3_bind_parameter_name(stmt, i + 1);
824 if (name.Equals(pName))
825 *_retval = JSValStorageStatementBinder(cx, mStatement, i, *vp);
827 } else {
828 *_retval = PR_FALSE;
831 return (*_retval) ? NS_OK : NS_ERROR_INVALID_ARG;
834 /* void preCreate (in nsISupports nativeObj, in JSContextPtr cx, in JSObjectPtr globalObj, out JSObjectPtr parentObj); */
835 NS_IMETHODIMP
836 mozStorageStatementParams::PreCreate(nsISupports *nativeObj, JSContext * cx,
837 JSObject * globalObj, JSObject * *parentObj)
839 return NS_ERROR_NOT_IMPLEMENTED;
842 /* void create (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
843 NS_IMETHODIMP
844 mozStorageStatementParams::Create(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj)
846 return NS_ERROR_NOT_IMPLEMENTED;
849 /* void postCreate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
850 NS_IMETHODIMP
851 mozStorageStatementParams::PostCreate(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj)
853 return NS_ERROR_NOT_IMPLEMENTED;
856 /* PRBool addProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
857 NS_IMETHODIMP
858 mozStorageStatementParams::AddProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
859 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
861 return NS_ERROR_NOT_IMPLEMENTED;
864 /* PRBool delProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in JSValPtr vp); */
865 NS_IMETHODIMP
866 mozStorageStatementParams::DelProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
867 JSObject * obj, jsval id, jsval * vp, PRBool *_retval)
869 return NS_ERROR_NOT_IMPLEMENTED;
872 /* PRBool enumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
873 NS_IMETHODIMP
874 mozStorageStatementParams::Enumerate(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
875 JSObject * obj, PRBool *_retval)
877 return NS_ERROR_NOT_IMPLEMENTED;
880 /* PRBool newEnumerate (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 enum_op, in JSValPtr statep, out JSID idp); */
881 NS_IMETHODIMP
882 mozStorageStatementParams::NewEnumerate(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
883 JSObject * obj, PRUint32 enum_op, jsval * statep, jsid *idp, PRBool *_retval)
885 return NS_ERROR_NOT_IMPLEMENTED;
888 /* PRBool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 flags, out JSObjectPtr objp); */
889 NS_IMETHODIMP
890 mozStorageStatementParams::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
891 JSObject * obj, jsval id, PRUint32 flags, JSObject * *objp, PRBool *_retval)
893 int idx = -1;
895 if (JSVAL_IS_INT(id)) {
896 idx = JSVAL_TO_INT(id);
897 } else if (JSVAL_IS_STRING(id)) {
898 JSString *str = JSVAL_TO_STRING(id);
899 nsCAutoString name(":");
900 name.Append(NS_ConvertUTF16toUTF8(nsDependentString((PRUnichar *)::JS_GetStringChars(str),
901 ::JS_GetStringLength(str))));
903 // check to see if there's a parameter with this name
904 idx = sqlite3_bind_parameter_index(mStatement->GetNativeStatementPointer(), name.get());
905 if (idx == 0) {
906 // nope.
907 fprintf (stderr, "********** mozStorageStatementWrapper: Couldn't find parameter %s\n", name.get());
908 *_retval = PR_FALSE;
909 return NS_OK;
910 } else {
911 // set idx, so that the numbered property also gets defined
912 idx = idx - 1;
915 PRBool success = ::JS_DefineUCProperty(cx, obj, ::JS_GetStringChars(str),
916 ::JS_GetStringLength(str),
917 JSVAL_VOID,
918 nsnull, nsnull, 0);
919 if (!success) {
920 *_retval = PR_FALSE;
921 return NS_ERROR_FAILURE;
925 if (idx == -1) {
926 *_retval = PR_FALSE;
927 return NS_ERROR_FAILURE;
930 // is it out of range?
931 if (idx < 0 || idx >= (int)mParamCount) {
932 *_retval = PR_FALSE;
933 return NS_OK;
936 *_retval = ::JS_DefineElement(cx, obj, idx, JSVAL_VOID, nsnull, nsnull, 0);
937 if (*_retval)
938 *objp = obj;
939 return NS_OK;
942 /* PRBool convert (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 type, in JSValPtr vp); */
943 NS_IMETHODIMP
944 mozStorageStatementParams::Convert(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
945 JSObject * obj, PRUint32 type, jsval * vp, PRBool *_retval)
947 return NS_ERROR_NOT_IMPLEMENTED;
950 /* void finalize (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
951 NS_IMETHODIMP
952 mozStorageStatementParams::Finalize(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
953 JSObject * obj)
955 return NS_ERROR_NOT_IMPLEMENTED;
958 /* PRBool checkAccess (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal id, in PRUint32 mode, in JSValPtr vp); */
959 NS_IMETHODIMP
960 mozStorageStatementParams::CheckAccess(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
961 JSObject * obj, jsval id, PRUint32 mode, jsval * vp, PRBool *_retval)
963 return NS_ERROR_NOT_IMPLEMENTED;
966 /* PRBool call (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
967 NS_IMETHODIMP
968 mozStorageStatementParams::Call(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
969 JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
971 return NS_ERROR_NOT_IMPLEMENTED;
974 /* PRBool construct (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in PRUint32 argc, in JSValPtr argv, in JSValPtr vp); */
975 NS_IMETHODIMP
976 mozStorageStatementParams::Construct(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
977 JSObject * obj, PRUint32 argc, jsval * argv, jsval * vp, PRBool *_retval)
979 return NS_ERROR_NOT_IMPLEMENTED;
982 /* PRBool hasInstance (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal val, out PRBool bp); */
983 NS_IMETHODIMP
984 mozStorageStatementParams::HasInstance(nsIXPConnectWrappedNative *wrapper, JSContext * cx,
985 JSObject * obj, jsval val, PRBool *bp, PRBool *_retval)
987 return NS_ERROR_NOT_IMPLEMENTED;
990 /* void trace (in nsIXPConnectWrappedNative wrapper, in JSTracerPtr trc, in JSObjectPtr obj); */
991 NS_IMETHODIMP
992 mozStorageStatementParams::Trace(nsIXPConnectWrappedNative *wrapper,
993 JSTracer *trc, JSObject * obj)
995 return NS_ERROR_NOT_IMPLEMENTED;
998 /* PRBool equality(in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in JSVal val); */
999 NS_IMETHODIMP
1000 mozStorageStatementParams::Equality(nsIXPConnectWrappedNative *wrapper,
1001 JSContext *cx, JSObject *obj, jsval val,
1002 PRBool *_retval)
1004 return NS_ERROR_NOT_IMPLEMENTED;
1007 /* JSObjectPtr outerObject(in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
1008 NS_IMETHODIMP
1009 mozStorageStatementParams::OuterObject(nsIXPConnectWrappedNative *wrapper,
1010 JSContext *cx, JSObject *obj,
1011 JSObject **_retval)
1013 return NS_ERROR_NOT_IMPLEMENTED;
1016 /* JSObjectPtr innerObject(in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj); */
1017 NS_IMETHODIMP
1018 mozStorageStatementParams::InnerObject(nsIXPConnectWrappedNative *wrapper,
1019 JSContext *cx, JSObject *obj,
1020 JSObject **_retval)
1022 return NS_ERROR_NOT_IMPLEMENTED;