Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
12 changes: 9 additions & 3 deletions packages/celest/lib/src/runtime/data/connect.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:celest/src/runtime/data/connect.io.dart'
import 'package:drift/drift.dart';
import 'package:drift_hrana/drift_hrana.dart';
import 'package:logging/logging.dart';
import 'package:sqlite3/common.dart' as sqlite3;

final Logger _logger = Logger('Celest.Data');

Expand All @@ -25,12 +26,17 @@ Future<Database> connect<Database extends GeneratedDatabase>(
required Database Function(QueryExecutor) factory,
required env hostnameVariable,
required secret tokenSecret,
void Function(sqlite3.CommonDatabase)? setup,
String? path,
}) async {
final host = context.get(hostnameVariable);
if (host == null) {
if (context.environment == Environment.local) {
final executor = await localExecutor(name: name, path: path);
final executor = await localExecutor(
name: name,
path: path,
setup: setup,
);
return _checkConnection(factory(executor));
}
throw StateError(
Expand All @@ -48,9 +54,9 @@ Future<Database> connect<Database extends GeneratedDatabase>(
final QueryExecutor connector;
switch (hostUri) {
case Uri(scheme: 'file', path: '/:memory:'):
connector = await inMemoryExecutor();
connector = await inMemoryExecutor(setup: setup);
case Uri(scheme: 'file', :final path):
connector = await localExecutor(name: name, path: path);
connector = await localExecutor(name: name, path: path, setup: setup);
case Uri(scheme: 'ws' || 'wss' || 'http' || 'https' || 'libsql'):
final token = context.get(tokenSecret);
if (token == null) {
Expand Down
11 changes: 9 additions & 2 deletions packages/celest/lib/src/runtime/data/connect.io.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,21 @@ import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as p;
import 'package:sqlite3/common.dart' as sqlite3;

final Logger _logger = Logger('Celest.Data');

/// A [QueryExecutor] for an in-memory database.
Future<QueryExecutor> inMemoryExecutor() async => NativeDatabase.memory();
Future<QueryExecutor> inMemoryExecutor({
void Function(sqlite3.CommonDatabase)? setup,
}) async {
return NativeDatabase.memory(setup: setup);
}

/// A [QueryExecutor] with local persistence.
Future<QueryExecutor> localExecutor({
required String name,
void Function(sqlite3.CommonDatabase)? setup,
String? path,
}) async {
if (path == null) {
Expand All @@ -28,7 +34,7 @@ Future<QueryExecutor> localExecutor({
'Failed to determine package config path. '
'Falling back to in-memory database.',
);
return inMemoryExecutor();
return inMemoryExecutor(setup: setup);
}
path = p.join(
p.dirname(p.fromUri(packageConfig)),
Expand All @@ -45,5 +51,6 @@ Future<QueryExecutor> localExecutor({
databaseFile,
cachePreparedStatements: true,
enableMigrations: true,
setup: setup,
);
}
10 changes: 7 additions & 3 deletions packages/celest/lib/src/runtime/data/connect.web.dart
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
import 'package:drift/drift.dart';
import 'package:drift/wasm.dart';
import 'package:sqlite3/common.dart' as sqlite3;
import 'package:sqlite3/wasm.dart';

/// A [QueryExecutor] for an in-memory database.
Future<QueryExecutor> inMemoryExecutor() async {
Future<QueryExecutor> inMemoryExecutor({
void Function(sqlite3.CommonDatabase)? setup,
}) async {
final sqlite3 = await WasmSqlite3.loadFromUrl(Uri.parse('./sqlite3.wasm'));
sqlite3.registerVirtualFileSystem(InMemoryFileSystem(), makeDefault: true);
return WasmDatabase.inMemory(sqlite3);
return WasmDatabase.inMemory(sqlite3, setup: setup);
}

/// A [QueryExecutor] with local persistence.
Future<QueryExecutor> localExecutor({
required String name,
void Function(sqlite3.CommonDatabase)? setup,
String? path,
}) async {
// TODO(dnys1): We don't have a use case for this yet.
return inMemoryExecutor();
return inMemoryExecutor(setup: setup);
}