В этом разделе перечислены свойства и методы объекта JCJS_SQL плагина PluginSQL

Свойства (property)

Пример использования:

// Загрузить плагин и Установить в 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()) {
    // Успех
 }

Для драйвера QODBC, name может быть DSN, имя файла DSN (в это случае файл должен иметь расширение .dsn) или строкой соединения.
Например, пользователи Microsoft Access могут использовать следующую строку соединения для открытия непосредственно файлов (вместо создания DSN записи в менеджере ODBC)
 db.driverName   = 'QODBC';
 db.databaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb");
 if (db.open()) {
    // Успех
 }

Для соединения с Microsoft Sql Server посредством ODBC Драйвера, необходимо указать строку соединения
 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

  • Описание объекта db.queryResult

    1. db.queryResult.rows  -  int     Количество строк, которые вернул запрос
    2. db.queryResult.fields  -  int     Количество столбцов, которые вернул запрос
    3. db.queryResult.fields_names  -  Array     Массив имен столбцов, которые вернул запрос
    4. db.queryResult.fields_index  -  Array     Массив столбцов, которые вернул запрос
    5. db.queryResult.fields_types  -  Array     Массив типов данных, которые вернул запрос
    6. db.queryResult.fields_typeN  -  Array     Массив имен типов данных, которые вернул запрос
    7. db.queryResult.numRowsAffected  -  int     Количество измененных записей в БД
    После db.close() объект db.queryResult очищается
    Чтобы принудительно освободить используюмую память воспользуйтесь db.clearSqlResult()

     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 сек ждать завершения запросов, и принудительно завершить поток обработки