node-oracledb/package/install.js

138 lines
4.8 KiB
JavaScript

/* Copyright (c) 2017, 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 https://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.
*
* NAME
* install.js
*
* DESCRIPTION
* This script is included in the npm bundle of node-oracledb. It
* is invoked by package.json during npm install to check the viability
* of the installation.
*
* MAINTENANCE NOTES
* This file should only ever 'require' packages included in core Node.js
* or that are part of node-oracledb.
*
*****************************************************************************/
'use strict';
const fs = require('fs');
const nodbUtil = require('../lib/util.js');
const errors = require('../lib/errors.js');
const constants = require('../lib/constants.js');
let installUrl = constants.DEFAULT_ERROR_URL;
let arch;
let thickModeErrMsg;
// Log standard output with an 'oracledb' prefix
function log(message) { // eslint-disable-line
const args = Array.from(arguments);
args.unshift('oracledb');
console.log.apply(console, args);
}
// Log errors. It combines 'oracledb' with a stylized 'ERR' prefix
function error(message) { // eslint-disable-line
const args = Array.from(arguments);
args.unshift('oracledb \x1b[31mERR!\x1b[0m');
console.error.apply(console, args);
}
// Log warnings. It combines 'oracledb' with a stylized 'WARN' prefix
function warn(message) { // eslint-disable-line
const args = Array.from(arguments);
args.unshift('oracledb \x1b[31mWARN!\x1b[0m');
console.error.apply(console, args);
}
// This version of node-oracledb works with Node.js 14.6 or later.
// Note: the checked version is the minimum required for Node-API
// compatibility. When new Node.js versions are released, older Node.js
// versions are dropped from the node-oracledb test plan.
//
// Keep this code in sync with lib/oracledb.js
function checkVersion() {
const vs = process.version.substring(1).split(".").map(Number);
errors.assert(vs[0] > 14 || (vs[0] === 14 && vs[1] >= 6),
errors.ERR_NODE_TOO_OLD, nodbUtil.PACKAGE_JSON_VERSION, "14.6");
}
// Check for the binary node-oracledb module needed for "Thick mode".
// If one isn't available, only Thin mode can be used.
function checkThickMode() {
try {
fs.statSync(nodbUtil.RELEASE_DIR + '/' + nodbUtil.BINARY_FILE);
} catch (err) {
errors.throwErr(errors.ERR_NO_BINARY_AVAILABLE, process.platform + ' ' + process.arch);
}
}
try {
checkVersion();
} catch (err) {
// This version of Node.js is too old
error(err.message);
error('An older node-oracledb version may work with Node.js ' + process.version);
process.exit(87);
}
try {
checkThickMode();
} catch (err) {
// No Thick mode binary was found for this platform
thickModeErrMsg = err.message;
}
// Successfully installed
if (process.arch === 'x64' || process.arch === 'arm64') {
arch = '64-bit';
} else {
arch = '32-bit';
}
if (process.platform === 'linux') {
installUrl += '#node-oracledb-installation-on-linux';
} else if (process.platform === 'darwin') {
installUrl += '#node-oracledb-installation-on-apple-macos-intel-x86';
} else if (process.platform === 'win32') {
installUrl += '#node-oracledb-installation-on-microsoft-windowsstallation';
}
log('********************************************************************************');
log('** Node-oracledb ' + nodbUtil.PACKAGE_JSON_VERSION + ' installed in Node.js ' + process.versions.node + ' (' + process.platform + ', ' + process.arch + ')');
log('** To use node-oracledb in Thin mode, no additional steps are needed.');
if (thickModeErrMsg) {
warn(thickModeErrMsg);
warn('If you want to use the optional Thick mode, compile node-oracledb code using');
warn(installUrl + '#github');
} else {
log('** To use the optional Thick mode, the Oracle Client libraries (' + arch + ')');
log('** must be available, see the installation instructions:');
log('** ' + installUrl);
}
log('********************************************************************************\n');