diff --git a/cpp/OPUtils.cpp b/cpp/OPUtils.cpp index 3513d629..f62f7e10 100644 --- a/cpp/OPUtils.cpp +++ b/cpp/OPUtils.cpp @@ -9,7 +9,6 @@ #include "OPMacros.hpp" #include #include -#include #include namespace opsqlite { @@ -17,37 +16,6 @@ namespace opsqlite { namespace jsi = facebook::jsi; namespace react = facebook::react; -namespace { - -// "rowsAffected"/"insertId"/"rows" are set on every execute() result -// regardless of query, so their PropNameIDs are worth caching the same way -// column_prop_ids are reused across rows -- except these are reused across -// *calls* too. PropNameID is a handle scoped to the jsi::Runtime that -// created it, and runtime "generations" can briefly overlap during a -// bridgeless reload (see OPTypes.hpp), so the cache is keyed by Runtime* -// rather than a single global. thread_local because JSI runtime access is -// always confined to one thread at a time; no lock needed. -struct ResultPropNames { - jsi::PropNameID rowsAffected; - jsi::PropNameID insertId; - jsi::PropNameID rows; -}; - -ResultPropNames &result_prop_names(jsi::Runtime &rt) { - static thread_local std::unordered_map cache; - auto it = cache.find(&rt); - if (it != cache.end()) { - return it->second; - } - auto [inserted, _] = cache.emplace( - &rt, ResultPropNames{jsi::PropNameID::forAscii(rt, "rowsAffected"), - jsi::PropNameID::forAscii(rt, "insertId"), - jsi::PropNameID::forAscii(rt, "rows")}); - return inserted->second; -} - -} // namespace - jsi::Value to_jsi(jsi::Runtime &rt, const JSVariant &value) { if (std::holds_alternative(value)) { return std::get(value); @@ -210,19 +178,18 @@ std::vector to_variant_vec(jsi::Runtime &rt, jsi::Value const &xs) { } jsi::Value create_js_rows(jsi::Runtime &rt, const BridgeResult &status) { - auto &prop_names = result_prop_names(rt); jsi::Object res = jsi::Object(rt); - res.setProperty(rt, prop_names.rowsAffected, status.affectedRows); + res.setProperty(rt, "rowsAffected", status.affectedRows); if (status.affectedRows > 0 && status.insertId != 0) { - res.setProperty(rt, prop_names.insertId, jsi::Value(status.insertId)); + res.setProperty(rt, "insertId", jsi::Value(status.insertId)); } size_t row_count = status.rows.size(); size_t column_count = status.column_names.size(); if (row_count == 0) { - res.setProperty(rt, prop_names.rows, jsi::Array(rt, 0)); + res.setProperty(rt, "rows", jsi::Array(rt, 0)); return res; } @@ -241,7 +208,7 @@ jsi::Value create_js_rows(jsi::Runtime &rt, const BridgeResult &status) { } rows.setValueAtIndex(rt, i, std::move(row)); } - res.setProperty(rt, prop_names.rows, std::move(rows)); + res.setProperty(rt, "rows", std::move(rows)); return res; } @@ -250,12 +217,11 @@ jsi::Value create_result(jsi::Runtime &rt, const BridgeResult &status, std::vector *results, std::shared_ptr> metadata) { - auto &prop_names = result_prop_names(rt); jsi::Object res = jsi::Object(rt); - res.setProperty(rt, prop_names.rowsAffected, status.affectedRows); + res.setProperty(rt, "rowsAffected", status.affectedRows); if (status.affectedRows > 0 && status.insertId != 0) { - res.setProperty(rt, prop_names.insertId, jsi::Value(status.insertId)); + res.setProperty(rt, "insertId", jsi::Value(status.insertId)); } size_t rowCount = results->size(); @@ -267,7 +233,7 @@ create_result(jsi::Runtime &rt, const BridgeResult &status, jsi::Object::createFromHostObject( rt, std::make_shared(obj))); } - res.setProperty(rt, prop_names.rows, std::move(array)); + res.setProperty(rt, "rows", std::move(array)); size_t column_count = metadata->size(); auto column_array = jsi::Array(rt, column_count); @@ -286,7 +252,6 @@ create_result(jsi::Runtime &rt, const BridgeResult &status, jsi::Value create_raw_result(jsi::Runtime &rt, const BridgeResult &status, const std::vector> *results) { - auto &prop_names = result_prop_names(rt); size_t row_count = results->size(); jsi::Object res(rt); jsi::Array raw_rows = jsi::Array(rt, row_count); @@ -306,8 +271,8 @@ create_raw_result(jsi::Runtime &rt, const BridgeResult &status, rt, i, jsi::String::createFromUtf8(rt, status.column_names.at(i))); } - res.setProperty(rt, prop_names.rowsAffected, status.affectedRows); - res.setProperty(rt, prop_names.insertId, status.insertId); + res.setProperty(rt, "rowsAffected", status.affectedRows); + res.setProperty(rt, "insertId", status.insertId); res.setProperty(rt, "rawRows", std::move(raw_rows)); res.setProperty(rt, "columnNames", std::move(column_names));