diff --git a/src/better_sqlite3.cpp b/src/better_sqlite3.cpp index 6c56f95..a7eedc2 100644 --- a/src/better_sqlite3.cpp +++ b/src/better_sqlite3.cpp @@ -2102,22 +2102,26 @@ namespace Data v8::Local GetFlatRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints) #line 80 "./src/util/data.lzz" { - v8::Local row = v8::Object::New(isolate); int column_count = sqlite3_column_count(handle); + std::vector> keys; + std::vector> values; + keys.reserve(column_count); + values.reserve(column_count); + for (int i = 0; i < column_count; ++i) { - row->Set(ctx, - InternalizedFromUtf8(isolate, sqlite3_column_name(handle, i), -1), - Data::GetValueJS(isolate, handle, i, safe_ints)).FromJust(); + keys.emplace_back(InternalizedFromUtf8(isolate, sqlite3_column_name(handle, i), -1)); + values.emplace_back(Data::GetValueJS(isolate, handle, i, safe_ints)); } - return row; + + return v8::Object::New(isolate, v8::Null(isolate), keys.data(), values.data(), column_count); } } #line 65 "./src/util/data.lzz" namespace Data { -#line 91 "./src/util/data.lzz" +#line 95 "./src/util/data.lzz" v8::Local GetExpandedRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints) -#line 91 "./src/util/data.lzz" +#line 95 "./src/util/data.lzz" { v8::Local row = v8::Object::New(isolate); int column_count = sqlite3_column_count(handle); @@ -2140,9 +2144,9 @@ namespace Data #line 65 "./src/util/data.lzz" namespace Data { -#line 110 "./src/util/data.lzz" +#line 114 "./src/util/data.lzz" v8::Local GetRawRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints) -#line 110 "./src/util/data.lzz" +#line 114 "./src/util/data.lzz" { v8::Local row = v8::Array::New(isolate); int column_count = sqlite3_column_count(handle); @@ -2155,9 +2159,9 @@ namespace Data #line 65 "./src/util/data.lzz" namespace Data { -#line 119 "./src/util/data.lzz" +#line 123 "./src/util/data.lzz" v8::Local GetRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints, char mode) -#line 119 "./src/util/data.lzz" +#line 123 "./src/util/data.lzz" { if (mode == FLAT) return GetFlatRowJS(isolate, ctx, handle, safe_ints); if (mode == PLUCK) return GetValueJS(isolate, handle, 0, safe_ints); @@ -2170,9 +2174,9 @@ namespace Data #line 65 "./src/util/data.lzz" namespace Data { -#line 128 "./src/util/data.lzz" +#line 132 "./src/util/data.lzz" void GetArgumentsJS (v8::Isolate * isolate, v8::Local * out, sqlite3_value * * values, int argument_count, bool safe_ints) -#line 128 "./src/util/data.lzz" +#line 132 "./src/util/data.lzz" { assert(argument_count > 0); for (int i = 0; i < argument_count; ++i) { @@ -2183,9 +2187,9 @@ namespace Data #line 65 "./src/util/data.lzz" namespace Data { -#line 135 "./src/util/data.lzz" +#line 139 "./src/util/data.lzz" int BindValueFromJS (v8::Isolate * isolate, sqlite3_stmt * handle, int index, v8::Local value) -#line 135 "./src/util/data.lzz" +#line 139 "./src/util/data.lzz" { if ( value -> IsNumber ( ) ) { return sqlite3_bind_double ( handle , index , value . As < v8 :: Number > ( ) -> Value ( ) ) ; } else if ( value -> IsBigInt ( ) ) { bool lossless ; int64_t v = value . As < v8 :: BigInt > ( ) -> Int64Value ( & lossless ) ; if ( lossless ) { return sqlite3_bind_int64 ( handle , index , v ) ; } } else if ( value -> IsString ( ) ) { v8 :: String :: Utf8Value utf8 ( isolate , value . As < v8 :: String > ( ) ) ; return sqlite3_bind_text ( handle , index , * utf8 , utf8 . length ( ) , SQLITE_TRANSIENT ) ; } else if ( node :: Buffer :: HasInstance ( value ) ) { const char * data = node :: Buffer :: Data ( value ) ; return sqlite3_bind_blob ( handle , index , data ? data : "" , node :: Buffer :: Length ( value ) , SQLITE_TRANSIENT ) ; } else if ( value -> IsNull ( ) || value -> IsUndefined ( ) ) { return sqlite3_bind_null ( handle , index ) ; } ; return value->IsBigInt() ? SQLITE_TOOBIG : -1; @@ -2194,9 +2198,9 @@ namespace Data #line 65 "./src/util/data.lzz" namespace Data { -#line 140 "./src/util/data.lzz" +#line 144 "./src/util/data.lzz" void ResultValueFromJS (v8::Isolate * isolate, sqlite3_context * invocation, v8::Local value, DataConverter * converter) -#line 140 "./src/util/data.lzz" +#line 144 "./src/util/data.lzz" { if ( value -> IsNumber ( ) ) { return sqlite3_result_double ( invocation , value . As < v8 :: Number > ( ) -> Value ( ) ) ; } else if ( value -> IsBigInt ( ) ) { bool lossless ; int64_t v = value . As < v8 :: BigInt > ( ) -> Int64Value ( & lossless ) ; if ( lossless ) { return sqlite3_result_int64 ( invocation , v ) ; } } else if ( value -> IsString ( ) ) { v8 :: String :: Utf8Value utf8 ( isolate , value . As < v8 :: String > ( ) ) ; return sqlite3_result_text ( invocation , * utf8 , utf8 . length ( ) , SQLITE_TRANSIENT ) ; } else if ( node :: Buffer :: HasInstance ( value ) ) { const char * data = node :: Buffer :: Data ( value ) ; return sqlite3_result_blob ( invocation , data ? data : "" , node :: Buffer :: Length ( value ) , SQLITE_TRANSIENT ) ; } else if ( value -> IsNull ( ) || value -> IsUndefined ( ) ) { return sqlite3_result_null ( invocation ) ; } ; converter->ThrowDataConversionError(invocation, value->IsBigInt()); diff --git a/src/better_sqlite3.hpp b/src/better_sqlite3.hpp index 132471a..0ec6bf1 100644 --- a/src/better_sqlite3.hpp +++ b/src/better_sqlite3.hpp @@ -782,37 +782,37 @@ namespace Data #line 65 "./src/util/data.lzz" namespace Data { -#line 91 "./src/util/data.lzz" +#line 95 "./src/util/data.lzz" v8::Local GetExpandedRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints); } #line 65 "./src/util/data.lzz" namespace Data { -#line 110 "./src/util/data.lzz" +#line 114 "./src/util/data.lzz" v8::Local GetRawRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints); } #line 65 "./src/util/data.lzz" namespace Data { -#line 119 "./src/util/data.lzz" +#line 123 "./src/util/data.lzz" v8::Local GetRowJS (v8::Isolate * isolate, v8::Local ctx, sqlite3_stmt * handle, bool safe_ints, char mode); } #line 65 "./src/util/data.lzz" namespace Data { -#line 128 "./src/util/data.lzz" +#line 132 "./src/util/data.lzz" void GetArgumentsJS (v8::Isolate * isolate, v8::Local * out, sqlite3_value * * values, int argument_count, bool safe_ints); } #line 65 "./src/util/data.lzz" namespace Data { -#line 135 "./src/util/data.lzz" +#line 139 "./src/util/data.lzz" int BindValueFromJS (v8::Isolate * isolate, sqlite3_stmt * handle, int index, v8::Local value); } #line 65 "./src/util/data.lzz" namespace Data { -#line 140 "./src/util/data.lzz" +#line 144 "./src/util/data.lzz" void ResultValueFromJS (v8::Isolate * isolate, sqlite3_context * invocation, v8::Local value, DataConverter * converter); } #line 1 "./src/util/binder.lzz" diff --git a/src/util/data.lzz b/src/util/data.lzz index 5b3ce5d..d3b49d3 100644 --- a/src/util/data.lzz +++ b/src/util/data.lzz @@ -78,14 +78,18 @@ namespace Data { } v8::Local GetFlatRowJS(v8::Isolate* isolate, v8::Local ctx, sqlite3_stmt* handle, bool safe_ints) { - v8::Local row = v8::Object::New(isolate); int column_count = sqlite3_column_count(handle); + std::vector> keys; + std::vector> values; + keys.reserve(column_count); + values.reserve(column_count); + for (int i = 0; i < column_count; ++i) { - row->Set(ctx, - InternalizedFromUtf8(isolate, sqlite3_column_name(handle, i), -1), - Data::GetValueJS(isolate, handle, i, safe_ints)).FromJust(); + keys.emplace_back(InternalizedFromUtf8(isolate, sqlite3_column_name(handle, i), -1)); + values.emplace_back(Data::GetValueJS(isolate, handle, i, safe_ints)); } - return row; + + return v8::Object::New(isolate, v8::Null(isolate), keys.data(), values.data(), column_count); } v8::Local GetExpandedRowJS(v8::Isolate* isolate, v8::Local ctx, sqlite3_stmt* handle, bool safe_ints) {