2026-01-27 15:46:30 -03:00
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
|
|
import 'package:drift/drift.dart';
|
|
|
|
|
import 'package:drift/native.dart';
|
|
|
|
|
import 'package:drift_offline_sync/drift_offline_sync.dart';
|
|
|
|
|
import 'package:sqlite3/sqlite3.dart';
|
|
|
|
|
import 'package:uuid/uuid.dart';
|
|
|
|
|
|
|
|
|
|
import '../../test/utils/tables.dart';
|
|
|
|
|
|
|
|
|
|
part 'database.g.dart';
|
|
|
|
|
|
|
|
|
|
@DriftDatabase(tables: [TableWithEveryColumnType])
|
|
|
|
|
class CrdtBenchmarkDatabase extends _$CrdtBenchmarkDatabase {
|
|
|
|
|
CrdtBenchmarkDatabase(super.e, {required this.crdtEnabled}) {
|
|
|
|
|
driftRuntimeOptions.dontWarnAboutMultipleDatabases = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static CrdtBenchmarkDatabase createDatabase(
|
|
|
|
|
File file, {
|
|
|
|
|
required bool crdtEnabled,
|
|
|
|
|
}) {
|
|
|
|
|
if (file.existsSync()) {
|
|
|
|
|
file.deleteSync();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return CrdtBenchmarkDatabase(
|
2026-02-05 22:38:12 -03:00
|
|
|
NativeDatabase.opened(sqlite3.open(file.path)),
|
2026-01-27 15:46:30 -03:00
|
|
|
crdtEnabled: crdtEnabled,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final bool crdtEnabled;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
int get schemaVersion => 1;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Migrator createMigrator() => !crdtEnabled
|
|
|
|
|
? super.createMigrator()
|
|
|
|
|
: OfflineSyncMigrator(
|
|
|
|
|
this,
|
|
|
|
|
userId: const Uuid().v7(),
|
|
|
|
|
nodeId: const Uuid().v7(),
|
|
|
|
|
synchronizedTables: [tableWithEveryColumnType],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Future<void> batchInsertTestRows(int count) async {
|
|
|
|
|
final baseTimestamp = DateTime.now();
|
|
|
|
|
await managers.tableWithEveryColumnType.bulkCreate(
|
|
|
|
|
(_) => List.generate(count, (i) => _createTestRow(i, baseTimestamp)),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> upsertTestRows(int count) async {
|
|
|
|
|
final baseTimestamp = DateTime.now();
|
|
|
|
|
for (var i = 0; i < count; i++) {
|
|
|
|
|
await managers.tableWithEveryColumnType.create(
|
|
|
|
|
(_) => _createTestRow(i, baseTimestamp),
|
|
|
|
|
mode: InsertMode.insertOrReplace,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> deleteTestRows(int count) async {
|
|
|
|
|
for (var i = 0; i < count; i++) {
|
|
|
|
|
await managers.tableWithEveryColumnType
|
|
|
|
|
.filter((t) => t.id.equals(RowId(i)))
|
|
|
|
|
.delete();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<int> testRowsCount() async {
|
|
|
|
|
return managers.tableWithEveryColumnType.count();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-05 23:20:21 -03:00
|
|
|
TableWithEveryColumnTypeCompanion _createTestRow(
|
|
|
|
|
int i,
|
|
|
|
|
DateTime baseTimestamp,
|
|
|
|
|
) {
|
2026-01-27 15:46:30 -03:00
|
|
|
return TableWithEveryColumnTypeCompanion(
|
|
|
|
|
id: Value(RowId(i)),
|
|
|
|
|
aBool: Value(i.isEven),
|
|
|
|
|
aDateTime: Value(baseTimestamp.add(Duration(seconds: i))),
|
|
|
|
|
aText: Value('Text $i'),
|
|
|
|
|
anInt: Value(i),
|
|
|
|
|
anInt64: Value(BigInt.from(i)),
|
|
|
|
|
aReal: Value(i.toDouble()),
|
|
|
|
|
aBlob: Value(Uint8List.fromList([i % 256])),
|
|
|
|
|
anIntEnum: const Value(null),
|
|
|
|
|
aTextWithConverter: const Value(null),
|
|
|
|
|
aUuid: const Value(null),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|