//------------------------------------------------------------------------------
/*
    Copyright (c) 2011-2013, OpenCoin, Inc.
*/
//==============================================================================

// Transaction database holds transactions and public keys
const char* TxnDBInit[] =
{
    "PRAGMA synchronous=NORMAL;",
    "PRAGMA journal_mode=WAL;",
    "PRAGMA journal_size_limit=1582080;",

#if (ULONG_MAX > UINT_MAX) && !defined (NO_SQLITE_MMAP)
	"PRAGMA mmap_size=17179869184;",
#endif

    "BEGIN TRANSACTION;",

    "CREATE TABLE Transactions (				\
		TransID		CHARACTER(64) PRIMARY KEY,	\
		TransType	CHARACTER(24),				\
		FromAcct	CHARACTER(35),				\
		FromSeq		BIGINT UNSIGNED,			\
		LedgerSeq	BIGINT UNSIGNED,			\
		Status		CHARACTER(1),				\
		RawTxn		BLOB,						\
		TxnMeta		BLOB						\
	);",
    "CREATE INDEX TxLgrIndex ON                 \
		Transactions(LedgerSeq);",

    "CREATE TABLE AccountTransactions (			\
		TransID		CHARACTER(64),				\
		Account		CHARACTER(64),				\
		LedgerSeq	BIGINT UNSIGNED,			\
		TxnSeq		INTEGER						\
	);",
    "CREATE INDEX AcctTxIDIndex ON				\
		AccountTransactions(TransID);",
    "CREATE INDEX AcctTxIndex ON				\
		AccountTransactions(Account, LedgerSeq, TxnSeq, TransID);",
    "CREATE INDEX AcctLgrIndex ON				\
		AccountTransactions(LedgerSeq, Account, TransID);",

    "END TRANSACTION;"
};

int TxnDBCount = NUMBER (TxnDBInit);

// Ledger database holds ledgers and ledger confirmations
const char* LedgerDBInit[] =
{
    "PRAGMA synchronous=NORMAL;",
    "PRAGMA journal_mode=WAL;",
    "PRAGMA journal_size_limit=1582080;",

    "BEGIN TRANSACTION;",

    "CREATE TABLE Ledgers (							\
		LedgerHash		CHARACTER(64) PRIMARY KEY,	\
		LedgerSeq		BIGINT UNSIGNED,			\
		PrevHash		CHARACTER(64),				\
		TotalCoins		BIGINT UNSIGNED,			\
		ClosingTime		BIGINT UNSIGNED,			\
		PrevClosingTime	BIGINT UNSIGNED,			\
		CloseTimeRes	BIGINT UNSIGNED,			\
		CloseFlags		BIGINT UNSIGNED,			\
		AccountSetHash	CHARACTER(64),				\
		TransSetHash	CHARACTER(64)				\
	);",
    "CREATE INDEX SeqLedger ON Ledgers(LedgerSeq);",

    "CREATE TABLE Validations	(					\
		LedgerHash	CHARACTER(64),					\
		NodePubKey	CHARACTER(56),					\
		SignTime	BIGINT UNSIGNED,				\
		RawData		BLOB							\
	);",
    "CREATE INDEX ValidationsByHash ON				\
		Validations(LedgerHash);",
    "CREATE INDEX ValidationsByTime ON				\
		Validations(SignTime);",

    "END TRANSACTION;"
};

int LedgerDBCount = NUMBER (LedgerDBInit);

// RPC database holds persistent data for RPC clients.
const char* RpcDBInit[] =
{

    // Local persistence of the RPC client
    "CREATE TABLE RPCData (							\
		Key			TEXT PRIMARY Key,				\
		Value		TEXT							\
	);",
};

int RpcDBCount = NUMBER (RpcDBInit);

