diff --git a/mssql/mssql-tests.ts b/mssql/mssql-tests.ts index 453b2b4e3..e508ec354 100644 --- a/mssql/mssql-tests.ts +++ b/mssql/mssql-tests.ts @@ -71,8 +71,74 @@ var connection: sql.Connection = new sql.Connection(config, function (err: any) console.error('Error happened calling Query: ' + err.name + " " + err.message); } else { - console.info(requestStoredProcedureWithOutput.parameters.output.value); + console.info(requestStoredProcedureWithOutput.parameters['output'].value); } }); } }); + +function test_table() { + var table = new sql.Table('#temp_table'); + + table.create = true; + + table.columns.add('name', sql.VarChar(sql.MAX), { nullable: false }); + table.columns.add('type', sql.Int, { nullable: false }); + table.columns.add('amount', sql.Decimal(7, 2), { nullable: false }); + + table.rows.add('name', 42, 3.50); + table.rows.add('name2', 7, 3.14); +} + + +function test_promise_returns() { + // Methods return a promises if the callback is omitted. + var connection: sql.Connection = new sql.Connection(config); + connection.connect().then(() => { }); + connection.close().then(() => { }); + + var preparedStatment = new sql.PreparedStatement(connection); + preparedStatment.prepare("SELECT @myValue").then(() => { }); + preparedStatment.execute({ myValue: 1 }).then((recordSet) => { }); + preparedStatment.unprepare().then(() => { }); + + var transaction = new sql.Transaction(connection); + transaction.begin().then(() => { }); + transaction.commit().then(() => { }); + transaction.rollback().then(() => { }); + + var request = new sql.Request(); + request.batch('create procedure #temporary as select * from table').then((recordset) => { }); + request.bulk(new sql.Table("table_name")).then(() => { }); + request.query('SELECT 1').then((recordset) => { }); + request.execute('procedure_name').then((recordset) => { }); +} + + +function test_request_constructor() { + // Request can be constructed with a connection, preparedStatment, transaction or no arguments + var connection: sql.Connection = new sql.Connection(config); + var preparedStatment = new sql.PreparedStatement(connection); + var transaction = new sql.Transaction(connection); + + var request1 = new sql.Request(connection); + var request2 = new sql.Request(preparedStatment); + var request3 = new sql.Request(transaction); + var request4 = new sql.Request(); +} + +function test_classes_extend_eventemitter() { + var connection: sql.Connection = new sql.Connection(config); + var transaction = new sql.Transaction(); + var request = new sql.Request(); + var preparedStatment = new sql.PreparedStatement(); + + connection.on('connect', () => { }); + transaction.on('begin', () => { }); + transaction.on('commit', () => { }); + transaction.on('rollback', () => { }); + request.on('done', () => { }); + request.on('error', () => { }); + + preparedStatment.on('error', () => { }) +} \ No newline at end of file diff --git a/mssql/mssql.d.ts b/mssql/mssql.d.ts index 880eb716c..c434444d3 100644 --- a/mssql/mssql.d.ts +++ b/mssql/mssql.d.ts @@ -1,53 +1,131 @@ -// Type definitions for mssql +// Type definitions for mssql v2.2.0 // Project: https://www.npmjs.com/package/mssql -// Definitions by: COLSA Corporation +// Definitions by: COLSA Corporation , Ben Farr // Definitions: https://github.com/borisyankov/DefinitelyTyped +/// +/// + declare module "mssql" { + import events = require('events'); - export var Date: any; - export var DateTime: any; - export var DateTime2: any; - export var DateTimeOffset: any; - export var SmallDateTime: any; - export var Time: any; - export var Char: any; - export var VarChar:any; - export var NChar: any; - export var NVarChar: any; - export var Text:any; - export var NText:any; - export var Xml: any; - export var TinyInt:any; - export var SmallInt:any; - export var Int: any; - export var BigInt:any; - export var Decimal:any; - export var Float:any; - export var Real:any; - export var SmallMoney:any; - export var Money:any; - export var Numeric:any; - export var Bit: any; - export var Binary: any; - export var VarBinary: any; - export var TVP: any; - export var UniqueIdentifier: any; - export var Image: any; - export var UDT: any; - export var Geography: any; - export var Geometry: any; + type sqlTypeWithNoParams = { type: sqlTypeFactoryWithNoParams } + type sqlTypeWithLength = { type: sqlTypeFactoryWithLength, length: number } + type sqlTypeWithScale = { type: sqlTypeFactoryWithScale, scale: number } + type sqlTypeWithPrecisionScale = { type: sqlTypeFactoryWithPrecisionScale, precision: number, scale: number } + type sqlTypeWithTvpType = { type: sqlTypeFactoryWithTvpType, tvpType: any } - export interface options { + type sqlTypeFactoryWithNoParams = () => sqlTypeWithNoParams; + type sqlTypeFactoryWithLength = (length?: number) => sqlTypeWithLength; + type sqlTypeFactoryWithScale = (scale?: number) => sqlTypeWithScale; + type sqlTypeFactoryWithPrecisionScale = (precision?: number, scale?: number) => sqlTypeWithPrecisionScale; + type sqlTypeFactoryWithTvpType = (tvpType: any) => sqlTypeWithTvpType; + + export var VarChar: sqlTypeFactoryWithLength; + export var NVarChar: sqlTypeFactoryWithLength; + export var Text: sqlTypeFactoryWithNoParams; + export var Int: sqlTypeFactoryWithNoParams; + export var BigInt: sqlTypeFactoryWithNoParams; + export var TinyInt: sqlTypeFactoryWithNoParams; + export var SmallInt: sqlTypeFactoryWithNoParams; + export var Bit: sqlTypeFactoryWithNoParams; + export var Float: sqlTypeFactoryWithNoParams; + export var Numeric: sqlTypeFactoryWithPrecisionScale; + export var Decimal: sqlTypeFactoryWithPrecisionScale; + export var Real: sqlTypeFactoryWithNoParams; + export var Date: sqlTypeFactoryWithNoParams; + export var DateTime: sqlTypeFactoryWithNoParams; + export var DateTime2: sqlTypeFactoryWithScale; + export var DateTimeOffset: sqlTypeFactoryWithScale; + export var SmallDateTime: sqlTypeFactoryWithNoParams; + export var Time: sqlTypeFactoryWithScale; + export var UniqueIdentifier: sqlTypeFactoryWithNoParams; + export var SmallMoney: sqlTypeFactoryWithNoParams; + export var Money: sqlTypeFactoryWithNoParams; + export var Binary: sqlTypeFactoryWithNoParams; + export var VarBinary: sqlTypeFactoryWithLength; + export var Image: sqlTypeFactoryWithNoParams; + export var Xml: sqlTypeFactoryWithNoParams; + export var Char: sqlTypeFactoryWithLength; + export var NChar: sqlTypeFactoryWithLength; + export var NText: sqlTypeFactoryWithNoParams; + export var TVP: sqlTypeFactoryWithTvpType; + export var UDT: sqlTypeFactoryWithNoParams; + export var Geography: sqlTypeFactoryWithNoParams; + export var Geometry: sqlTypeFactoryWithNoParams; + + export var TYPES: { + VarChar: sqlTypeFactoryWithLength; + NVarChar: sqlTypeFactoryWithLength; + Text: sqlTypeFactoryWithNoParams; + Int: sqlTypeFactoryWithNoParams; + BigInt: sqlTypeFactoryWithNoParams; + TinyInt: sqlTypeFactoryWithNoParams; + SmallInt: sqlTypeFactoryWithNoParams; + Bit: sqlTypeFactoryWithNoParams; + Float: sqlTypeFactoryWithNoParams; + Numeric: sqlTypeFactoryWithPrecisionScale; + Decimal: sqlTypeFactoryWithPrecisionScale; + Real: sqlTypeFactoryWithNoParams; + Date: sqlTypeFactoryWithNoParams; + DateTime: sqlTypeFactoryWithNoParams; + DateTime2: sqlTypeFactoryWithScale; + DateTimeOffset: sqlTypeFactoryWithScale; + SmallDateTime: sqlTypeFactoryWithNoParams; + Time: sqlTypeFactoryWithScale; + UniqueIdentifier: sqlTypeFactoryWithNoParams; + SmallMoney: sqlTypeFactoryWithNoParams; + Money: sqlTypeFactoryWithNoParams; + Binary: sqlTypeFactoryWithNoParams; + VarBinary: sqlTypeFactoryWithLength; + Image: sqlTypeFactoryWithNoParams; + Xml: sqlTypeFactoryWithNoParams; + Char: sqlTypeFactoryWithLength; + NChar: sqlTypeFactoryWithLength; + NText: sqlTypeFactoryWithNoParams; + TVP: sqlTypeFactoryWithTvpType; + UDT: sqlTypeFactoryWithNoParams; + Geography: sqlTypeFactoryWithNoParams; + Geometry: sqlTypeFactoryWithNoParams; + }; + + export var MAX: number; + export var fix: boolean; + export var Promise: any; + + + interface IMap extends Array<{js: any, sql: any }> { + register(jstype: any, sql: any): void; + } + + export var map: IMap; + + export var DRIVERS: string[]; + + type recordSet = any; + type IIsolationLevel = number; + + export var ISOLATION_LEVEL: { + READ_UNCOMMITTED: IIsolationLevel + READ_COMMITTED: IIsolationLevel + REPEATABLE_READ: IIsolationLevel + SERIALIZABLE: IIsolationLevel + SNAPSHOT: IIsolationLevel + } + + export interface IOptions { encrypt: boolean; } - export interface pool { + + export interface IPool { min: number; max: number; idleTimeoutMillis: number; } + export var pool: IPool; + export interface config { driver?: string; user?: string; @@ -59,18 +137,26 @@ declare module "mssql" { connectionTimeout?: number; requestTimeout?: number; stream?: boolean; - options?: options; - pool?: pool; - + options?: IOptions; + pool?: IPool; } - export class Connection { - + export class Connection extends events.EventEmitter { + public connected: boolean; + public connecting: boolean; + public driver: string; public constructor(config: config, callback?: (err?: any) => void); + public connect(): Promise; + public connect(callback: (err: any) => void): void; + public close(): Promise; + public close(callback: (err: any) => void): void; + } - public connect(callback?: (err?: any) => void): void; - - public close(): void; + export class ConnectionError implements Error { + constructor(message: string, code?: any) + public name: string; + public message: string; + public code: string; } class columns { @@ -78,7 +164,7 @@ declare module "mssql" { } class rows { - public add(row: any): void; + public add(...row: any[]): void; } export class Table { @@ -86,37 +172,97 @@ declare module "mssql" { public columns: columns; public rows: rows; public constructor(tableName: string); - } - export class Request { + interface IRequestParameters { + [name: string]: { + name: string; + type: any; + io: number; + value: any; + length: number; + scale: number; + precision: number; + tvpType: any; + } + } + + export class Request extends events.EventEmitter { + public connection: Connection; + public transaction: Transaction; + public pstatement: PreparedStatement; + public parameters: IRequestParameters; + public verbose: boolean; + public multiple: boolean; + public canceled: boolean; + public stream: any; public constructor(connection?: Connection); - public execute(procedure: string, callback?: (err?: any, recordsets?: any, returnValue?: any) => void): void; + public constructor(transaction: Transaction); + public constructor(preparedStatement: PreparedStatement); + public execute(procedure: string): Promise; + public execute(procedure: string, callback: (err?: any, recordsets?: any, returnValue?: any) => void): void; public input(name: string, value: any): void; public input(name: string, type: any, value: any): void; public output(name: string, type: any, value?: any): void; - public pipe(stream: any): void; - public query(command: string, callback?: (err?: any, recordset?: any) => void): void; - public batch(batch: string, callback?: (err?: any, recordset?: any) => void): void; - public bulk(table: Table, callback?: (err?: any, rowCount?: any) => void): void; + public pipe(stream: NodeJS.WritableStream): void; + public query(command: string): Promise; + public query(command: string, callback: (err?: any, recordset?: any) => void): void; + public batch(batch: string): Promise; + public batch(batch: string, callback: (err?: any, recordset?: any) => void): void; + public bulk(table: Table): Promise; + public bulk(table: Table, callback: (err: any, rowCount: any) => void): void; public cancel(): void; - public parameters: any; } - export class Transaction { + export class RequestError implements Error { + constructor(message: string, code?: any) + public name: string; + public message: string; + public code: string; + } + + export class Transaction extends events.EventEmitter { + public connection: Connection; + public isolationLevel: IIsolationLevel; public constructor(connection?: Connection); - public begin(isolationLevel?: any, callback?: (err?: any) => void): void; - public begin(callback?: (err?: any) => void): void; - public commit(callback?: (err?: any) => void): void; - public rollback(callback?: (err?: any) => void): void; + public begin(isolationLevel?: IIsolationLevel): Promise; + public begin(isolationLevel?: IIsolationLevel, callback?: (err?: any) => void): void; + public commit(): Promise; + public commit(callback: (err?: any) => void): void; + public rollback(): Promise; + public rollback(callback: (err?: any) => void): void; } - export class PreparedStatement { + export class TransactionError implements Error { + constructor(message: string, code?: any) + public name: string; + public message: string; + public code: string; + } + + export class PreparedStatement extends events.EventEmitter { + public connection: Connection; + public transaction: Transaction; + public prepared: boolean; + public statement: string; + public parameters: IRequestParameters; + public multiple: boolean; + public stream: any; public constructor(connection?: Connection); public input(name: string, type: any): void; public output(name: string, type: any): void; - public prepare(statement: string, callback?: (err?: any) => void): void; - public execute(values: any, callback?: (err?: any) => void): void; - public unprepare(callback?: (err?: any) => void): void; + public prepare(statement?: string): Promise; + public prepare(statement?: string, callback?: (err?: any) => void): void; + public execute(values: Object): Promise; + public execute(values: Object, callback: (err: any, recordSet: recordSet) => void): void; + public unprepare(): Promise; + public unprepare(callback: (err?: any) => void): void; + } + + export class PreparedStatementError implements Error { + constructor(message: string, code?: any) + public name: string; + public message: string; + public code: string; } }