query method
Executes a single query.
Implementation
@override
Future<List<List>> query(
String tableName, String query, Map<String, dynamic> substitutionValues,
{String returningQuery = '',
List<String> returningFields = const []}) async {
// Change @id -> ?
for (var name in substitutionValues.keys) {
query = query.replaceAll('@$name', ':$name');
// Convert UTC time to local time
var value = substitutionValues[name];
if (value is DateTime && value.isUtc) {
var t = value.toLocal();
//logger.warning('Datetime deteted: $name');
//logger.warning('Datetime: UTC -> $value, Local -> $t');
substitutionValues[name] = t;
}
}
//logger.warning('Query: $query');
//logger.warning('Values: $substitutionValues');
//logger.warning('Returning Query: $returningQuery');
if (returningQuery.isNotEmpty) {
// Handle insert, update and delete
// Retrieve back the inserted record
if (query.startsWith("INSERT")) {
var result = await _connection.execute(query, substitutionValues);
//logger.fine(result.lastInsertID);
query = returningQuery;
//logger.fine('Result.insertId: ${result.insertId}');
// Has primary key
if (returningQuery.endsWith('.id=?')) {
query = query.replaceAll("?", ":id");
substitutionValues.clear();
substitutionValues['id'] = result.lastInsertID;
} else {
query = _convertSQL(query, substitutionValues);
}
} else if (query.startsWith("UPDATE")) {
await _connection.execute(query, substitutionValues);
query = returningQuery;
}
}
//logger.warning('Query 2: $query');
//logger.warning('Values 2: $substitutionValues');
// Handle select
return _connection.execute(query, substitutionValues).then((results) {
// var tmpData = results.rows;
//for (var element in tmpData) {
// logger.warning("[Result] : ${element.assoc()}");
//}
return results.rows.map((r) => r.typedAssoc().values.toList()).toList();
});
}