query method

  1. @override
Future<List<List>> 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<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();
  });
}