execute method
Executes a raw SQL query with optional parameter bindings.
Example:
await connection.execute('SELECT * FROM users WHERE id = ?', [1]);
Implementation
@override
Future<DatabaseResponse> execute(
String sql, [
List<dynamic> bindings = const [],
]) async {
if (_db == null) await connect();
final preparedBindings = _prepareBindings(bindings);
try {
final stmt = _db!.prepare(sql);
// Simple heuristic: check if it starts with SELECT (case insensitive)
final isSelect = sql.trim().toUpperCase().startsWith('SELECT') ||
sql.trim().toUpperCase().startsWith('PRAGMA');
if (isSelect) {
final result = stmt.select(preparedBindings);
stmt.dispose();
final data =
result.map((row) => Map<String, dynamic>.from(row)).toList();
return DatabaseResponse(data: data);
} else {
stmt.execute(preparedBindings);
stmt.dispose();
return DatabaseResponse(
data: [],
insertId: _db!.lastInsertRowId,
affectedRows: _db!.updatedRows,
);
}
} catch (e) {
throw DatabaseException(
'SQLite Error: $e\nQuery: $sql\nBindings: $preparedBindings',
);
}
}