From 49a2450e76488780987fbd247d2f3984899957b0 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Tue, 17 Mar 2015 14:54:13 -0700 Subject: [PATCH] Include the Sqlite schema to auto-init the database. --- netconf/SqliteNetworkConfigMaster.cpp | 7 +- netconf/netconf-schema.sql.c | 93 +++++++++++++++++++++++++++ netconf/schema2c.sh | 8 +++ 3 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 netconf/netconf-schema.sql.c create mode 100755 netconf/schema2c.sh diff --git a/netconf/SqliteNetworkConfigMaster.cpp b/netconf/SqliteNetworkConfigMaster.cpp index 8361a2766..1dfb1a448 100644 --- a/netconf/SqliteNetworkConfigMaster.cpp +++ b/netconf/SqliteNetworkConfigMaster.cpp @@ -42,6 +42,9 @@ #include "../node/CertificateOfMembership.hpp" #include "../node/NetworkConfig.hpp" +// Include ZT_NETCONF_SCHEMA_SQL constant to init database +#include "netconf-schema.sql.c" + // Stored in database as schemaVersion key in Config. // If not present, database is assumed to be empty and at the current schema version // and this key/value is added automatically. @@ -52,13 +55,13 @@ namespace ZeroTier { SqliteNetworkConfigMaster::SqliteNetworkConfigMaster(const Identity &signingId,const char *dbPath) : _signingId(signingId), _dbPath(dbPath), - _db((sqlite3 *)0) + _db((sqlite3 *)0), _lock() { if (!_signingId.hasPrivate()) throw std::runtime_error("SqliteNetworkConfigMaster signing identity must have a private key"); - if (sqlite3_open_v2(dbPath,&_db,SQLITE_OPEN_READWRITE,(const char *)0) != SQLITE_OK) + if (sqlite3_open_v2(dbPath,&_db,SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE,(const char *)0) != SQLITE_OK) throw std::runtime_error("SqliteNetworkConfigMaster cannot open database file"); sqlite3_busy_timeout(_db,10000); } diff --git a/netconf/netconf-schema.sql.c b/netconf/netconf-schema.sql.c new file mode 100644 index 000000000..0e3605639 --- /dev/null +++ b/netconf/netconf-schema.sql.c @@ -0,0 +1,93 @@ +#define ZT_NETCONF_SCHEMA_SQL \ +"CREATE TABLE Config (\n"\ +" k varchar(16) PRIMARY KEY NOT NULL,\n"\ +" v varchar(1024) NOT NULL\n"\ +");\n"\ +"\n"\ +"CREATE TABLE IpAssignment (\n"\ +" networkId char(16) NOT NULL,\n"\ +" nodeId char(10) NOT NULL,\n"\ +" ip varchar(64) NOT NULL,\n"\ +" ipNetmaskBits integer(4) NOT NULL DEFAULT(0)\n"\ +");\n"\ +"\n"\ +"CREATE UNIQUE INDEX IpAssignment_networkId_ip ON IpAssignment (networkId, ip);\n"\ +"\n"\ +"CREATE INDEX IpAssignment_networkId_nodeId ON IpAssignment (networkId, nodeId);\n"\ +"\n"\ +"CREATE INDEX IpAssignment_networkId ON IpAssignment (networkId);\n"\ +"\n"\ +"CREATE TABLE IpAssignmentPool (\n"\ +" networkId char(16) NOT NULL,\n"\ +" ipNetwork varchar(64) NOT NULL,\n"\ +" ipNetmaskBits integer(4) NOT NULL,\n"\ +" active integer(1) NOT NULL DEFAULT(1)\n"\ +");\n"\ +"\n"\ +"CREATE INDEX IpAssignmentPool_networkId ON IpAssignmentPool (networkId);\n"\ +"\n"\ +"CREATE TABLE Member (\n"\ +" networkId char(16) NOT NULL,\n"\ +" nodeId char(10) NOT NULL,\n"\ +" cachedNetconf blob(4096),\n"\ +" cachedNetconfRevision integer(32),\n"\ +" clientReportedRevision integer(32),\n"\ +" authorized integer(1) NOT NULL DEFAULT(0),\n"\ +" activeBridge integer(1) NOT NULL DEFAULT(0)\n"\ +");\n"\ +"\n"\ +"CREATE INDEX Member_networkId ON Member (networkId);\n"\ +"\n"\ +"CREATE UNIQUE INDEX Member_networkId_nodeId ON Member (networkId, nodeId);\n"\ +"\n"\ +"CREATE TABLE MulticastRate (\n"\ +" networkId char(16) NOT NULL,\n"\ +" mgMac char(12) NOT NULL,\n"\ +" mgAdi integer(8) NOT NULL DEFAULT(0),\n"\ +" preload integer(16) NOT NULL,\n"\ +" maxBalance integer(16) NOT NULL,\n"\ +" accrual integer(16) NOT NULL\n"\ +");\n"\ +"\n"\ +"CREATE INDEX MulticastRate_networkId ON MulticastRate (networkId);\n"\ +"\n"\ +"CREATE TABLE Network (\n"\ +" id char(16) PRIMARY KEY NOT NULL,\n"\ +" name varchar(128) NOT NULL,\n"\ +" private integer(1) NOT NULL DEFAULT(1),\n"\ +" enableBroadcast integer(1) NOT NULL DEFAULT(1),\n"\ +" allowPassiveBridging integer(1) NOT NULL DEFAULT(0),\n"\ +" v4AssignMode varchar(8) NOT NULL DEFAULT('none'),\n"\ +" v6AssignMode varchar(8) NOT NULL DEFAULT('none'),\n"\ +" multicastLimit integer(8) NOT NULL DEFAULT(32),\n"\ +" creationTime integer(32) NOT NULL DEFAULT(0),\n"\ +" revision integer(32) NOT NULL DEFAULT(0)\n"\ +");\n"\ +"\n"\ +"CREATE TABLE Node (\n"\ +" id char(10) PRIMARY KEY NOT NULL,\n"\ +" identity varchar(4096) NOT NULL,\n"\ +" lastAt varchar(64),\n"\ +" lastSeen integer(32) NOT NULL DEFAULT(0),\n"\ +" firstSeen integer(32) NOT NULL DEFAULT(0)\n"\ +");\n"\ +"\n"\ +"CREATE TABLE Rule (\n"\ +" networkId char(16) NOT NULL,\n"\ +" nodeId char(10),\n"\ +" vlanId integer(4),\n"\ +" vlanPcp integer(4),\n"\ +" etherType integer(8),\n"\ +" macSource char(12),\n"\ +" macDest char(12),\n"\ +" ipSource varchar(64),\n"\ +" ipDest varchar(64),\n"\ +" ipTos integer(4),\n"\ +" ipProtocol integer(4),\n"\ +" ipSourcePort integer(8),\n"\ +" ipDestPort integer(8),\n"\ +" "action" varchar(4096) NOT NULL DEFAULT('accept')\n"\ +");\n"\ +"\n"\ +"CREATE INDEX Rule_networkId ON Rule (networkId);\n"\ +"" diff --git a/netconf/schema2c.sh b/netconf/schema2c.sh new file mode 100755 index 000000000..7775cfef3 --- /dev/null +++ b/netconf/schema2c.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Run this file to package the .sql file into a .c file whenever the SQL changes. + +rm -f netconf-schema.sql.c +echo '#define ZT_NETCONF_SCHEMA_SQL \' >netconf-schema.sql.c +cat netconf-schema.sql | sed 's/^/"/' | sed 's/$/\\n"\\/' >>netconf-schema.sql.c +echo '""' >>netconf-schema.sql.c