/*--------------------------------------------------------*/ /* sql.c apr-1998/pablo */ /*--------------------------------------------------------*/ #include #define SQL_INIT #include "sql.h" /*--------------------------------------------------------*/ /* sql_exit */ /*--------------------------------------------------------*/ void sql_exit( int status ) { if (( sqldb != NULL ) && ( PQstatus( sqldb ) == CONNECTION_OK )) { PQuntrace( sqldb ); PQfinish( sqldb ); } exit( status ); } /* end of sql_exit() */ /*--------------------------------------------------------*/ /* sql_die */ /*--------------------------------------------------------*/ void sql_die() { fprintf( stderr, "%s(%d) dying on sql error...\n", progname,(int)getpid() ); fprintf( stderr, "%s\n", PQerrorMessage( sqldb )); sql_exit( 1 ); } /* end of sql_die() */ /*--------------------------------------------------------*/ /* sql_warn */ /*--------------------------------------------------------*/ void sql_warn() { fprintf( stderr, "%s(%d)SQL Warning...\n", progname,(int)getpid() ); fprintf( stderr, "%s\n", PQerrorMessage( sqldb )); } /* end of sql_warn() */ /*--------------------------------------------------------*/ /* sql_watch */ /* check for error and call sql_die or sql_warn if */ /* necessary */ /* does not clear res! */ /*--------------------------------------------------------*/ ExecStatusType sql_watch( PGresult *res ) { ExecStatusType s; if ( res == NULL ) { s = PGRES_FATAL_ERROR; } else { s = PQresultStatus( res ); } switch( s ) { case PGRES_BAD_RESPONSE: case PGRES_NONFATAL_ERROR: sql_warn(); break; case PGRES_FATAL_ERROR: sql_die(); break; default: /* ok */ break; } return( s ); } /* end of sql_watch() */ /*--------------------------------------------------------*/ /* sql_try */ /*--------------------------------------------------------*/ void sql_try( char *query ) { PGresult *res = PQexec( sqldb,query ); if ( res != NULL ) { PQclear( res ); } } /* end of sql_try() */ /*--------------------------------------------------------*/ /* sql_do */ /*--------------------------------------------------------*/ ExecStatusType sql_do( char *query ) { PGresult *res = PQexec( sqldb,query ); ExecStatusType ret = sql_watch( res ); PQclear( res ); return( ret ); } /* end of sql_do() */ /*--------------------------------------------------------*/ /* sql_printf */ /*--------------------------------------------------------*/ ExecStatusType sql_printf( char *fmt, ... ) { static char sql[BIGSQLSIZE]; va_list args; va_start( args,fmt ); vsprintf( sql,fmt,args ); return( sql_do( sql )); } /* end of sql_printf() */ /*--------------------------------------------------------*/ /* sql_int */ /*--------------------------------------------------------*/ int sql_int( char *query ) { int count; PGresult *res = PQexec( sqldb,query ); if ( PQresultStatus( res ) != PGRES_TUPLES_OK ) { sql_die(); } count = atoi( PQgetvalue( res,0,0 )); PQclear( res ); return( count ); } /* end of sql_int() */ /*--------------------------------------------------------*/ /* sql_connect_or_fail */ /* connect to local sql database */ /*--------------------------------------------------------*/ int sql_connect_or_fail() { int trace = 0; if (( sqldb != NULL ) && ( PQstatus( sqldb ) == CONNECTION_OK )) { return( 0 ); /* already connected */ } /*fprintf( stderr,"attempting to connect to SQLHOST=[%s] SQLPORT=[%s] SQLTTY=[%s] dbname=[%s]\n",SQLHOST,SQLPORT,SQLTTY,dbname );*/ sqldb = PQsetdb( SQLHOST,SQLPORT,NULL,SQLTTY,dbname ); if ( PQstatus( sqldb ) == CONNECTION_BAD ) { fprintf( stderr, "%s(%d): WARNING: Couldn't hook db (host %s,port %s), retrying...\n", progname,(int)getpid(),SQLHOST,SQLPORT ); /* spawn postmaster */ /* system( SPAWN_POSTMASTER );*/ sleep( 10 ); sqldb = PQsetdb( NULL,NULL,NULL,NULL,dbname ); if ( PQstatus( sqldb ) != CONNECTION_OK ) { fprintf( stderr, "%s(%d) Couldn't connect to %s\n", progname,(int)getpid(),dbname ); fprintf( stderr, "%s\n", PQerrorMessage( sqldb )); return( 1 ); } } if ( trace ) { FILE *fp; fp = fopen( "SQLtrace","w" ); PQtrace( sqldb,fp ); } return( 0 ); } /* end of sql_connect_or_fail() */ /*--------------------------------------------------------*/ /* sql_connect_db */ /*--------------------------------------------------------*/ void sql_connect_db() { if ( sql_connect_or_fail() ) sql_exit( 1 ); } /* end of sql_connect_db() */