runQuery method

Future<void> runQuery({
  1. bool fromRefresh = false,
})

Implementation

Future<void> runQuery({bool fromRefresh = false}) async {
  final sourceId = selectedSourceId;
  final sql = queryText.trim();
  if (sourceId == null) return;

  if (sql.isEmpty) {
    queryError = 'Query cannot be empty.';
    notifyListeners();
    return;
  }

  if (!supportsRawSql) {
    queryError = 'Raw SQL is not supported for this source.';
    notifyListeners();
    return;
  }

  if (SqlUtils.isSelectQuery(sql)) {
    _cacheTableViewForQuery();

    final detectedTable = SqlUtils.extractSimpleFromTable(sql);
    final tableExists = detectedTable != null &&
        collections.any(
          (c) => c.toLowerCase() == detectedTable.toLowerCase(),
        );
    queryCustomResult = !tableExists;

    if (tableExists) {
      selectedCollection = collections.firstWhere(
        (c) => c.toLowerCase() == detectedTable.toLowerCase(),
      );
    }

    late List<String> derivedColumns;
    try {
      final peek = await _runRawQueryPaged(
        sourceId,
        sql,
        limit: 1,
        offset: 0,
      );
      derivedColumns = peek.isNotEmpty ? peek.first.keys.toList() : [];
    } catch (error) {
      queryError = error.toString();
      notifyListeners();
      return;
    }

    fromRefresh ? refreshing = true : runningQuery = true;
    queryExpanded = true;
    queryError = null;
    queryInfoMessage = null;
    queryColumns = derivedColumns;
    queryMode = true;
    _resetSearchAndSort();
    notifyListeners();

    _ensureQueryPagination(sourceId, sql);
    await pagination!.loadPage(0);
    runningQuery = false;
    refreshing = false;
    notifyListeners();
    return;
  }

  fromRefresh ? refreshing = true : runningQuery = true;
  queryExpanded = true;
  queryError = null;
  queryInfoMessage = null;
  _resetSearchAndSort();
  notifyListeners();

  try {
    await _executeStatement(sourceId, sql);
    await _refreshTableSnapshot();
    _cacheTableViewForQuery();
    queryColumns = [];
    queryMode = true;
    queryCustomResult = true;
    queryInfoMessage = 'Query executed successfully. No rows returned.';
    runningQuery = false;
    refreshing = false;
    notifyListeners();
  } catch (error) {
    runningQuery = false;
    refreshing = false;
    queryError = error.toString();
    notifyListeners();
  }
}