// NodeIdentity database holds local accounts and trusted nodes
// VFALCO NOTE but its a table not a database, so...?
//
const char* WalletDBInit[] =
{
    // Node identity must be persisted for CAS routing and responsibilities.
    "BEGIN TRANSACTION;",

    "CREATE TABLE NodeIdentity (					\
		PublicKey		CHARACTER(53),				\
		PrivateKey		CHARACTER(52),				\
		Dh512			TEXT,						\
		Dh1024			TEXT						\
	);",

    // Miscellaneous persistent information
    // Integer: 1 : Used to simplify SQL.
    // ScoreUpdated: when scores was last updated.
    // FetchUpdated: when last fetch succeeded.
    "CREATE TABLE Misc (							\
		Magic			INTEGER UNIQUE NOT NULL,	\
		ScoreUpdated	DATETIME,					\
		FetchUpdated	DATETIME					\
	);",

    // Scoring and other information for domains.
    //
    // Domain:
    //  Domain source for https.
    // PublicKey:
    //  Set if ever succeeded.
    // XXX Use NULL in place of ""
    // Source:
    //  'M' = Manually added.   : 1500
    //  'V' = validators.txt    : 1000
    //  'W' = Web browsing.     :  200
    //  'R' = Referral          :    0
    // Next:
    //  Time of next fetch attempt.
    // Scan:
    //  Time of last fetch attempt.
    // Fetch:
    //  Time of last successful fetch.
    // Sha256:
    //  Checksum of last fetch.
    // Comment:
    //  User supplied comment.
    // Table of Domains user has asked to trust.
    "CREATE TABLE SeedDomains (						\
		Domain			TEXT PRIMARY KEY NOT NULL,	\
		PublicKey		CHARACTER(53),				\
		Source			CHARACTER(1) NOT NULL,		\
		Next			DATETIME,					\
		Scan			DATETIME,					\
		Fetch			DATETIME,					\
		Sha256			CHARACTER[64],				\
		Comment			TEXT						\
	);",

    // Allow us to easily find the next SeedDomain to fetch.
    "CREATE INDEX SeedDomainNext ON SeedDomains (Next);",

    // Table of PublicKeys user has asked to trust.
    // Fetches are made to the CAS.  This gets the ripple.txt so even validators without a web server can publish a ripple.txt.
    // Source:
    //  'M' = Manually added.   : 1500
    //  'V' = validators.txt    : 1000
    //  'W' = Web browsing.     :  200
    //  'R' = Referral          :    0
    // Next:
    //  Time of next fetch attempt.
    // Scan:
    //  Time of last fetch attempt.
    // Fetch:
    //  Time of last successful fetch.
    // Sha256:
    //  Checksum of last fetch.
    // Comment:
    //  User supplied comment.
    "CREATE TABLE SeedNodes (						\
		PublicKey		CHARACTER(53) PRIMARY KEY NOT NULL,		\
		Source			CHARACTER(1) NOT NULL,		\
		Next			DATETIME,					\
		Scan			DATETIME,					\
		Fetch			DATETIME,					\
		Sha256			CHARACTER[64],				\
		Comment			TEXT						\
	);",

    // Allow us to easily find the next SeedNode to fetch.
    "CREATE INDEX SeedNodeNext ON SeedNodes (Next);",

    // Nodes we trust to not grossly collude against us.  Derived from SeedDomains, SeedNodes, and ValidatorReferrals.
    //
    // Score:
    //  Computed trust score.  Higher is better.
    // Seen:
    //  Last validation received.
    "CREATE TABLE TrustedNodes (							\
		PublicKey		CHARACTER(53) PRIMARY KEY NOT NULL,	\
		Score			INTEGER DEFAULT 0 NOT NULL,			\
		Seen			DATETIME,							\
		Comment			TEXT								\
	);",

    // List of referrals.
    // - There may be multiple sources for a Validator.  The last source is used.
    // Validator:
    //  Public key of referrer.
    // Entry:
    //  Entry index in [validators] table.
    // Referral:
    //  This is the form provided by the ripple.txt:
    //  - Public key for CAS based referral.
    //  - Domain for domain based referral.
    // XXX Do garbage collection when validators have no references.
    "CREATE TABLE ValidatorReferrals (				\
		Validator		CHARACTER(53) NOT NULL,		\
		Entry			INTEGER NOT NULL,			\
		Referral		TEXT NOT NULL,				\
		PRIMARY KEY (Validator,Entry)				\
	);",

    // List of referrals from ripple.txt files.
    // Validator:
    //  Public key of referree.
    // Entry:
    //  Entry index in [validators] table.
    // IP:
    //  IP of referred.
    // Port:
    //  -1 = Default
    // XXX Do garbage collection when ips have no references.
    "CREATE TABLE IpReferrals (							\
		Validator		CHARACTER(53) NOT NULL,			\
		Entry			INTEGER NOT NULL,				\
		IP				TEXT NOT NULL,					\
		Port			INTEGER NOT NULL DEFAULT -1,	\
		PRIMARY KEY (Validator,Entry)					\
	);",

    // Table of IPs to contact the network.
    // IP:
    //  IP address to contact.
    // Port:
    //  Port to contact.
    //  -1 = Default
    // Score:
    //  Computed trust score.  Higher is better.
    // Source:
    //  'C' = Configuration file
    //  'V' = Validation file
    //  'M' = Manually added.
    //  'I' = Inbound connection.
    //  'T' = Told by other peer
    //  'O' = Other.
    // ScanNext:
    //  When to next scan.  Null=not scanning.
    // ScanInterval:
    //  Delay between scans.
    "CREATE TABLE PeerIps (								\
		IpPort			TEXT NOT NULL PRIMARY KEY,		\
		Score			INTEGER NOT NULL DEFAULT 0,		\
		Source			CHARACTER(1) NOT NULL,			\
		ScanNext		DATETIME DEFAULT 0,				\
		ScanInterval	INTEGER NOT NULL DEFAULT 0		\
	);",

    "CREATE INDEX PeerScanIndex ON						\
		PeerIps(ScanNext);",

    "CREATE TABLE Features (							\
		Hash			CHARACTER(64) PRIMARY KEY,		\
		FirstMajority	BIGINT UNSIGNED,				\
		LastMajority	BIGINT UNSIGNED					\
	);",

    "END TRANSACTION;"
};

