diff --git a/CMakeLists.txt b/CMakeLists.txt index c356280..382df5d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ if (WIN32) # Одинаковые флаги для компиляторов MSVC и clang-cl в релизной конфигурации set (V8SQLITE_CXX_FLAGS_RELEASE "/O2 /GS- /DNDEBUG" CACHE STRING "") # Одинаковые флаги для компиляторов MSVC и clang-cl в отладочной конфигурации - set (V8SQLITE_CXX_FLAGS_DEBUG "/Zi /Ob0 /Od /RTC1" CACHE STRING "") + set (V8SQLITE_CXX_FLAGS_DEBUG "/Zi /Ob0 /Od /D_DEBUG /RTC1" CACHE STRING "") # Флаги только для компилятора MSVC в релизной конфигурации set (V8SQLITE_CXX_MSVC_RELEASE "/GL" CACHE STRING "") # Флаги только для компилятора MSVC в отладочной конфигурации diff --git a/readme.md b/readme.md index bfd1db5..7ff5660 100644 --- a/readme.md +++ b/readme.md @@ -47,23 +47,23 @@ ``` Функция ПодключитьВК() - + ПутьКВК = КаталогПрограммы(); СистемнаяИнформация = Новый СистемнаяИнформация; - + Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда ПутьКВК = ПутьКВК + "v8sqlite.dll"; ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда ПутьКВК = ПутьКВК + "libv8sqlite.so"; КонецЕсли; - + Если не ПодключитьВнешнююКомпоненту(ПутьКВК, "v8sqlite", ТипВнешнейКомпоненты.Native) Тогда Предупреждение("Не удалось подключить внешнюю компоненту " + ПутьКВК); Возврат Ложь; КонецЕсли; Возврат Истина; - + КонецФункции // ПодключитьВК() ``` @@ -220,7 +220,7 @@ база.ПодготовитьЗапрос("Запрос1", " |select * from test where a = @p1 |"); - + ... база.УстановитьПараметр("Запрос1", "@p1", 1); @@ -248,8 +248,7 @@ Возвращаемая строка зависит от указанного при вызове метода формате. Для формата "ТаблицаЗначений" - выдаётся строка, которая методом `ЗначениеИзСтрокиВнутр` преобразуется -в Таблицу значений. Названия колонок запроса становятся идентификатороми и заголовками колонок -таблицы значений. Невалидные для идентификатора символы заменяются на `_`, заголовки остаются как есть. +в Таблицу значений. Названия колонок запроса становятся именем и заголовком колонок таблицы значений. Для формата "JSON" возвращается строка, которая через XDTO преобразуется в массив. Элементы массива - тоже массивы, строки результата запроса. diff --git a/src/sqlite.cpp b/src/sqlite.cpp index 7374bb6..ed1e0fb 100644 --- a/src/sqlite.cpp +++ b/src/sqlite.cpp @@ -29,7 +29,7 @@ int SqliteBase::exec(stru query) { SqliteQuery SqliteBase::prepare(stru query) { sqlite3_stmt* stmt = nullptr; if (db_) { - sqlite3_prepare16_v3(db_, (void*)query.str, query.len * 2, 0, &stmt, nullptr); + sqlite3_prepare16_v3(db_, (void*)query.str, (int)query.length() * 2, 0, &stmt, nullptr); } return SqliteQuery(stmt); } diff --git a/src/tests/v8sqlite.epf b/src/tests/v8sqlite.epf index a72df4c..a038ba2 100644 Binary files a/src/tests/v8sqlite.epf and b/src/tests/v8sqlite.epf differ diff --git a/src/v8sqlite_addin.cpp b/src/v8sqlite_addin.cpp index af7a21c..7d6a255 100644 --- a/src/v8sqlite_addin.cpp +++ b/src/v8sqlite_addin.cpp @@ -133,9 +133,8 @@ bool V8SqliteAddin::BindParam(tVariant* params, unsigned count) { SqliteQuery& query = find->second; - int paramNum = params[1].vt == VTYPE_PWSTR ? - sqlite3_bind_parameter_index(query, lstringa<100>{varToTextU(params[1])}) - : getInteger(params[1]); + int paramNum = + params[1].vt == VTYPE_PWSTR ? sqlite3_bind_parameter_index(query, lstringa<100>{varToTextU(params[1])}) : getInteger(params[1]); if (!paramNum || paramNum > sqlite3_bind_parameter_count(query)) { return error(u"Неверный параметр запроса", u"Bad query param"); @@ -189,16 +188,12 @@ struct ValueTableReceiver : ToTextReceiver { void addColumnName(ssu name) { checkColumnForDates(name); - lstringu<200> idName{name}; - - bool first = true; - for (u16symbol *ptr = idName.str(), *end = ptr + idName.length(); ptr < end; ptr++) { - if (!(iswalpha(*ptr) || (!first && *ptr >= '0' && *ptr <= '9'))) { - *ptr = '_'; - } - first = false; + if (name.find('\"') != str_pos::badIdx) { + lstringu<200> idName{e_repl(name, u"\"", u"\"\"")}; + vtText << (eeu & u"{" & currentCol & u",\"" & idName & u"\",{\"Pattern\"},\"" & idName & u"\",0},"); + } else { + vtText << (eeu & u"{" & currentCol & u",\"" & name & u"\",{\"Pattern\"},\"" & name & u"\",0},"); } - vtText << (eeu & u"{" & currentCol & u",\"" & idName & u"\",{\"Pattern\"},\"" & e_repl(name, u"\"", u"\"\"") & u"\",0},"); currentCol++; } void addRow() { @@ -332,8 +327,8 @@ static bool execQuery(SqliteQuery& query, tVariant& retVal, hashStrMapUIU& return false; } if (receiver.colCount) { - retVal.vt = VTYPE_PWSTR; - retVal.wstrLen = (int)text.length(); + retVal.vt = VTYPE_PWSTR; + retVal.wstrLen = (int)text.length(); mm->AllocMemory((void**)&retVal.pwstrVal, (int)(text.length() + 1) * 2); *text.place(retVal.pwstrVal) = 0; @@ -361,7 +356,7 @@ bool V8SqliteAddin::ExecQuery(tVariant& retVal, tVariant* params, unsigned count if (params[2].vt != VTYPE_NULL) { if (params[2].vt == VTYPE_PWSTR) { auto vals = varToTextU(params[2]).splitf>(u",", [](ssu& t) { t = t.trimmed(); }); - for (const auto& v : vals) { + for (const auto& v: vals) { dates.emplace(v, 0); } } else { diff --git a/src/v8sqlite_addin.h b/src/v8sqlite_addin.h index e37764b..62ea84f 100644 --- a/src/v8sqlite_addin.h +++ b/src/v8sqlite_addin.h @@ -22,7 +22,7 @@ class V8SqliteAddin : public V8Addin { lstringu<40> v{ssa{P_VERSION}}; value.vt = VTYPE_PWSTR; value.pwstrVal = copyText(v); - value.wstrLen = v.length(); + value.wstrLen = (int)v.length(); return true; } diff --git a/src/version.h b/src/version.h index 3a85692..31165fd 100644 --- a/src/version.h +++ b/src/version.h @@ -1,3 +1,3 @@ -#define F_VERSION 1,0,0,3 -#define P_VERSION "1.0.0.3" +#define F_VERSION 1,0,0,4 +#define P_VERSION "1.0.0.4"