Index: gears/database2/transaction.cc =================================================================== --- gears/database2/transaction.cc (revision 1639) +++ gears/database2/transaction.cc (working copy) @@ -88,17 +88,17 @@ void Database2Transaction::ExecuteSql(JsCallContext *context) { std::string16 sql_statement; - JsArray sql_arguments; - JsRootedCallback *callback = NULL; - JsRootedCallback *error_callback = NULL; + scoped_ptr sql_arguments(new JsArray()); + scoped_ptr callback; + scoped_ptr error_callback; JsArgument argv[] = { { JSPARAM_REQUIRED, JSPARAM_STRING16, &sql_statement }, - { JSPARAM_OPTIONAL, JSPARAM_ARRAY, &sql_arguments}, - { JSPARAM_OPTIONAL, JSPARAM_FUNCTION, &callback }, - { JSPARAM_OPTIONAL, JSPARAM_FUNCTION, &error_callback } + { JSPARAM_OPTIONAL, JSPARAM_ARRAY, sql_arguments.get() }, + { JSPARAM_OPTIONAL, JSPARAM_FUNCTION, callback.get() }, + { JSPARAM_OPTIONAL, JSPARAM_FUNCTION, error_callback.get() } }; - context->GetArguments(ARRAYSIZE(argv), argv); + int argc = context->GetArguments(ARRAYSIZE(argv), argv); if (context->is_exception_set()) return; if (!is_open_) { @@ -106,9 +106,21 @@ return; } + // if any of the arguments are not supplied or null, send them to statement + // factory as NULL + if (argc < 2 || JsTokenIsNullOrUndefined(sql_arguments->token())) { + sql_arguments.reset(NULL); + } + if (argc < 3 || JsTokenIsNullOrUndefined(callback->token())) { + callback.reset(NULL); + } + if (argc < 4 || JsTokenIsNullOrUndefined(error_callback->token())) { + error_callback.reset(NULL); + } + Database2Statement *statement; - if (!Database2Statement::Create(sql_statement, sql_arguments, callback, - error_callback, &statement)) { + if (!Database2Statement::Create(sql_statement, sql_arguments.get(), + callback.release(), error_callback.release(), &statement)) { context->SetException(GET_INTERNAL_ERROR_MESSAGE()); return; }