#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #include <assert.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include "global.h" #include "bug.h" #define __SQL_C__ #include "sql.h" EXEC SQL INCLUDE sqlca; int db_connected = 0; int db_logging = 1; int db_log_info = 0; int db_log_errors = 1; int db_log_boot = 1; int db_log_auth = 1; int db_log_kills = 0; int db_log_resets = 0; int db_log_imc = 1; int init_sql( void ) { EXEC SQL BEGIN DECLARE SECTION; const char *sql_connect = "tcp:postgresql://localhost:5432/wiley"; const char *sql_user = "wiley"; const char *sql_passwd = "tardis69"; EXEC SQL END DECLARE SECTION; // if (ECPGstatus(__LINE__, NULL)) { // db_connected = 1; // return db_connected; // } fprintf(stderr, "Connecting to database server..."); EXEC SQL CONNECT TO :sql_connect AS :sql_user USER :sql_user IDENTIFIED BY :sql_passwd; if (sqlca.sqlcode == 0 ) { db_connected = 1; fprintf(stderr, "success!\n"); } else { db_connected = 0; fprintf(stderr, "failed!\n"); } //assert(sqlca.sqlcode == 0); return db_connected; } void close_sql( void ) { if (db_connected) EXEC SQL DISCONNECT ALL; db_connected = 0; } int verify_sql( void ) { EXEC SQL BEGIN DECLARE SECTION; int is_connected; EXEC SQL END DECLARE SECTION; is_connected = 0; if (ECPGstatus(__LINE__, NULL)) { EXEC SQL SELECT 1 INTO :is_connected; } return is_connected; } char *version_sql( void ) { EXEC SQL BEGIN DECLARE SECTION; static char version[MAX_STRING_LENGTH]; EXEC SQL END DECLARE SECTION; if (db_connected) { EXEC SQL SELECT version() INTO :version LIMIT 1; if (sqlca.sqlcode != 0 ) { fprintf(stderr, "error code %ld, message %s, rows %ld, warning %c\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc, sqlca.sqlerrd[2], sqlca.sqlwarn[0]); strcpy(version, sqlca.sqlerrm.sqlerrmc); } } else { strcpy(version, "Not Connected"); } return version; } int compare_dates_file_sql( const char *filename, const char *tablename, const char *fieldname ) { EXEC SQL BEGIN DECLARE SECTION; char statement[MAX_STRING_LENGTH]; int sql_time = 0; EXEC SQL END DECLARE SECTION; struct stat statbuf; int file_time = 0; if (db_connected) { sprintf(statement, "SELECT floor(extract(epoch FROM %s))::int FROM %s ORDER BY %s DESC LIMIT 1", fieldname, tablename, fieldname); EXEC SQL PREPARE stmt FROM :statement; EXEC SQL EXECUTE stmt INTO :sql_time; EXEC SQL DEALLOCATE PREPARE stmt; if(!stat(filename, &statbuf)) { file_time = (int)statbuf.st_mtime; } return file_time < sql_time ? -1 : (file_time == sql_time ? 0 : 1); } else { return 1; /* If SQL isn't available, the file IS the newest */ } }