New features of the Query Editor

1. Добавлена возможность быстрой подстановки слов на латинице по нажатию
   Alt+RIGHT. Возможность включается настройкой "Use word hints".
   Список слов составляется при загрузке запроса и по мере ввода новых слов.
2. Добавлена возможность заменять при выполнении запроса переменные вида
   $1, $2, ... или :variableName1 на пользовательские значения введённые
   в диалоге. Пока можно заменять переменные в запросах select,update,delete,insert.
   Перед отправкой запроса на сервер переменные заменяются простой текстовой заменой.
   Запрос который выполнен на сервере можно посмотреть на вкладке История.
   Возможность включается настройкой "Replace variables in a query".
   Выделить правой кнопкой выполненый запрос не получиться т.к. текст выполненого запроса
   и текст в редакторе будет отличаться.
This commit is contained in:
lsv 2024-12-17 16:36:43 +05:00 committed by lsv
parent 09dab55c0b
commit 5ee53e086f
16 changed files with 796 additions and 81 deletions

View file

@ -25,7 +25,7 @@ int FormatterSQL::GetIndexItemNextSqlPosition(int sqlPosition) {
p++;
if (it.srcpos < sqlPosition) continue;
while (p >= 0 && items[--p].srcpos == -1) {};
while (p > 0 && items[--p].srcpos == -1) {};
vi = items[p];
return p;
}
@ -421,13 +421,16 @@ wxString FormatterSQL::BuildAutoComplite(int startIndex, int level) {
else
return wxJoin(cols, ',');
}
int FormatterSQL::GetNextPositionSqlParse() {
return lastposition;
}
/// <summary>
/// <c>ParseSql</c> Выполнение разбора текста как SQL выражения
/// </summary>
/// <param name="flags"></param>
/// <returns>Возвращает код ошибки если SQL выражение было не полное или не корректное</returns>
int FormatterSQL::ParseSql(int flags) {
int i = 0;
int i = lastposition;
int lhome = 0;
bool str_literal = false;
bool ext = false;
@ -708,6 +711,10 @@ int FormatterSQL::ParseSql(int flags) {
if ((i - 1) > k) {
if (items.size() != 0 && items[items.size() - 1].type == spaces) {
// multi space ---> one spaces
if (items[items.size() - 1].srcpos == -1) { // change real space
items[items.size() - 1].srcpos = vi.srcpos;
vi.srcpos = i - 1;
}
}
else
vi.type = spaces;
@ -824,6 +831,18 @@ int FormatterSQL::ParseSql(int flags) {
continue;
}
}
// naming arg
if ((c==':') && ((c2 >= 'a' && c2 <= 'z') || ((c2 >= 'A' && c2 <= 'Z')))) {
k = i - 1;
while (wxIsalpha(c2) || c2 == '_') {
if (i < sql.length()) c2 = sql[i++]; else { i++; break; };
}
vi.txt = sql.substr(k, i - k - 1);
vi.type = bindarg;
i--;
continue;
}
if (c == ';') break;
// separat
if (c == ',') {
@ -879,7 +898,7 @@ int FormatterSQL::ParseSql(int flags) {
}
if (bracket.size() > 0)
return -1; // bracet no close
lastposition = i;
return 0;
}
// mode =2 draw position x,y