UNPKG

oracledb

Version:

A Node.js module for Oracle Database access from JavaScript and TypeScript

98 lines (87 loc) 3.42 kB
// Copyright (c) 2022, 2023, Oracle and/or its affiliates. //----------------------------------------------------------------------------- // // This software is dual-licensed to you under the Universal Permissive License // (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License // 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose // either license. // // If you elect to accept the software under the Apache License, Version 2.0, // the following applies: // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //----------------------------------------------------------------------------- 'use strict'; const constants = require("../constants.js"); const Message = require("./base.js"); /** * Executes a Protocol Negotiation RPC function * * @class ProtocolMessage * @extends {Message} */ class ProtocolMessage extends Message { /** * Serializes the ProtocolMessage function arguments * * @param {object} buf input arguments */ encode(buf) { buf.writeUInt8(constants.TNS_MSG_TYPE_PROTOCOL); buf.writeUInt8(6); // protocol version (8.1+) buf.writeUInt8(0); // "array" terminator buf.writeStr("node-oracledb"); // unique name for driver buf.writeUInt8(0); } processMessage(buf, messageType) { if (messageType === constants.TNS_MSG_TYPE_PROTOCOL) { this.processProtocolInfo(buf); this.endOfResponse = !this.connection.nscon.endOfRequestSupport; } else { super.processMessage(buf, messageType); } } processProtocolInfo(buf) { this.serverVersion = buf.readUInt8(); buf.skipUB1(); this.serverBanner = buf.readNullTerminatedBytes(48); buf.caps.charSetID = buf.readUInt16LE(); this.serverFlags = buf.readUInt8(); const num_elem = buf.readUInt16LE(); if (num_elem > 0) { // skip elements buf.skipBytes(num_elem * 5); } const fdoLen = buf.readUInt16BE(); const fdo = buf.readBytes(fdoLen); const ix = 6 + fdo[5] + fdo[6]; buf.caps.nCharsetId = (fdo[ix + 3] << 8) + fdo[ix + 4]; const serverCompileCaps = buf.readBytesWithLength(); if (serverCompileCaps) { this.serverCompileCaps = Buffer.from(serverCompileCaps); buf.caps.adjustForServerCompileCaps(this.serverCompileCaps, this.connection.nscon); // Set the maximum OSON field name size if (buf.caps.ttcFieldVersion >= constants.TNS_CCAP_FIELD_VERSION_23_1) { this.connection._osonMaxFieldNameSize = 65535; } else { this.connection._osonMaxFieldNameSize = 255; } } const serverRunTimeCaps = buf.readBytesWithLength(); if (serverRunTimeCaps) { this.serverRunTimeCaps = Buffer.from(serverRunTimeCaps); buf.caps.adjustForServerRuntimeCaps(this.serverRunTimeCaps); } } } module.exports = ProtocolMessage;