query method
Executes a single query.
Implementation
@override
Future<Result> query(
String tableName, String query, Map<String, dynamic> substitutionValues,
{String returningQuery = '', List<String> returningFields = const []}) {
if (returningFields.isNotEmpty) {
var fields = returningFields.join(', ');
var returning = 'RETURNING $fields';
query = '$query $returning';
}
logger.fine('Query: $query');
logger.fine('Values: $substitutionValues');
// Convert List into String
var param = <String, dynamic>{};
substitutionValues.forEach((key, value) {
if (value is List) {
param[key] = jsonEncode(value);
} else {
param[key] = value;
}
});
return _session
.execute(Sql.named(query), parameters: param)
.catchError((err) async {
logger.warning(err);
if (err is PgException) {
// This is a hack to detect broken db connection
bool brokenConnection = err.message.contains("connection is not open");
if (brokenConnection) {
// Open a new db session
if (_session is Connection) {
(_session as Connection).close();
logger.warning(
"A broken database connection is detected. Creating a new database connection.");
_session = await _createNewSession();
// Retry the query with the new db connection
return _session.execute(Sql.named(query), parameters: param);
}
}
}
throw err;
});
}