static void tick_handler(struct PgSocket *s, void *arg, enum PgEvent ev, PGresult *res) { struct PgDatabase *db = arg; switch (ev) { case DB_CONNECT_OK: run_pgq_check(db); break; case DB_RESULT_OK: switch (db->state) { case DB_TICKER_CHECK_PGQ: parse_pgq_check(db, res); break; case DB_TICKER_CHECK_VERSION: parse_version_check(db, res); break; case DB_TICKER_RUN: parse_ticker_result(db, res); break; default: fatal("bad state"); } break; case DB_TIMEOUT: log_debug("%s: tick timeout", db->name); if (!db_connection_valid(db->c_ticker)) launch_ticker(db); else run_ticker(db); break; default: db_reconnect(db->c_ticker); } }
YAAMP_DB *db_connect() { YAAMP_DB *db = new YAAMP_DB; db_reconnect(db); return db; }
void db_query(YAAMP_DB *db, const char *format, ...) { va_list arglist; va_start(arglist, format); char *buffer = (char *)malloc(YAAMP_SMALLBUFSIZE+strlen(format)); if(!buffer) return; int len = vsprintf(buffer, format, arglist); va_end(arglist); while(1) { int res = mysql_query(&db->mysql, buffer); if(!res) break; res = mysql_errno(&db->mysql); stratumlog("SQL ERROR: %d, %s\n", res, mysql_error(&db->mysql)); if(res != CR_SERVER_GONE_ERROR && res != CR_SERVER_LOST) exit(1); db_reconnect(db); } free(buffer); }
int main(int argc, char **argv) { int i, errCode; double magic, rlat, s, c; int lat; g_progname = argv[0]; for (i=1; i < argc; i++) { if(!strcmp(argv[i], "-tchost")) { if(++i >= argc) usage(); db_host = argv[i]; } else if(!strcmp(argv[i], "-tcport")) { if(++i >= argc) usage(); db_port = tcatoi(argv[i]); } else if (!strcmp(argv[i], "-help")) { usage(); } } pi = atan(1.0)*4; magic = cos(pi/180.0); for (lat = 0; lat < 181; ++lat) { rlat = lat*pi/180; s = sin(rlat); c = cos(rlat); longDistance[lat] = radius*acos((s*s)+(magic*c*c)); } memset(&db_status, -1, sizeof(db_status)); simplehttp_init(); db_reconnect(0, 0, NULL); simplehttp_set_cb("/search*", search_cb, NULL); simplehttp_set_cb("/put*", put_cb, NULL); simplehttp_set_cb("/get*", get_cb, NULL); simplehttp_set_cb("/del*", del_cb, NULL); simplehttp_set_cb("/distance*", distance_cb, NULL); simplehttp_set_cb("/box*", box_cb, NULL); simplehttp_main(argc, argv); if (!tcrdbclose(rdb)) { errCode = tcrdbecode(rdb); fprintf(stderr, "close error: %s\n", tcrdberrmsg(errCode)); } tcrdbdel(rdb); return 0; }