// CreateDB creates, initializes, and opens a database for use. func CreateDB(args ...interface{}) (database.Db, error) { if err := parseArgs("CreateDB", args...); err != nil { return nil, err } log = database.GetLog() return newMemDb(), nil }
// CreateDB creates, initializes and opens a database for use. func CreateDB(args ...interface{}) (database.Db, error) { dbpath, err := parseArgs("Create", args...) if err != nil { return nil, err } log = database.GetLog() // No special setup needed, just OpenBB db, err := openDB(dbpath, true) if err == nil { ldb := db.(*LevelDb) ldb.lastBlkIdx = -1 ldb.lastAddrIndexBlkIdx = -1 ldb.nextBlock = 0 } return db, err }
// OpenDB opens an existing database for use. func OpenDB(args ...interface{}) (database.Db, error) { dbpath, err := parseArgs("OpenDB", args...) if err != nil { return nil, err } log = database.GetLog() db, err := openDB(dbpath, false) if err != nil { return nil, err } // Need to find last block and tx var lastknownblock, nextunknownblock, testblock int32 increment := int32(100000) ldb := db.(*LevelDb) var lastSha *wire.ShaHash // forward scan blockforward: for { sha, err := ldb.fetchBlockShaByHeight(testblock) if err == nil { // block is found lastSha = sha lastknownblock = testblock testblock += increment } else { if testblock == 0 { //no blocks in db, odd but ok. lastknownblock = -1 nextunknownblock = 0 var emptysha wire.ShaHash lastSha = &emptysha } else { nextunknownblock = testblock } break blockforward } } // narrow search blocknarrow: for lastknownblock != -1 { testblock = (lastknownblock + nextunknownblock) / 2 sha, err := ldb.fetchBlockShaByHeight(testblock) if err == nil { lastknownblock = testblock lastSha = sha } else { nextunknownblock = testblock } if lastknownblock+1 == nextunknownblock { break blocknarrow } } log.Infof("Checking address index") // Load the last block whose transactions have been indexed by address. if sha, idx, err := ldb.fetchAddrIndexTip(); err == nil { if err = ldb.checkAddrIndexVersion(); err == nil { ldb.lastAddrIndexBlkSha = *sha ldb.lastAddrIndexBlkIdx = idx log.Infof("Address index good, continuing") } else { log.Infof("Address index in old, incompatible format, dropping...") ldb.deleteOldAddrIndex() ldb.DeleteAddrIndex() log.Infof("Old, incompatible address index dropped and can now be rebuilt") } } else { ldb.lastAddrIndexBlkIdx = -1 } ldb.lastBlkSha = *lastSha ldb.lastBlkIdx = lastknownblock ldb.nextBlock = lastknownblock + 1 return db, nil }