int PICA_nodeaddr_save(const char* dbfilename, struct PICA_nodeaddr *naddr) { sqlite3 *db; sqlite3_stmt *stmt; int ret; const char query[] = "insert into nodes (address, port, last_active, inactive_count) values(:addr, :port, strftime('%s','now'), 0);"; ret = sqlite3_open(dbfilename, &db); if (ret != SQLITE_OK) { PICA_error("Can't open nodelist database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -1; } ret = sqlite3_prepare_v2(db, query, -1, &stmt, NULL); if (ret != SQLITE_OK) { PICA_error("Can't prepare SQLite statement: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -1; } ret = sqlite3_bind_text(stmt, 1, naddr->addr, -1, SQLITE_STATIC); if (ret != SQLITE_OK) { PICA_error("Can't bind address value: %s\n", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return -1; } ret = sqlite3_bind_int(stmt, 2, naddr->port); if (ret != SQLITE_OK) { PICA_error("Can't bind port value: %s\n", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return -1; } ret = sqlite3_step(stmt); if (ret != SQLITE_DONE) { PICA_error( "Can't execute query: %s\n", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return -1; } sqlite3_finalize(stmt); sqlite3_close(db); return 1; }
void nodewait_start_connect(struct nodewait *nw) { #ifndef WIN32 pthread_t thr; pthread_attr_t attr; #else DWORD thread_id; HANDLE thread_h; #endif PICA_debug1("connecting to node %.255s %u ...", nw->addr.addr, nw->addr.port); nw->state = PICA_NODEWAIT_CONNECTING; #ifndef WIN32 if (0 != pthread_attr_init(&attr)) PICA_error("pthread_attr_init() call failed."); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (0 != pthread_create(&thr, &attr, nodewait_connect_thread, (void*)nw)) PICA_error("unable to create thread: %s", strerror(errno)); pthread_attr_destroy(&attr); #else thread_h = CreateThread(NULL, 4096, nodewait_connect_thread, (void*)nw, 0, &thread_id); if (NULL != thread_h) CloseHandle(thread_h); else PICA_error("unable to create thread: %u", GetLastError()); #endif }
int PICA_nodeaddr_cleanold(const char* dbfilename, int treshold) { sqlite3 *db; sqlite3_stmt *stmt; int ret; const char query[] = "delete from nodes where inactive_count > :treshold"; ret = sqlite3_open(dbfilename, &db); if (ret != SQLITE_OK) { PICA_error("Can't open nodelist database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -1; } ret = sqlite3_prepare_v2(db, query, -1, &stmt, NULL); if (ret != SQLITE_OK) { PICA_error("Can't prepare SQLite statement: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -1; } ret = sqlite3_bind_int(stmt, 1, treshold); if (ret != SQLITE_OK) { PICA_error("Can't bind treshold value: %s\n", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return -1; } ret = sqlite3_step(stmt); if (ret != SQLITE_DONE) { PICA_error( "Can't execute query: %s\n", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return -1; } sqlite3_finalize(stmt); sqlite3_close(db); return 1; }
int PICA_nodeaddr_list_load(const char* dbfilename, struct PICA_nodeaddr **list_head) { int N = 0, ret; sqlite3 *db; char *zErrMsg = 0; const char query[] = "select address, port, inactive_count, last_active from nodes order by inactive_count desc, last_active asc"; struct cb_param p = {list_head, &N}; ret = sqlite3_open_v2(dbfilename, &db, SQLITE_OPEN_READWRITE, NULL); if (ret != SQLITE_OK) { PICA_fatal( "Can't open nodelist database (%s): %s\n", dbfilename, sqlite3_errmsg(db)); sqlite3_close(db); return -1; } ret = sqlite3_exec(db, query, nodeaddr_load_sqlite_cb, &p, &zErrMsg); if( ret != SQLITE_OK ) { PICA_error("SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } sqlite3_close(db); return N; }
void nodewait_start_resolve(struct PICA_nodeaddr *a) { struct nodewait *nw; #ifndef WIN32 pthread_t thr; pthread_attr_t attr; #else DWORD thread_id; HANDLE thread_h; #endif nw = nodewait_list_addnew(); if (!nw) return; nw ->addr = *a; PICA_debug1("starting to resolve node address %.255s %u ...", nw->addr.addr, nw->addr.port); nw->state = PICA_NODEWAIT_RESOLVING; #ifndef WIN32 if (0 != pthread_attr_init(&attr)) PICA_error("pthread_attr_init() call failed."); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (0 != pthread_create(&thr, &attr, nodewait_resolve_thread, (void*)nw)) PICA_error("unable to create thread: %s", strerror(errno)); pthread_attr_destroy(&attr); #else thread_h = CreateThread(NULL, 4096, nodewait_resolve_thread, (void*)nw, 0, &thread_id); if (NULL != thread_h) CloseHandle(thread_h); else PICA_error("unable to create thread: %u", GetLastError()); #endif }
int PICA_nodeaddr_update(const char* dbfilename, struct PICA_nodeaddr *naddr, int is_alive) { sqlite3 *db; sqlite3_stmt *stmt; int ret; const char q1[] = "update nodes set last_active = strftime('%s','now'), inactive_count = 0 where address = :addr and port = :port"; const char q2[] = "update nodes set inactive_count = inactive_count + 1 where address = :addr and port = :port"; char *query; query = is_alive ? q1 : q2; ret = sqlite3_open(dbfilename, &db); if (ret != SQLITE_OK) { PICA_error("Can't open nodelist database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -1; } ret = sqlite3_prepare_v2(db, query, -1, &stmt, NULL); if (ret != SQLITE_OK) { PICA_error("Can't prepare SQLite statement: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -1; } ret = sqlite3_bind_text(stmt, 1, naddr->addr, -1, SQLITE_STATIC); if (ret != SQLITE_OK) { PICA_error("Can't bind address value: %s\n", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return -1; } ret = sqlite3_bind_int(stmt, 2, naddr->port); if (ret != SQLITE_OK) { PICA_error("Can't bind port value: %s\n", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return -1; } ret = sqlite3_step(stmt); if (ret != SQLITE_DONE) { PICA_error( "Can't execute query: %s\n", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return -1; } sqlite3_finalize(stmt); sqlite3_close(db); return 1; }