diff --git a/.env-cmdrc b/.env-cmdrc index c6a7a4b7..63d02279 100644 --- a/.env-cmdrc +++ b/.env-cmdrc @@ -1,7 +1,7 @@ { "test": { "CONNECTION_KEY": "UAT18", - "LOCAL": "Driver={ODBC Driver 17 for SQL Server};Server=(localdb)\\node;Database=scratch;Trusted_Connection=yes;", + "LOCAL17": "Driver={ODBC Driver 17 for SQL Server};Server=(localdb)\\node;Database=scratch;Trusted_Connection=yes;", "LAP": "Driver={ODBC Driver 17 for SQL Server}; Server=DESKTOP-9RLN5E4;UID=linux; PWD=linux; Database=node", "WSL": "DSN=MSSQLTest;UID=linux; PWD=linux; Database=node", "DEV": "Driver={ODBC Driver 17 for SQL Server}; Server=192.168.1.102;UID=linux; PWD=linux; Database=node", @@ -11,7 +11,8 @@ "UAT18ENC": "Driver={ODBC Driver 18 for SQL Server}; Server=DESKTOP-VIUCH90; Database=node;TrustServerCertificate=yes;Trusted_Connection=yes;ColumnEncryption=Enabled;", "UAT": "Driver={ODBC Driver 17 for SQL Server}; Server=DESKTOP-VIUCH90;UID=linux; PWD=linux; Database=node", "SA": "Driver={ODBC Driver 17 for SQL Server}; Server=192.168.1.102;UID=sa; PWD=sqlexpress; Database=node", - "UAT11TC": "Driver={SQL Server Native Client 11.0}; Server=DESKTOP-VIUCH90; Database=node;Trusted_Connection=yes;" + "UAT11TC": "Driver={SQL Server Native Client 11.0}; Server=DESKTOP-VIUCH90; Database=node;Trusted_Connection=yes;", + "LOCAL18": "Driver={ODBC Driver 18 for SQL Server}; Server=(localdb)\\node;Database=scratch;Trusted_Connection=yes;" }, "appv-ubuntu": { "DEFAULT": "Driver={ODBC Driver 17 for SQL Server}; Server=localhost; Uid=SA; Pwd=Password12!" diff --git a/binding.gyp b/binding.gyp index 11538442..2ec99757 100644 --- a/binding.gyp +++ b/binding.gyp @@ -22,14 +22,20 @@ ] ], 'variables': { - "openssl_fips" : "0", - 'msodbcsql%': 'msodbcsql17', + 'openssl_fips' : '0', + # look for include files for these versions - taking top first priority + 'msodbsver%': [ + 'msodbcsql18', + 'msodbcsql17' + ], 'ext%': '.cpp', 'homebrew%': '/opt/homebrew/lib/libodbc.a', 'unixlocalodbc%': '-l/usr/local/odbc', 'linuxodbc%': '-lodbc', 'winodbc%': 'odbc32', - 'linkdir%': '/usr/local/lib /opt/homebrew/lib /usr/lib .' + # pick up libodbc from somwhere - note the ms driver is loaded dynamicaly via odbc, no + # link dependency is added + 'linkdir%': '/usr/local/lib /usr/local/ssl/lib64/ /opt/homebrew/lib /home/linuxbrew/.linuxbrew/lib/ /usr/lib .' }, 'targets': [ @@ -37,9 +43,30 @@ 'target_name': 'sqlserverv8', 'variables': { + # Set the target variable only if it is not passed in by prebuild 'target%': ' [" + "'/opt/microsoft/' + x +'/include/'" + " ," + "'/usr/local/opt/' + x + '/include/'" + " ," + "'/usr/local/opt/' + x + '/include/' + x + '/'" + " ," + "'/opt/homebrew/include/' + x + '/'" + "])" + ".flatMap(y => y)" + ".filter(z => require('fs').existsSync(z))" + ".join(' ')" + "\")" + ], + # set fo + # the link folders available -L/usr/local/lib -L/usr/lib -L. 'link_path%': [ " `[${e.name}] ${this.typed(e)}`).join(', ') @@ -105,6 +109,7 @@ class TableBuilder { this.paramsSql = paramsSql this.insertParamsSql = `${insertSql} ${paramsSql}` this.insertTvpProcedureName = `${this.tableSchema}.${this.tableName}_tvp_inserter` + this.dropInsertTvpProcedure = this.dropProc(this.insertTvpProcedureName) this.insertProcedureTvpSql = this.insertTvpProcSql() } diff --git a/lib/table.js b/lib/table.js index 797eb37b..4233a54f 100644 --- a/lib/table.js +++ b/lib/table.js @@ -13,8 +13,9 @@ 'use strict' -const { BasePromises } = require('./base-promises') const tableModule = (() => { + const { BasePromises } = require('./base-promises') + const { ServerDialect } = require("./dialect") const { TableBulkOpMgr } = require('./table-bulk-op-mgr') const { TableMeta } = require('./table-meta') const { TableColumn } = require('./table-column') @@ -48,6 +49,10 @@ const tableModule = (() => { this.user = connectionUser this.bcpVersion = 0 this.promises = new TableMgrPromises(this) + this.ServerDialect = { + Sybase: ServerDialect.Sybase, + SqlServer: ServerDialect.SqlServer + } } setBcpVersion (v) { diff --git a/samples/javascript/table-builder.js b/samples/javascript/table-builder.js index a19cbb49..58f2ab6f 100644 --- a/samples/javascript/table-builder.js +++ b/samples/javascript/table-builder.js @@ -35,14 +35,18 @@ async function builder () { const t = builder.toTable() const dropTypeSql = builder.dropTypeSql const userTypeSql = builder.userTypeTableSql + const dropTvpInsert = builder.dropInsertTvpProcedure + const tvpInserterSql = builder.insertProcedureTvpSql const typeName = `${tableName}Type` const selectSql = `DECLARE @test AS ${typeName}; INSERT INTO @test SELECT * FROM ?; SELECT * FROM @test` + console.log(dropTvpInsert) + await connection.promises.query(dropTvpInsert) const create = builder.createTableSql - const drop = builder.dropTableSql - console.log(drop) + const dropTable = builder.dropTableSql + console.log(dropTable) await builder.drop() console.log(create) await builder.create() @@ -50,6 +54,8 @@ async function builder () { await connection.promises.query(dropTypeSql) console.log(userTypeSql) await connection.promises.query(userTypeSql) + console.log(tvpInserterSql) + await connection.promises.query(tvpInserterSql) const table = t.asTableType() await connection.promises.getUserTypeTable('dbo.' + typeName) diff --git a/samples/typescript/builder.ts b/samples/typescript/builder.ts index 43924edc..a20d0e0a 100644 --- a/samples/typescript/builder.ts +++ b/samples/typescript/builder.ts @@ -39,6 +39,9 @@ async function builder (): Promise { const vec: Row[] = Array(rows).fill(0).map((_, i) => makeOne(i)) const table: BulkTableMgr = builder.toTable() + const dropTvpProcSql = builder.dropInsertTvpProcedure + console.log(dropTvpProcSql) + await connection.promises.query(dropTvpProcSql) const create: string = builder.createTableSql const drop: string = builder.dropTableSql console.log(drop) diff --git a/src/QueryOperationParams.cpp b/src/QueryOperationParams.cpp index b108b039..4b0551a2 100644 --- a/src/QueryOperationParams.cpp +++ b/src/QueryOperationParams.cpp @@ -19,6 +19,7 @@ shared_ptr> _query_string; QueryOperationParams::QueryOperationParams(const Local query_id, const Local query_object) : _timeout(MutateJS::getint32(query_object, "query_timeout")), + _query_tz_adjustment(0), _id(MutateJS::getint32(query_id)), _max_prepared_column_size(MutateJS::getint64(query_object, "max_prepared_column_size")), _numeric_string(MutateJS::getbool(query_object, "numeric_string")), diff --git a/src/TimestampColumn.cpp b/src/TimestampColumn.cpp index df6d4d49..3475f3d4 100644 --- a/src/TimestampColumn.cpp +++ b/src/TimestampColumn.cpp @@ -58,10 +58,11 @@ namespace mssql { return floor(days); } - void TimestampColumn::milliseconds_from_timestamp(TIMESTAMP_STRUCT const & ts, const int32_t tz_offset) + void TimestampColumn::milliseconds_from_timestamp(TIMESTAMP_STRUCT const & ts, const SQLSMALLINT tz_offset) { - const auto tzhrs = tz_offset / 60; - const auto tzmins = tz_offset % 60; + const SQLSMALLINT c = 60; + const SQLSMALLINT tzhrs = tz_offset / c; + const SQLSMALLINT tzmins = tz_offset % c; SQL_SS_TIMESTAMPOFFSET_STRUCT time_struct; time_struct.year = ts.year; diff --git a/src/TimestampColumn.h b/src/TimestampColumn.h index 71ab461c..07c57c70 100644 --- a/src/TimestampColumn.h +++ b/src/TimestampColumn.h @@ -109,7 +109,7 @@ namespace mssql // return the number of days since Jan 1, 1970 double DaysSinceEpoch(SQLSMALLINT y, SQLUSMALLINT m, SQLUSMALLINT d) const; - void milliseconds_from_timestamp(TIMESTAMP_STRUCT const & ts, int tz_offset = 0); + void milliseconds_from_timestamp(TIMESTAMP_STRUCT const & ts, SQLSMALLINT tz_offset = 0); // derived from ECMA 262 15.9 void milliseconds_from_timestamp_offset(SQL_SS_TIMESTAMPOFFSET_STRUCT const& time_struct); @@ -121,6 +121,6 @@ namespace mssql // since Jan 1, 1970 void DateFromMilliseconds(SQL_SS_TIMESTAMPOFFSET_STRUCT& date) const; - int32_t offset_minutes; + SQLSMALLINT offset_minutes; }; } diff --git a/src/UnbindOperation.cpp b/src/UnbindOperation.cpp index dc9f4f19..83dd4977 100644 --- a/src/UnbindOperation.cpp +++ b/src/UnbindOperation.cpp @@ -12,7 +12,7 @@ namespace mssql Local UnbindOperation::CreateCompletionArg() { - auto a = _statement->unbind_params(); + const auto a = _statement->unbind_params(); const auto ret = a->Clone(); return ret; }