[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Postgresql ODBC driver not found



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           | hfollmann@itcfollmann.com


Reply to: