executeSQL method

  1. @override
Future<({Object? lastID, List<Map<String, dynamic>>? results})?> executeSQL(
  1. SQL sql, {
  2. List<SQL>? executedSqls,
})
override

Executes a sql.

Implementation

@override
Future<({Object? lastID, List<Map<String, dynamic>>? results})?> executeSQL(
    SQL sql,
    {List<SQL>? executedSqls}) async {
  var s = sql.build(dialect: dialect, executedSqls: executedSqls);

  sql.executedSQL = s.sql;

  switch (sql.type) {
    case SQLType.INSERT:
      {
        var idFieldName = await resolveTableIDFieldName(sql.table);

        var sqlQuery = '${s.sql} RETURNING "${sql.table}"."$idFieldName" ';
        var result = await nativeConnection.mappedResultsQuery(sqlQuery,
            substitutionValues: s.valuesNamed);

        if (result.isNotEmpty) {
          var resultID =
              _resolveResultID(result, sql.table, idFieldName: idFieldName);
          var lastId = sql.resolveLastInsertID(resultID,
              valuesNamed: s.valuesNamed, executedSqls: executedSqls);
          return (results: result, lastID: lastId);
        } else {
          return null;
        }
      }
    case SQLType.UPDATE:
      {
        var result = await nativeConnection.query(s.sql,
            substitutionValues: s.valuesNamed);

        return result.affectedRowCount > 0
            ? (
                results: [
                  {'ok': true}
                ],
                lastID: null
              )
            : null;
      }
    case SQLType.SELECT:
      {
        var results = await nativeConnection.mappedResultsQuery(s.sql,
            substitutionValues: s.valuesNamed);

        return (results: results, lastID: null);
      }
    case SQLType.DELETE:
      {
        var result = await nativeConnection.query(s.sql,
            substitutionValues: s.valuesNamed);

        return result.affectedRowCount > 0
            ? (
                results: [
                  {'ok': true}
                ],
                lastID: null
              )
            : null;
      }
    default:
      throw StateError("Can't execute SQL: $sql");
  }
}