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;
}
Beispiel #2
0
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;
}
Beispiel #5
0
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;
}