Skip to content

Raw tables #300

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Jul 17, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Remove manual schema management APIs
  • Loading branch information
simolus3 committed Jul 15, 2025
commit b44177b76b7362e54a56dc65a2c1b3d3a766cd1e
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,6 @@ class PowerSyncDatabaseImpl
@override
SqliteDatabase database;

@override
bool manualSchemaManagement;

@override
@protected
late Future<void> isInitialized;
Expand Down Expand Up @@ -80,7 +77,6 @@ class PowerSyncDatabaseImpl
required String path,
int maxReaders = SqliteDatabase.defaultMaxReaders,
Logger? logger,
bool manualSchemaManagement = false,
@Deprecated("Use [PowerSyncDatabase.withFactory] instead.")
// ignore: deprecated_member_use_from_same_package
SqliteConnectionSetup? sqliteSetup}) {
Expand All @@ -93,7 +89,6 @@ class PowerSyncDatabaseImpl
schema: schema,
maxReaders: maxReaders,
logger: logger,
manualSchemaManagement: manualSchemaManagement,
);
}

Expand All @@ -110,14 +105,12 @@ class PowerSyncDatabaseImpl
required Schema schema,
int maxReaders = SqliteDatabase.defaultMaxReaders,
Logger? logger,
bool manualSchemaManagement = false,
}) {
final db = SqliteDatabase.withFactory(openFactory, maxReaders: maxReaders);
return PowerSyncDatabaseImpl.withDatabase(
schema: schema,
database: db,
logger: logger,
manualSchemaManagement: manualSchemaManagement,
);
}

