| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -35,11 +35,14 @@ using v8::HandleScope; | |||
| 35 | 35 | using v8::Int32; | |
| 36 | 36 | using v8::Integer; | |
| 37 | 37 | using v8::Isolate; | |
| 38 | + using v8::JustVoid; | ||
| 38 | 39 | using v8::Local; | |
| 39 | 40 | using v8::LocalVector; | |
| 41 | + using v8::Maybe; | ||
| 40 | 42 | using v8::MaybeLocal; | |
| 41 | 43 | using v8::Name; | |
| 42 | 44 | using v8::NewStringType; | |
| 45 | + using v8::Nothing; | ||
| 43 | 46 | using v8::Null; | |
| 44 | 47 | using v8::Number; | |
| 45 | 48 | using v8::Object; | |
@@ -2009,6 +2012,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) { | |||
| 2009 | 2012 | ||
| 2010 | 2013 | void StatementSync::MemoryInfo(MemoryTracker* tracker) const {} | |
| 2011 | 2014 | ||
| 2015 | + Maybe<void> ExtractRowValues(Isolate* isolate, | ||
| 2016 | + int num_cols, | ||
| 2017 | + StatementSync* stmt, | ||
| 2018 | + LocalVector<Value>* row_values) { | ||
| 2019 | + row_values->clear(); | ||
| 2020 | + row_values->reserve(num_cols); | ||
| 2021 | + for (int i = 0; i < num_cols; ++i) { | ||
| 2022 | + Local<Value> val; | ||
| 2023 | + if (!stmt->ColumnToValue(i).ToLocal(&val)) return Nothing<void>(); | ||
| 2024 | + row_values->emplace_back(val); | ||
| 2025 | + } | ||
| 2026 | + return JustVoid(); | ||
| 2027 | + } | ||
| 2028 | + | ||
| 2012 | 2029 | void StatementSync::All(const FunctionCallbackInfo<Value>& args) { | |
| 2013 | 2030 | StatementSync* stmt; | |
| 2014 | 2031 | ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This()); | |
@@ -2026,24 +2043,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) { | |||
| 2026 | 2043 | auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt->statement_); }); | |
| 2027 | 2044 | int num_cols = sqlite3_column_count(stmt->statement_); | |
| 2028 | 2045 | LocalVector<Value> rows(isolate); | |
| 2046 | + LocalVector<Value> row_values(isolate); | ||
| 2047 | + LocalVector<Name> row_keys(isolate); | ||
| 2029 | 2048 | ||
| 2030 | - if (stmt->return_arrays_) { | ||
| 2031 | - while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) { | ||
| 2032 | - LocalVector<Value> array_values(isolate); | ||
| 2033 | - array_values.reserve(num_cols); | ||
| 2034 | - for (int i = 0; i < num_cols; ++i) { | ||
| 2035 | - Local<Value> val; | ||
| 2036 | - if (!stmt->ColumnToValue(i).ToLocal(&val)) return; | ||
| 2037 | - array_values.emplace_back(val); | ||
| 2038 | - } | ||
| 2049 | + while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) { | ||
| 2050 | + auto maybe_row_values = | ||
| 2051 | + ExtractRowValues(env->isolate(), num_cols, stmt, &row_values); | ||
| 2052 | + if (maybe_row_values.IsNothing()) return; | ||
| 2053 | + | ||
| 2054 | + if (stmt->return_arrays_) { | ||
| 2039 | 2055 | Local<Array> row_array = | |
| 2040 | - Array::New(isolate, array_values.data(), array_values.size()); | ||
| 2056 | + Array::New(isolate, row_values.data(), row_values.size()); | ||
| 2041 | 2057 | rows.emplace_back(row_array); | |
| 2042 | - } | ||
| 2043 | - } else { | ||
| 2044 | - LocalVector<Name> row_keys(isolate); | ||
| 2045 | - | ||
| 2046 | - while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) { | ||
| 2058 | + } else { | ||
| 2047 | 2059 | if (row_keys.size() == 0) { | |
| 2048 | 2060 | row_keys.reserve(num_cols); | |
| 2049 | 2061 | for (int i = 0; i < num_cols; ++i) { | |
@@ -2053,14 +2065,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) { | |||
| 2053 | 2065 | } | |
| 2054 | 2066 | } | |
| 2055 | 2067 | ||
| 2056 | - LocalVector<Value> row_values(isolate); | ||
| 2057 | - row_values.reserve(num_cols); | ||
| 2058 | - for (int i = 0; i < num_cols; ++i) { | ||
| 2059 | - Local<Value> val; | ||
| 2060 | - if (!stmt->ColumnToValue(i).ToLocal(&val)) return; | ||
| 2061 | - row_values.emplace_back(val); | ||
| 2062 | - } | ||
| 2063 | - | ||
| 2064 | 2068 | DCHECK_EQ(row_keys.size(), row_values.size()); | |
| 2065 | 2069 | Local<Object> row_obj = Object::New( | |
| 2066 | 2070 | isolate, Null(isolate), row_keys.data(), row_values.data(), num_cols); | |
@@ -2538,28 +2542,21 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) { | |||
| 2538 | 2542 | ||
| 2539 | 2543 | int num_cols = sqlite3_column_count(iter->stmt_->statement_); | |
| 2540 | 2544 | Local<Value> row_value; | |
| 2545 | + LocalVector<Name> row_keys(isolate); | ||
| 2546 | + LocalVector<Value> row_values(isolate); | ||
| 2547 | + | ||
| 2548 | + auto maybe_row_values = | ||
| 2549 | + ExtractRowValues(isolate, num_cols, iter->stmt_.get(), &row_values); | ||
| 2550 | + if (maybe_row_values.IsNothing()) return; | ||
| 2541 | 2551 | ||
| 2542 | 2552 | if (iter->stmt_->return_arrays_) { | |
| 2543 | - LocalVector<Value> array_values(isolate); | ||
| 2544 | - array_values.reserve(num_cols); | ||
| 2545 | - for (int i = 0; i < num_cols; ++i) { | ||
| 2546 | - Local<Value> val; | ||
| 2547 | - if (!iter->stmt_->ColumnToValue(i).ToLocal(&val)) return; | ||
| 2548 | - array_values.emplace_back(val); | ||
| 2549 | - } | ||
| 2550 | - row_value = Array::New(isolate, array_values.data(), array_values.size()); | ||
| 2553 | + row_value = Array::New(isolate, row_values.data(), row_values.size()); | ||
| 2551 | 2554 | } else { | |
| 2552 | - LocalVector<Name> row_keys(isolate); | ||
| 2553 | - LocalVector<Value> row_values(isolate); | ||
| 2554 | 2555 | row_keys.reserve(num_cols); | |
| 2555 | - row_values.reserve(num_cols); | ||
| 2556 | 2556 | for (int i = 0; i < num_cols; ++i) { | |
| 2557 | 2557 | Local<Name> key; | |
| 2558 | 2558 | if (!iter->stmt_->ColumnNameToName(i).ToLocal(&key)) return; | |
| 2559 | - Local<Value> val; | ||
| 2560 | - if (!iter->stmt_->ColumnToValue(i).ToLocal(&val)) return; | ||
| 2561 | 2559 | row_keys.emplace_back(key); | |
| 2562 | - row_values.emplace_back(val); | ||
| 2563 | 2560 | } | |
| 2564 | 2561 | ||
| 2565 | 2562 | DCHECK_EQ(row_keys.size(), row_values.size()); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -173,6 +173,8 @@ class StatementSync : public BaseObject { | |||
| 173 | 173 | const v8::FunctionCallbackInfo<v8::Value>& args); | |
| 174 | 174 | static void SetReadBigInts(const v8::FunctionCallbackInfo<v8::Value>& args); | |
| 175 | 175 | static void SetReturnArrays(const v8::FunctionCallbackInfo<v8::Value>& args); | |
| 176 | + v8::MaybeLocal<v8::Value> ColumnToValue(const int column); | ||
| 177 | + v8::MaybeLocal<v8::Name> ColumnNameToName(const int column); | ||
| 176 | 178 | void Finalize(); | |
| 177 | 179 | bool IsFinalized(); | |
| 178 | 180 | ||
@@ -190,8 +192,6 @@ class StatementSync : public BaseObject { | |||
| 190 | 192 | std::optional<std::map<std::string, std::string>> bare_named_params_; | |
| 191 | 193 | bool BindParams(const v8::FunctionCallbackInfo<v8::Value>& args); | |
| 192 | 194 | bool BindValue(const v8::Local<v8::Value>& value, const int index); | |
| 193 | - v8::MaybeLocal<v8::Value> ColumnToValue(const int column); | ||
| 194 | - v8::MaybeLocal<v8::Name> ColumnNameToName(const int column); | ||
| 195 | 195 | ||
| 196 | 196 | friend class StatementSyncIterator; | |
| 197 | 197 | }; | |
| Back | FazBrowse Home | New Git URL |
0 commit comments