|
@@ -92,6 +92,9 @@
|
|
// Flags with all V6 managed mode flags flipped off -- for masking in update operation and in string form for SQL building
|
|
// Flags with all V6 managed mode flags flipped off -- for masking in update operation and in string form for SQL building
|
|
#define ZT_DB_NETWORK_FLAG_ZT_MANAGED_V6_MASK_S "268435449"
|
|
#define ZT_DB_NETWORK_FLAG_ZT_MANAGED_V6_MASK_S "268435449"
|
|
|
|
|
|
|
|
+// Uncomment to trace Sqlite for debugging
|
|
|
|
+//#define ZT_NETCONF_SQLITE_TRACE 1
|
|
|
|
+
|
|
namespace ZeroTier {
|
|
namespace ZeroTier {
|
|
|
|
|
|
namespace {
|
|
namespace {
|
|
@@ -162,7 +165,7 @@ public:
|
|
|
|
|
|
struct MemberRecord
|
|
struct MemberRecord
|
|
{
|
|
{
|
|
- int64_t rowid;
|
|
|
|
|
|
+ sqlite3_int64 rowid;
|
|
char nodeId[16];
|
|
char nodeId[16];
|
|
bool authorized;
|
|
bool authorized;
|
|
bool activeBridge;
|
|
bool activeBridge;
|
|
@@ -207,6 +210,13 @@ struct NetworkRecord
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+#ifdef ZT_NETCONF_SQLITE_TRACE
|
|
|
|
+static void sqliteTraceFunc(void *ptr,const char *s)
|
|
|
|
+{
|
|
|
|
+ fprintf(stderr,"SQLITE: %s\n",s);
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
} // anonymous namespace
|
|
} // anonymous namespace
|
|
|
|
|
|
SqliteNetworkController::SqliteNetworkController(Node *node,const char *dbPath,const char *circuitTestPath) :
|
|
SqliteNetworkController::SqliteNetworkController(Node *node,const char *dbPath,const char *circuitTestPath) :
|
|
@@ -385,7 +395,7 @@ SqliteNetworkController::SqliteNetworkController(Node *node,const char *dbPath,c
|
|
||(sqlite3_prepare_v2(_db,"SELECT m.nodeId,m.memberRevision FROM Member AS m WHERE m.networkId = ? ORDER BY m.nodeId ASC",-1,&_sListNetworkMembers,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"SELECT m.nodeId,m.memberRevision FROM Member AS m WHERE m.networkId = ? ORDER BY m.nodeId ASC",-1,&_sListNetworkMembers,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"UPDATE Member SET authorized = ?,memberRevision = (SELECT memberRevisionCounter FROM Network WHERE id = ?) WHERE rowid = ?",-1,&_sUpdateMemberAuthorized,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"UPDATE Member SET authorized = ?,memberRevision = (SELECT memberRevisionCounter FROM Network WHERE id = ?) WHERE rowid = ?",-1,&_sUpdateMemberAuthorized,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"UPDATE Member SET activeBridge = ?,memberRevision = (SELECT memberRevisionCounter FROM Network WHERE id = ?) WHERE rowid = ?",-1,&_sUpdateMemberActiveBridge,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"UPDATE Member SET activeBridge = ?,memberRevision = (SELECT memberRevisionCounter FROM Network WHERE id = ?) WHERE rowid = ?",-1,&_sUpdateMemberActiveBridge,(const char **)0) != SQLITE_OK)
|
|
- ||(sqlite3_prepare_v2(_db,"UPDATE Member SET lastRequestTime = ? AND recentHistory = ? WHERE rowid = ?",-1,&_sUpdateMemberHistory,(const char **)0) != SQLITE_OK)
|
|
|
|
|
|
+ ||(sqlite3_prepare_v2(_db,"UPDATE Member SET \"lastRequestTime\" = ?, \"recentHistory\" = ? WHERE rowid = ?",-1,&_sUpdateMemberHistory,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"DELETE FROM Member WHERE networkId = ? AND nodeId = ?",-1,&_sDeleteMember,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"DELETE FROM Member WHERE networkId = ? AND nodeId = ?",-1,&_sDeleteMember,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"DELETE FROM Member WHERE networkId = ?",-1,&_sDeleteAllNetworkMembers,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"DELETE FROM Member WHERE networkId = ?",-1,&_sDeleteAllNetworkMembers,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"SELECT nodeId,recentHistory FROM Member WHERE networkId = ? AND lastRequestTime >= ?",-1,&_sGetActiveNodesOnNetwork,(const char **)0) != SQLITE_OK)
|
|
||(sqlite3_prepare_v2(_db,"SELECT nodeId,recentHistory FROM Member WHERE networkId = ? AND lastRequestTime >= ?",-1,&_sGetActiveNodesOnNetwork,(const char **)0) != SQLITE_OK)
|
|
@@ -428,6 +438,10 @@ SqliteNetworkController::SqliteNetworkController(Node *node,const char *dbPath,c
|
|
_instanceId = iid;
|
|
_instanceId = iid;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef ZT_NETCONF_SQLITE_TRACE
|
|
|
|
+ sqlite3_trace(_db,sqliteTraceFunc,(void *)0);
|
|
|
|
+#endif
|
|
|
|
+
|
|
_backupThread = Thread::start(this);
|
|
_backupThread = Thread::start(this);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -550,26 +564,20 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
|
|
return NetworkController::NETCONF_QUERY_OBJECT_NOT_FOUND;
|
|
return NetworkController::NETCONF_QUERY_OBJECT_NOT_FOUND;
|
|
}
|
|
}
|
|
|
|
|
|
- // Fetch Member record
|
|
|
|
|
|
+ // Fetch or create Member record
|
|
|
|
|
|
- bool foundMember = false;
|
|
|
|
sqlite3_reset(_sGetMember);
|
|
sqlite3_reset(_sGetMember);
|
|
sqlite3_bind_text(_sGetMember,1,network.id,16,SQLITE_STATIC);
|
|
sqlite3_bind_text(_sGetMember,1,network.id,16,SQLITE_STATIC);
|
|
sqlite3_bind_text(_sGetMember,2,member.nodeId,10,SQLITE_STATIC);
|
|
sqlite3_bind_text(_sGetMember,2,member.nodeId,10,SQLITE_STATIC);
|
|
if (sqlite3_step(_sGetMember) == SQLITE_ROW) {
|
|
if (sqlite3_step(_sGetMember) == SQLITE_ROW) {
|
|
- foundMember = true;
|
|
|
|
- member.rowid = (int64_t)sqlite3_column_int64(_sGetMember,0);
|
|
|
|
|
|
+ member.rowid = sqlite3_column_int64(_sGetMember,0);
|
|
member.authorized = (sqlite3_column_int(_sGetMember,1) > 0);
|
|
member.authorized = (sqlite3_column_int(_sGetMember,1) > 0);
|
|
member.activeBridge = (sqlite3_column_int(_sGetMember,2) > 0);
|
|
member.activeBridge = (sqlite3_column_int(_sGetMember,2) > 0);
|
|
member.lastRequestTime = (uint64_t)sqlite3_column_int64(_sGetMember,5);
|
|
member.lastRequestTime = (uint64_t)sqlite3_column_int64(_sGetMember,5);
|
|
const char *rhblob = (const char *)sqlite3_column_blob(_sGetMember,6);
|
|
const char *rhblob = (const char *)sqlite3_column_blob(_sGetMember,6);
|
|
if (rhblob)
|
|
if (rhblob)
|
|
- member.recentHistory.fromBlob(rhblob,sqlite3_column_bytes(_sGetMember,6));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // Create Member record for unknown nodes, auto-authorizing if network is public
|
|
|
|
-
|
|
|
|
- if (!foundMember) {
|
|
|
|
|
|
+ member.recentHistory.fromBlob(rhblob,(unsigned int)sqlite3_column_bytes(_sGetMember,6));
|
|
|
|
+ } else {
|
|
member.authorized = (network.isPrivate ? false : true);
|
|
member.authorized = (network.isPrivate ? false : true);
|
|
member.activeBridge = false;
|
|
member.activeBridge = false;
|
|
sqlite3_reset(_sCreateMember);
|
|
sqlite3_reset(_sCreateMember);
|
|
@@ -580,7 +588,7 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
|
|
if (sqlite3_step(_sCreateMember) != SQLITE_DONE) {
|
|
if (sqlite3_step(_sCreateMember) != SQLITE_DONE) {
|
|
return NetworkController::NETCONF_QUERY_INTERNAL_SERVER_ERROR;
|
|
return NetworkController::NETCONF_QUERY_INTERNAL_SERVER_ERROR;
|
|
}
|
|
}
|
|
- member.rowid = (int64_t)sqlite3_last_insert_rowid(_db);
|
|
|
|
|
|
+ member.rowid = sqlite3_last_insert_rowid(_db);
|
|
|
|
|
|
sqlite3_reset(_sIncrementMemberRevisionCounter);
|
|
sqlite3_reset(_sIncrementMemberRevisionCounter);
|
|
sqlite3_bind_text(_sIncrementMemberRevisionCounter,1,network.id,16,SQLITE_STATIC);
|
|
sqlite3_bind_text(_sIncrementMemberRevisionCounter,1,network.id,16,SQLITE_STATIC);
|
|
@@ -606,10 +614,13 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co
|
|
} else {
|
|
} else {
|
|
member.recentHistory.front().append("null}");
|
|
member.recentHistory.front().append("null}");
|
|
}
|
|
}
|
|
|
|
+
|
|
while (member.recentHistory.size() > ZT_NETCONF_DB_MEMBER_HISTORY_LENGTH)
|
|
while (member.recentHistory.size() > ZT_NETCONF_DB_MEMBER_HISTORY_LENGTH)
|
|
member.recentHistory.pop_back();
|
|
member.recentHistory.pop_back();
|
|
std::string rhblob(member.recentHistory.toBlob());
|
|
std::string rhblob(member.recentHistory.toBlob());
|
|
|
|
+
|
|
sqlite3_reset(_sUpdateMemberHistory);
|
|
sqlite3_reset(_sUpdateMemberHistory);
|
|
|
|
+ sqlite3_clear_bindings(_sUpdateMemberHistory);
|
|
sqlite3_bind_int64(_sUpdateMemberHistory,1,(sqlite3_int64)now);
|
|
sqlite3_bind_int64(_sUpdateMemberHistory,1,(sqlite3_int64)now);
|
|
sqlite3_bind_blob(_sUpdateMemberHistory,2,(const void *)rhblob.data(),(int)rhblob.length(),SQLITE_STATIC);
|
|
sqlite3_bind_blob(_sUpdateMemberHistory,2,(const void *)rhblob.data(),(int)rhblob.length(),SQLITE_STATIC);
|
|
sqlite3_bind_int64(_sUpdateMemberHistory,3,member.rowid);
|
|
sqlite3_bind_int64(_sUpdateMemberHistory,3,member.rowid);
|