Skip to content

Commit 20b4999

Browse files
committed
fix: Avoid a bunch of heap allocations (shared_ptr/unique_ptr)
1 parent 2c97c76 commit 20b4999

File tree

5 files changed

+20
-31
lines changed

5 files changed

+20
-31
lines changed

package/cpp/operations.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <cmath>
66
#include <ctime>
77
#include <iostream>
8+
#include <optional>
89
#include <map>
910
#include <sqlite3.h>
1011
#include <sstream>
@@ -143,8 +144,8 @@ SQLiteExecuteQueryResult sqliteExecute(const std::string& dbName, const std::str
143144
std::string column_name;
144145
ColumnType column_declared_type;
145146
SQLiteQueryResultRow row;
146-
auto results = std::make_unique<SQLiteQueryResults>();
147-
auto metadata = new SQLiteQueryTableMetadata();
147+
SQLiteQueryResults results;
148+
std::optional<SQLiteQueryTableMetadata> metadata = std::nullopt();
148149

149150
while (isConsuming) {
150151
result = sqlite3_step(statement);
@@ -192,7 +193,7 @@ SQLiteExecuteQueryResult sqliteExecute(const std::string& dbName, const std::str
192193
}
193194
i++;
194195
}
195-
results->push_back(std::move(row));
196+
results.push_back(std::move(row));
196197
break;
197198
case SQLITE_DONE:
198199
i = 0;
@@ -202,7 +203,11 @@ SQLiteExecuteQueryResult sqliteExecute(const std::string& dbName, const std::str
202203
const char* tp = sqlite3_column_decltype(statement, i);
203204
column_declared_type = mapSQLiteTypeToColumnType(tp);
204205
auto columnMeta = SQLiteQueryColumnMetadata(std::move(column_name), std::move(column_declared_type), i);
205-
metadata->insert({column_name, columnMeta});
206+
207+
if (!metadata) {
208+
metadata = std::make_optional<SQLiteQueryTableMetadata>();
209+
}
210+
metadata.insert({column_name, columnMeta});
206211
i++;
207212
}
208213
isConsuming = false;
@@ -221,16 +226,11 @@ SQLiteExecuteQueryResult sqliteExecute(const std::string& dbName, const std::str
221226

222227
int rowsAffected = sqlite3_changes(db);
223228
long long latestInsertRowId = sqlite3_last_insert_rowid(db);
224-
auto meta = std::make_unique<std::optional<SQLiteQueryTableMetadata>>(
225-
metadata && metadata->size() > 0
226-
? std::make_optional(std::move(*metadata))
227-
: std::nullopt
228-
);
229229
return {
230230
.rowsAffected = rowsAffected,
231231
.insertId = static_cast<double>(latestInsertRowId),
232232
.results = std::move(results),
233-
.metadata = std::move(meta)
233+
.metadata = std::move(metadata)
234234
};
235235
}
236236

package/cpp/specs/HybridNativeQueryResult.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33
namespace margelo::nitro::rnnitrosqlite {
44

55
std::optional<double> HybridNativeQueryResult::getInsertId() {
6-
return this->_insertId;
6+
return _result.insertId;
77
}
88

99
double HybridNativeQueryResult::getRowsAffected() {
10-
return this->_rowsAffected;
10+
return _result.rowsAffected;
1111
}
1212

1313
SQLiteQueryResults HybridNativeQueryResult::getResults() {
14-
return this->_results;
14+
return _result.results;
1515
};
1616

1717
std::optional<SQLiteQueryTableMetadata> HybridNativeQueryResult::getMetadata() {
18-
return this->_metadata;
18+
return _result.metadata;
1919
}
2020

2121
} // namespace margelo::nitro::rnnitrosqlite

package/cpp/specs/HybridNativeQueryResult.hpp

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,16 @@ namespace margelo::nitro::rnnitrosqlite {
1111
class HybridNativeQueryResult : public HybridNativeQueryResultSpec {
1212
public:
1313
HybridNativeQueryResult() : HybridObject(TAG) {}
14-
HybridNativeQueryResult(std::optional<double> insertId, int rowsAffected, SQLiteQueryResults& results, std::optional<SQLiteQueryTableMetadata>& metadata)
15-
: HybridObject(TAG),
16-
_insertId(insertId),
17-
_rowsAffected(rowsAffected),
18-
_results(std::move(results)),
19-
_metadata(std::move(metadata)) {}
14+
HybridNativeQueryResult(SQLiteExecuteQueryResult&& result): _result(std::move(result)) {}
2015

2116
private:
22-
std::optional<double> _insertId;
23-
int _rowsAffected;
24-
SQLiteQueryResults _results;
25-
std::optional<SQLiteQueryTableMetadata> _metadata;
17+
SQLiteExecuteQueryResult _result;
2618

2719
public:
2820
// Properties
29-
std::optional<double> getInsertId() override;
30-
21+
double getInsertId() override;
3122
double getRowsAffected() override;
32-
3323
SQLiteQueryResults getResults() override;
34-
3524
std::optional<SQLiteQueryTableMetadata> getMetadata() override;
3625
};
3726

package/cpp/specs/HybridNitroSQLite.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ using ExecuteQueryResult = std::shared_ptr<HybridNativeQueryResultSpec>;
5454

5555
ExecuteQueryResult HybridNitroSQLite::execute(const std::string& dbName, const std::string& query,
5656
const std::optional<SQLiteQueryParams>& params) {
57-
auto result = sqliteExecute(dbName, query, params);
58-
return std::make_shared<HybridNativeQueryResult>(result.insertId, result.rowsAffected, *result.results, *result.metadata);
57+
SQLiteExecuteQueryResult result = sqliteExecute(dbName, query, params);
58+
return std::make_shared<HybridNativeQueryResult>(std::move(result));
5959
};
6060

6161
std::shared_ptr<Promise<std::shared_ptr<HybridNativeQueryResultSpec>>> HybridNitroSQLite::executeAsync(const std::string& dbName, const std::string& query,

package/src/specs/NativeQueryResult.nitro.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import type { ColumnType, SQLiteValue } from '../types'
1414
export interface NativeQueryResult
1515
extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
1616
readonly rowsAffected: number
17-
readonly insertId?: number
17+
readonly insertId: number
1818

1919
/** Query results */
2020
readonly results: NativeSQLiteQueryResults

0 commit comments

Comments
 (0)