Expand All @@ -130,7 +123,6 @@ class PowerSyncDatabaseImpl
required this.schema,
required this.database,
Logger? logger,
this.manualSchemaManagement = false,
}) {
this.logger = logger ?? autoLogger;
isInitialized = baseInit();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,13 @@ abstract class PowerSyncDatabase
required Schema schema,
required String path,
Logger? logger,
bool manualSchemaManagement = false,
@Deprecated("Use [PowerSyncDatabase.withFactory] instead.")
// ignore: deprecated_member_use_from_same_package
SqliteConnectionSetup? sqliteSetup,
}) {
return PowerSyncDatabaseImpl(
schema: schema,
path: path,
manualSchemaManagement: manualSchemaManagement,
logger: logger,
// ignore: deprecated_member_use_from_same_package
sqliteSetup: sqliteSetup,
Expand All @@ -63,14 +61,12 @@ abstract class PowerSyncDatabase
DefaultSqliteOpenFactory openFactory, {
required Schema schema,
int maxReaders = SqliteDatabase.defaultMaxReaders,
bool manualSchemaManagement = false,
Logger? logger,
}) {
return PowerSyncDatabaseImpl.withFactory(
openFactory,
schema: schema,
maxReaders: maxReaders,
manualSchemaManagement: manualSchemaManagement,
logger: logger,
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@ class PowerSyncDatabaseImpl
@override
SqliteDatabase get database => throw UnimplementedError();

@override
bool get manualSchemaManagement => throw UnimplementedError();

@override
Future<void> get isInitialized => throw UnimplementedError();

Expand All @@ -56,7 +53,6 @@ class PowerSyncDatabaseImpl
{required Schema schema,
required String path,
int maxReaders = SqliteDatabase.defaultMaxReaders,
bool manualSchemaManagement = false,
Logger? logger,
@Deprecated("Use [PowerSyncDatabase.withFactory] instead.")
// ignore: deprecated_member_use_from_same_package
Expand All @@ -76,7 +72,6 @@ class PowerSyncDatabaseImpl
DefaultSqliteOpenFactory openFactory, {
required Schema schema,
int maxReaders = SqliteDatabase.defaultMaxReaders,
bool manualSchemaManagement = false,
Logger? logger,
}) {
throw UnimplementedError();
Expand All @@ -90,7 +85,6 @@ class PowerSyncDatabaseImpl
factory PowerSyncDatabaseImpl.withDatabase({
required Schema schema,
required SqliteDatabase database,
bool manualSchemaManagement = false,
Logger? logger,
}) {
throw UnimplementedError();
Expand Down
38 changes: 1 addition & 37 deletions packages/powersync_core/lib/src/database/powersync_db_mixin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,6 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection {
/// Use [attachedLogger] to propagate logs to [Logger.root] for custom logging.
Logger get logger;

bool get manualSchemaManagement;

bool _manualSchemaManagementCompleted = false;

@Deprecated("This field is unused, pass params to connect() instead")
Map<String, dynamic>? clientParams;

Expand Down Expand Up @@ -114,36 +110,10 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection {
statusStream = statusStreamController.stream;
updates = powerSyncUpdateNotifications(database.updates);

_manualSchemaManagementCompleted = false;

await database.initialize();
await _checkVersion();
await database.execute('SELECT powersync_init()');

if (!manualSchemaManagement) {
// Create the internal db schema
await updateSchema(schema);
await _afterSchemaReady();
}
}

Future<void> markSchemaAsReady() async {
await isInitialized;
_manualSchemaManagementCompleted = true;

await _afterSchemaReady();
}

void _checkSchemaIsReady() {
if (!manualSchemaManagement || _manualSchemaManagementCompleted) {
return;
}

throw StateError(
'In manual schema management mode, you need to mark the powersync database as ready');
}

Future<void> _afterSchemaReady() async {
await updateSchema(schema);
await _updateHasSynced();
}

Expand Down Expand Up @@ -319,8 +289,6 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection {
// the lock for the connection.
await initialize();

_checkSchemaIsReady();

final resolvedOptions = ResolvedSyncOptions.resolve(
options,
crudThrottleTime: crudThrottleTime,
Expand Down Expand Up @@ -484,15 +452,13 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection {
/// Get an unique id for this client.
/// This id is only reset when the database is deleted.
Future<String> getClientId() async {
_checkSchemaIsReady();
final row = await get('SELECT powersync_client_id() as client_id');
return row['client_id'] as String;
}

/// Get upload queue size estimate and count.
Future<UploadQueueStats> getUploadQueueStats(
{bool includeSize = false}) async {
_checkSchemaIsReady();
if (includeSize) {
final row = await getOptional(
'SELECT SUM(cast(data as blob) + 20) as size, count(*) as count FROM ps_crud');
Expand Down Expand Up @@ -520,7 +486,6 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection {
/// data by transaction. One batch may contain data from multiple transactions,
/// and a single transaction may be split over multiple batches.
Future<CrudBatch?> getCrudBatch({int limit = 100}) async {
_checkSchemaIsReady();
final rows = await getAll(
'SELECT id, tx_id, data FROM ps_crud ORDER BY id ASC LIMIT ?',
[limit + 1]);
Expand Down Expand Up @@ -567,7 +532,6 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection {
/// Unlike [getCrudBatch], this only returns data from a single transaction at a time.
/// All data for the transaction is loaded into memory.
Future<CrudTransaction?> getNextCrudTransaction() async {
_checkSchemaIsReady();
return await readTransaction((tx) async {
final first = await tx.getOptional(
'SELECT id, tx_id, data FROM ps_crud ORDER BY id ASC LIMIT 1');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,6 @@ class PowerSyncDatabaseImpl
@override
SqliteDatabase database;

@override
bool manualSchemaManagement;

@override
@protected
late Future<void> isInitialized;
Expand Down Expand Up @@ -73,7 +70,6 @@ class PowerSyncDatabaseImpl
{required Schema schema,
required String path,
int maxReaders = SqliteDatabase.defaultMaxReaders,
bool manualSchemaManagement = false,
Logger? logger,
@Deprecated("Use [PowerSyncDatabase.withFactory] instead.")
// ignore: deprecated_member_use_from_same_package
Expand All @@ -85,7 +81,6 @@ class PowerSyncDatabaseImpl
maxReaders: maxReaders,
logger: logger,
schema: schema,
manualSchemaManagement: manualSchemaManagement,
);
}

Expand All @@ -101,12 +96,10 @@ class PowerSyncDatabaseImpl
DefaultSqliteOpenFactory openFactory,
{required Schema schema,
int maxReaders = SqliteDatabase.defaultMaxReaders,
bool manualSchemaManagement = false,
Logger? logger}) {
final db = SqliteDatabase.withFactory(openFactory, maxReaders: 1);
return PowerSyncDatabaseImpl.withDatabase(
schema: schema,
manualSchemaManagement: manualSchemaManagement,
logger: logger,
database: db,
);
Expand All @@ -120,7 +113,6 @@ class PowerSyncDatabaseImpl
PowerSyncDatabaseImpl.withDatabase({
required this.schema,
required this.database,
this.manualSchemaManagement = false,
Logger? logger,
}) {
if (logger != null) {
Expand Down
3 changes: 2 additions & 1 deletion packages/powersync_core/test/utils/abstract_test_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -153,10 +153,11 @@ extension MockSync on PowerSyncDatabase {
PowerSyncBackendConnector connector, {
Logger? logger,
SyncOptions options = const SyncOptions(retryDelay: Duration(seconds: 5)),
Schema? customSchema,
}) {
final impl = StreamingSyncImplementation(
adapter: BucketStorage(this),
schemaJson: jsonEncode(schema),
schemaJson: jsonEncode(customSchema ?? schema),
client: client,
options: ResolvedSyncOptions(options),
connector: InternalConnector.wrap(connector, this),
Expand Down