const taos = require('../tdengine');
var conn = taos.connect({ host: "localhost" });
var cursor = conn.cursor();

function executeUpdate(updateSql) {
    console.log(updateSql);
    cursor.execute(updateSql);
}
function executeQuery(querySql) {

    let query = cursor.query(querySql);
    query.execute().then((result => {
        console.log(querySql);
        result.pretty();
    }));
}

function stmtBindParamBatchSample() {
    let db = 'node_test_db';
    let table = 'stmt_taos_bind_param_batch';

    let createDB = `create database if not exists ${db} keep 3650;`;
    let dropDB = `drop database if exists ${db};`;
    let useDB = `use ${db}`;
    let createTable = `create table if not exists ${table} ` +
        `(ts timestamp,` +
        `bl bool,` +
        `i8 tinyint,` +
        `i16 smallint,` +
        `i32 int,` +
        `i64 bigint,` +
        `f32 float,` +
        `d64 double,` +
        `bnr binary(20),` +
        `blob nchar(20),` +
        `u8 tinyint unsigned,` +
        `u16 smallint unsigned,` +
        `u32 int unsigned,` +
        `u64 bigint unsigned` +
        `)tags(` +
        `t_bl bool,` +
        `t_i8 tinyint,` +
        `t_i16 smallint,` +
        `t_i32 int,` +
        `t_i64 bigint,` +
        `t_f32 float,` +
        `t_d64 double,` +
        `t_bnr binary(20),` +
        `t_blob nchar(20),` +
        `t_u8 tinyint unsigned,` +
        `t_u16 smallint unsigned,` +
        `t_u32 int unsigned,` +
        `t_u64 bigint unsigned` +
        `);`;
    let querySql = `select * from ${table};`;
    let insertSql = `insert into ? using ${table} tags(?,?,?,?,?,?,?,?,?,?,?,?,?) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?);`;

    executeUpdate(dropDB);
    executeUpdate(createDB);
    executeUpdate(useDB);
    executeUpdate(createTable);

    let mBinds = new taos.TaosMultiBindArr(14);
    mBinds.multiBindTimestamp([1642435200000, 1642435300000, 1642435400000, 1642435500000, 1642435600000]);
    mBinds.multiBindBool([true, false, true, undefined, null]);
    mBinds.multiBindTinyInt([-127, 3, 127, null, undefined]);
    mBinds.multiBindSmallInt([-256, 0, 256, null, undefined]);
    mBinds.multiBindInt([-1299, 0, 1233, null, undefined]);
    mBinds.multiBindBigInt([16424352000002222n, -16424354000001111n, 0, null, undefined]);
    mBinds.multiBindFloat([12.33, 0, -3.1415, null, undefined]);
    mBinds.multiBindDouble([3.141592653, 0, -3.141592653, null, undefined]);
    mBinds.multiBindBinary(['TDengine_Binary', '', 'taosdata涛思数据', null, undefined]);
    mBinds.multiBindNchar(['taos_data_nchar', 'taosdata涛思数据', '', null, undefined]);
    mBinds.multiBindUTinyInt([0, 127, 254, null, undefined]);
    mBinds.multiBindUSmallInt([0, 256, 512, null, undefined]);
    mBinds.multiBindUInt([0, 1233, 4294967294, null, undefined]);
    mBinds.multiBindUBigInt([16424352000002222n, 36424354000001111n, 0, null, undefined]);

    let tags = new taos.TaosBind(13);

    tags.bindBool(true);
    tags.bindTinyInt(127);
    tags.bindSmallInt(32767);
    tags.bindInt(1234555);
    tags.bindBigInt(-164243520000011111n);
    tags.bindFloat(214.02);
    tags.bindDouble(2.01);
    tags.bindBinary('taosdata涛思数据');
    tags.bindNchar('TDengine数据');
    tags.bindUTinyInt(254);
    tags.bindUSmallInt(65534);
    tags.bindUInt(4294967290 / 2);
    tags.bindUBigInt(164243520000011111n);

    cursor.stmtInit();
    cursor.stmtPrepare(insertSql);
    cursor.stmtSetTbnameTags('s_01', tags.getBind());
    cursor.stmtBindParamBatch(mBinds.getMultiBindArr());
    cursor.stmtAddBatch();
    cursor.stmtExecute();
    cursor.stmtClose();

    executeQuery(querySql);
    executeUpdate(dropDB);    

}

stmtBindParamBatchSample();
setTimeout(() => {
    conn.close();
}, 2000);
