sqlanywhere / node-sqlanywhere

SAP SQL Anywhere Database Client for Node
Apache License 2.0
39 stars 37 forks source link

Code: -2004 Msg: Can't initialize DBCAPI #46

Open redevill opened 2 years ago

redevill commented 2 years ago

Trying to use this Driver to connect from a Nodejs server (hosted on macOS 10.15.7) to a remote Sql Anywhere 17 "SQL Anywhere Network Server Version 17.0.4.2053" database, hosted on a Windows box. With 2638 port open on the Firewall.

Readings done suggest that I need Sql Anywhere Client on my Mac... (However - the node-sqlanywhere readme, does not say this is a requirement)

Is a SA client needed? If so, where might I get a client? Any help appreciated. Thanks

DanCummins-SAP commented 2 years ago

Hello,

The download of the client can be found here: https://wiki.scn.sap.com/wiki/plugins/servlet/mobile?contentId=448478814#content/view/448478814

Direct link: https://d5d4ifzqzkhwt.cloudfront.net/sqla17client/sqla17_client_os_x.tar.gz

The "DBCAPI" library on macOS is libdbcapi_r.dylib.

Set SQLANY_API_DLL to point to it, eg. export SQLANY_API_DLL=/Applications/SQLAnywhere17/System/lib64/libdbcapi_r.dylib

Add dependent libraries to library path: source /Applications/SQLAnywhere17/System/bin64/sa_config.sh

HTH, Dan

redevill commented 2 years ago

Thank you so much for the response... will give it a go. It would be very helpful, to note the need of the above prerequisite on main Readme.

"This driver communicates with the native SQL Anywhere libraries, and thus requires native compilation. Native compilation is managed by [node-gyp]"

This statement implied to me, that needed SQL Anywhere libraries were compiled and installed as part of the "npm install", and the only the compilation ability (and related compiler code) was a pre-requisite. Thank you.

redevill commented 2 years ago

So - From my Mac, I can no do a dbPing to the SA host... as below this works. However from the Driver in my javascript / node environment... still get this: Code: -2004 Msg: Can't initialize DBCAPI

Perhaps environment variables need to be set separately in the node environment...? What is the NODE_PATH supposed to contain? Path to the current active version of Node?


$ dbping -c "Host=;Server=mySvr" -z SQL Anywhere Server Ping Utility Version 17.0.10.6178 Application information: HOST=####.local;OSUSER=###;OS='Darwin 19.6.0 x86_64';EXE=/Applications/SQLAnywhere17/System/bin64/dbping;PID=0x33c5;THREAD=0x11d342dc0;VERSION=17.0.10.6178;API=DBLIB;TIMEZONEADJUSTMENT=-360 Attempting to connect using: ServerName=mySvr;Host= Attempting to connect to a running server... Trying to start TCPIP link ... My IP address is 127.0.0.1 My IP address is ::1%1 My IP address is fe80::1%1 My IP address is ### My IP address is ### My IP address is ### My IP address is ### My IP address is ### My IP address is ### My IP address is ### TCPIP link started successfully Attempting TCPIP connection (address :2638 found in sasrv.ini cache) Looking for server with name mysvr Trying to find server at cached address :2638 without broadcasting Found database server mySvr on TCPIP link Connected using client address ipaddress:localport Connected to server over TCPIP Connected to SQL Anywhere Server version 17.0.4.2053 Client disconnected Disconnected from server Ping server successful. $

redevill commented 2 years ago

This is the code being used with the driver in the node environment. (Node 12.22.1) sqlanywhere driver V1.0.27

var sqlanywhere = require('sqlanywhere'); const conn_params = { Host: 'xxx.xxx.xxx.xxx', Server: 'mySvr', UserId: 'dba', Password: 'sql' }; const conn = sqlanywhere.createConnection(); conn.connect(conn_params, (err: Error) => { if (err) throw err; console.log('connected ' + conn.connected()); conn.exec('SELECT name FROM orion', [301], (err: Error, result: any) => { if (err) throw err;

console.log(result); conn.disconnect(); }); });

// The environment variable is set. image

the content of the sa_config.sh was added to my bash_profile.

DanCummins-SAP commented 2 years ago

Hello again,

