query method

  1. @override
Future<Result> query(
  1. String tableName,
  2. String query,
  3. Map<String, dynamic> substitutionValues, {
  4. String returningQuery = '',
  5. List<String> returningFields = const [],
})

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;
  });
}