runQuery method
Future<void>
runQuery(
{ - 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();
}
}