isdn4k-utils/isdnlog/isdnlog/ora_load.c

209 lines
4.7 KiB
C

/*
* Copyright (C) 1999 Jan Bolt
*
* Permission to use, copy and distribute this software for
* non-commercial purposes is hereby granted without fee,
* provided that this copyright and permission notice appears
* in all copies.
*
* This software is provided "as-is", without ANY WARRANTY.
*
* ora_load.c 1999/01/07 Jan Bolt
*
* $Log: ora_load.c,v $
* Revision 1.2 2002/03/11 16:17:10 paul
* DM -> EUR
*
* Revision 1.1 1999/12/31 13:30:02 akool
* isdnlog-4.00 (Millenium-Edition)
* - Oracle support added by Jan Bolt (Jan.Bolt@t-online.de)
*
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdarg.h>
#include "policy.h"
#include "oracle.h"
static const char rcsid[] = "$Id: ora_load.c,v 1.2 2002/03/11 16:17:10 paul Exp $";
extern const char *db_load_error;
static const char *logfile;
static int debug, rowsInserted, insErrors;
/* overwrite syslog for console output */
void syslog(int pri, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fprintf(stderr, "\n");
}
static
char *trim(char *s)
{
char *p;
while (*s == ' ') s++;
if (!*s) return s;
p = s;
while (*p) p++;
p--;
while (*p == ' ') *p-- = '\0';
return s;
}
static
int isdngeb(FILE *fp)
{
oracle_DbStrIn call;
int row = 0, i;
char buf[256];
rowsInserted = 0;
for ( ; fgets(buf, sizeof(buf), fp); )
{
char *p;
row++;
/*printf("%s", buf);*/
memset(&call, 0, sizeof(call));
for (i = 0, p = buf; (p = strtok(p, "|")); p = 0)
{
i++;
/*printf("%d \"%s\"\n", p);*/
switch (i)
{
case 1: /* Datum (ctime(&t)+4, Nov 1 10:25:21 1998) */
/*struct tm tm;*/
/*strptime(p, "%b %d %H:%M:%S %Y", &tm);*/
/*call.connect = mktime(&tm);*/
break;
case 2: /* Anrufer */
strncpy(call.calling, trim(p), sizeof(call.calling));
call.calling[sizeof(call.calling)-1] = '\0';
break;
case 3: /* Angerufener */
strncpy(call.called, trim(p), sizeof(call.called));
call.called[sizeof(call.called)-1] = '\0';
break;
case 4: /* Dauer der Verbindung in Sekunden */
call.duration = atol(p);
break;
case 5: /* Dauer der Verbindung in 1/100 Sekunden */
call.hduration = atol(p);
break;
case 6: /* Zeitpunkt des Verbindungsaufbaues in UTC */
call.connect = atol(p);
break;
case 7: /* Gebuehreneinheiten (-1 == keine Meldung) */
call.aoce = atoi(p);
break;
case 8: /* "I" fuer incoming call, "O" fuer outgoing call */
call.dialin[0] = *trim(p);
call.dialin[1] = '\0';
break;
case 9: /* Status Verbindungsende */
call.cause = atoi(p);
break;
case 10: /* Summe der uebertragenen Byte (incoming) */
call.ibytes = atol(p);
break;
case 11: /* Summe der uebertragenen Byte (outgoing) */
call.obytes = atol(p);
break;
case 12: /* Versionsnummer der "isdn.log" Eintragung */
strncpy(call.version, trim(p), sizeof(call.version));
call.version[sizeof(call.version)-1] = '\0';
break;
case 13: /* Dienstkennung (1=Speech, 7=Data usw.) */
call.si1 = atoi(p);
break;
case 14: /* 0 = ISDN, 1 = analog */
call.si11 = atoi(p);
break;
case 15: /* Currency Factor (0.121) */
call.currency_factor = atof(p);
break;
case 16: /* Waehrung (EUR) */
strncpy(call.currency, trim(p), sizeof(call.currency));
call.currency[sizeof(call.currency)-1] = '\0';
break;
case 17: /* Gebuehrensumme (xx.xx) */
call.pay = atof(p);
break;
case 18: /* Providercode (ab 3.1) */
call.provider = atoi(p);
break;
case 19: /* Zone (ab 3.2) */
call.zone = atoi(p);
break;
}
}
if (i >= 17)
{
if (!oracle_dbAdd(&call))
rowsInserted++;
else
insErrors++;
}
else
{
fprintf(stderr, "%s: #%d: corrupted record.\n", logfile, row);
insErrors++;
}
}
return row;
}
/*********************************************************************/
int main(int argc, const char *argv[])
{
int i, rows;
FILE *fp;
for (i = 1; i < argc; i++)
{
if (!strcmp(argv[i], "--help"))
{
fprintf(stderr, "Usage: %s [ -debug ] [ logfile ]\n",
basename(argv[0]));
return 0;
}
else
if (!strcmp(argv[i], "-debug"))
debug = 1;
else
if (!logfile)
logfile = argv[i];
}
db_load_error = "ora_load.sql";
unlink(db_load_error);
if (!logfile) logfile = LOGFILE; /*"/var/log/isdn.log"*/
if (!(fp = fopen(logfile, "r")))
{
perror(logfile);
return 1;
}
if (oracle_dbOpen()) return 1;
rows = isdngeb(fp);
fclose(fp);
oracle_dbClose();
fprintf(stderr, "%s: %d rows, %d inserted, %d errors\n",
logfile, rows, rowsInserted, insErrors);
if (insErrors)
fprintf(stderr, "look at %s for loader errors\n", db_load_error);
return insErrors;
}