teradatasql
Version:
Teradata SQL Driver for Node.js
428 lines • 19.1 kB
TypeScript
import { TeradataCursor } from "./teradata-cursor";
import { TeradataLogging } from "./teradata-logging";
export interface ITDConnParams {
account?: string;
browser?: string;
browser_tab_timeout?: string;
browser_timeout?: string;
column_name?: string;
connect_failure_ttl?: string;
connect_function?: string;
connect_timeout?: string;
cop?: string;
coplast?: string;
database?: string;
dbs_port?: string;
encryptdata?: string;
error_query_count?: string;
error_query_interval?: string;
error_table_1_suffix?: string;
error_table_2_suffix?: string;
error_table_database?: string;
fake_result_sets?: string;
field_quote?: string;
field_sep?: string;
govern?: string;
host?: string;
https_port?: string;
lob_support?: string;
log?: string;
logdata?: string;
logmech?: string;
logon_sequence_number?: string;
logon_timeout?: string;
manage_error_tables?: string;
max_message_body?: string;
oidc_scope?: string;
oidc_token?: string;
partition?: string;
password?: string;
request_timeout?: string;
runstartup?: string;
sessions?: string;
sip_support?: string;
sp_spl?: string;
sslca?: string;
sslcapath?: string;
sslcipher?: string;
sslcrc?: string;
sslmode?: string;
sslprotocol?: string;
teradata_values?: string;
tmode?: string;
user?: string;
}
export declare function getPackageVersion(): string;
export declare class TeradataConnection {
static nInstanceCount: number;
sVersionNumber: string;
private nId;
private poolHandle;
private gosideLib;
private lib;
private logLevel;
logger: TeradataLogging;
private bInAsyncConnect;
/**
* Registry of all cursors created from this connection.
*
* This Set tracks all active TeradataCursor instances associated with this
* connection to enable cross-object async operation validation. When any
* cursor has an async operation in progress (executeAsync/executemanyAsync),
* the connection must block ALL operations (both sync and async).
*
* Lifecycle:
* - Cursor registered: When cursor() is called and TeradataCursor is created
* - Cursor unregistered: When cursor.close() is called
*
* Purpose: Enforces "When an async operation is in progress, ALL other operations
* are blocked" rule across object boundaries (connection vs cursor).
*/
private activeCursors;
/**
* Constants for async operation timing and control.
*
* These constants centralize timing parameters and control flags used across
* all async connection operations, ensuring consistency and maintainability.
*/
/**
* Default timeout duration (in milliseconds) for connectAsync() when logon_timeout is "0" or not specified.
*
* This constant is used exclusively by connectAsync() as a safety timeout when the logon_timeout
* parameter is "0" (default) or explicitly set to "0". While synchronous connect() waits indefinitely
* with logon_timeout="0", async operations should always have a safety timeout. The 5-minute duration
* provides a reasonable compromise between:
* - Honoring user intent of "long wait acceptable" (implied by logon_timeout="0")
* - Preventing infinite hangs in async operations
* - Allowing slow connections to succeed
*
* Note: When logon_timeout is set to a positive value, connectAsync() uses that value plus a 5-second
* buffer instead of this constant.
*/
private static readonly CONNECT_ASYNC_DEFAULT_TIMEOUT_MS;
/**
* Timeout duration (in milliseconds) for closeAsync() operations.
*
* This constant is used exclusively by closeAsync() to provide client-side timeout protection.
* Connection close operations typically complete quickly, so 30 seconds is generous enough
* to handle network delays while preventing indefinite hangs. Note: connectAsync() uses
* a different timeout strategy based on the logon_timeout parameter.
*/
private static readonly CLOSE_ASYNC_TIMEOUT_MS;
/**
* Polling interval (in milliseconds) for connectAsync() and closeAsync() operations.
*
* This constant controls how frequently the client checks Go-side operation status
* during async connection operations. The 100ms interval provides a good balance between:
* - Responsiveness: Quick detection of operation completion
* - CPU efficiency: Avoiding excessive polling overhead
* - Network efficiency: Not overwhelming the Go-side with status requests
*/
private static readonly POLLING_INTERVAL_MS;
/**
* Error message constants for async operation enforcement.
*
* These constants centralize error messages to ensure consistency across methods
* and simplify maintenance. They enforce mutual exclusion during async operations.
* Made public to allow teradata-cursor.ts to reference them.
*/
/**
* Error message when attempting cursor operations while this cursor's own async operation is in progress.
* Used by: TeradataCursor._stopIfInAsyncExecute()
*/
static readonly ERROR_801_CURSOR_SELF_ASYNC_IN_PROGRESS = "[Error 801] [SQLState HY000] Cannot perform operation while cursor async operation (executeAsync/executemanyAsync) is in progress on this cursor.";
/**
* Error message when attempting operations while another cursor's async operation is in progress.
* Used by: cursor(), TeradataCursor._stopIfInAsyncExecute()
*/
static readonly ERROR_802_OTHER_CURSOR_ASYNC_IN_PROGRESS = "[Error 802] [SQLState HY000] Cannot perform operation while cursor async operation (executeAsync/executemanyAsync) is in progress on another cursor on this connection";
/**
* Error message when attempting new operations while connection async operation is in progress.
* Used by: _stopIfInAsyncConnect(), TeradataCursor._stopIfInAsyncExecute()
*/
static readonly ERROR_803_CONNECTION_ASYNC_IN_PROGRESS = "[Error 803] [SQLState HY000] Cannot perform new operation while connection async operation (connectAsync/closeAsync) is in progress.";
/**
* Error message when attempting connection async operations while cursor async operation is in progress.
* Used by: connectAsync(), closeAsync()
*/
static readonly ERROR_804_CURSOR_ASYNC_BLOCKS_CONNECTION = "[Error 804] [SQLState HY000] Cannot start new connection async operation (connectAsync/closeAsync) while cursor async operation (executeAsync/executemanyAsync) is in progress.";
constructor();
get Id(): number;
get uLog(): number;
get uPoolHandle(): number | null;
get isAsyncConnect(): boolean;
get connected(): boolean;
cursor(): TeradataCursor;
nativeSQL(sSQL: string): string;
get autocommit(): boolean;
set autocommit(value: boolean);
connect(connectParams?: ITDConnParams, sJSON?: string): void;
close(): void;
cancel(): void;
commit(): void;
rollback(): void;
/**
* Asynchronously connects to the Teradata database server using non-blocking operations.
*
* @param connectParams - Connection parameters (host, user, password, etc.)
* @param sJSON - Additional parameters as JSON string (default: "{}")
* @returns Promise resolving when connection is established
* @throws {ProgrammingError} Error 803 - Connection async operation in progress
* @throws {ProgrammingError} Error 804 - Cursor async operation blocks connection operation
* @throws {OperationalError} Connection failed
*
* @example
* ```typescript
* await conn.connectAsync({ host: "whomooz", user: "guest", password: "please" });
* ```
*
* @remarks
* **Mutual Exclusion:** ALL new operations blocked while an async operation in progress.
*
* **Timeout:** Uses 5-minute timeout if logon_timeout=0 (default), otherwise uses logon_timeout + 5s buffer.
*
* **Polling:** Checks completion every 100ms until done or timeout.
*/
connectAsync(connectParams?: ITDConnParams, sJSON?: string): Promise<void>;
/**
* Asynchronously closes the connection using non-blocking operations.
*
* @returns Promise resolving when connection is closed
* @throws {ProgrammingError} Error 803 - Connection async operation already in progress
* @throws {ProgrammingError} Error 804 - Cursor async operation blocks connection operation
* @throws {OperationalError} Close operation failed
*
* @example
* ```typescript
* await conn.closeAsync();
* ```
*
* @remarks
* **Mutual Exclusion:** ALL operations blocked while async operation in progress.
*
* **Timeout:** Fixed 30-second timeout for close operations.
*
* **Polling:** Checks completion every 100ms until done or timeout.
*
* **Cleanup:** Sets poolHandle to null after successful close.
*/
closeAsync(): Promise<void>;
/**
* Prepares connection parameters by merging user params with system metadata.
*
* This helper method consolidates common parameter preparation logic shared by
* both connect() and connectAsync(). It handles:
* - JSON kwargs parsing and boolean-to-string conversion
* - Stack trace extraction and formatting
* - Client metadata injection (kind, VM, OS, stack, extras)
*
* **Metadata Added:**
* - `client_kind`: "S" for Node.js
* - `client_vmname`: Node.js version
* - `client_osname`: OS version and architecture
* - `client_stack`: Formatted call stack
* - `client_extra`: Node.js version and timezone
*
* @param connectParams - User-provided connection parameters
* @param sJSON - Additional parameters as JSON string
* @returns Merged connection parameters with system metadata
* @private
*/
private _prepareConnectionParams;
/**
* Validates if an async connect/close operation is currently in progress.
*
* This method prevents race conditions by ensuring only one async operation
* can be active at a time. It's called at the beginning of synchronous and
* asynchronous methods to enforce mutual exclusion.
*
*
* @throws {ProgrammingError} Error 803 - If bInAsyncConnect is true, indicating
* an async connection operation is already in progress
*
* @private
*/
private _stopIfInAsyncConnect;
/**
* Registers a cursor in the active cursor registry.
*
* This method adds a TeradataCursor to the activeCursors Set, enabling
* cross-object async operation validation. Once registered, the connection
* can check if any cursor has an async operation in progress.
*
* **Lifecycle Integration:**
* - Called by: cursor() method when creating new TeradataCursor
* - Paired with: _unregisterCursor() called by cursor.close()
*
* **Purpose:**
* - Enables _hasActiveCursorAsyncOp() to detect cursor async operations
* - Enforces "When async operation is in progress, ALL other operations are blocked" rule
*
* @param cursor - The TeradataCursor instance to register
* @private
*/
private _registerCursor;
/**
* Unregisters a cursor from the active cursor registry.
*
* This method removes a TeradataCursor from the activeCursors Set when
* the cursor is closed. This cleanup ensures accurate async operation
* validation state.
*
* **Lifecycle Integration:**
* - Called by: TeradataCursor.close() method
* - Paired with: _registerCursor() called by cursor()
*
* **Purpose:**
* - Maintains accurate cursor registry state
* - Prevents memory leaks from closed cursors
*
* @param cursor - The TeradataCursor instance to unregister
* @internal - Public for TeradataCursor access, but not part of public API
*/
_unregisterCursor(cursor: any): void;
/**
* Checks if any active cursor has an async operation in progress.
*
* This method provides cross-object async operation validation by checking
* if any registered cursor is currently executing an async SQL operation
* (executeAsync/executemanyAsync).
*
* **Validation Logic:**
* - Iterates through all cursors in activeCursors Set
* - Optionally excludes a specific cursor from the check (used by that cursor to check others)
* - Checks each cursor's bInAsyncExecute flag
* - Returns true if ANY cursor (except excluded one) has async operation in progress
*
* **Usage:**
* - Called by: connectAsync() and closeAsync() before starting operation
* - Called by: cursor() to check if any cursor has async operation before creating new cursor
* - Purpose: Enforces "When async operation is in progress, ALL other operations are blocked"
*
* @param excludeCursor - Optional cursor to exclude from the check (typically the caller)
* @returns True if any cursor (except excluded) has async operation in progress, false otherwise
* @private
*/
private _hasActiveCursorAsyncOp;
/**
* Initiates asynchronous connection creation on the Go side.
*
* This method starts the async connection process by calling the Go-side
* jsgoAsyncCreateConnection function. It handles immediate errors but does
* not wait for connection completion - that's handled by polling.
*
* **Go-side Integration:**
* - Calls jsgoAsyncCreateConnection with log level, version, and params
* - Handles immediate validation errors from Go side
* - Does not block waiting for connection establishment
*
* **Error Handling:**
* - Throws OperationalError for immediate Go-side failures
* - Provides timing logs for performance monitoring
* - Preserves original Go error messages
*
* @param nLog - Logging level for Go-side operations
* @param sVersionNumber - Driver version number
* @param sConnectParams - JSON-serialized connection parameters
* @throws {OperationalError} For immediate connection creation failures
*
* @private
*/
private _createConnection;
/**
* Initiates asynchronous connection closure on the Go side.
*
* This method starts the async connection close process by calling the Go-side
* jsgoAsyncCloseConnection function. It validates the handle first and handles
* immediate errors, but does not wait for close completion.
*
* **Pre-conditions:**
* - Connection handle should be valid (Go-side will validate)
* - No other async operations should be in progress
*
* **Go-side Integration:**
* - Calls jsgoAsyncCloseConnection with log level and pool handle
* - Go-side validates handle and provides proper error messages
* - Does not block waiting for connection closure completion
*
* **Error Handling:**
* - Go-side performs comprehensive handle validation
* - Throws OperationalError for immediate Go-side failures
* - Provides timing logs for performance monitoring
* - Preserves original Go error messages
*
* @param nLog - Logging level for Go-side operations
* @param nPoolHandle - Connection pool handle to close (Go-side validates)
* @throws {OperationalError} For immediate close failures from Go-side validation
*
* @private
*/
private _closeConnection;
/**
* Polls the Go side for async connection operation status.
*
* This method directly calls the Go-side jsgoPollConnection function to check
* if an async operation (connect or close) has completed. It implements the
* compatibility fix for the new Go pbReady flag implementation.
*
* **Go-side Compatibility:**
* - Updated for new Go implementation using *pbReady = C.char(1) for completion
* - Changed from string-based status to numeric flag (0 = executing, 1 = complete)
* - Maintains compatibility with enhanced Go-side error handling
*
* **Return Values:**
* - `number`: 0 = operation still executing, non-zero = operation complete
* - `string`: Error message from Go side for immediate failure
*
* **Error Handling:**
* - Go-side validates connection handle with proper error codes
* - Returns error string for Go-side failures
* - Provides comprehensive timing logs for performance analysis
* - Preserves original Go error messages for debugging
*
* **Performance Monitoring:**
* - Logs timing for each poll operation
* - Tracks polling frequency and duration
* - Enables performance optimization analysis
*
* @param nLog - Logging level for Go-side operations
* @param nPoolHandle - Connection pool handle to poll (Go-side validates)
* @returns Operation status as number (0 = executing, non-zero = complete)
* or error string for immediate failures
*
* @private
*/
private _jsgoPollConnection;
/**
* Promise wrapper for async connection polling operations.
*
* This method wraps the synchronous _jsgoPollConnection call in a Promise
* to integrate seamlessly with the async/await pattern used in connectAsync()
* and closeAsync(). It provides clean separation between sync Go calls and
* async JavaScript patterns.
*
* **Promise Resolution:**
* - **Resolves** with numeric result: 0 = operation not complete, non-zero = complete
* - **Rejects** with string result: error message from Go side
*
* **Integration Pattern:**
* - Used in while loops within async methods for non-blocking polling
* - Enables proper error propagation through Promise rejection
* - Maintains clean async/await syntax in calling methods
*
* **Design Benefits:**
* - Clean separation of sync Go calls from async JavaScript patterns
* - Consistent error handling through Promise rejection
* - Enables timeout handling in calling methods
* - Provides foundation for future polling enhancements
*
* @param nLog - Logging level for Go-side operations
* @param nPoolHandle - Connection pool handle to poll
* @returns Promise<number> - 0 for operation not complete, non-zero for complete
* @rejects {string} Error message from Go side
*
* @private
*/
private _pollConnection;
}
//# sourceMappingURL=teradata-connection.d.ts.map