int WalletDBCount = NUMBER (WalletDBInit);

// Hash node database holds nodes indexed by hash
// VFALCO TODO Remove this since it looks unused
/*

int HashNodeDBCount = NUMBER (HashNodeDBInit);
*/

// Net node database holds nodes seen on the network
// XXX Not really used needs replacement.
/*
const char* NetNodeDBInit[] =
{
    "CREATE TABLE KnownNodes	(					\
		Hanko			CHARACTER(35) PRIMARY KEY,	\
		LastSeen		TEXT,						\
		HaveContactInfo	CHARACTER(1),				\
		ContactObject	BLOB						\
	);"
};

int NetNodeDBCount = NUMBER (NetNodeDBInit);
*/

// This appears to be unused
/*
const char* PathFindDBInit[] =
{
    "PRAGMA synchronous = OFF;            ",

    "DROP TABLE TrustLines;               ",

    "CREATE TABLE TrustLines {            "
    "To				CHARACTER(40),    "  // Hex of account trusted
    "By				CHARACTER(40),    " // Hex of account trusting
    "Currency		CHARACTER(80),    " // Hex currency, hex issuer
    "Use			INTEGER,          " // Use count
    "Seq			BIGINT UNSIGNED   " // Sequence when use count was updated
    "};                                   ",

    "CREATE INDEX TLBy ON TrustLines(By, Currency, Use);",
    "CREATE INDEX TLTo ON TrustLines(To, Currency, Use);",

    "DROP TABLE Exchanges;",

    "CREATE TABLE Exchanges {             "
    "From			CHARACTER(80),    "
    "To				CHARACTER(80),    "
    "Currency       CHARACTER(80),    "
    "Use            INTEGER,          "
    "Seq            BIGINT UNSIGNED   "
    "};                                   ",

    "CREATE INDEX ExBy ON Exchanges(By, Currency, Use);",
    "CREATE INDEX ExTo ON Exchanges(To, Currency, Use);",
};

int PathFindDBCount = NUMBER (PathFindDBInit);
*/

