mariadb
Version:
fast mariadb/mysql connector.
860 lines (738 loc) • 22.6 kB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
// Type definitions for mariadb 2.5
// Project: https://github.com/mariadb-corporation/mariadb-connector-nodejs
// Definitions by: Diego Dupin <https://github.com/rusher>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.1
import tls = require('tls');
import stream = require('stream');
import geojson = require('geojson');
export const version: string;
export function createConnection(connectionUri: string | ConnectionConfig): Promise<Connection>;
export function createPool(config: PoolConfig | string): Pool;
export function createPoolCluster(config?: PoolClusterConfig): PoolCluster;
export function defaultOptions(connectionUri?: string | ConnectionConfig): any;
export type TypeCastResult =
| boolean
| number
| string
| symbol
| null
| Date
| geojson.Geometry
| Buffer;
export type TypeCastNextFunction = () => TypeCastResult;
export type TypeCastFunction = (field: FieldInfo, next: TypeCastNextFunction) => TypeCastResult;
export interface QueryConfig {
/**
* Presents result-sets by table to avoid results with colliding fields. See the query() description for more information.
*/
nestTables?: boolean | string;
/**
* Allows to cast result types.
*/
typeCast?: TypeCastFunction;
/**
* Return result-sets as array, rather than a JSON object. This is a faster way to get results
*/
rowsAsArray?: boolean;
/**
* Whether to retrieve dates as strings or as Date objects.
*/
dateStrings?: boolean;
/**
* Forces use of the indicated timezone, rather than the current Node.js timezone.
* Possible values are Z for UTC, local or ±HH:MM format
*/
timezone?: string;
/**
* Allows the use of named placeholders.
*/
namedPlaceholders?: boolean;
/**
* permit to indicate server global variable max_allowed_packet value to ensure efficient batching.
* default is 4Mb. see batch documentation
*/
maxAllowedPacket?: number;
/**
* When an integer is not in the safe range, the Connector interprets the value as a Long object.
*/
supportBigNumbers?: boolean;
/**
* Compatibility option to permit setting multiple value by a JSON object to replace one question mark.
* key values will replace the question mark with format like key1=val,key2='val2'.
* Since it doesn't respect the usual prepared statement format that one value is for one question mark,
* this can lead to incomprehension, even if badly use to possible injection.
*/
permitSetMultiParamEntries?: boolean;
/**
* When an integer is not in the safe range, the Connector interprets the value as a string
*/
bigNumberStrings?: boolean;
/**
* disabled bulk command in batch.
*/
bulk?: boolean;
/**
* Sends queries one by one without waiting on the results of the previous entry.
* (Default: true)
*/
pipelining?: boolean;
/**
* Force server version check by explicitly using SELECT VERSION(), not relying on server initial handshake
* information
*/
forceVersionCheck?: boolean;
/**
* Allows the use of LOAD DATA INFILE statements.
* Loading data from a file from the client may be a security issue, as a man-in-the-middle proxy server can change
* the actual file the server loads. Being able to execute a query on the client gives you access to files on
* the client.
* (Default: false)
*/
permitLocalInfile?: boolean;
/**
* Database server port number
*/
port?: number;
}
export interface QueryOptions extends QueryConfig {
/**
* SQL command to execute
*/
sql: string;
}
export interface UserConnectionConfig {
/**
* Name of the database to use for this connection
*/
database?: string;
/**
* When enabled, sends information during connection to server
* - client name
* - version
* - operating system
* - Node.js version
*
* If JSON is set, add JSON key/value to those values.
*
* When Performance Schema is enabled, server can display client information on each connection.
*/
connectAttributes?: any;
/**
* Protocol character set used with the server.
* Connection collation will be the default collation associated with charset.
* It's mainly used for micro-optimizations. The default is often sufficient.
* example 'UTF8MB4', 'CP1250'.
* (default 'UTF8MB4')
*/
charset?: string;
/**
* Permit to defined collation used for connection.
* This will defined the charset encoding used for exchanges with database and defines the order used when
* comparing strings. It's mainly used for micro-optimizations
* (Default: 'UTF8MB4_UNICODE_CI')
*/
collation?: string;
/**
* The MySQL user to authenticate as
*/
user?: string;
/**
* The password of that MySQL user
*/
password?: string;
}
export interface ConnectionConfig extends UserConnectionConfig, QueryConfig {
/**
* The hostname of the database you are connecting to. (Default: localhost)
*/
host?: string;
/**
* The port number to connect to. (Default: 3306)
*/
port?: number;
/**
* The path to a unix domain socket to connect to. When used host and port are ignored
*/
socketPath?: string;
/**
* The milliseconds before a timeout occurs during the initial connection to the MySQL server. (Default: 10 seconds)
*/
connectTimeout?: number;
/**
* Socket timeout in milliseconds after the connection is established
*/
socketTimeout?: number;
/**
* This will print all incoming and outgoing packets on stdout.
* (Default: false)
*/
debug?: boolean;
/**
* This will print all incoming and outgoing compressed packets on stdout.
* (Default: false)
*/
debugCompress?: boolean;
/**
* When debugging, maximum packet length to write to console.
* (Default: 256)
*/
debugLen?: number;
/**
* Adds the stack trace at the time of query creation to the error stack trace, making it easier to identify the
* part of the code that issued the query.
* Note: This feature is disabled by default due to the performance cost of stack creation.
* Only turn it on when you need to debug issues.
* (Default: false)
*/
trace?: boolean;
/**
* Allow multiple mysql statements per query. Be careful with this, it exposes you to SQL injection attacks.
* (Default: false)
*/
multipleStatements?: boolean;
/**
* object with ssl parameters or a boolean to enable ssl without setting any other ssl option.
* see
* https://github.com/mariadb-corporation/mariadb-connector-nodejs/blob/master/documentation/connection-options.md#ssl
* for more information
*/
ssl?: boolean | (tls.SecureContextOptions & { rejectUnauthorized?: boolean });
/**
* Compress exchanges with database using gzip.
* This can give you better performance when accessing a database in a different location.
* (Default: false)
*/
compress?: boolean;
/**
* Debug option : permit to save last exchanged packet.
* Error messages will display those last exchanged packet.
*
* (Default: false)
*/
logPackets?: boolean;
/**
* Force server version check by explicitly using SELECT VERSION(), not relying on server initial packet.
* (Default: false)
*/
forceVersionCheck?: boolean;
/**
* indicate to throw an exception if result-set will not contain some data due to having duplicate identifier
* (Default: true)
*/
checkDuplicate?: boolean;
/**
* When enabled, the update number corresponds to update rows.
* When disabled, it indicates the real rows changed.
*/
foundRows?: boolean;
/**
* When a connection is established, permit to execute commands before using connection
*/
initSql?: string | string[];
/**
* Permit to set session variables when connecting.
* Example: sessionVariables:{'idle_transaction_timeout':10000}
*/
sessionVariables?: any;
/**
* Indicate if array are included in parenthesis. This option permit compatibility with version < 2.5
*/
arrayParenthesis?: boolean;
/**
* indicate if JSON fields for MariaDB server 10.5.2+ results in JSON format (or String if disabled)
*/
autoJsonMap?: boolean;
/**
* permit to enable socket keep alive, setting delay. 0 means not enabled. Keep in mind that this don't reset server [@@wait_timeout](https://mariadb.com/kb/en/library/server-system-variables/#wait_timeout) (use pool option idleTimeout for that).
* in ms
* (Default: 0)
*/
keepAliveDelay?: number;
/**
* Indicate path/content to MySQL server RSA public key.
* use requires Node.js v11.6+
*/
rsaPublicKey?: string;
/**
* Indicate path/content to MySQL server caching RSA public key.
* use requires Node.js v11.6+
*/
cachingRsaPublicKey?: string;
/**
* Indicate that if `rsaPublicKey` or `cachingRsaPublicKey` public key are not provided, if client can ask server to send public key.
* default: false
*/
allowPublicKeyRetrieval?: boolean;
/**
* Whether resultset should return javascript ES2020 [BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt)
* for [BIGINT](https://mariadb.com/kb/en/bigint/) data type.
* This ensures having expected value even for value > 2^53
* (see [safe](documentation/connection-options.md#support-for-big-integer) range).
*
* default false
*/
supportBigInt?: boolean;
}
export interface PoolConfig extends ConnectionConfig {
/**
* The milliseconds before a timeout occurs during the connection acquisition. This is slightly different from connectTimeout,
* because acquiring a pool connection does not always involve making a connection. (Default: 10 seconds)
*/
acquireTimeout?: number;
/**
* The maximum number of connections to create at once. (Default: 10)
*/
connectionLimit?: number;
/**
* Indicate idle time after which a pool connection is released.
* Value must be lower than [@@wait_timeout](https://mariadb.com/kb/en/library/server-system-variables/#wait_timeout).
* In seconds (0 means never release)
* Default: 1800 ( = 30 minutes)
*/
idleTimeout?: number;
/**
* Timeout after which pool give up creating new connection.
*/
initializationTimeout?: number;
/**
* When asking a connection to pool, the pool will validate the connection state.
* "minDelayValidation" permits disabling this validation if the connection has been borrowed recently avoiding
* useless verifications in case of frequent reuse of connections.
* 0 means validation is done each time the connection is asked. (in ms)
* Default: 500 (in millisecond)
*/
minDelayValidation?: number;
/**
* Permit to set a minimum number of connection in pool.
* **Recommendation is to use fixed pool, so not setting this value**
*/
minimumIdle?: number;
/**
* Use COM_STMT_RESET when releasing a connection to pool.
* Default: true
*/
resetAfterUse?: boolean;
/**
* No rollback or reset when releasing a connection to pool.
* Default: false
*/
noControlAfterUse?: boolean;
}
export interface PoolClusterConfig {
/**
* If true, PoolCluster will attempt to reconnect when connection fails. (Default: true)
*/
canRetry?: boolean;
/**
* If connection fails, node's errorCount increases. When errorCount is greater than removeNodeErrorCount,
* remove a node in the PoolCluster. (Default: 5)
*/
removeNodeErrorCount?: number;
/**
* If connection fails, specifies the number of milliseconds before another connection attempt will be made.
* If set to 0, then node will be removed instead and never re-used. (Default: 0)
*/
restoreNodeTimeout?: number;
/**
* The default selector. (Default: RR)
* RR: Select one alternately. (Round-Robin)
* RANDOM: Select the node by random function.
* ORDER: Select the first node available unconditionally.
*/
defaultSelector?: string;
}
export interface ServerVersion {
/**
* Raw string that database server send to connector.
* example : "10.4.3-MariaDB-1:10.4.3+maria~bionic-log"
*/
readonly raw: string;
/**
* indicate if server is a MariaDB or a MySQL server
*/
readonly mariaDb: boolean;
/**
* Server major version.
* Example for raw version "10.4.3-MariaDB" is 10
*/
readonly major: number;
/**
* Server major version.
* Example for raw version "10.4.3-MariaDB" is 4
*/
readonly minor: number;
/**
* Server major version.
* Example for raw version "10.4.3-MariaDB" is 3
*/
readonly patch: number;
}
export interface ConnectionInfo {
/**
* Server connection identifier value
*/
readonly threadId: number | null;
/**
* connection status flag
* see https://mariadb.com/kb/en/library/ok_packet/#server-status-flag
*/
readonly status: number;
/**
* Server version information
*/
serverVersion: ServerVersion;
/**
* Server capabilities
* see https://mariadb.com/kb/en/library/connection/#capabilities
*/
readonly serverCapabilities: number;
}
export interface Connection {
/**
* Connection information
*/
info: ConnectionInfo | null;
/**
* Alias of info.threadId for compatibility
*/
readonly threadId: number | null;
/**
* Permit to change user during connection.
* All user variables will be reset, Prepare commands will be released.
* !!! mysql has a bug when CONNECT_ATTRS capability is set, that is default !!!!
*/
changeUser(options?: UserConnectionConfig): Promise<void>;
/**
* Start transaction
*/
beginTransaction(): Promise<void>;
/**
* Commit a transaction.
*/
commit(): Promise<void>;
/**
* Roll back a transaction.
*/
rollback(): Promise<void>;
/**
* Execute query using text protocol.
*/
query(sql: string | QueryOptions, values?: any): Promise<any>;
/**
* Execute batch using text protocol.
*/
batch(sql: string | QueryOptions, values?: any): Promise<UpsertResult[]>;
/**
* Execute query returning a Readable Object that will emit columns/data/end/error events
* to permit streaming big result-set
*/
queryStream(sql: string | QueryOptions, values?: any): stream.Readable;
/**
* Send an empty MySQL packet to ensure connection is active, and reset @@wait_timeout
*/
ping(): Promise<void>;
/**
* Send a reset command that will
* - rollback any open transaction
* - reset transaction isolation level
* - reset session variables
* - delete user variables
* - remove temporary tables
* - remove all PREPARE statement
*/
reset(): Promise<void>;
/**
* Indicates the state of the connection as the driver knows it
*/
isValid(): boolean;
/**
* Terminate connection gracefully.
*/
end(): Promise<void>;
/**
* Force connection termination by closing the underlying socket and killing server process if any.
*/
destroy(): void;
pause(): void;
resume(): void;
/**
* Alias for info.serverVersion.raw
*/
serverVersion(): string;
/**
* Change option "debug" during connection.
*/
debug(value: boolean): void;
/**
* Change option "debugCompress" during connection.
*/
debugCompress(value: boolean): void;
/**
* This function permit to escape a parameter properly according to parameter type to avoid injection.
* @param value parameter
*/
escape(value: any): string;
/**
* This function permit to escape a Identifier properly . See Identifier Names for escaping. Value will be enclosed by '`' character if content doesn't satisfy:
* <OL>
* <LI>ASCII: [0-9,a-z,A-Z$_] (numerals 0-9, basic Latin letters, both lowercase and uppercase, dollar sign, underscore)</LI>
* <LI>Extended: U+0080 .. U+FFFF and escaping '`' character if needed.</LI>
* </OL>
* @param identifier identifier
*/
escapeId(identifier: string): string;
on(ev: 'end', callback: () => void): Connection;
on(ev: 'error', callback: (err: SqlError) => void): Connection;
}
export interface PoolConnection extends Connection {
/**
* Release the connection to pool internal cache.
*/
release(): Promise<void>;
}
export interface Pool {
/**
* Retrieve a connection from pool.
* Create a new one, if limit is not reached.
* wait until acquireTimeout.
*/
getConnection(): Promise<PoolConnection>;
/**
* Execute a query on one connection from pool.
*/
query(sql: string | QueryOptions, values?: any): Promise<any>;
/**
* Execute a batch on one connection from pool.
*/
batch(sql: string | QueryOptions, values?: any): Promise<UpsertResult[]>;
/**
* Close all connection in pool
*/
end(): Promise<void>;
/**
* Get current active connections.
*/
activeConnections(): number;
/**
* Get current total connection number.
*/
totalConnections(): number;
/**
* Get current idle connection number.
*/
idleConnections(): number;
/**
* Get current stacked connection request.
*/
taskQueueSize(): number;
/**
* This function permit to escape a parameter properly according to parameter type to avoid injection.
* @param value parameter
*/
escape(value: any): string;
/**
* This function permit to escape a Identifier properly . See Identifier Names for escaping. Value will be enclosed by '`' character if content doesn't satisfy:
* <OL>
* <LI>ASCII: [0-9,a-z,A-Z$_] (numerals 0-9, basic Latin letters, both lowercase and uppercase, dollar sign, underscore)</LI>
* <LI>Extended: U+0080 .. U+FFFF and escaping '`' character if needed.</LI>
* </OL>
* @param identifier identifier
*/
escapeId(identifier: string): string;
on(ev: 'acquire', callback: (conn: Connection) => void): Pool;
on(ev: 'connection', callback: (conn: Connection) => void): Pool;
on(ev: 'enqueue', callback: () => void): Pool;
on(ev: 'release', callback: (conn: Connection) => void): Pool;
}
export interface FilteredPoolCluster {
getConnection(): Promise<PoolConnection>;
query(sql: string | QueryOptions, values?: any): Promise<any>;
batch(sql: string | QueryOptions, values?: any): Promise<UpsertResult[]>;
}
export interface PoolCluster {
add(id: string, config: PoolConfig): void;
end(): Promise<void>;
of(pattern: string, selector?: string): FilteredPoolCluster;
of(pattern: undefined | null | false, selector: string): FilteredPoolCluster;
remove(pattern: string): void;
getConnection(pattern?: string, selector?: string): Promise<PoolConnection>;
}
export interface UpsertResult {
affectedRows: number;
insertId: number;
warningStatus: number;
}
export interface SqlError extends Error {
/**
* Either a MySQL server error (e.g. 'ER_ACCESS_DENIED_ERROR'),
* a node.js error (e.g. 'ECONNREFUSED') or an internal error
* (e.g. 'PROTOCOL_CONNECTION_LOST').
*/
code: string | null;
/**
* original error message value
*/
text: string | null;
/**
* The sql command associate
*/
sql: string | null;
/**
* The error number for the error code
*/
errno: number;
/**
* The sql state
*/
sqlState?: string | null;
/**
* Boolean, indicating if this error is terminal to the connection object.
*/
fatal: boolean;
}
interface SqlErrorConstructor extends ErrorConstructor {
new (
msg: string,
fatal?: boolean,
info?: { threadId?: number },
sqlState?: string | null,
errno?: number,
additionalStack?: string,
addHeader?: boolean
): SqlError;
readonly prototype: SqlError;
}
declare const SqlError: SqlErrorConstructor;
export const enum TypeNumbers {
DECIMAL = 0,
TINY = 1,
SHORT = 2,
LONG = 3,
FLOAT = 4,
DOUBLE = 5,
NULL = 6,
TIMESTAMP = 7,
LONGLONG = 8,
INT24 = 9,
DATE = 10,
TIME = 11,
DATETIME = 12,
YEAR = 13,
NEWDATE = 14,
VARCHAR = 15,
BIT = 16,
TIMESTAMP2 = 17,
DATETIME2 = 18,
TIME2 = 19,
JSON = 245, //only for MySQ,
NEWDECIMAL = 246,
ENUM = 247,
SET = 248,
TINY_BLOB = 249,
MEDIUM_BLOB = 250,
LONG_BLOB = 251,
BLOB = 252,
VAR_STRING = 253,
STRING = 254,
GEOMETRY = 255
}
export const enum Flags {
// field cannot be null
NOT_NULL = 1,
// field is a primary key
PRIMARY_KEY = 2,
//field is unique
UNIQUE_KEY = 4,
//field is in a multiple key
MULTIPLE_KEY = 8,
//is this field a Blob
BLOB = 1 << 4,
// is this field unsigned
UNSIGNED = 1 << 5,
//is this field a zerofill
ZEROFILL_FLAG = 1 << 6,
//whether this field has a binary collation
BINARY_COLLATION = 1 << 7,
//Field is an enumeration
ENUM = 1 << 8,
//field auto-increment
AUTO_INCREMENT = 1 << 9,
//field is a timestamp value
TIMESTAMP = 1 << 10,
//field is a SET
SET = 1 << 11,
//field doesn't have default value
NO_DEFAULT_VALUE_FLAG = 1 << 12,
//field is set to NOW on UPDATE
ON_UPDATE_NOW_FLAG = 1 << 13,
//field is num
NUM_FLAG = 1 << 14
}
export const enum Types {
DECIMAL = 'DECIMAL',
TINY = 'TINY',
SHORT = 'SHORT',
LONG = 'LONG',
FLOAT = 'FLOAT',
DOUBLE = 'DOUBLE',
NULL = 'NULL',
TIMESTAMP = 'TIMESTAMP',
LONGLONG = 'LONGLONG',
INT24 = 'INT24',
DATE = 'DATE',
TIME = 'TIME',
DATETIME = 'DATETIME',
YEAR = 'YEAR',
NEWDATE = 'NEWDATE',
VARCHAR = 'VARCHAR',
BIT = 'BIT',
TIMESTAMP2 = 'TIMESTAMP2',
DATETIME2 = 'DATETIME2',
TIME2 = 'TIME2',
JSON = 'JSON',
NEWDECIMAL = 'NEWDECIMAL',
ENUM = 'ENUM',
SET = 'SET',
TINY_BLOB = 'TINY_BLOB',
MEDIUM_BLOB = 'MEDIUM_BLOB',
LONG_BLOB = 'LONG_BLOB',
BLOB = 'BLOB',
VAR_STRING = 'VAR_STRING',
STRING = 'STRING',
GEOMETRY = 'GEOMETRY'
}
export interface Collation {
index: number;
name: string;
encoding: string;
fromEncoding(encoding: string): Collation;
fromIndex(index: number): Collation;
fromName(name: string): Collation;
}
export interface FieldInfo {
collation: Collation;
columnLength: number;
columnType: TypeNumbers;
scale: number;
type: Types;
flags: Flags;
db(): string;
schema(): string; // Alias for db()
table(): string;
orgTable(): string;
name(): string;
orgName(): string;
// Note that you may only call *one* of these functions
// when decoding a column via the typeCast callback.
// Calling additional functions will give you incorrect results.
string(): string | null;
buffer(): Buffer | null;
float(): number | null;
int(): number | null;
long(): number | null;
decimal(): number | null;
date(): Date | null;
geometry(): geojson.Geometry | null;
}