I am trying to query a Progress OpenEdge Database from a ruby application.
I am unable to get ruby-odbc to compile against the Progress ODBC driver include files.
Perls DBD::ODBC compiled just fine and I can query from perl.
Any suggestions?
I've tried both DataDirect Connect64 drivers and the Progress OpenEdge SQL Client Access drivers.
I get the same error with both libraries.
47501odbc:~ # gem install ruby-odbc -- --with-odbc-dir=/usr/dlc/odbc Building native extensions with: '--with-odbc-dir=/usr/dlc/odbc' This could take a while... /usr/local/rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/rubygems/ext/builder.rb:73: warning: Insecure world writable dir /usr/dlc in PATH, mode 040777 ERROR: Error installing ruby-odbc: ERROR: Failed to build gem native extension. /usr/local/rvm/rubies/ruby-2.1.1/bin/ruby extconf.rb --with-odbc-dir=/usr/dlc/odbc checking for version.h... no checking for sql.h... yes checking for sqlext.h... yes checking for SQLTCHAR in sqltypes.h... no checking for SQLLEN in sqltypes.h... no checking for SQLULEN in sqltypes.h... no checking for odbcinst.h... yes checking for SQLAllocConnect() in -lodbc... yes checking for SQLConfigDataSource() in -lodbcinst... no checking for SQLConfigDataSource() in -liodbcinst... no checking for SQLInstallerError() in odbcinst.h... yes checking for SQLBIGINT in sqltypes.h with -DHAVE_LONG_LONG... no creating Makefile make "DESTDIR=" clean make "DESTDIR=" compiling init.c compiling odbc.c odbc.c:47: error: redefinition of typedef ‘SQLTCHAR’ /usr/dlc/odbc/include/sqltypes.h:329: error: previous declaration of ‘SQLTCHAR’ was here odbc.c:2404: error: ‘SQL_DTC_TRANSITION_COST’ undeclared here (not in a function) odbc.c:2709: error: ‘SQL_DTC_ENLIST_EXPENSIVE’ undeclared here (not in a function) odbc.c:2709: error: initializer element is not constant odbc.c:2709: error: (near initialization for ‘get_info_bitmap[201].bits’) odbc.c:2710: error: ‘SQL_DTC_UNENLIST_EXPENSIVE’ undeclared here (not in a function) odbc.c:2710: error: initializer element is not constant odbc.c:2710: error: (near initialization for ‘get_info_bitmap[202].bits’) odbc.c:7993: error: ‘SQL_CP_OFF’ undeclared here (not in a function) odbc.c:7993: error: initializer element is not constant odbc.c:7993: error: (near initialization for ‘o_const[44].value’) odbc.c:7994: error: ‘SQL_CP_ONE_PER_DRIVER’ undeclared here (not in a function) odbc.c:7994: error: initializer element is not constant odbc.c:7994: error: (near initialization for ‘o_const[45].value’) odbc.c:7995: error: ‘SQL_CP_ONE_PER_HENV’ undeclared here (not in a function) odbc.c:7995: error: initializer element is not constant odbc.c:7995: error: (near initialization for ‘o_const[46].value’) odbc.c:7996: error: ‘SQL_CP_DEFAULT’ undeclared here (not in a function) odbc.c:7996: error: initializer element is not constant odbc.c:7996: error: (near initialization for ‘o_const[47].value’) make: *** [odbc.o] Error 1 make failed, exit code 2 Gem files will remain installed in /usr/local/rvm/gems/ruby-2.1.1/gems/ruby-odbc-0.99995 for inspection. Results logged to /usr/local/rvm/gems/ruby-2.1.1/extensions/x86_64-linux/2.1.0/ruby-odbc-0.99995/gem_make.out
I'm cross posting this from here on a suggestion from the folks over there: https://community.progress.com/technicalusers/f/19/t/9394.aspx
The problem is that odbc.c is defining SQLTCHAR, which is already defined in sqltypes.h.
typedef SQLCHAR SQLTCHAR;
Perhaps this happened because the parser that examines files is not working properly.
/usr/local/rvm/rubies/ruby-2.1.1/bin/ruby extconf.rb --with-odbc-dir=/usr/dlc/odbc
...
checking for SQLTCHAR in sqltypes.h... no
checking for SQLLEN in sqltypes.h... no
checking for SQLULEN in sqltypes.h... no
Does ruby create odbc.c? What's at line 47 of odbc.c?
The source tarball is here: www.ch-werner.de/.../ruby-odbc-0.99995.tar.gz
Or some slightly modified source in a git repo here: github.com/.../odbc.c
Line 43-49
#ifndef HAVE_TYPE_SQLTCHAR #ifdef UNICODE typedef SQLWCHAR SQLTCHAR; #else typedef SQLCHAR SQLTCHAR; #endif #endif
Because Ruby reported that SQLTCHAR was not in sqltypes.h, I suspect that HAVE_TYPE_SQLTCHAR is not defined. I don't know why Ruby didn't find SQLTCHAR in our sqltypes.h file.
Are the resulting files somewhere so I can look at them? Perhaps one of the resulting files can be modified to work-around this problem.
Sure.
I really appreciate the help.
dl.dropboxusercontent.com/.../ruby-odbc-0.99995.tgz
The build files are in the 'ext' directory.
My make output is in make.log
I was able to get odbc.c to compile by changing:
DEFS =
To:
DEFS2 = -DHAVE_TYPE_SQLTCHAR -DSQL_DTC_TRANSITION_COST=1750 -DSQL_DTC_ENLIST_EXPENSIVE=0x00000001L -DSQL_DTC_UNENLIST_EXPENSIVE=0x00000002L
DEFS = $(DEFS2) -DSQL_CP_OFF=0UL -DSQL_CP_ONE_PER_DRIVER=1UL -DSQL_CP_ONE_PER_HENV=2UL -DSQL_CP_DEFAULT=SQL_CP_OFF
Hopefully this will work for you as well. Good luck.
Oops...I forgot to mention I made this change in the ext/Makefile.
Thank you! That appears to work great!
You're welcome. I'm glad that fixed the problem.