/src/ripple/app/main/DBInit.cpp
C++ | 329 lines | 139 code | 32 blank | 158 comment | 1 complexity | 8d7676dae3d81f970f0376103a84bb68 MD5 | raw file
- //------------------------------------------------------------------------------
- /*
- This file is part of rippled: https://github.com/ripple/rippled
- Copyright (c) 2012, 2013 Ripple Labs Inc.
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
- //==============================================================================
- #include <BeastConfig.h>
- #include <ripple/app/main/DBInit.h>
- #include <type_traits>
- namespace ripple {
- // 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 IF NOT EXISTS 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 IF NOT EXISTS TxLgrIndex ON \
- Transactions(LedgerSeq);",
- "CREATE TABLE IF NOT EXISTS AccountTransactions ( \
- TransID CHARACTER(64), \
- Account CHARACTER(64), \
- LedgerSeq BIGINT UNSIGNED, \
- TxnSeq INTEGER \
- );",
- "CREATE INDEX IF NOT EXISTS AcctTxIDIndex ON \
- AccountTransactions(TransID);",
- "CREATE INDEX IF NOT EXISTS AcctTxIndex ON \
- AccountTransactions(Account, LedgerSeq, TxnSeq, TransID);",
- "CREATE INDEX IF NOT EXISTS AcctLgrIndex ON \
- AccountTransactions(LedgerSeq, Account, TransID);",
- "END TRANSACTION;"
- };
- int TxnDBCount = std::extent<decltype(TxnDBInit)>::value;
- // 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 IF NOT EXISTS 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 IF NOT EXISTS SeqLedger ON Ledgers(LedgerSeq);",
- // InitialSeq field is the current ledger seq when the row
- // is inserted. Only relevant during online delete
- "CREATE TABLE IF NOT EXISTS Validations ( \
- LedgerSeq BIGINT UNSIGNED, \
- InitialSeq BIGINT UNSIGNED, \
- LedgerHash CHARACTER(64), \
- NodePubKey CHARACTER(56), \
- SignTime BIGINT UNSIGNED, \
- RawData BLOB \
- );",
- "CREATE INDEX IF NOT EXISTS ValidationsByHash ON \
- Validations(LedgerHash);",
- "CREATE INDEX IF NOT EXISTS ValidationsBySeq ON \
- Validations(LedgerSeq);",
- "CREATE INDEX IF NOT EXISTS ValidationsByInitialSeq ON \
- Validations(InitialSeq, LedgerSeq);",
- "CREATE INDEX IF NOT EXISTS ValidationsByTime ON \
- Validations(SignTime);",
- "END TRANSACTION;"
- };
- int LedgerDBCount = std::extent<decltype(LedgerDBInit)>::value;
- // 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 IF NOT EXISTS NodeIdentity ( \
- PublicKey CHARACTER(53), \
- PrivateKey CHARACTER(52) \
- );",
- // Miscellaneous persistent information
- // Integer: 1 : Used to simplify SQL.
- // ScoreUpdated: when scores was last updated.
- // FetchUpdated: when last fetch succeeded.
- "CREATE TABLE IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS ValidatorReferrals (\
- Validator CHARACTER(53) NOT NULL, \
- Entry INTEGER NOT NULL, \
- Referral TEXT NOT NULL, \
- PRIMARY KEY (Validator,Entry) \
- );",
- // Validator Manifests
- R"(
- CREATE TABLE IF NOT EXISTS ValidatorManifests (
- RawData BLOB NOT NULL
- );
- )",
- // 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 IF NOT EXISTS IpReferrals ( \
- Validator CHARACTER(53) NOT NULL, \
- Entry INTEGER NOT NULL, \
- IP TEXT NOT NULL, \
- Port INTEGER NOT NULL DEFAULT -1, \
- PRIMARY KEY (Validator,Entry) \
- );",
- "END TRANSACTION;"
- };
- int WalletDBCount = std::extent<decltype(WalletDBInit)>::value;
- // Hash node database holds nodes indexed by hash
- // VFALCO TODO Remove this since it looks unused
- /*
- int HashNodeDBCount = std::extent<decltype(HashNodeDBInit)>::value;
- */
- // 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 = std::extent<decltype(NetNodeDBInit)>::value;
- */
- // 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 = std::extent<decltype(PathFindDBInit)>::value;
- */
- } // ripple