On Thu, Sep 23, 2021 at 11:55:00PM +0200, Pierre Couderc wrote: > Thenk you, Henning, thank you Gregory . > > On 9/23/21 5:49 PM, Gregory Seidman wrote: > > On Thu, Sep 23, 2021 at 08:18:45AM -0400, Henning Follmann wrote: > > > > > I don't see where you ask for the PostgreSQL ODBC connection in particular. > > Maybe I'm the one missing something? > You are right, I am not trying to connect (not soon) but trying to get the > list of available drivers ! > > > > > isql "PostgreSQL Unicode" <user> <password> > > > > > > and perform a minimum check like: > > > select 1; > > > SQL> select 1 > +------------+ > | ?column? | > +------------+ > | 1 | > +------------+ > SQLRowCount returns 1 > 1 rows fetched > > SQL> quit > > > unixodbc seems to work...
yes > > I put here the full c++ source and the full result : > and I see you do not do any error checking. This would be a first step to find out where it fails. I added some code... > > #include <iostream> > #include <string> > #include <stdio.h> > #pragma GCC diagnostic ignored "-Wendif-labels" > #pragma GCC diagnostic ignored "-Wwrite-strings" > > #define TDBG clock_t ttdbg=clock();float > ftdbg=((float)ttdbg)/CLOCKS_PER_SEC; > #define DBG_(fmt, args...) {TDBG fprintf(stdout,string( string("D%5.1f:ln > %d:%s(): ")+fmt).c_str(),ftdbg,__LINE__, __func__, ##args);fflush(stdout);} > > using namespace std; > extern "C" > { > #include <sql.h> > #include <sqlext.h> > } > int main(int argc, char **argv) > { > DBG_("Start : Compile time : __DATE__ __TIME__\n"); > SQLHENV env; > SQLCHAR driver[256]; > SQLCHAR attr[256]; > SQLSMALLINT driver_ret; > SQLSMALLINT attr_ret; > SQLUSMALLINT direction; > SQLRETURN ret; > ret = > SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) { { /* most likely the odbc env is not set up properly write error message and bail */ cerr << "Failed to allocate handle" << endl; return -1; } ret = > SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0); /* again, even this function is not guaranteed to succeed test ! */ > > cout << env<<endl; > direction = SQL_FETCH_FIRST; /* again here you just use the return value for your loop I think it might be helpful to test for SQL_SUCCESS and in case it fails to actually handle the error for error codes check: https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqldrivers-function?view=sql-server-ver15 */ > while(SQL_SUCCEEDED (ret = SQLDrivers(env, direction, > driver, sizeof(driver), > &driver_ret, > attr, sizeof(attr), &attr_ret))) > { > direction = SQL_FETCH_NEXT; > printf("%s - %s\n", driver, attr); > if (ret == SQL_SUCCESS_WITH_INFO) printf("\tdata truncation\n"); > } > return 0; > } > > > Result : > > nous@pcouderc:~/projets/tttt/build$ ./ttest > D 0.0:ln 33:main(): Start : Compile time : __DATE__ __TIME__ > 0x55b0948ffed0 > nous@pcouderc:~/projets/tttt/build$ > > and meson.build for completeness : > > project('ttest','cpp', default_options : ['cpp_std=c++17'], > version : '0.1') > cpp = meson.get_compiler('cpp') > libiodbc_dep = cpp.find_library('libiodbc') > incdirs = include_directories('/usr/include/iodbc') > executable('ttest', 'main.cpp', dependencies : [libiodbc_dep], > include_directories : incdirs) > > > -- Henning Follmann | hfollm...@itcfollmann.com