PostgreSQL server for OS/2 Development

This page will deal with the  programming in C, C++, Embedded C, JAVA. for Postgres SQL server, Postgres function modules, etc.

When you compile your programs in C or C++, you see this error during execution:

Process terminated by SIGSEGV
core dumped
SYS1808:
The process has stopped. The software diagnostic
code (exception code) is  0005.

This error is caused by pq.dll environment runtime. For solving this problem you can:

1: create a script like psql.cmd; (substutite psql.exe with the name of your application
2: set environment variable PGUSER:
        set pguser=user
user is an user name created by psql monitor with "create user" statement or with createuser.cmd utility


In a network environment you must set the IP workstation in \pgsqldata\pg_hba.conf

File format:
host    dbname    ip_address    address_mask    authtype
For field authtype see pg_hba.conf file in \pgsqldata directory

Example:
host    account    192.168.0.0    255.255.255.0    trust
This example allow all users from 192.168.0.x hosts to connect to account database

Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.



Programming Examples:


How compile the "C" programs with postgres:

    gcc -Zcrtdll -I/pgsql/include test1.c -L/pgsql/lib -lpq

The flag -Zcrtdll is necessary because the pq.dll is compiled with the same switch.
-lpq is the library for dynamically linked with pq.dll 
(In the list of library for compiling, pq is the last)

TEST1.C:

 /*
 * testlibpq.c Test the C version of Libpq, the Postgres frontend
 * library.
 *
 *
 */
 #include <stdio.h>
 #include "libpq-fe.h"

 void exit_nicely(PGconn *conn)
 {
  PQfinish(conn);
  exit(1);
 }

 main()
 {
  char *pghost,
  *pgport,
  *pgoptions,
  *pgtty;
  char *dbName;
  int nFields;
  int i,
  j;

  /* FILE *debug; */
  PGconn *conn;
  PGresult *res;

  /*
  * begin, by setting the parameters for a backend connection if
  * the parameters are null, then the system will try to use reasonable
  * defaults by looking up environment variables or, failing that,
  * using hardwired constants
  */

 pghost = NULL; /* host name of the backend server */
 pgport = NULL; /* port of the backend server */
 pgoptions = NULL; /* special options to start up the backend server */
 pgtty = NULL; /* debugging tty for the backend server */
 dbName = "template1";

 /* make a connection to the database */
 conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

 /*
  * check to see that the backend connection was successfully made
 */
 if (PQstatus(conn) == CONNECTION_BAD)
    {
     fprintf(stderr, "Connection to database  %s  failed.\n", dbName);
     fprintf(stderr, "%s", PQerrorMessage(conn));
     exit_nicely(conn);
    }

 /* debug = fopen("/tmp/trace.out","w"); */
 /* PQtrace(conn, debug); */
 /* start a transaction block */
 res = PQexec(conn, "BEGIN");
 if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
    {
     fprintf(stderr, "BEGIN command failed\n");
     PQclear(res);
     exit_nicely(conn);
    }
 /*
 * should PQclear PGresult whenever it is no longer needed to avoid
 * memory leaks
 */
 PQclear(res);
 /*
 * fetch instances from the pg_database, the system catalog of
 * databases
 */
 res = PQexec(conn, "DECLARE mycursor CURSOR FOR select * from pg_database");
 if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
     {
      fprintf(stderr, "DECLARE CURSOR command failed\n");
      PQclear(res);
      exit_nicely(conn);
     }
 PQclear(res);
 res = PQexec(conn, "FETCH ALL in mycursor");
 if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)
     {
      fprintf(stderr, "FETCH ALL command didn t return tuples properly\n");
      PQclear(res);
     exit_nicely(conn);
     }
 /* first, print out the attribute names */
 nFields = PQnfields(res);
 for (i = 0; i < nFields; i++)
     printf("%-15s", PQfname(res, i));
 printf("\n\n");
 /* next, print out the instances */
 for (i = 0; i < PQntuples(res); i++)
     {
      for (j = 0; j < nFields; j++)
          printf("%-15s", PQgetvalue(res, i, j));
      printf("\n");
     }
 PQclear(res);
 /* close the cursor */
 res = PQexec(conn, "CLOSE mycursor");
 PQclear(res);
 /* commit the transaction */
 res = PQexec(conn, "COMMIT");
 PQclear(res);
 /* close the connection to the database and cleanup */
 PQfinish(conn);
 /* fclose(debug); */
 }

How compile the "C++" programs with postgres:

See the examples and makefile  in /pgsql/prog/objc
    gcc -Zcrtdll -I/pgsql/include test1.cc -L/pgsql/lib -lpq++s -lpq -lstdcpp

The flag -Zcrtdll is necessary because the pq.dll is compiled with the   same switch.
-lpq is the library for dynamically linked with pq.dll;
-lpq++s is the library for pq++ code;
-lstdcpp is the library for runtime c++ code
(In the list of library for compiling, this 3 library are the last)

TEST1.CC:

/*-------------------------------------------------------------------------
 *
 * testlibpq0.c--
 *    small test program for libpq++,
 * small interactive loop where queries can be entered interactively
 * and sent to the backend
 *
 * Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *    $Header: /pgsql/src/interfaces/libpq++/examples/testlibpq0.cc,v 1.5
      1999/12/03 18:28:32 momjian Exp $
 *
 *-------------------------------------------------------------------------
 */

#include <iostream.h>
#include <libpq++.h>

int main()
{
  // Open the connection to the database and make sure it's OK
  PgDatabase data("dbname=template1");
  if ( data.ConnectionBad() ) {
      cout << "Connection was unsuccessful..." << endl
           << "Error message returned: " << data.ErrorMessage() << endl;
      return 1;
  }
  else
      cout << "Connection successful...  Enter queries below:" << endl;

  // Interactively obtain and execute queries
  ExecStatusType status;
  string buf;
  int done = 0;
  while (!done)
    {
      cout << "> ";
      cout.flush();
      getline(cin, buf);
      if ( buf != "" )
               if ( (status = data.Exec( buf.c_str() )) == PGRES_TUPLES_OK )
                  data.DisplayTuples();
               else
                  cout << "No tuples returned..." << endl
                       << "status = " << status << endl
                       << "Error returned: " << data.ErrorMessage() << endl;
      else
               done = 1;
      }
  return 0;
} // End main()