Implementation
Future<void> initialize() async {
if (_db != null) return;
final appDir = await getApplicationSupportDirectory();
final dbPath = '${appDir.path}/$_dbName';
_db = sqlite3.open(dbPath);
_db!.execute('''
CREATE TABLE IF NOT EXISTS outbox_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
local_id TEXT NOT NULL,
table_name TEXT NOT NULL,
operation TEXT NOT NULL CHECK (operation IN ('insert','upsert','update','delete')),
payload TEXT NOT NULL,
state TEXT NOT NULL DEFAULT 'pending' CHECK (state IN ('pending','syncing','synced','failed')),
created_at TEXT NOT NULL,
client_updated_at TEXT NOT NULL,
attempt_count INTEGER NOT NULL DEFAULT 0,
last_attempt_at TEXT,
last_error TEXT,
server_id TEXT
)
''');
_db!.execute('''
CREATE INDEX IF NOT EXISTS idx_outbox_state_created
ON outbox_events(state, created_at)
''');
_db!.execute('''
CREATE INDEX IF NOT EXISTS idx_outbox_table_local_id
ON outbox_events(table_name, local_id)
''');
dev.log('Outbox initialized at $dbPath', name: 'OfflineOutbox');
}