Skip to content

Commit fcf2b31

Browse files
committed
Revert other changes
1 parent 56c3b59 commit fcf2b31

6 files changed

Lines changed: 66 additions & 7 deletions

File tree

packages/capacitor/src/adapter/CapacitorSQLiteAdapter.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,19 @@ export class CapacitorSQLiteAdapter extends DBAdapter {
215215
return result.rows?._array ?? ([] as T[]);
216216
};
217217

218+
const getOptional = async <T>(query: string, params?: any[]): Promise<T | null> => {
219+
const results = await getAll<T>(query, params);
220+
return results.length > 0 ? results[0] : null;
221+
};
222+
223+
const get = async <T>(query: string, params?: any[]): Promise<T> => {
224+
const result = await getOptional<T>(query, params);
225+
if (!result) {
226+
throw new Error(`No results for query: ${query}`);
227+
}
228+
return result;
229+
};
230+
218231
const executeRaw = async (query: string, params?: any[]): Promise<RawQueryResult> => {
219232
// This is a workaround, we don't support multiple columns of the same name
220233
const { insertId, rowsAffected, rows } = await execute(query, params);
@@ -256,6 +269,14 @@ export class CapacitorSQLiteAdapter extends DBAdapter {
256269
return getAll(sql, parameters);
257270
}
258271

272+
get<T>(sql: string, parameters?: any[]): Promise<T> {
273+
return get(sql, parameters);
274+
}
275+
276+
getOptional<T>(sql: string, parameters?: any[]): Promise<T | null> {
277+
return getOptional(sql, parameters);
278+
}
279+
259280
execute<T>(query: string, params?: any[] | undefined): Promise<QueryResult<T>> {
260281
return execute<T>(query, params);
261282
}

packages/common/src/db/DBAdapter.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ export abstract class LockContext implements SqlExecutor, DBGetUtils {
105105
}
106106

107107
async getOptional<T>(sql: string, parameters?: any[]): Promise<T | null> {
108-
const { rows } = await this.execute(sql, parameters);
109-
if (rows && rows.length > 0) {
110-
return rows.item(0);
108+
const { array } = await this.execute<T>(sql, parameters);
109+
if (array.length > 0) {
110+
return array[0];
111111
}
112112

113113
return null;

packages/node/src/db/AsyncDatabase.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
import { QueryResult, RawQueryResult } from '@powersync/common';
1+
import { BaseQueryResult, QueryResult, RawQueryResult } from '@powersync/common';
22
import { NodeDatabaseImplementation } from './options.js';
33

4+
export interface MappedQueryResult extends BaseQueryResult {
5+
rows?: unknown[];
6+
}
7+
48
export interface AsyncDatabaseOpenOptions {
59
path: string;
610
isWriter: boolean;
@@ -12,6 +16,7 @@ export interface AsyncDatabaseOpener {
1216
}
1317

1418
export interface AsyncDatabase {
19+
execute: (query: string, params: any[]) => Promise<MappedQueryResult>;
1520
executeRaw: (query: string, params: any[]) => Promise<RawQueryResult>;
1621
executeBatch: (query: string, params: any[][]) => Promise<QueryResult<never>>;
1722
close: () => Promise<void>;

packages/node/src/db/BetterSqliteWorker.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Database } from 'better-sqlite3';
2-
import { AsyncDatabase, AsyncDatabaseOpenOptions } from './AsyncDatabase.js';
2+
import { AsyncDatabase, AsyncDatabaseOpenOptions, MappedQueryResult } from './AsyncDatabase.js';
33
import { PowerSyncWorkerOptions } from './SqliteWorker.js';
44
import { threadId } from 'node:worker_threads';
55
import { QueryResult, queryResultWithoutRows, RawQueryResult, SqliteValue } from '@powersync/common';
@@ -17,6 +17,23 @@ class BlockingAsyncDatabase implements AsyncDatabase {
1717
this.db.close();
1818
}
1919

20+
async execute(query: string, params: any[]): Promise<MappedQueryResult> {
21+
const stmt = this.db.prepare(query);
22+
if (stmt.reader) {
23+
const rows = stmt.all(params);
24+
return {
25+
rowsAffected: 0,
26+
rows
27+
};
28+
} else {
29+
const info = stmt.run(params);
30+
return {
31+
rowsAffected: info.changes,
32+
insertId: Number(info.lastInsertRowid)
33+
};
34+
}
35+
}
36+
2037
async executeRaw(query: string, params: any[]): Promise<RawQueryResult> {
2138
const stmt = this.db.prepare(query);
2239
if (stmt.reader) {

packages/node/src/db/NodeSqliteWorker.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { DatabaseSync } from 'node:sqlite';
22
import { threadId } from 'node:worker_threads';
33

4-
import { AsyncDatabase, AsyncDatabaseOpenOptions } from './AsyncDatabase.js';
4+
import { AsyncDatabase, AsyncDatabaseOpenOptions, MappedQueryResult } from './AsyncDatabase.js';
55
import { PowerSyncWorkerOptions } from './SqliteWorker.js';
66
import { QueryResult, queryResultWithoutRows, RawQueryResult, SqliteValue } from '@powersync/common';
77

@@ -18,6 +18,15 @@ class BlockingNodeDatabase implements AsyncDatabase {
1818
this.db.close();
1919
}
2020

21+
async execute(query: string, params: any[]): Promise<MappedQueryResult> {
22+
const stmt = this.db.prepare(query);
23+
const rows = stmt.all(...params);
24+
return {
25+
rowsAffected: 0,
26+
rows
27+
};
28+
}
29+
2130
async executeRaw(query: string, params: any[]): Promise<RawQueryResult> {
2231
const stmt = this.db.prepare(query);
2332
(stmt as any).setReturnArrays(true); // Missing in @types/node, https://nodejs.org/api/sqlite.html#statementsetreturnarraysenabled

packages/node/src/db/RemoteConnection.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { QueryResult, LockContext, RawQueryResult } from '@powersync/common';
1+
import { QueryResult, LockContext, RawQueryResult, SqliteRecord, queryResultFromMapped } from '@powersync/common';
22
import { releaseProxy, Remote } from 'comlink';
33
import { Worker } from 'node:worker_threads';
44
import { AsyncDatabase, AsyncDatabaseOpener } from './AsyncDatabase.js';
@@ -71,6 +71,13 @@ export class RemoteConnection extends LockContext {
7171
});
7272
}
7373

74+
execute<T = SqliteRecord>(query: string, params?: any[] | undefined): Promise<QueryResult<T>> {
75+
return this.withRemote(async () => {
76+
const results = await this.database.execute(query, params ?? []);
77+
return queryResultFromMapped(results, results.rows as T[] | undefined);
78+
});
79+
}
80+
7481
executeBatch(query: string, params: any[][] = []): Promise<QueryResult<never>> {
7582
return this.withRemote(async () => {
7683
return await this.database.executeBatch(query, params ?? []);

0 commit comments

Comments
 (0)