full threading with sqlite3

pull/14/head
Tom Early 6 years ago
parent b6d3fe47b5
commit 065a464bbd

@ -23,62 +23,33 @@
bool CQnetDB::Open(const char *name) bool CQnetDB::Open(const char *name)
{ {
if (sqlite3_open(name, &db)) { if (sqlite3_open_v2(name, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL)) {
fprintf(stderr, "CQnetDB::Open: can't open %s\n", name); fprintf(stderr, "CQnetDB::Open: can't open %s\n", name);
return true; return true;
} }
return false;
return Init();
} }
void CQnetDB::Init() bool CQnetDB::Init()
{ {
std::string sql("DROP TABLE IF EXISTS LHEARD;");
char *eMsg; char *eMsg;
int rval = SQLITE_ERROR;
for (int i=0; i<10 && rval!=SQLITE_OK; i++) {
rval = sqlite3_exec(db, sql.c_str(), NULL, 0, &eMsg);
if (SQLITE_OK != rval) {
fprintf(stderr, "CQnetDB::Open drop table LHEARD error: %s\n", eMsg);
sqlite3_free(eMsg);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
if (SQLITE_OK == rval) { std::string sql("CREATE TABLE IF NOT EXIST LHEARD("
sql.assign("CREATE TABLE LHEARD(" "callsign TEXT PRIMARY KEY, "
"callsign TEXT PRIMARY KEY, " "sfx TEXT, "
"sfx TEXT, " "module TEXT, "
"module TEXT, " "reflector TEXT, "
"reflector TEXT, " "lasttime INT NOT NULL"
"lasttime INT NOT NULL" ") WITHOUT ROWID;");
") WITHOUT ROWID;");
rval = SQLITE_ERROR; if (SQLITE_OK != sqlite3_exec(db, sql.c_str(), NULL, 0, &eMsg)) {
for (int i=0; i<10 && rval!=SQLITE_OK; i++) { fprintf(stderr, "CQnetDB::Open create table LHEARD error: %s\n", eMsg);
rval = sqlite3_exec(db, sql.c_str(), NULL, 0, &eMsg); sqlite3_free(eMsg);
if (SQLITE_OK != rval) { return true;
fprintf(stderr, "CQnetDB::Open create table LHEARD error: %s\n", eMsg);
sqlite3_free(eMsg);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
}
sql.assign("DROP TABLE IF EXISTS LINKSTATUS;");
rval = SQLITE_ERROR;
for (int i=0; i<10 && rval!=SQLITE_OK; i++) {
rval = sqlite3_exec(db, sql.c_str(), NULL, 0, &eMsg);
if (SQLITE_OK != rval) {
fprintf(stderr, "CQnetDB::Open drop table LINKSTATUS error: %s\n", eMsg);
sqlite3_free(eMsg);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
} }
if (SQLITE_OK == rval) { sql.assign("CREATE TABLE IF NOT EXIST LINKSTATUS("
sql.assign("CREATE TABLE LINKSTATUS("
"ip_address TEXT PRIMARY KEY, " "ip_address TEXT PRIMARY KEY, "
"from_mod TEXT NOT NULL, " "from_mod TEXT NOT NULL, "
"to_callsign TEXT NOT NULL, " "to_callsign TEXT NOT NULL, "
@ -86,46 +57,24 @@ void CQnetDB::Init()
"linked_time INT NOT NULL" "linked_time INT NOT NULL"
") WITHOUT ROWID;"); ") WITHOUT ROWID;");
rval = SQLITE_ERROR; if (SQLITE_OK != sqlite3_exec(db, sql.c_str(), NULL, 0, &eMsg)) {
for (int i=0; i<10 && rval!=SQLITE_OK; i++) { fprintf(stderr, "CQnetDB::Open create table LINKSTATUS error: %s\n", eMsg);
rval = sqlite3_exec(db, sql.c_str(), NULL, 0, &eMsg); sqlite3_free(eMsg);
if (SQLITE_OK != rval) { return true;
fprintf(stderr, "CQnetDB::Open create table LINKSTATUS error: %s\n", eMsg);
sqlite3_free(eMsg);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
}
sql.assign("DROP TABLE IF EXISTS GATEWAYS;");
rval = SQLITE_ERROR;
for (int i=0; i<10 && rval!=SQLITE_OK; i++) {
rval = sqlite3_exec(db, sql.c_str(), NULL, 0, &eMsg);
if (SQLITE_OK != rval) {
fprintf(stderr, "CQnetDB::Open drop table GATEWAYS error: %s\n", eMsg);
sqlite3_free(eMsg);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
} }
if (SQLITE_OK == rval) { sql.assign("CREATE TABLE IF NOT EXIST GATEWAYS("
sql.assign("CREATE TABLE GATEWAYS("
"name TEXT PRIMARY KEY, " "name TEXT PRIMARY KEY, "
"address TEXT NOT NULL, " "address TEXT NOT NULL, "
"port INT NOT NULL" "port INT NOT NULL"
") WITHOUT ROWID;"); ") WITHOUT ROWID;");
rval = SQLITE_ERROR; if (SQLITE_OK != sqlite3_exec(db, sql.c_str(), NULL, 0, &eMsg)) {
for (int i=0; i<10 && rval!=SQLITE_OK; i++) { fprintf(stderr, "CQnetDB::Open create table GATEWAYS error: %s\n", eMsg);
rval = sqlite3_exec(db, sql.c_str(), NULL, 0, &eMsg); sqlite3_free(eMsg);
if (SQLITE_OK != rval) { return true;
fprintf(stderr, "CQnetDB::Open create table GATEWAYS error: %s\n", eMsg);
sqlite3_free(eMsg);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
} }
return false;
} }
bool CQnetDB::UpdateLH(const char *callsign, const char *sfx, const char module, const char *reflector) bool CQnetDB::UpdateLH(const char *callsign, const char *sfx, const char module, const char *reflector)
@ -206,7 +155,7 @@ bool CQnetDB::UpdateGW(const char *name, const char *address, unsigned short por
bool CQnetDB::UpdateGW(CHostQueue &hqueue) bool CQnetDB::UpdateGW(CHostQueue &hqueue)
{ {
if (NULL == db) if (NULL == db)
return true; return false;
char *eMsg; char *eMsg;
if (SQLITE_OK != sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, 0, &eMsg)) { if (SQLITE_OK != sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, 0, &eMsg)) {
@ -221,7 +170,7 @@ bool CQnetDB::UpdateGW(CHostQueue &hqueue)
} }
if (SQLITE_OK != sqlite3_exec(db, "COMMIT TRANSACTION;", NULL, 0, &eMsg)) { if (SQLITE_OK != sqlite3_exec(db, "COMMIT TRANSACTION;", NULL, 0, &eMsg)) {
fprintf(stderr, "CQnetDB::UpdateGW END TRANSACTION error: %s\n", eMsg); fprintf(stderr, "CQnetDB::UpdateGW COMMIT TRANSACTION error: %s\n", eMsg);
sqlite3_free(eMsg); sqlite3_free(eMsg);
return true; return true;
} }
@ -331,15 +280,40 @@ bool CQnetDB::FindGW(const char *name)
} }
} }
void CQnetDB::ClearLH()
{
if (NULL == db)
return;
char *eMsg;
if (SQLITE_OK != sqlite3_exec(db, "DELETE FROM LHEARD;", NULL, 0, &eMsg)) {
fprintf(stderr, "CQnetDB::ClearLH error: %s\n", eMsg);
sqlite3_free(eMsg);
}
}
void CQnetDB::ClearLS()
{
if (NULL == db)
return;
char *eMsg;
if (SQLITE_OK != sqlite3_exec(db, "DELETE FROM LINKSTATUS;", NULL, 0, &eMsg)) {
fprintf(stderr, "CQnetDB::ClearLS error: %s\n", eMsg);
sqlite3_free(eMsg);
}
}
void CQnetDB::ClearGW() void CQnetDB::ClearGW()
{ {
if (NULL == db) if (NULL == db)
return; return;
std::string sql("DELETE FROM GATEWAYS;");
char *eMsg; char *eMsg;
if (SQLITE_OK != sqlite3_exec(db, sql.c_str(), NULL, 0, &eMsg)) { if (SQLITE_OK != sqlite3_exec(db, "DELETE FROM GATEWAYS;", NULL, 0, &eMsg)) {
fprintf(stderr, "CQnetDB::ClearGW error: %s\n", eMsg); fprintf(stderr, "CQnetDB::ClearGW error: %s\n", eMsg);
sqlite3_free(eMsg); sqlite3_free(eMsg);
} }

@ -54,18 +54,20 @@ public:
CQnetDB() : db(NULL) {} CQnetDB() : db(NULL) {}
~CQnetDB() { if (db) sqlite3_close(db); } ~CQnetDB() { if (db) sqlite3_close(db); }
bool Open(const char *name); bool Open(const char *name);
void Init();
bool UpdateLH(const char *callsign, const char *sfx, const char module, const char *reflector); bool UpdateLH(const char *callsign, const char *sfx, const char module, const char *reflector);
bool UpdateLS(const char *address, const char from_mod, const char *to_callsign, const char to_mod, time_t connect_time); bool UpdateLS(const char *address, const char from_mod, const char *to_callsign, const char to_mod, time_t connect_time);
bool UpdateGW(const char *name, const char *address, unsigned short port);
bool UpdateGW(CHostQueue &); bool UpdateGW(CHostQueue &);
bool DeleteLS(const char *address); bool DeleteLS(const char *address);
bool FindLS(const char mod, std::list<CLink> &linklist); bool FindLS(const char mod, std::list<CLink> &linklist);
bool FindGW(const char *name, std::string &address, unsigned short &port); bool FindGW(const char *name, std::string &address, unsigned short &port);
bool FindGW(const char *name); bool FindGW(const char *name);
void ClearLH();
void ClearLS();
void ClearGW(); void ClearGW();
int Count(const char *table); int Count(const char *table);
private: private:
bool Init();
bool UpdateGW(const char *name, const char *address, unsigned short port);
sqlite3 *db; sqlite3 *db;
}; };

@ -54,7 +54,7 @@
#define CFG_DIR "/usr/local/etc" #define CFG_DIR "/usr/local/etc"
#endif #endif
const std::string GW_VERSION("QnetGateway-510"); const std::string GW_VERSION("QnetGateway-511");
static std::atomic<bool> keep_running(true); static std::atomic<bool> keep_running(true);
@ -2317,7 +2317,7 @@ bool CQnetGateway::Init(char *cfgfile)
fname.append(DASH_SQL_NAME); fname.append(DASH_SQL_NAME);
if (qnDB.Open(fname.c_str())) if (qnDB.Open(fname.c_str()))
return true; return true;
qnDB.Init(); qnDB.ClearLH();
playNotInCache = false; playNotInCache = false;

@ -54,7 +54,7 @@
#include "QnetLink.h" #include "QnetLink.h"
#include "Utilities.h" #include "Utilities.h"
#define LINK_VERSION "QnetLink-510" #define LINK_VERSION "QnetLink-511"
#ifndef BIN_DIR #ifndef BIN_DIR
#define BIN_DIR "/usr/local/bin" #define BIN_DIR "/usr/local/bin"
#endif #endif
@ -292,6 +292,7 @@ void CQnetLink::RptrAckThread(char *arg)
/* Open text file of repeaters, reflectors */ /* Open text file of repeaters, reflectors */
void CQnetLink::LoadGateways(const std::string &filename) void CQnetLink::LoadGateways(const std::string &filename)
{ {
qnDB.ClearGW();
const std::string website("auth.dstargateway.org"); const std::string website("auth.dstargateway.org");
int dplus = 0; int dplus = 0;
// DPlus Authenticate // DPlus Authenticate
@ -3025,7 +3026,6 @@ void CQnetLink::Process()
notify_msg[i][0] = '\0'; notify_msg[i][0] = '\0';
} }
if (loadG[i] && 0x0U == tracing[i].streamid) { if (loadG[i] && 0x0U == tracing[i].streamid) {
qnDB.ClearGW();
LoadGateways(gwys); LoadGateways(gwys);
loadG[i] = false; loadG[i] = false;
if (bool_rptr_ack) if (bool_rptr_ack)
@ -3292,7 +3292,7 @@ bool CQnetLink::Init(const char *cfgfile)
fname.append(dash_sql_name); fname.append(dash_sql_name);
if (qnDB.Open(fname.c_str())) if (qnDB.Open(fname.c_str()))
return true; return true;
qnDB.ClearLS();
LoadGateways(gwys); LoadGateways(gwys);
/* create our server */ /* create our server */

Loading…
Cancel
Save

Powered by TurnKey Linux.