В этом разделе перечислены свойства и методы объекта JCJS_SQL плагина PluginSQL
Пример использования:
// Загрузить плагин и Установить в JS конструторы объектов
post.loadPlugin('PluginSQL').install(scriptEngine);
// Создать объект, к свойствам и
// методам которого можно обращаться в стиле Qt
var db = new JCJS_SQL();
//свойство параметра чтение/запись:
// Чтение
var driver = db.driverName;
// Запись
var driver = 'QOCI';
db.driverName = driverName;
String Array() db.drivers только чтение
Вывести список всех зарегистрированных драйверов
var allDrivers = db.drivers;
// Массив строк ['QIBASE', 'QSQLITE', 'QOCI8', 'QOCI', 'QODBC3', 'QODBC', 'QPSQL7', 'QPSQL']
var allDriversStr = '';
for (i=0; i < allDrivers.length; i++) {
allDriversStr += (allDrivers[i] + ' ');
}
post.log("i", 'Список всех доступных драйверов: ' + allDriversStr)
String db.driverName чтение/запись
Установить используемый драйвер для соединения с БД
db.driverName = 'QOCI';
String db.databaseName чтение/запись
Устанавливает 'имя базы' данных для соединения.
см. официальное описание void QSqlDatabase::setDatabaseName (QString &)
Для драйвера QOCI (Oracle) имя базы данных - это TNS Service Name,
Или спец строка соединения, если есть необходимость отвязаться от записей в файле tnsnames.ora.
var dbHost_1 = '10.7.182.111'; // основной
var dbPort_1 = '1521';
var dbHost_2 = '10.7.182.112'; // резервный
var dbPort_2 = '1521';
var dbSid = 'dbpc';
var oraDbName = '(DESCRIPTION =' +
' (ADDRESS_LIST =' +
' (ADDRESS = (PROTOCOL = TCP)(HOST = ' +dbHost_1+ ')(PORT = ' +dbPort_1+ '))' +
' (ADDRESS = (PROTOCOL = TCP)(HOST = ' +dbHost_2+ ')(PORT = ' +dbPort_2+ '))' +
' )' +
' (CONNECT_DATA =' +
' (SERVER = DEDICATED)' +
' (SID = ' +dbSid+ ')' +
' )' +
')';
db.driverName = 'QOCI';
db.hostName = dbHost_1;
db.port = dbPort_1;
db.databaseName = oraDbName; // Установить строку соединения
db.userName = 'user';
db.password = 'userpass';
if (db.open()) {
// Успех
}
db.driverName = 'QODBC';
db.databaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb");
if (db.open()) {
// Успех
}
var dbHost = '10.7.211.7'
var dbPort = '1433'
var dbName = 'msSqlDb'
var dbUsr = 'username'
var dbPwd = 'password'
var db_sql = '' +
'Driver={SQL Server};' +
'Server=' + dbHost + ',' + dbPort + ';' +
'Database=' + dbName + ';' +
'Uid=' + dbUsr + ';' +
'Pwd=' + dbPwd + ';' +
'';
db.driverName = 'QODBC';
db.hostName = dbHost;
db.port = dbPort;
db.databaseName = db_sql; // Установить строку соединения
db.userName = dbUsr;
db.password = dbPwd;
if (db.open()) {
// Успех
}
String db.hostName чтение/запись
Установить host как имя узла соединения.
см. официальное описание void QSqlDatabase::setHostName(const QString & options)
db.port = 3306;
db.hostName = '10.7.64.10';
db.databaseName = 'mySqlDb';
if (db.open()) {
// Успех
}
int db.port чтение/запись
Устанавливает порт соединения как port. Чтобы получить эффект,
номер порта должен быть установлен перед тем, как соединение будет открыто.
В качестве альтернативы, вы можете закрыть соединение close(),
установить номер порта и снова вызвать open().
У этого параметра нет значения по умолчанию.
см. официальное описание void QSqlDatabase::setConnectOptions(const QString & options)
db.port = 1521;
db.hostName = '10.7.97.3'
db.databaseName = 'ASKRO';
if (db.open()) {
// Успех
}
String db.connectionName чтение/запись
Установить идентификатор соединения
Можно не указывать, оно будет назначено автоматически
Замечание: Имя соединения - это не имя базы данных.
см. официальное описание void QSqlDatabase::setConnectOptions(const QString & options)
db.connectionName = "con_" + post.postName;
String db.connectOptions чтение/запись
Установить специфические параметры соединения с БД
см. официальное описание void QSqlDatabase::setConnectOptions(const QString & options)
// соденинение MySQL
db.connectOptions = "CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1"; // используйте SSL соединение
if (!db.open()) {
db.connectOptions = ''; // очищает список параметров
...
}
bool db.ifValid только чтение
возвращает статус используемого драйвера SQL
см. официальное описание bool QSqlDatabase::ifValid()
if(db.ifValid) {
post.log("i", 'драйвер соединения с БД можно использовать')
}
bool db.isOpen только чтение
возвращает статус соединения с БД
см. официальное описание bool QSqlDatabase::isOpen()
if(db.isOpen) {
db.query('SELECT * FROM mytable t WHERE t.ID = 10');
}
bool db.isOpenError только чтение
возвращает статус соединения с БД
см. официальное описание bool QSqlDatabase::isOpenError()
db.open();
if(db.isOpenError) {
post.log("e", 'не смог соединиться с БД. Err: ' + db.lastError)
}
bool db.isRunning только чтение
возвращает статус выполнения SQL запроса в отдельном потоке
(см. db.query_thread и
db.exec_thread)
db.open();
if(db.isOpenError) {
post.log("e", 'не смог соединиться с БД. Err: ' + db.lastError)
}
bool db.isSupportEvent только чтение
возвращает статус поддержки базой событий (см. db.event)
ВНИМАНИЕ!!! При закрытом соединении с БД всегда возвращает false
db.open();
if(db.isSupportEvent) {
post.log("i", 'драйвер ' + db.driverName + ' поддерживает события в БД')
}
String db.lastError только чтение
последняя ошибка при работе с БД
if(!db.open()) {
post.log("e", 'не смог соединиться с БД. Err: ' + db.lastError)
}
Object db.lastErrors только чтение
Детальная ошибка
var oracle_sql = 'select ID, NOMER, NAME, SHORTNAME, SIZER from SKYLINK order by NOMER';
if(!db.query(oracle_sql))
{
post.log("e", JSON.stringify(db.lastErrors,0,2));
}
bool db.traceLog чтение/запись
Включить/отключить вывод в лог отладочной информации
db.traceLog = true;
db.query("UPDATE skylink SIZER='nZv/h' WHERE id > 5 AND id < 10");
db.traceLog = false;
bool db.affectedRows чтение
Количество измененных записей в БД
if(db.query("UPDATE skylink SIZER='nZv/h' WHERE id > 5 AND id < 10"))
{
if(db.affectedRows == 0)
{
post.log("w", 'записи, удовлетворяющие условию (id > 5 AND id < 10) не найдены в таблице skylink')
}
else
{
post.log("i", 'Изменено записей в БД:: ' + db.affectedRows)
}
}
else
{
post.log("e", 'ошибка выполнения запроса. Err: ' + db.lastError)
}
int db.timeNotUse чтение/запись
Время в ms, после которого останавливается поток обслуживающий асинхронные запросы, если нет активности в очереди (по умолчанию 720000 ms - 12 минут )
void db.opened() Сигнал
генерируется объектом JCJS_SQL при удачном соединении с БД
db.opened.connect(db, function opened(){this.db_opened = 1});
void db.closed() Сигнал
генерируется объектом JCJS_SQL при закрытии соединения
db.closed.connect(db, function closed(){this.db_opened = 0});
void db.query_finish(bool) Сигнал
генерируется объектом JCJS_SQL при окончании
выполнении асинхронного запроса db.query_thread();
// подсоединить к сигналу query_finish функцию обработчик
db.query_finish.connect(function func_finish(res, err, elapsed){
if(res) {
var roomStr;
if(res.rows) {
roomStr = 'Помещение найдено ' + res.ROOM[0] +' '+ res.ROOMNAME[0];
} else {
roomStr = 'Помещение не найдено'
}
post.log("i", 'запрос выполнен успешно: ' + roomStr);
} else {
post.log("i", 'запрос не выполнен');
}
});
// Выполнить асинхронный запрос
db.query_thread('SELECT room, roomname FROM rooms_table where roomid = 1');
или с возможностью отключения функций обработчиков
// Объявить глобально функцию обработчика
func_finish = function func_finish(res, err, elapsed){
if(res) {
var roomStr;
if(res.rows) {
roomStr = 'Помещение найдено ' + res.ROOM[0] +' '+ res.ROOMNAME[0];
} else {
roomStr = 'Помещение не найдено'
}
post.log("i", 'запрос выполнен успешно за ' + elapsed +' ms: ' + roomStr);
} else {
var args = [].slice.call(arguments)
args.shift() // пропустить первый аргумент
res = args.shift()
err = args.shift()
elapsed = args.shift()
post.log("i", 'запрос не выполнен: ' + JSON.stringify(err));
}
// отсоединить сигнал от функции
db.query_finish.disconnect(func_finish);
}
// Подсоединить сигнал к функции
db.query_finish.connect(func_finish);
// Выполнить асинхронный запрос
db.query_thread('SELECT room, roomname FROM rooms_table where roomid = 1');
void db.event(eventName) Сигнал
void db.event(eventName, payload, source) Сигнал (только в Qt5)
генерируется объектом JCJS_SQL при возникновении события в БД
прежде чем ожидать событие, на него необходимо подписаться с помощью db.add_event()
// подсоединить к сигналу event функцию обработчик
// payload, source доступны только в Qt5.
// При этом, полезная нагрузка payload, некоторыми СУБД не поддерживаются. В частности Firebird
db.event.connect(function event(evnt, payload, source){
post.log('i', 'в БД сгенерировано событие: ' + evnt)
});
db.add_event('DUT_UPDATE'); // подписаться на событие DUT_UPDATE
/* после возникновения события DUT_UPDATE в БД,
сгенерируется сигнал event, и будет вызван обработчик
*/
void db.started() Сигнал
генерируется объектом JCJS_SQL при запуске потока обслуживающего асинхронные запросы
void db.finished() Сигнал
генерируется объектом JCJS_SQL при остановке потока обслуживающего асинхронные запросы
bool db.isDriverAvailable(String driverName) Функция
Проверить доступность драйвера
if(db.isDriverAvailable('QODBC')){
post.log('i', 'Драйвер QODBC можно использовать')
}
bool db.open() Функция
Открыть соединение с БД
db.port = 1521;
db.hostName = '10.7.97.3'
db.databaseName = 'ASKRO';
if (db.open()) {
// Успех
}
bool db.close() Функция
Закрыть соединение с БД
if (db.close()) {
// Успех
}
bool db.transaction() Функция
Начать транзакцию
var transaction_start = db.transaction();
bool db.commit() Функция
Завершить транзакцию (записать все изменения в БД)
var transaction_start = db.transaction();
... // работа с SQL запросами INSERT, UPDATE, DELETE и т.д.
if(transaction_start)
db.commit();
bool db.rollback() Функция
Откатить транзакцию (отменить все изменения, сделанные после db.transaction())
function rec_toDb(id, name, val)
var transaction_start = db.transaction();
... // работа с SQL запросами INSERT, UPDATE, DELETE и т.д.
if(!db.query("INSERT INTO myTableName1 (id, name, val) VALUES ('"+Number(id)+"', '"+name+"', '"+val+"')"))
{
db.rollback();
return false;
}
if(!db.query("INSERT INTO myTableName2 (column_id, column_name, column_val) VALUES ('"+Number(id)+"', '"+name+"', '"+val+"')"))
{
db.rollback();
return false;
}
if(transaction_start) db.commit();
return true;
}
bool db.query(String sql) Функция
Выполнить запрос (выполняется синхронно)
Если ожидается длительное выполнение запроса,
необходимо обернуть все запросы в сигнал-слотовую конструкцию
и использовать функцию асинхронного запроса db.query_thread()
db.queryResult
- Объект со всеми результирующими данными запроса
Запросы возвращающие данные размешаются в объекте db.queryResult
var oracle_sql = 'select ID, NOMER, NAME, SHORTNAME, SIZER from SKYLINK order by NOMER';
// Массив с сохраненными результирующими данными запроса
var channels_arr = [];
// Объект с сохраненными результирующими данными запроса
var channels_obj = {};
if(db.query(oracle_sql))
{
for(var i=0; i < db.queryResult.rows; i++)
{
// Объект, в который будут помещена информация одной строки запроса
var chann = {};
// разместить в массиве
channels_arr.push(chann);
// или разместить в объекте (зависит от подхода программиста)
channels_obj['ch_' + db.queryResult.ID[i]] = chann;
// Скопировать данные из результирующего Объекта в объект chann
chann.ID = db.queryResult.ID[i];
chann.NOMER = db.queryResult.NOMER[i];
chann.NAME = db.queryResult.NAME[i];
chann.SHORTNAME = db.queryResult.SHORTNAME[i];
chann.SIZER = db.queryResult.SIZER[i];
}// for i < db.queryResult.rows
// ------------------------------------------------------------------
// Пример: Если имена полей не известны, можно выбрать результат запроса из массива queryResult.fields_index
for(var c=0; c < db.queryResult.fields_index.lenght; c++)
{
// Перебор полей
for(var i=0; i < db.queryResult.rows; i++)
{
//var fieldVal = db.queryResult.fields_index[c][i];
}
}
// ------------------------------------------------------------------
// Пример: Или сначала взять имена полей из массива queryResult.fields_names
for(var c=0; c < db.queryResult.fields_names.lenght; c++)
{
var field = db.queryResult.fields_names[c];
// Перебор полей
for(var i=0; i < db.queryResult.rows; i++)
{
// и обратиться к именованому свойству объекта queryResult
//var fieldVal = db.queryResult[field][i];
}
}
// ------------------------------------------------------------------
}
db.close();
// Теперь запрошенные данные можно использовать из channels_arr или channels_obj
for(var i=0; i < channels_arr.lenght; i++)
{
var chann = channels_arr[i];
...
}
for(var key in channels_obj)
{
var chann = channels_obj[key];
...
}
Выполнить не селективный запрос (не возвращающий строки)
var db = new JCJS_SQL();
... // Установить информацию о соединении
db.open();
if(db.isOpen())
{
db.transaction();
if(db.query("UPDATE skylink SIZER='nZv/h' WHERE id > 5 AND id < 10"))
{
// Запрос изменил 4-ре записи в БД
db.commit();
post.log('i', 'Запрос выполнен успешно. Количество измененных записей: ' + db.queryResult.numRowsAffected);
}
}
bool db.query_thread(String sql) Функция
Выполнить асинхронный запрос
По завершению выполнения запроса, генерируются сигнал
db.query_finish(res, err, elapsed)
bool db.query_thread(sql[]) Функция
bool db.query_thread(func, sql) Функция
bool db.query_thread(func, sql[]) Функция
bool db.query_thread(ctx, func, sql) Функция
bool db.query_thread(ctx, func, sql[]) Функция
Выполнить асинхронный запрос
По завершению выполнения запроса, выполняется функция func в которую передается ctx как объект this
ВНИМАНИЕ!!! Все асинхронные запросы выполняются в отдельном соединении и имеют разные идентификаторы соединений при сравнении с синхронными
// подсоединить к сигналу query_finish функцию обработчик
db.query_finish.connect(function func_finish(res, err, elapsed){
if(res) {
var roomStr;
if(res.rows) {
roomStr = 'Помещение найдено ' + res.ROOM[0] +' '+ res.ROOMNAME[0];
} else {
roomStr = 'Помещение не найдено'
}
post.log("i", 'запрос выполнен успешно за ' + elapsed +' ms: ' + roomStr);
} else {
var args = [].slice.call(arguments)
args.shift() // пропустить первый аргумент
res = args.shift()
err = args.shift()
elapsed = args.shift()
post.log("i", 'запрос не выполнен: ' + JSON.stringify(err));
}
});
// Выполнить асинхронный запрос
db.query_thread('SELECT room, roomname FROM rooms_table where roomid = 1');
или с возможностью отключения функций обработчиков
// Объявить функцию обработчика
var func_finish = func_finish(res, err, elapsed){
if(res) {
var roomStr;
if(res.rows) {
roomStr = 'Помещение найдено ' + res.ROOM[0] +' '+ res.ROOMNAME[0];
} else {
roomStr = 'Помещение не найдено'
}
post.log("i", 'запрос выполнен успешно за ' + elapsed +' ms: ' + roomStr);
} else {
var args = [].slice.call(arguments)
args.shift() // пропустить первый аргумент
res = args.shift()
err = args.shift()
elapsed = args.shift()
post.log("i", 'запрос не выполнен: ' + JSON.stringify(err));
}
}
// Подсоединить сигнал к функции
db.query_finish.connect(db, func_finish);
// Выполнить асинхронный запрос
db.query_thread('SELECT room, roomname FROM rooms_table where roomid = 1');
лучшего результата можно добится не используя сигнал db.query_finish(res, err, elapsed)
function func_finish(res, err, elapsed){
if(res) {
var roomStr;
if(res.rows) {
roomStr = 'Помещение найдено ' + res.ROOM[0] +' '+ res.ROOMNAME[0];
} else {
roomStr = 'Помещение не найдено'
}
post.log("i", 'запрос выполнен успешно за ' + elapsed +' ms: ' + roomStr);
} else {
var args = [].slice.call(arguments)
args.shift() // пропустить первый аргумент
res = args.shift()
err = args.shift()
elapsed = args.shift()
post.log("i", 'запрос не выполнен: ' + JSON.stringify(err));
}
}
// Выполнить запрос асинхронно
db.query_thread(func_finish, 'SELECT room, roomname FROM rooms_table WHERE roomid = 1');
// Выполнить сразу несколько запросов (асинхронно, функция вызовется на самом последнем запросе)
var arrSql = [];
arrSql.push('DELETE FROM rooms_table WHERE roomid = 1');
arrSql.push('commit');
arrSql.push('SELECT room, roomname FROM rooms_table WHERE roomid = 1');
db.query_thread(db, func_finish, arrSql);
Запись в БД значений типа BLOB описание
Для записи используйте функцию exec
bool db.exec(proc, argArr) Функция
Выполнить SQL процедуру proc c аргументами argArr (выполняется синхронно)
Если ожидается длительное выполнение запроса,
необходимо обернуть все запросы в сигнал-слотовую конструкцию
и использовать функцию асинхронного запроса db.exec_thread()
ВНИМАНИЕ!!! В некоторых драйверах БД (в частности в QIBASE)
при выполнении процедур db.queryResult.numRowsAffected всегда возвращает 0
var db = new JCJS_SQL();
... // Установить информацию о соединении
db.open();
if(db.isOpen())
{
var transaction_start = db.transaction();
var ins_proc = 'SHUS_JOURNAL_INS';
// Массив аргументов
var procArgArr = [];
// Наполнить массив значениями
procArgArr.push(1); // Первый аргумент
procArgArr.push(new Date()); // второй
procArgArr.push(2.56); // третий
procArgArr.push('Строковый аргумент'); // четвертый
var blob = new ByteArray();
// blob.push(........); добавить данные в массив ByteArray
procArgArr.push(blob.valueOf()); // запись BLOB (отдать на запись QByteArray)
if(!db.exec(ins_proc, procArgArr)) // выполнить процедуру
{
post.log("e", 'ошибка выполнения процедуры ' + ins_proc + '\t Err: ' + db.lastError)
if(transaction_start)
db.rollback();
transaction_start = false;
}
else
{
post.log("i", 'Процедура ' + ins_proc + ' выполнена успешно');
}
}
bool db.exec_thread(proc, argArr) Функция
Выполнить асинхронный запрос
По завершению выполнения запроса, генерируются сигнал
db.query_finish(res, err, elapsed)
void db.clearSqlResult() Процедура
Освободить память C++ объекта занятую результатом запроса
if(db.isOpen() && db.query('select * from MYTABLE'))
{
var qResult = db.queryResult; // забрать ссылку на результат
db.clearSqlResult(); // очистить C++ объект и db.queryResult == undefined
post.log('i', jsext.stringify(qResult,0,2));
}
bool db.tables(tableType) Функция
Выводит имена всех таблиц/представлений
type - определитель что выводить
// tableTypes
var tables = 0x01; // (по умолчанию)
var systemTables = 0x02;
var views = 0x04;
var allTables = 0xff;
if(db.isOpen())
{
if(db.tables( tables ))
{
for(var i=0; i < db.queryResult.rows; i++)
{
post.log('d', 'table ' + i + ':\t' + db.queryResult.TABLES[i]);
}
}
if(db.tables( views ))
{
for(var i=0; i < db.queryResult.rows; i++)
{
post.log('d', 'view ' + i + ':\t' + db.queryResult.TABLES[i]);
}
}
if(db.tables( views|tables ))
{
for(var i=0; i < db.queryResult.rows; i++)
{
post.log('d', '' + i + ':\t' + db.queryResult.TABLES[i]);
}
}
}
bool db.add_event(evntName) Функция
Подписаться на событие в БД
При возникновении этого события в БД,
сгенерируется сигнал db.event.
// подсоединить к сигналу event функцию обработчик
db.event.connect(function event(evnt){
post.log('i', 'в БД сгенерировано событие: ' + evnt)
});
db.add_event('DUT_UPDATE'); // подписаться на событие DUT_UPDATE
/* после возникновения события DUT_UPDATE в БД,
сгенерируется сигнал event, и будет вызван обработчик
*/
bool db.rem_event(evntName) Функция
Отписаться от события в БД
StringList db.events() Функция
Список всех событий, на которые ожидать сигнал db.event
void db.enableTraceLog() Процедура
void db.disableTraceLog() Процедура
Включить/отключить вывод в лог отладочной информации
db.enableTraceLog();
db.query("UPDATE skylink SIZER='nZv/h' WHERE id > 5 AND id < 10");
db.disableTraceLog();
object db.counters() Функция
Возвращает состояние текущего соединения
post.log('e',JSON.stringify(db.counters(),0,2))
// выведет в лог
// {
// "cnt_open": 2, количество попыток открыть соединение db.open()
// "cnt_opened": 2, количество успешных открытых соединений
// "cnt_closed": 1, количество разорванных соединения db.close()
// "is_opened": 1, состояние текущего соединения
// "cnt_sql_ok": 2, количество успешных sql запросов
// "cnt_sql_er": 0, количество sql запросов завершенных ошибкой
// "driver": "QIBASE", тип драйвера
// "database": "fdb_1", имя БД
// "user": "SYSDBA", имя пользователя
// "host": "127.0.0.1:3050", хост/порт
// "subscribeEvents": [] Список всех событий db.events()
// }
void db.setCodec(String codec) Процедура
Установить при необходимости декодер строк при работе с сервером
обычно кодек устанавливается соответствующим запросом SQL к серверу
db.setCodec('KOI8-R');
/*
==== Список поддерживаемых кодеков (включая синонемы) ===
UTF-8 ISO-8859-1 latin1 CP819
IBM819 iso-ir-100 csISOLatin1 ISO-8859-15
latin9 UTF-32LE UTF-32BE UTF-32
UTF-16LE UTF-16BE UTF-16 System
roman8 hp-roman8 csHPRoman8 TIS-620
ISO 8859-11 WINSAMI2 WS2 Apple Roman
macintosh MacRoman windows-1258 CP1258
windows-1257 CP1257 windows-1256 CP1256
windows-1255 CP1255 windows-1254 CP1254
windows-1253 CP1253 windows-1252 CP1252
windows-1251 CP1251 windows-1250 CP1250
IBM866 CP866 csIBM866 IBM874
CP874 IBM850 CP850 csPC850Multilingual
ISO-8859-16 iso-ir-226 latin10 ISO-8859-14
iso-ir-199 latin8 iso-celtic ISO-8859-13
ISO-8859-10 iso-ir-157 latin6 ISO-8859-10:1992
csISOLatin6 ISO-8859-9 iso-ir-148 latin5
csISOLatin5 ISO-8859-8 ISO 8859-8-I iso-ir-138
hebrew csISOLatinHebrew ISO-8859-7 ECMA-118
greek iso-ir-126 csISOLatinGreek ISO-8859-6
ISO-8859-6-I ECMA-114 ASMO-708 arabic
iso-ir-127 csISOLatinArabic ISO-8859-5 cyrillic
iso-ir-144 csISOLatinCyrillic ISO-8859-4 latin4
iso-ir-110 csISOLatin4 ISO-8859-3 latin3
iso-ir-109 csISOLatin3 ISO-8859-2 latin2
iso-ir-101 csISOLatin2 KOI8-U KOI8-RU
KOI8-R csKOI8R Iscii-Mlm Iscii-Knd
Iscii-Tlg Iscii-Tml Iscii-Ori Iscii-Gjr
Iscii-Pnj Iscii-Bng Iscii-Dev TSCII
GB18030 GBK GB2312 CP936
MS936 windows-936 EUC-JP ISO-2022-JP
Shift_JIS JIS7 SJIS MS_Kanji
EUC-KR cp949 Big5 Big5-HKSCS
Big5-ETen CP950
*/
object db.hasFeature() Функция
Возвращает объект с описанием возможностей используемого SQL драйвера
db.open(); console.log( db.hasFeature() ); // вывод в лог описания возможностей
object db.taskSize() Функция
Возвращает количество необработанных асинхронных запросов
db.open(); console.log( db.hasFeature() ); // вывод в лог описания возможностей
void db.stop_thread(ms = 1000) Процедура
Завершить асинхронную обработку и очистить очередь.
По умолчанию 1 сек ждать завершения запросов, и принудительно завершить поток обработки