Search code examples
postgresqlgnucobol

OpenCobol & PostgreSQL on Windows with Visual Studio


I'm currently facing a problem with this team of 4.

Using binaries I downloaded on kiska's site. I'm able to compile cobol to C and run it with cobcrun or compile it to an executable. However I can 't get opencobol to find the postgres commands.

Here is the strat of my cobol script :

identification division.
program-id. pgcob.
data division.
working-storage section.
01 pgconn usage pointer.
01 pgres usage pointer.
01 resptr usage pointer.
01 resstr pic x(80) based.
01 result usage binary-long.
01 answer pic x(80).

procedure division.
    display "Before connect:" pgconn end-display
    call "PQconnectdb" using
        by reference "dbname = postgres" & x"00"
        by reference "host = 10.37.180.146" & "00"
        returning pgconn
    end-call

...

the call PQconnectdb fail with module ont found : PQconnectdb

I noticed that if i rename the libpq.dll the error message change to can't find entry point. So at least I'm sure it can get my dll.

After digging into the code of the call method of the libcob library. I found it it was possible to pre load some dll using an environment variable COB_PRE_LOAD but sitll no results.

Here is what look the script to compile the cobol :

call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat"
set COB_CONFIG_DIR=C:\OpenCobol\config
set COB_COPY_DIR=C:\OpenCobol\Copy
set COB_LIBS=%COB_LIBS% c:\OpenCobol\libpq.lib
set COB_LIBRARY_PATH=C:\OpenCobol\bin
set COB_PRE_LOAD=C:\OpenCobol\libpq.dll
@echo on
cobc -info
cobc -free -o pgcob -L:"C:\OpenCobol" -llibpq.lib test_cobol\postgres.cob
call cobcrun pgcob

I don't see anything missing, I'm using the 64-bit binaries from kiska's site and use the 64-bit cl.exe from Visual Studio, Postgres is a 64 bit version too (checked with dependencyChecker).

I even tryed to compile the generated C from Visual Studio, same result, but I may miss something, I'm pretty rotten in C and never really had to manage DLL or use Visual Studio.

What am I missing ?


Solution

  • COB_PRE_LOAD doesn't take any path or extension, see the short documentation for the available runtime configurations. I guess

    set COB_LIBRARY_PATH=C:\OpenCobol\bin;C:\OpenCobol
    set COB_PRE_LOAD=libpq
    

    Will work. You can omit the C:\OpenCobol\bin if you did not placed any additional executables there.

    If it doesn't work (even if it does) I'd try to get the C functions resolved at compile time. Either use

    CALL STATIC "PQconnectdb" using ...
    

    or an appropriate CALL-CONVENTION or leave the program as-is and use

    cobc -free -o pgcob -L"C:\OpenCobol" -llibpq -K PQconnectdb test_cobol\postgres.cob
    

    From cobc --help:

    -K generate CALL to <entry> as static

    In general: the binaries from kiska.net are quite outdated. I highly suggest getting newer ones from the official download site or ideally build them on your own from source, see the documentation for building GnuCOBOL with VisualStudio.