isdn4k-utils/isdnlog/isdnlog/postgres.c

247 lines
5.9 KiB
C

/* $Id: postgres.c,v 1.2 2000/01/23 22:31:13 akool Exp $
*
* Interface for Postgres95-Database for isdn4linux. (db-module)
*
* by Markus Leist (markus@hal.dirnet.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: postgres.c,v $
* Revision 1.2 2000/01/23 22:31:13 akool
* isdnlog-4.04
* - Support for Luxemburg added:
* - isdnlog/country-de.dat ... no +352 1 luxemburg city
* - isdnlog/rate-lu.dat ... initial LU version NEW
* - isdnlog/holiday-lu.dat ... NEW - FIXME
* - isdnlog/.Config.in ... LU support
* - isdnlog/configure.in ... LU support
* - isdnlog/samples/isdn.conf.lu ... LU support NEW
*
* - German zone-table enhanced
* - isdnlog/tools/zone/de/01033/mk ...fixed, with verify now
* - isdnlog/tools/zone/redzone ... fixed
* - isdnlog/tools/zone/de/01033/mzoneall ... fixed, faster
* - isdnlog/tools/zone/mkzonedb.c .... data Version 1.21
*
* - Patch from Philipp Matthias Hahn <pmhahn@titan.lahn.de>
* - PostgreSQL SEGV solved
*
* - Patch from Armin Schindler <mac@melware.de>
* - Eicon-Driver Support for isdnlog
*
* Revision 1.1 1997/03/16 20:58:45 luethje
* Added the source code isdnlog. isdnlog is not working yet.
* A workaround for that problem:
* copy lib/policy.h into the root directory of isdn4k-utils.
*
* Revision 1.2 1996/12/05 10:20:04 admin
* first version auf Postgres95-Interface seems to be ok
*
* Revision 1.1 1996/12/04 10:03:24 admin
* Initial revision
*
*
*/
#ifdef POSTGRES
#define _POSTGRES_C_
#include "postgres.h"
void _PQfinish(void)
{
if ( db_Conn )
PQfinish( db_Conn);
db_Conn = NULL;
}
int dbOpen(void)
{
/* get strings from macros */
db_Host = NULL;
if ( DB_HOST )
{
db_Host = malloc( strlen( DB_HOST));
strcpy( db_Host, DB_HOST);
}
db_Name = NULL;
if ( DB_NAME )
{
db_Name = malloc( strlen( DB_NAME));
strcpy( db_Name, DB_NAME);
}
db_Table = NULL;
if ( DB_TABLE )
{
db_Table = malloc( strlen( DB_TABLE));
strcpy( db_Table, DB_TABLE);
}
db_Port = NULL;
if ( DB_PORT )
{
db_Port = malloc( strlen( DB_PORT));
strcpy( db_Port, DB_PORT);
}
db_Options = NULL;
if ( DB_OPTIONS )
{
db_Options = malloc( strlen( DB_OPTIONS));
strcpy( db_Options, DB_OPTIONS);
}
db_Tty = NULL;
if ( DB_TTY )
{
db_Tty = malloc( strlen( DB_TTY));
strcpy( db_Tty, DB_TTY);
}
/* make a connection to the database */
db_Conn = PQsetdb( db_Host, db_Port, db_Options, db_Tty, db_Name);
/* check to see that the backend connection was successfully made */
if ( PQstatus( db_Conn) == CONNECTION_BAD)
{
syslog( LOG_ERR, "%s", "Connection to ISDN-database failed.");
syslog( LOG_ERR, "%s", PQerrorMessage( db_Conn));
_PQfinish();
return( -1);
}
return( 0);
}
int dbClose(void)
{
_PQfinish();
if ( db_Host)
free( db_Host);
if ( db_Name)
free( db_Name);
if ( db_Table)
free( db_Table);
if ( db_Port)
free( db_Port);
if ( db_Options)
free( db_Options);
if ( db_Tty)
free( db_Tty);
return( 0);
}
int dbAdd( DbStrIn *in)
{
PGresult *res;
char out_txt[400];
struct tm *tm;
assert( (int)in);
if ( dbStatus() ) /* returns -1 when not open */
if ( dbOpen() ) /* returns -1 when error appears */
return( -1);
res = PQexec( db_Conn, "BEGIN");
if ( PQresultStatus( res) != PGRES_COMMAND_OK)
{
syslog( LOG_ERR, "%s", "Connection to ISDN-database failed.");
syslog( LOG_ERR, "%s", PQerrorMessage( db_Conn));
_PQfinish();
return( -1);
}
/* should PQclear PGresult whenever it is no longer needed to avoid
memory leaks */
PQclear( res);
tm = localtime( (__const time_t *) &(in->connect));
sprintf( out_txt
, "INSERT INTO %s "
"( sdate, stime, calling, called, charge, dir, "
" in_bytes, out_bytes, msec, sec, status, service, "
" source, vrsion, factor, currency) values "
"( \'%02d.%02d.%d\', \'%02d:%02d:%02d\', "
"\'%s\', \'%s\', \'%d\', \'%c\', "
"\'%ld\', \'%ld\', \'%d\', \'%d\', \'%d\', \'%d\', "
"\'%d\', \'%d\', \'%5.2f\', \'%s\' );",
db_Table,
tm->tm_mday, tm->tm_mon+1, tm->tm_year+1900,
tm->tm_hour, tm->tm_min, tm->tm_sec,
in->calling, in->called,
in->aoce, in->dialin,
in->ibytes, in->obytes,
in->hduration, in->duration,
in->cause, in->si1, in->si11,
in->version, in->currency_factor,
in->currency);
/* fetch instances from the pg_database, the system catalog of databases*/
res = PQexec( db_Conn, out_txt);
if ( PQresultStatus( res) != PGRES_COMMAND_OK)
{
syslog( LOG_ERR, "%s", "Connection to ISDN-database failed.");
syslog( LOG_ERR, "%s", PQerrorMessage( db_Conn));
_PQfinish();
return( -1);
}
PQclear( res);
/* end the transaction */
res = PQexec( db_Conn, "END");
if ( PQresultStatus( res) != PGRES_COMMAND_OK)
{
syslog( LOG_ERR, "%s", "Connection to ISDN-database failed.");
syslog( LOG_ERR, "%s", PQerrorMessage( db_Conn));
_PQfinish();
return( -1);
}
PQclear(res);
return( 0);
}
int dbStatus( void)
{
if ( PQstatus( db_Conn) == CONNECTION_BAD)
return( -1);
else
return( 0);
}
#endif