Is the file there? I had to run the setup from the install image, which installs a lib64 with a dbcapi inside (not the same as the lib64 in the install image). I thought I should mention that since it's confusing how to run the installer on Mac. The GUI installer might not run on modern macOS (working on getting it Notarized). As a workaround you can use the character mode installer.

To use the character-mode installer, run the "setup" script from the Install SQL Anywhere app by launching: Contents/Resources/sqlany17/setup

Maybe the file is there, but won't load for another reason? Can you try: otool -L libdbcapi_r.dylib

The output should look something like this:

libdbcapi_r.dylib: @rpath/libdbcapi_r.dylib (compatibility version 0.0.0, current version 0.0.0) @rpath/libdblib17_r.dylib (compatibility version 0.0.0, current version 0.0.0) @rpath/libdbtasks17_r.dylib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.6.0)

Hopefully those can be found in the DYLD_LIBRARY_PATH (hopefully that variable is not getting disabled somehow in your environment).

If that does not lead to a solution, can you gather the output from "dtruss"?

Dan

DanCummins-SAP commented 2 years ago

For NODE_PATH, it should contain the path to the node_modules directory of your Node distribution. Like other tools, there is a global and a per-user setting. You can see these with: npm root npm -g root

So for example if you "npm -g install node-sqlanywhere" it will go in the global place.

Dan

redevill commented 2 years ago

So I did check to see if the file "libdbcapi_r.dylib actually existed in the folder - It was there. After putting all the config into my bash profile, I double checked that the $ENVVARS had values that made sense.

With the exception of NODE_PATH... this I was a bit uncertain as I use a version manager called n... It swaps out node installs based on need. I tracked down its location, and then set the NODE_PATH to

export SQLANY17=/Applications/SQLAnywhere17/System NODE_PATH="/Users/Eti/n/bin/node" NODE_PATH="$SQLANY17/node:${NODE_PATH:-}" export NODE_PATH

I will look into dtruss

TorbenI commented 1 year ago

Hi @redevill . Did you find a solution for your problem? I get the same error on connecting to the database. The SQLANY_API_DLL path is set to the libdbcapi_r.dylib (the file exists and otool is showing the result from @DanCummins-SAP). Also SQLANY17=/Applications/SQLAnywhere17/System is set. I installed the sql-anywhere app with the setup file (Contents/Resources/sqlany17/setup)

redevill commented 1 year ago

@TorbenI - Sorry, we did not find a solution, and no more budget for the effort.

TorbenI commented 1 year ago

@redevill Thanks for your response :). Sad to hear that it didn‘t work. Maybe I will find someone who managed to get it working on MacOS.

DenisBessa commented 1 year ago

If you came here looking for answers, here is a functioning config for a node.js app with all dependencies running on Docker:

(this took me several hours)

# Wont work with any version newer version of node
FROM --platform=linux/amd64 node:12

# Build dependencies
RUN apt-get install -y make gcc g++ python3

# Avoid "gyp ERR! stack Error: certificate has expired"
ENV NODE_TLS_REJECT_UNAUTHORIZED=0

WORKDIR /app

ENV SQLANY17="/opt/sqlanywhere17" \
    LD_LIBRARY_PATH="/opt/sqlanywhere17/lib64:${LD_LIBRARY_PATH}" \
    NODE_PATH="/opt/sqlanywhere17/node:${NODE_PATH}" \
    PATH="/opt/sqlanywhere17/bin64:/opt/sqlanywhere17/bin32:${PATH}"

# Install SQL Anywhere client
RUN wget http://d5d4ifzqzkhwt.cloudfront.net/sqla17developer/bin/sqla17developerlinux.tar.gz -P /opt/sqlanywhere17/installation \
    && tar zxvf /opt/sqlanywhere17/installation/sqla17developerlinux.tar.gz -C /opt/sqlanywhere17/installation

RUN sh /opt/sqlanywhere17/installation/sqlany17/setup -silent -I_accept_the_license_agreement -type CREATE
RUN rm -rf /opt/sqlanywhere17/installation

COPY package*.json ./
RUN npm install

COPY . .
RUN npm run build

# # Needs to install SQL Anywhere again to get the right binaries
RUN npm i sqlanywhere

EXPOSE 3000

CMD ["node", "/app/dist/index.js"]