Skip to content

Commit a776bbc

Browse files
wip: use forked execute raw sync branch
1 parent 5e84db6 commit a776bbc

File tree

6 files changed

+64
-48
lines changed

6 files changed

+64
-48
lines changed

packages/drizzle-driver-sync/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
"drizzle-orm": "<1.0.0"
4747
},
4848
"devDependencies": {
49+
"@op-engineering/op-sqlite": "github:joshua-journey-apps/op-sqlite#execute-raw-sync",
4950
"@powersync/web": "workspace:*",
50-
"@op-engineering/op-sqlite": "^14.0.2",
5151
"@journeyapps/wa-sqlite": "^1.2.0",
5252
"@types/node": "^20.17.6",
5353
"drizzle-orm": "^0.35.2",

packages/drizzle-driver-sync/src/sqlite/PowerSyncSQLiteBaseSession.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { LockContext, QueryResult } from '@powersync/common';
21
import { entityKind } from 'drizzle-orm/entity';
32
import type { Logger } from 'drizzle-orm/logger';
43
import { NoopLogger } from 'drizzle-orm/logger';
@@ -14,8 +13,7 @@ import {
1413
type SQLiteTransactionConfig
1514
} from 'drizzle-orm/sqlite-core/session';
1615
import { PowerSyncSQLitePreparedQuery } from './PowerSyncSQLitePreparedQuery.js';
17-
import { DB } from '@op-engineering/op-sqlite';
18-
16+
import { DB, QueryResult } from '@op-engineering/op-sqlite';
1917
export interface PowerSyncSQLiteSessionOptions {
2018
logger?: Logger;
2119
}

packages/drizzle-driver-sync/src/sqlite/PowerSyncSQLiteDatabase.ts

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
import {
2-
AbstractPowerSyncDatabase,
3-
compilableQueryWatch,
4-
CompilableQueryWatchHandler,
5-
QueryResult,
6-
SQLWatchOptions
7-
} from '@powersync/common';
81
import { Query } from 'drizzle-orm';
92
import { DefaultLogger } from 'drizzle-orm/logger';
103
import {
@@ -18,18 +11,18 @@ import { SQLiteTransaction } from 'drizzle-orm/sqlite-core';
1811
import { BaseSQLiteDatabase } from 'drizzle-orm/sqlite-core/db';
1912
import { SQLiteSyncDialect } from 'drizzle-orm/sqlite-core/dialect';
2013
import type { DrizzleConfig } from 'drizzle-orm/utils';
21-
import { toCompilableQuery } from '../utils/compilableQuery.js';
2214
import { PowerSyncSQLiteTransactionConfig } from './PowerSyncSQLiteBaseSession.js';
2315
import { PowerSyncSQLiteSession } from './PowerSyncSQLiteSession.js';
16+
import { DB, QueryResult } from '@op-engineering/op-sqlite';
2417

2518
export type DrizzleQuery<T> = { toSQL(): Query; execute(): Promise<T | T[]> };
2619

2720
export class PowerSyncSQLiteDatabase<
2821
TSchema extends Record<string, unknown> = Record<string, never>
2922
> extends BaseSQLiteDatabase<'sync', QueryResult, TSchema> {
30-
private db: AbstractPowerSyncDatabase;
23+
private db: DB;
3124

32-
constructor(db: AbstractPowerSyncDatabase, config: DrizzleConfig<TSchema> = {}) {
25+
constructor(db: DB, config: DrizzleConfig<TSchema> = {}) {
3326
const dialect = new SQLiteSyncDialect({ casing: config.casing });
3427
let logger;
3528
if (config.logger === true) {
@@ -63,13 +56,13 @@ export class PowerSyncSQLiteDatabase<
6356
return super.transaction(transaction, config);
6457
}
6558

66-
watch<T>(query: DrizzleQuery<T>, handler: CompilableQueryWatchHandler<T>, options?: SQLWatchOptions): void {
67-
compilableQueryWatch(this.db, toCompilableQuery(query), handler, options);
68-
}
59+
// watch<T>(query: DrizzleQuery<T>, handler: CompilableQueryWatchHandler<T>, options?: SQLWatchOptions): void {
60+
// compilableQueryWatch(this.db, toCompilableQuery(query), handler, options);
61+
// }
6962
}
7063

7164
export function wrapPowerSyncWithDrizzle<TSchema extends Record<string, unknown> = Record<string, never>>(
72-
db: AbstractPowerSyncDatabase,
65+
db: DB,
7366
config: DrizzleConfig<TSchema> = {}
7467
): PowerSyncSQLiteDatabase<TSchema> {
7568
return new PowerSyncSQLiteDatabase<TSchema>(db, config);

packages/drizzle-driver-sync/src/sqlite/PowerSyncSQLitePreparedQuery.ts

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { DB, QueryResult, Scalar } from '@op-engineering/op-sqlite';
2-
import { LockContext } from '@powersync/common';
32
import { Column, DriverValueDecoder, getTableName, SQL } from 'drizzle-orm';
43
import { entityKind, is } from 'drizzle-orm/entity';
54
import type { Logger } from 'drizzle-orm/logger';
65
import { fillPlaceholders, type Query } from 'drizzle-orm/sql/sql';
76
import { SQLiteColumn } from 'drizzle-orm/sqlite-core';
87
import type { SelectedFieldsOrdered } from 'drizzle-orm/sqlite-core/query-builders/select.types';
98
import {
9+
ExecuteResultSync,
1010
type PreparedQueryConfig as PreparedQueryConfigBase,
1111
type SQLiteExecuteMethod,
1212
SQLitePreparedQuery
@@ -38,6 +38,15 @@ export class PowerSyncSQLitePreparedQuery<
3838
super('sync', executeMethod, query);
3939
}
4040

41+
execute(placeholderValues?: Record<string, unknown>): ExecuteResultSync<T['execute']> {
42+
const params = fillPlaceholders(this.query.params, placeholderValues ?? {}) as Scalar[];
43+
this.logger.logQuery(this.query.sql, params);
44+
const rs = this.db.executeRawSync(this.query.sql, params);
45+
return new ExecuteResultSync(() => {
46+
return this.mapResult(rs, false);
47+
});
48+
}
49+
4150
run(placeholderValues?: Record<string, unknown>): QueryResult {
4251
const params = fillPlaceholders(this.query.params, placeholderValues ?? {}) as Scalar[];
4352
this.logger.logQuery(this.query.sql, params);
@@ -56,10 +65,10 @@ export class PowerSyncSQLitePreparedQuery<
5665

5766
const rows = this.values(placeholderValues) as unknown[][];
5867

59-
if (customResultMapper) {
60-
const mapped = customResultMapper(rows) as T['all'];
61-
return mapped;
62-
}
68+
// if (customResultMapper) {
69+
// const mapped = customResultMapper(rows) as T['all'];
70+
// return mapped;
71+
// }
6372
return rows.map((row) => mapResultRow(fields!, row, (this as any).joinsNotNullableMap));
6473
}
6574

@@ -70,7 +79,6 @@ export class PowerSyncSQLitePreparedQuery<
7079
const { fields, customResultMapper } = this;
7180
const joinsNotNullableMap = (this as any).joinsNotNullableMap;
7281
if (!fields && !customResultMapper) {
73-
// return this.db.get(this.query.sql, params);
7482
return this.db.executeSync(this.query.sql, params) as T['get'];
7583
}
7684

@@ -81,9 +89,9 @@ export class PowerSyncSQLitePreparedQuery<
8189
return undefined;
8290
}
8391

84-
if (customResultMapper) {
85-
return customResultMapper(rows) as T['get'];
86-
}
92+
// if (customResultMapper) {
93+
// return customResultMapper(rows) as T['get'];
94+
// }
8795

8896
return mapResultRow(fields!, row, joinsNotNullableMap);
8997
}
@@ -92,7 +100,7 @@ export class PowerSyncSQLitePreparedQuery<
92100
const params = fillPlaceholders(this.query.params, placeholderValues ?? {}) as Scalar[];
93101
this.logger.logQuery(this.query.sql, params);
94102

95-
return this.db.executeRaw(this.query.sql, params);
103+
return this.db.executeRawSync(this.query.sql, params);
96104
}
97105

98106
isResponseInArrayMode(): boolean {
@@ -101,7 +109,7 @@ export class PowerSyncSQLitePreparedQuery<
101109
}
102110

103111
/**
104-
* Maps a flat array of database row values to a result object based on the provided column definitions.
112+
* Maps a database row object to a result object based on the provided column definitions.
105113
* It reconstructs the hierarchical structure of the result by following the specified paths for each field.
106114
* It also handles nullification of nested objects when joined tables are nullable.
107115
*/

packages/drizzle-driver-sync/src/sqlite/PowerSyncSQLiteSession.ts

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { AbstractPowerSyncDatabase, DBAdapter } from '@powersync/common';
21
import { entityKind } from 'drizzle-orm/entity';
32
import type { RelationalSchemaConfig, TablesRelationalConfig } from 'drizzle-orm/relations';
43
import type { SQLiteSyncDialect } from 'drizzle-orm/sqlite-core/dialect';
@@ -8,15 +7,16 @@ import {
87
PowerSyncSQLiteTransaction,
98
PowerSyncSQLiteTransactionConfig
109
} from './PowerSyncSQLiteBaseSession.js';
10+
import { DB, Transaction } from '@op-engineering/op-sqlite';
1111

1212
export class PowerSyncSQLiteSession<
1313
TFullSchema extends Record<string, unknown>,
1414
TSchema extends TablesRelationalConfig
1515
> extends PowerSyncSQLiteBaseSession<TFullSchema, TSchema> {
1616
static readonly [entityKind]: string = 'PowerSyncSQLiteSession';
17-
protected client: AbstractPowerSyncDatabase;
17+
protected client: DB;
1818
constructor(
19-
db: AbstractPowerSyncDatabase,
19+
db: DB,
2020
dialect: SQLiteSyncDialect,
2121
schema: RelationalSchemaConfig<TSchema> | undefined,
2222
options: PowerSyncSQLiteSessionOptions = {}
@@ -29,34 +29,51 @@ export class PowerSyncSQLiteSession<
2929
transaction: (tx: PowerSyncSQLiteTransaction<TFullSchema, TSchema>) => T,
3030
config: PowerSyncSQLiteTransactionConfig = {}
3131
): T {
32-
const { accessMode = 'read write' } = config;
32+
let result: T;
3333

34-
if (accessMode === 'read only') {
35-
return this.client.readLock(async (ctx) => this.internalTransaction(ctx, transaction, config)) as T;
36-
}
34+
this.client.transaction(async (trx) => {
35+
const tx = new PowerSyncSQLiteTransaction<TFullSchema, TSchema>(
36+
'sync',
37+
this.dialect,
38+
new PowerSyncSQLiteBaseSession(this.client, this.dialect, this.schema, this.options),
39+
// trx,
40+
this.schema
41+
);
42+
result = this.internalTransaction(trx, () => transaction(tx), config);
43+
});
44+
45+
// @ts-ignore
46+
return result;
47+
48+
// const { accessMode = 'read write' } = config;
3749

38-
return this.client.writeLock(async (ctx) => this.internalTransaction(ctx, transaction, config)) as T;
50+
// if (accessMode === 'read only') {
51+
// return this.client.readLock(async (ctx) => this.internalTransaction(ctx, transaction, config)) as T;
52+
// return this.client.transaction(async (ctx) => this.internalTransaction(ctx, transaction, config));
53+
// }
54+
55+
// return this.client.writeLock(async (ctx) => this.internalTransaction(ctx, transaction, config)) as T;
3956
}
4057

41-
protected async internalTransaction<T>(
42-
connection: DBAdapter,
58+
protected internalTransaction<T>(
59+
transaction: Transaction,
4360
fn: (tx: PowerSyncSQLiteTransaction<TFullSchema, TSchema>) => T,
4461
config: PowerSyncSQLiteTransactionConfig = {}
45-
): Promise<T> {
62+
): T {
4663
const tx = new PowerSyncSQLiteTransaction<TFullSchema, TSchema>(
4764
'sync',
4865
(this as any).dialect,
49-
new PowerSyncSQLiteBaseSession(connection, this.dialect, this.schema, this.options),
66+
new PowerSyncSQLiteBaseSession(this.client, this.dialect, this.schema, this.options),
5067
this.schema
5168
);
5269

53-
await connection.execute(`begin${config?.behavior ? ' ' + config.behavior : ''}`);
70+
transaction.execute(`begin${config?.behavior ? ' ' + config.behavior : ''}`);
5471
try {
55-
const result = await fn(tx);
56-
await connection.execute(`commit`);
72+
const result = fn(tx);
73+
transaction.commit();
5774
return result;
5875
} catch (err) {
59-
await connection.execute(`rollback`);
76+
transaction.rollback();
6077
throw err;
6178
}
6279
}

packages/drizzle-driver-sync/src/utils/compilableQuery.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { Query } from 'drizzle-orm';
2121
* );
2222
*/
2323
export function toCompilableQuery<T>(query: {
24-
execute: () => Promise<T | T[]>;
24+
execute: () => T | T[];
2525
toSQL: () => Query;
2626
}): CompilableQuery<T> {
2727
return {
@@ -33,8 +33,8 @@ export function toCompilableQuery<T>(query: {
3333
};
3434
},
3535
execute: async () => {
36-
const result = await query.execute();
36+
const result = query.execute();
3737
return Array.isArray(result) ? result : [result];
38-
},
38+
}
3939
};
4040
}

0 commit comments

Comments
 (0)