#include #include #include #include #include /* * Program to import Sputnik data from 23C3 into PostgreSQL database. * Inspired by program of Peter Meerwald http://pmeerw.net/23C3_Sputnik/ */ typedef struct { u_int32_t timestamp; u_int32_t station; u_int32_t id, garbage2; u_int8_t size, protocol; u_int8_t flags; u_int8_t strength; u_int32_t seqno; } __attribute__ ((packed)) beacon_log_t; #define BUTTON 0x02 int main(int argc, char *argv[]) { FILE *f = NULL; int m, n, i; unsigned char buffer[sizeof(beacon_log_t)]; beacon_log_t *b = NULL; PGconn *connection; PGresult *result = NULL; char *parameters[6]; char P0[1024]; char P1[1024]; char P2[1024]; char P3[1024]; char P4[1024]; char P5[1024]; struct in_addr station; parameters[0] = P0; parameters[1] = P1; parameters[2] = P2; parameters[3] = P3; parameters[4] = P4; n = 0; connection = PQconnectdb("dbname = tomus"); if (NULL == connection) { return EXIT_FAILURE; } if (CONNECTION_OK != PQstatus(connection)) { printf("%s", PQerrorMessage(connection)); PQfinish(connection); connection = NULL; return EXIT_FAILURE; } result = PQexec(connection, "begin"); PQclear(result); f = fopen(argv[1], "rb"); if (argc > 2) { n = strtol(argv[2], NULL, 10); fseek(f, n*sizeof(beacon_log_t), SEEK_SET); } while (!feof(f)) { m = fread(buffer, 1, sizeof(beacon_log_t), f); if (m == 0) { continue; } else if (m != sizeof(beacon_log_t)) { result = PQexec(connection, "end"); PQclear(result); PQfinish(connection); connection = NULL; fclose(f); return EXIT_FAILURE; } b = (beacon_log_t *)buffer; for (i = 0; i < 5; ++i) { parameters[i][0] = '\0'; } snprintf(parameters[0], 1024, "%u", ntohl(b->id)); snprintf(parameters[1], 1024, "%u", ntohl(b->seqno)); snprintf(parameters[2], 1024, "%u", b->strength); station.s_addr = ntohl(b->station); snprintf(parameters[3], 1024, "%s", inet_ntoa(station)); snprintf(parameters[4], 1024, "%u", ntohl(b->timestamp)); if (b->flags&BUTTON) { snprintf(P5, 1024, "%s", "{'button0'}"); parameters[5] = P5; } else { parameters[5] = NULL; } result = PQexecParams(connection, "INSERT INTO sputnik.sputnik(id, sequence, strength, station, time, tags)" " VALUES ($1, $2, $3, (SELECT id FROM sputnik.station WHERE address = $4), to_timestamp($5), $6) ", 6, NULL, parameters, NULL, NULL, 0); if (PGRES_COMMAND_OK != PQresultStatus(result)) { printf("%s", PQerrorMessage(connection)); PQclear(result); result = PQexec(connection, "end"); PQclear(result); PQfinish(connection); connection = NULL; fclose(f); return EXIT_FAILURE; } PQclear(result); if (++n % 10000 == 0) { result = PQexec(connection, "end"); PQclear(result); result = PQexec(connection, "begin"); PQclear(result); printf("%i\n", n); } } result = PQexec(connection, "end"); PQclear(result); PQfinish(connection); connection = NULL; fclose(f); return EXIT_SUCCESS; }