From d574a3af6d40c494f5708f8b00c973ed8de78943 Mon Sep 17 00:00:00 2001 From: Dave Collins Date: Tue, 27 Jan 2015 11:45:10 -0600 Subject: [PATCH] Import btcdb repo into database directory. This commit contains the entire btcdb repository along with several changes needed to move all of the files into the database directory in order to prepare it for merging. This does NOT update btcd or any of the other packages to use the new location as that will be done separately. - All import paths in the old btcdb test files have been changed to the new location - All references to btcdb as the package name have been chagned to database - The coveralls badge has been removed since it unfortunately doesn't support coverage of sub-packages This is ongoing work toward #214. --- .gitignore | 28 ------ .travis.yml | 15 --- LICENSE | 13 --- README.md => database/README.md | 27 +++-- common_test.go => database/common_test.go | 22 ++--- cov_report.sh => database/cov_report.sh | 0 db.go => database/db.go | 2 +- db_test.go => database/db_test.go | 46 ++++----- database/doc.go | 31 ++++++ example_test.go => database/example_test.go | 16 +-- .../interface_test.go | 10 +- {ldb => database/ldb}/block.go | 16 +-- {ldb => database/ldb}/boundary_test.go | 6 +- {ldb => database/ldb}/dbtest/dbtst.go | 0 {ldb => database/ldb}/doc.go | 2 +- {ldb => database/ldb}/dup_test.go | 6 +- {ldb => database/ldb}/insertremove_test.go | 14 +-- {ldb => database/ldb}/internal_test.go | 0 {ldb => database/ldb}/leveldb.go | 22 ++--- {ldb => database/ldb}/operational_test.go | 28 +++--- {ldb => database/ldb}/tx.go | 52 +++++----- log.go => database/log.go | 2 +- {memdb => database/memdb}/doc.go | 4 +- {memdb => database/memdb}/driver.go | 14 +-- {memdb => database/memdb}/memdb.go | 92 +++++++++--------- {memdb => database/memdb}/memdb_test.go | 10 +- .../testdata}/blocks1-256.bz2 | Bin doc.go | 31 ------ 28 files changed, 226 insertions(+), 283 deletions(-) delete mode 100644 .gitignore delete mode 100644 .travis.yml delete mode 100644 LICENSE rename README.md => database/README.md (65%) rename common_test.go => database/common_test.go (91%) rename cov_report.sh => database/cov_report.sh (100%) rename db.go => database/db.go (99%) rename db_test.go => database/db_test.go (79%) create mode 100644 database/doc.go rename example_test.go => database/example_test.go (87%) rename interface_test.go => database/interface_test.go (99%) rename {ldb => database/ldb}/block.go (95%) rename {ldb => database/ldb}/boundary_test.go (90%) rename {ldb => database/ldb}/dbtest/dbtst.go (100%) rename {ldb => database/ldb}/doc.go (85%) rename {ldb => database/ldb}/dup_test.go (97%) rename {ldb => database/ldb}/insertremove_test.go (93%) rename {ldb => database/ldb}/internal_test.go (100%) rename {ldb => database/ldb}/leveldb.go (96%) rename {ldb => database/ldb}/operational_test.go (94%) rename {ldb => database/ldb}/tx.go (91%) rename log.go => database/log.go (98%) rename {memdb => database/memdb}/doc.go (74%) rename {memdb => database/memdb}/driver.go (68%) rename {memdb => database/memdb}/memdb.go (90%) rename {memdb => database/memdb}/memdb_test.go (94%) rename {testdata => database/testdata}/blocks1-256.bz2 (100%) delete mode 100644 doc.go diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 5b97dbba..00000000 --- a/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -# Temp files -*~ - -# Log files -*.log - -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6f025bf1..00000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -go: release -before_install: - - gocleandeps=c16c849abae90c23419d - - git clone https://gist.github.com/$gocleandeps.git - - goclean=71d0380287747d956a26 - - git clone https://gist.github.com/$goclean.git -install: - - go get -d -t -v ./... - - bash $gocleandeps/gocleandeps.sh -script: - - export PATH=$PATH:$HOME/gopath/bin - - bash $goclean/goclean.sh -after_success: - - goveralls -coverprofile=profile.cov -service=travis-ci \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 992dd50d..00000000 --- a/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2013-2014 Conformal Systems LLC. - -Permission to use, copy, modify, and 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. \ No newline at end of file diff --git a/README.md b/database/README.md similarity index 65% rename from README.md rename to database/README.md index 90f27b1a..bac1f264 100644 --- a/README.md +++ b/database/README.md @@ -1,42 +1,40 @@ -btcdb -===== +database +======== -[![Build Status](http://img.shields.io/travis/btcsuite/btcdb.svg)] -(https://travis-ci.org/btcsuite/btcdb) [![Coverage Status] -(https://img.shields.io/coveralls/btcsuite/btcdb.svg)] -(https://coveralls.io/r/btcsuite/btcdb) [![ISC License] +[![Build Status](http://img.shields.io/travis/btcsuite/btcd.svg)] +(https://travis-ci.org/btcsuite/btcd) [![ISC License] (http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -Package btcdb provides a database interface for the bitcoin block chain and +Package database provides a database interface for the bitcoin block chain and transactions. ## Documentation [![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)] -(http://godoc.org/github.com/btcsuite/btcdb) +(http://godoc.org/github.com/btcsuite/btcd/database) Full `go doc` style documentation for the project can be viewed online without installing this package by using the GoDoc site -[here](http://godoc.org/github.com/btcsuite/btcdb). +[here](http://godoc.org/github.com/btcsuite/btcd/database). You can also view the documentation locally once the package is installed with the `godoc` tool by running `godoc -http=":6060"` and pointing your browser to -http://localhost:6060/pkg/github.com/btcsuite/btcdb +http://localhost:6060/pkg/github.com/btcsuite/btcd/database ## Installation ```bash -$ go get github.com/btcsuite/btcdb +$ go get github.com/btcsuite/btcd/database ``` ## Examples * [CreateDB Example] - (http://godoc.org/github.com/btcsuite/btcdb#example-CreateDB) + (http://godoc.org/github.com/btcsuite/btcd/database#example-CreateDB) Demonstrates creating a new database and inserting the genesis block into it. * [NewestSha Example] - (http://godoc.org/github.com/btcsuite/btcdb#example-Db--NewestSha) + (http://godoc.org/github.com/btcsuite/btcd/database#example-Db--NewestSha) Demonstrates querying the database for the most recent best block height and hash. @@ -65,4 +63,5 @@ signature perform the following: ## License -Package btcdb is licensed under the [copyfree](http://copyfree.org) ISC License. +Package database is licensed under the [copyfree](http://copyfree.org) ISC +License. diff --git a/common_test.go b/database/common_test.go similarity index 91% rename from common_test.go rename to database/common_test.go index 76762664..eaca1a2f 100644 --- a/common_test.go +++ b/database/common_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. -package btcdb_test +package database_test import ( "compress/bzip2" @@ -14,9 +14,9 @@ import ( "strings" "testing" - "github.com/btcsuite/btcdb" - _ "github.com/btcsuite/btcdb/ldb" - _ "github.com/btcsuite/btcdb/memdb" + "github.com/btcsuite/btcd/database" + _ "github.com/btcsuite/btcd/database/ldb" + _ "github.com/btcsuite/btcd/database/memdb" "github.com/btcsuite/btcnet" "github.com/btcsuite/btcutil" "github.com/btcsuite/btcwire" @@ -53,10 +53,10 @@ func fileExists(name string) bool { // openDB is used to open an existing database based on the database type and // name. -func openDB(dbType, dbName string) (btcdb.Db, error) { +func openDB(dbType, dbName string) (database.Db, error) { // Handle memdb specially since it has no files on disk. if dbType == "memdb" { - db, err := btcdb.OpenDB(dbType) + db, err := database.OpenDB(dbType) if err != nil { return nil, fmt.Errorf("error opening db: %v", err) } @@ -64,7 +64,7 @@ func openDB(dbType, dbName string) (btcdb.Db, error) { } dbPath := filepath.Join(testDbRoot, dbName) - db, err := btcdb.OpenDB(dbType, dbPath) + db, err := database.OpenDB(dbType, dbPath) if err != nil { return nil, fmt.Errorf("error opening db: %v", err) } @@ -76,11 +76,11 @@ func openDB(dbType, dbName string) (btcdb.Db, error) { // should invoke when done testing to clean up. The close flag indicates // whether or not the teardown function should sync and close the database // during teardown. -func createDB(dbType, dbName string, close bool) (btcdb.Db, func(), error) { +func createDB(dbType, dbName string, close bool) (database.Db, func(), error) { // Handle memory database specially since it doesn't need the disk // specific handling. if dbType == "memdb" { - db, err := btcdb.CreateDB(dbType) + db, err := database.CreateDB(dbType) if err != nil { return nil, nil, fmt.Errorf("error creating db: %v", err) } @@ -108,7 +108,7 @@ func createDB(dbType, dbName string, close bool) (btcdb.Db, func(), error) { // Create a new database to store the accepted blocks into. dbPath := filepath.Join(testDbRoot, dbName) _ = os.RemoveAll(dbPath) - db, err := btcdb.CreateDB(dbType, dbPath) + db, err := database.CreateDB(dbType, dbPath) if err != nil { return nil, nil, fmt.Errorf("error creating db: %v", err) } @@ -132,7 +132,7 @@ func createDB(dbType, dbName string, close bool) (btcdb.Db, func(), error) { // setupDB is used to create a new db instance with the genesis block already // inserted. In addition to the new db instance, it returns a teardown function // the caller should invoke when done testing to clean up. -func setupDB(dbType, dbName string) (btcdb.Db, func(), error) { +func setupDB(dbType, dbName string) (database.Db, func(), error) { db, teardown, err := createDB(dbType, dbName, true) if err != nil { return nil, nil, err diff --git a/cov_report.sh b/database/cov_report.sh similarity index 100% rename from cov_report.sh rename to database/cov_report.sh diff --git a/db.go b/database/db.go similarity index 99% rename from db.go rename to database/db.go index 93e5291f..56e74bc7 100644 --- a/db.go +++ b/database/db.go @@ -2,7 +2,7 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. -package btcdb +package database import ( "errors" diff --git a/db_test.go b/database/db_test.go similarity index 79% rename from db_test.go rename to database/db_test.go index b14804cd..801736d8 100644 --- a/db_test.go +++ b/database/db_test.go @@ -2,13 +2,13 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. -package btcdb_test +package database_test import ( "fmt" "testing" - "github.com/btcsuite/btcdb" + "github.com/btcsuite/btcd/database" ) var ( @@ -21,7 +21,7 @@ var ( // testNewestShaEmpty ensures that NewestSha returns the values expected by // the interface contract. -func testNewestShaEmpty(t *testing.T, db btcdb.Db) { +func testNewestShaEmpty(t *testing.T, db database.Db) { sha, height, err := db.NewestSha() if err != nil { t.Errorf("NewestSha error %v", err) @@ -37,7 +37,7 @@ func testNewestShaEmpty(t *testing.T, db btcdb.Db) { // TestEmptyDB tests that empty databases are handled properly. func TestEmptyDB(t *testing.T) { - for _, dbType := range btcdb.SupportedDBs() { + for _, dbType := range database.SupportedDBs() { // Ensure NewestSha returns expected values for a newly created // db. db, teardown, err := createDB(dbType, "emptydb", false) @@ -66,7 +66,7 @@ func TestEmptyDB(t *testing.T) { // TestAddDuplicateDriver ensures that adding a duplicate driver does not // overwrite an existing one. func TestAddDuplicateDriver(t *testing.T) { - supportedDBs := btcdb.SupportedDBs() + supportedDBs := database.SupportedDBs() if len(supportedDBs) == 0 { t.Errorf("TestAddDuplicateDriver: No backends to test") return @@ -77,7 +77,7 @@ func TestAddDuplicateDriver(t *testing.T) { // driver function and intentionally returns a failure that can be // detected if the interface allows a duplicate driver to overwrite an // existing one. - bogusCreateDB := func(args ...interface{}) (btcdb.Db, error) { + bogusCreateDB := func(args ...interface{}) (database.Db, error) { return nil, fmt.Errorf("duplicate driver allowed for database "+ "type [%v]", dbType) } @@ -85,12 +85,12 @@ func TestAddDuplicateDriver(t *testing.T) { // Create a driver that tries to replace an existing one. Set its // create and open functions to a function that causes a test failure if // they are invoked. - driver := btcdb.DriverDB{ + driver := database.DriverDB{ DbType: dbType, CreateDB: bogusCreateDB, OpenDB: bogusCreateDB, } - btcdb.AddDBDriver(driver) + database.AddDBDriver(driver) // Ensure creating a database of the type that we tried to replace // doesn't fail (if it does, it indicates the driver was erroneously @@ -112,22 +112,22 @@ func TestCreateOpenFail(t *testing.T) { dbType := "createopenfail" openError := fmt.Errorf("failed to create or open database for "+ "database type [%v]", dbType) - bogusCreateDB := func(args ...interface{}) (btcdb.Db, error) { + bogusCreateDB := func(args ...interface{}) (database.Db, error) { return nil, openError } // Create and add driver that intentionally fails when created or opened // to ensure errors on database open and create are handled properly. - driver := btcdb.DriverDB{ + driver := database.DriverDB{ DbType: dbType, CreateDB: bogusCreateDB, OpenDB: bogusCreateDB, } - btcdb.AddDBDriver(driver) + database.AddDBDriver(driver) // Ensure creating a database with the new type fails with the expected // error. - _, err := btcdb.CreateDB(dbType, "createfailtest") + _, err := database.CreateDB(dbType, "createfailtest") if err != openError { t.Errorf("TestCreateOpenFail: expected error not received - "+ "got: %v, want %v", err, openError) @@ -136,7 +136,7 @@ func TestCreateOpenFail(t *testing.T) { // Ensure opening a database with the new type fails with the expected // error. - _, err = btcdb.OpenDB(dbType, "openfailtest") + _, err = database.OpenDB(dbType, "openfailtest") if err != openError { t.Errorf("TestCreateOpenFail: expected error not received - "+ "got: %v, want %v", err, openError) @@ -150,28 +150,28 @@ func TestCreateOpenUnsupported(t *testing.T) { // Ensure creating a database with an unsupported type fails with the // expected error. dbType := "unsupported" - _, err := btcdb.CreateDB(dbType, "unsupportedcreatetest") - if err != btcdb.ErrDbUnknownType { + _, err := database.CreateDB(dbType, "unsupportedcreatetest") + if err != database.ErrDbUnknownType { t.Errorf("TestCreateOpenUnsupported: expected error not "+ - "received - got: %v, want %v", err, btcdb.ErrDbUnknownType) + "received - got: %v, want %v", err, database.ErrDbUnknownType) return } // Ensure opening a database with the new type fails with the expected // error. - _, err = btcdb.OpenDB(dbType, "unsupportedopentest") - if err != btcdb.ErrDbUnknownType { + _, err = database.OpenDB(dbType, "unsupportedopentest") + if err != database.ErrDbUnknownType { t.Errorf("TestCreateOpenUnsupported: expected error not "+ - "received - got: %v, want %v", err, btcdb.ErrDbUnknownType) + "received - got: %v, want %v", err, database.ErrDbUnknownType) return } } -// TestInterface performs tests for the various interfaces of btcdb which -// require state in the database for each supported database type (those loaded -// in common_test.go that is). +// TestInterface performs tests for the various interfaces of the database +// package which require state in the database for each supported database +// type (those loaded in common_test.go that is). func TestInterface(t *testing.T) { - for _, dbType := range btcdb.SupportedDBs() { + for _, dbType := range database.SupportedDBs() { if _, exists := ignoreDbTypes[dbType]; !exists { testInterface(t, dbType) } diff --git a/database/doc.go b/database/doc.go new file mode 100644 index 00000000..ec389016 --- /dev/null +++ b/database/doc.go @@ -0,0 +1,31 @@ +// Copyright (c) 2013-2014 Conformal Systems LLC. +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. + +/* +Package database provides a database interface for the Bitcoin block chain. + +As of July 2014, there are over 309,000 blocks in the Bitcoin block chain and +and over 42 million transactions (which turns out to be over 21GB of data). +This package provides a database layer to store and retrieve this data in a +fairly simple and efficient manner. The use of this should not require specific +knowledge of the database backend. + +Basic Design + +The basic design of this package is to provide two classes of items in a +database; blocks and transactions (tx) where the block number increases +monotonically. Each transaction belongs to a single block although a block can +have a variable number of transactions. Along with these two items, several +convenience functions for dealing with the database are provided as well as +functions to query specific items that may be present in a block or tx. + +Usage + +At the highest level, the use of this packages just requires that you import it, +setup a database, insert some data into it, and optionally, query the data back. +The first block inserted into the database will be treated as the genesis block. +Every subsequent block insert requires the referenced parent block to already +exist. +*/ +package database diff --git a/example_test.go b/database/example_test.go similarity index 87% rename from example_test.go rename to database/example_test.go index f50d7422..90da19a1 100644 --- a/example_test.go +++ b/database/example_test.go @@ -2,13 +2,13 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. -package btcdb_test +package database_test import ( "fmt" - "github.com/btcsuite/btcdb" - _ "github.com/btcsuite/btcdb/memdb" + "github.com/btcsuite/btcd/database" + _ "github.com/btcsuite/btcd/database/memdb" "github.com/btcsuite/btcnet" "github.com/btcsuite/btcutil" ) @@ -20,8 +20,8 @@ func ExampleCreateDB() { // Ordinarily this would be whatever driver(s) your application // requires. // import ( - // "github.com/btcsuite/btcdb" - // _ "github.com/btcsuite/btcdb/memdb" + // "github.com/btcsuite/btcd/database" + // _ "github.com/btcsuite/btcd/database/memdb" // ) // Create a database and schedule it to be closed on exit. This example @@ -29,7 +29,7 @@ func ExampleCreateDB() { // the disk. Typically, you would specify a persistent database driver // such as "leveldb" and give it a database name as the second // parameter. - db, err := btcdb.CreateDB("memdb") + db, err := database.CreateDB("memdb") if err != nil { fmt.Println(err) return @@ -51,8 +51,8 @@ func ExampleCreateDB() { } // exampleLoadDB is used in the example to elide the setup code. -func exampleLoadDB() (btcdb.Db, error) { - db, err := btcdb.CreateDB("memdb") +func exampleLoadDB() (database.Db, error) { + db, err := database.CreateDB("memdb") if err != nil { return nil, err } diff --git a/interface_test.go b/database/interface_test.go similarity index 99% rename from interface_test.go rename to database/interface_test.go index 8127b971..a7c5c432 100644 --- a/interface_test.go +++ b/database/interface_test.go @@ -2,13 +2,13 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. -package btcdb_test +package database_test import ( "reflect" "testing" - "github.com/btcsuite/btcdb" + "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcutil" "github.com/btcsuite/btcwire" "github.com/davecgh/go-spew/spew" @@ -25,7 +25,7 @@ import ( type testContext struct { t *testing.T dbType string - db btcdb.Db + db database.Db blockHeight int64 blockHash *btcwire.ShaHash block *btcutil.Block @@ -523,8 +523,8 @@ func testIntegrity(tc *testContext) bool { return true } -// testInterface tests performs tests for the various interfaces of btcdb which -// require state in the database for the given database type. +// testInterface tests performs tests for the various interfaces of the database +// package which require state in the database for the given database type. func testInterface(t *testing.T, dbType string) { db, teardown, err := setupDB(dbType, "interface") if err != nil { diff --git a/ldb/block.go b/database/ldb/block.go similarity index 95% rename from ldb/block.go rename to database/ldb/block.go index 3e6c84f2..8c5b5e10 100644 --- a/ldb/block.go +++ b/database/ldb/block.go @@ -8,7 +8,7 @@ import ( "bytes" "encoding/binary" - "github.com/btcsuite/btcdb" + "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcutil" "github.com/btcsuite/btcwire" "github.com/btcsuite/goleveldb/leveldb" @@ -40,7 +40,7 @@ func (db *LevelDb) fetchBlockBySha(sha *btcwire.ShaHash) (blk *btcutil.Block, er } // FetchBlockHeightBySha returns the block height for the given hash. This is -// part of the btcdb.Db interface implementation. +// part of the database.Db interface implementation. func (db *LevelDb) FetchBlockHeightBySha(sha *btcwire.ShaHash) (int64, error) { db.dbLock.Lock() defer db.dbLock.Unlock() @@ -77,7 +77,7 @@ func (db *LevelDb) getBlkLoc(sha *btcwire.ShaHash) (int64, error) { data, err := db.lDb.Get(key, db.ro) if err != nil { if err == leveldb.ErrNotFound { - err = btcdb.ErrBlockShaMissing + err = database.ErrBlockShaMissing } return 0, err } @@ -151,7 +151,7 @@ func (db *LevelDb) insertBlockData(sha *btcwire.ShaHash, prevSha *btcwire.ShaHas if err != nil { // check current block count // if count != 0 { - // err = btcdb.PrevShaMissing + // err = database.PrevShaMissing // return // } oBlkHeight = -1 @@ -206,7 +206,7 @@ func (db *LevelDb) blkExistsSha(sha *btcwire.ShaHash) (bool, error) { switch err { case nil: return true, nil - case leveldb.ErrNotFound, btcdb.ErrBlockShaMissing: + case leveldb.ErrNotFound, database.ErrBlockShaMissing: return false, nil } return false, err @@ -247,7 +247,7 @@ func (db *LevelDb) FetchHeightRange(startHeight, endHeight int64) (rshalist []bt defer db.dbLock.Unlock() var endidx int64 - if endHeight == btcdb.AllShas { + if endHeight == database.AllShas { endidx = startHeight + 500 } else { endidx = endHeight @@ -302,7 +302,7 @@ func (db *LevelDb) fetchAddrIndexTip() (*btcwire.ShaHash, int64, error) { data, err := db.lDb.Get(addrIndexMetaDataKey, db.ro) if err != nil { - return &btcwire.ShaHash{}, -1, btcdb.ErrAddrIndexDoesNotExist + return &btcwire.ShaHash{}, -1, database.ErrAddrIndexDoesNotExist } var blkSha btcwire.ShaHash @@ -322,7 +322,7 @@ func (db *LevelDb) FetchAddrIndexTip() (*btcwire.ShaHash, int64, error) { defer db.dbLock.Unlock() if db.lastAddrIndexBlkIdx == -1 { - return &btcwire.ShaHash{}, -1, btcdb.ErrAddrIndexDoesNotExist + return &btcwire.ShaHash{}, -1, database.ErrAddrIndexDoesNotExist } sha := db.lastAddrIndexBlkSha diff --git a/ldb/boundary_test.go b/database/ldb/boundary_test.go similarity index 90% rename from ldb/boundary_test.go rename to database/ldb/boundary_test.go index 6d963d96..986f6711 100644 --- a/ldb/boundary_test.go +++ b/database/ldb/boundary_test.go @@ -8,7 +8,7 @@ import ( "os" "testing" - "github.com/btcsuite/btcdb" + "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcwire" ) @@ -21,7 +21,7 @@ func TestEmptyDB(t *testing.T) { dbnamever := dbname + ".ver" _ = os.RemoveAll(dbname) _ = os.RemoveAll(dbnamever) - db, err := btcdb.CreateDB("leveldb", dbname) + db, err := database.CreateDB("leveldb", dbname) if err != nil { t.Errorf("Failed to open test database %v", err) return @@ -42,7 +42,7 @@ func TestEmptyDB(t *testing.T) { t.Errorf("Close: unexpected error: %v", err) } - db, err = btcdb.OpenDB("leveldb", dbname) + db, err = database.OpenDB("leveldb", dbname) if err != nil { t.Errorf("Failed to open test database %v", err) return diff --git a/ldb/dbtest/dbtst.go b/database/ldb/dbtest/dbtst.go similarity index 100% rename from ldb/dbtest/dbtst.go rename to database/ldb/dbtest/dbtst.go diff --git a/ldb/doc.go b/database/ldb/doc.go similarity index 85% rename from ldb/doc.go rename to database/ldb/doc.go index df99938b..dff5445b 100644 --- a/ldb/doc.go +++ b/database/ldb/doc.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. /* -Package ldb implements an instance of btcdb backed by leveldb. +Package ldb implements an instance of the database package backed by leveldb. Database version number is stored in a flat file .ver Currently a single (littlendian) integer in the file. If there is diff --git a/ldb/dup_test.go b/database/ldb/dup_test.go similarity index 97% rename from ldb/dup_test.go rename to database/ldb/dup_test.go index 302aa05a..c8d12740 100644 --- a/ldb/dup_test.go +++ b/database/ldb/dup_test.go @@ -10,7 +10,7 @@ import ( "path/filepath" "testing" - "github.com/btcsuite/btcdb" + "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcutil" "github.com/btcsuite/btcwire" ) @@ -22,7 +22,7 @@ func Test_dupTx(t *testing.T) { dbnamever := dbname + ".ver" _ = os.RemoveAll(dbname) _ = os.RemoveAll(dbnamever) - db, err := btcdb.CreateDB("leveldb", dbname) + db, err := database.CreateDB("leveldb", dbname) if err != nil { t.Errorf("Failed to open test database %v", err) return @@ -154,7 +154,7 @@ out: listReply = db.FetchUnSpentTxByShaList(fetchList) for _, lr := range listReply { - if lr.Err != btcdb.ErrTxShaMissing { + if lr.Err != database.ErrTxShaMissing { t.Errorf("sha %v spent %v err %v\n", lr.Sha, lr.TxSpent, lr.Err) } diff --git a/ldb/insertremove_test.go b/database/ldb/insertremove_test.go similarity index 93% rename from ldb/insertremove_test.go rename to database/ldb/insertremove_test.go index dd8ab524..4e325f35 100644 --- a/ldb/insertremove_test.go +++ b/database/ldb/insertremove_test.go @@ -10,8 +10,8 @@ import ( "path/filepath" "testing" - "github.com/btcsuite/btcdb" - _ "github.com/btcsuite/btcdb/ldb" + "github.com/btcsuite/btcd/database" + _ "github.com/btcsuite/btcd/database/ldb" "github.com/btcsuite/btcutil" "github.com/btcsuite/btcwire" ) @@ -48,7 +48,7 @@ func testUnspentInsert(t *testing.T) { dbnamever := dbname + ".ver" _ = os.RemoveAll(dbname) _ = os.RemoveAll(dbnamever) - db, err := btcdb.CreateDB("leveldb", dbname) + db, err := database.CreateDB("leveldb", dbname) if err != nil { t.Errorf("Failed to open test database %v", err) return @@ -96,7 +96,7 @@ endtest: txOutList = append(txOutList, &txshaname) } - txneededmap := map[btcwire.ShaHash]*btcdb.TxListReply{} + txneededmap := map[btcwire.ShaHash]*database.TxListReply{} txlist := db.FetchUnSpentTxByShaList(txneededList) for _, txe := range txlist { if txe.Err != nil { @@ -122,7 +122,7 @@ endtest: break endtest } - txlookupmap := map[btcwire.ShaHash]*btcdb.TxListReply{} + txlookupmap := map[btcwire.ShaHash]*database.TxListReply{} txlist = db.FetchTxByShaList(txlookupList) for _, txe := range txlist { if txe.Err != nil { @@ -158,7 +158,7 @@ endtest: break endtest } - txlookupmap = map[btcwire.ShaHash]*btcdb.TxListReply{} + txlookupmap = map[btcwire.ShaHash]*database.TxListReply{} txlist = db.FetchUnSpentTxByShaList(txlookupList) for _, txe := range txlist { if txe.Err != nil { @@ -180,7 +180,7 @@ endtest: t.Errorf("failed to insert block %v err %v", height, err) break endtest } - txlookupmap = map[btcwire.ShaHash]*btcdb.TxListReply{} + txlookupmap = map[btcwire.ShaHash]*database.TxListReply{} txlist = db.FetchTxByShaList(txlookupList) for _, txe := range txlist { if txe.Err != nil { diff --git a/ldb/internal_test.go b/database/ldb/internal_test.go similarity index 100% rename from ldb/internal_test.go rename to database/ldb/internal_test.go diff --git a/ldb/leveldb.go b/database/ldb/leveldb.go similarity index 96% rename from ldb/leveldb.go rename to database/ldb/leveldb.go index cc946fbb..42eda568 100644 --- a/ldb/leveldb.go +++ b/database/ldb/leveldb.go @@ -11,7 +11,7 @@ import ( "strconv" "sync" - "github.com/btcsuite/btcdb" + "github.com/btcsuite/btcd/database" "github.com/btcsuite/btclog" "github.com/btcsuite/btcutil" "github.com/btcsuite/btcwire" @@ -60,13 +60,13 @@ type LevelDb struct { txSpentUpdateMap map[btcwire.ShaHash]*spentTxUpdate } -var self = btcdb.DriverDB{DbType: "leveldb", CreateDB: CreateDB, OpenDB: OpenDB} +var self = database.DriverDB{DbType: "leveldb", CreateDB: CreateDB, OpenDB: OpenDB} func init() { - btcdb.AddDBDriver(self) + database.AddDBDriver(self) } -// parseArgs parses the arguments from the btcdb Open/Create methods. +// parseArgs parses the arguments from the database package Open/Create methods. func parseArgs(funcName string, args ...interface{}) (string, error) { if len(args) != 1 { return "", fmt.Errorf("Invalid arguments to ldb.%s -- "+ @@ -81,13 +81,13 @@ func parseArgs(funcName string, args ...interface{}) (string, error) { } // OpenDB opens an existing database for use. -func OpenDB(args ...interface{}) (btcdb.Db, error) { +func OpenDB(args ...interface{}) (database.Db, error) { dbpath, err := parseArgs("OpenDB", args...) if err != nil { return nil, err } - log = btcdb.GetLog() + log = database.GetLog() db, err := openDB(dbpath, false) if err != nil { @@ -159,7 +159,7 @@ blocknarrow: // CurrentDBVersion is the database version. var CurrentDBVersion int32 = 1 -func openDB(dbpath string, create bool) (pbdb btcdb.Db, err error) { +func openDB(dbpath string, create bool) (pbdb database.Db, err error) { var db LevelDb var tlDb *leveldb.DB var dbversion int32 @@ -184,7 +184,7 @@ func openDB(dbpath string, create bool) (pbdb btcdb.Db, err error) { } else { _, err = os.Stat(dbpath) if err != nil { - err = btcdb.ErrDbDoesNotExist + err = database.ErrDbDoesNotExist return } } @@ -247,13 +247,13 @@ func openDB(dbpath string, create bool) (pbdb btcdb.Db, err error) { } // CreateDB creates, initializes and opens a database for use. -func CreateDB(args ...interface{}) (btcdb.Db, error) { +func CreateDB(args ...interface{}) (database.Db, error) { dbpath, err := parseArgs("Create", args...) if err != nil { return nil, err } - log = btcdb.GetLog() + log = database.GetLog() // No special setup needed, just OpenBB db, err := openDB(dbpath, true) @@ -694,7 +694,7 @@ func (db *LevelDb) processBatches() error { return nil } -// RollbackClose this is part of the btcdb.Db interface and should discard +// RollbackClose this is part of the database.Db interface and should discard // recent changes to the db and the close the db. This currently just does // a clean shutdown. func (db *LevelDb) RollbackClose() error { diff --git a/ldb/operational_test.go b/database/ldb/operational_test.go similarity index 94% rename from ldb/operational_test.go rename to database/ldb/operational_test.go index 6cb16422..349b615f 100644 --- a/ldb/operational_test.go +++ b/database/ldb/operational_test.go @@ -15,7 +15,7 @@ import ( "strings" "testing" - "github.com/btcsuite/btcdb" + "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcnet" "github.com/btcsuite/btcscript" "github.com/btcsuite/btcutil" @@ -29,7 +29,7 @@ var network = btcwire.MainNet // the `cleanUpFunc` *must* be called after each test to maintain db // consistency across tests. type testDb struct { - db btcdb.Db + db database.Db blocks []*btcutil.Block dbName string dbNameVer string @@ -42,7 +42,7 @@ func setUpTestDb(t *testing.T) (*testDb, error) { dbnamever := dbname + ".ver" _ = os.RemoveAll(dbname) _ = os.RemoveAll(dbnamever) - db, err := btcdb.CreateDB("leveldb", dbname) + db, err := database.CreateDB("leveldb", dbname) if err != nil { return nil, err } @@ -74,10 +74,10 @@ func TestOperational(t *testing.T) { // testAddrIndexOperations ensures that all normal operations concerning // the optional address index function correctly. -func testAddrIndexOperations(t *testing.T, db btcdb.Db, newestBlock *btcutil.Block, newestSha *btcwire.ShaHash, newestBlockIdx int64) { +func testAddrIndexOperations(t *testing.T, db database.Db, newestBlock *btcutil.Block, newestSha *btcwire.ShaHash, newestBlockIdx int64) { // Metadata about the current addr index state should be unset. sha, height, err := db.FetchAddrIndexTip() - if err != btcdb.ErrAddrIndexDoesNotExist { + if err != database.ErrAddrIndexDoesNotExist { t.Fatalf("Address index metadata shouldn't be in db, hasn't been built up yet.") } @@ -104,7 +104,7 @@ func testAddrIndexOperations(t *testing.T, db btcdb.Db, newestBlock *btcutil.Blo } // Simple test to index outputs(s) of the first tx. - testIndex := make(btcdb.BlockAddrIndex) + testIndex := make(database.BlockAddrIndex) testTx, err := newestBlock.Tx(0) if err != nil { t.Fatalf("Block has no transactions, unable to test addr "+ @@ -160,7 +160,7 @@ func testAddrIndexOperations(t *testing.T, db btcdb.Db, newestBlock *btcutil.Blo db.Close() // Re-Open, tip still should be updated to current height and sha. - db, err = btcdb.OpenDB("leveldb", "tstdbop1") + db, err = database.OpenDB("leveldb", "tstdbop1") if err != nil { t.Fatalf("Unable to re-open created db, err %v", err) } @@ -184,13 +184,13 @@ func testAddrIndexOperations(t *testing.T, db btcdb.Db, newestBlock *btcutil.Blo } // Tip should be blanked out. - if _, _, err := db.FetchAddrIndexTip(); err != btcdb.ErrAddrIndexDoesNotExist { + if _, _, err := db.FetchAddrIndexTip(); err != database.ErrAddrIndexDoesNotExist { t.Fatalf("Address index was not fully deleted.") } } -func assertAddrIndexTipIsUpdated(db btcdb.Db, t *testing.T, newestSha *btcwire.ShaHash, newestBlockIdx int64) { +func assertAddrIndexTipIsUpdated(db database.Db, t *testing.T, newestSha *btcwire.ShaHash, newestBlockIdx int64) { // Safe to ignore error, since height will be < 0 in "error" case. sha, height, _ := db.FetchAddrIndexTip() if newestBlockIdx != height { @@ -337,7 +337,7 @@ func testBackout(t *testing.T) { // db was closed at height 120, so no cleanup is possible. // reopen db - testDb.db, err = btcdb.OpenDB("leveldb", testDb.dbName) + testDb.db, err = database.OpenDB("leveldb", testDb.dbName) if err != nil { t.Errorf("Failed to open test database %v", err) return @@ -465,7 +465,7 @@ func loadBlocks(t *testing.T, file string) (blocks []*btcutil.Block, err error) return } -func testFetchHeightRange(t *testing.T, db btcdb.Db, blocks []*btcutil.Block) { +func testFetchHeightRange(t *testing.T, db database.Db, blocks []*btcutil.Block) { var testincrement int64 = 50 var testcnt int64 = 100 @@ -486,7 +486,7 @@ func testFetchHeightRange(t *testing.T, db btcdb.Db, blocks []*btcutil.Block) { endheight := startheight + testcnt if endheight > nBlocks { - endheight = btcdb.AllShas + endheight = database.AllShas } shalist, err := db.FetchHeightRange(startheight, endheight) @@ -494,7 +494,7 @@ func testFetchHeightRange(t *testing.T, db btcdb.Db, blocks []*btcutil.Block) { t.Errorf("FetchHeightRange: unexpected failure looking up shas %v", err) } - if endheight == btcdb.AllShas { + if endheight == database.AllShas { if int64(len(shalist)) != nBlocks-startheight { t.Errorf("FetchHeightRange: expected A %v shas, got %v", nBlocks-startheight, len(shalist)) } @@ -549,7 +549,7 @@ func TestLimitAndSkipFetchTxsForAddr(t *testing.T) { // Create and insert an address index for out test addr. txLoc, _ := testBlock.TxLoc() - index := make(btcdb.BlockAddrIndex) + index := make(database.BlockAddrIndex) for i := range testBlock.Transactions() { var hash160 [ripemd160.Size]byte scriptAddr := targetAddr.ScriptAddress() diff --git a/ldb/tx.go b/database/ldb/tx.go similarity index 91% rename from ldb/tx.go rename to database/ldb/tx.go index aff215a2..4157b814 100644 --- a/ldb/tx.go +++ b/database/ldb/tx.go @@ -9,7 +9,7 @@ import ( "encoding/binary" "errors" - "github.com/btcsuite/btcdb" + "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcutil" "github.com/btcsuite/btcwire" "github.com/btcsuite/goleveldb/leveldb" @@ -129,7 +129,7 @@ func (db *LevelDb) getTxFullySpent(txsha *btcwire.ShaHash) ([]*spentTx, error) { key := shaSpentTxToKey(txsha) buf, err := db.lDb.Get(key, db.ro) if err == leveldb.ErrNotFound { - return badTxList, btcdb.ErrTxShaMissing + return badTxList, database.ErrTxShaMissing } else if err != nil { return badTxList, err } @@ -198,13 +198,13 @@ func (db *LevelDb) existsTxSha(txSha *btcwire.ShaHash) (bool, error) { } // FetchTxByShaList returns the most recent tx of the name fully spent or not -func (db *LevelDb) FetchTxByShaList(txShaList []*btcwire.ShaHash) []*btcdb.TxListReply { +func (db *LevelDb) FetchTxByShaList(txShaList []*btcwire.ShaHash) []*database.TxListReply { db.dbLock.Lock() defer db.dbLock.Unlock() // until the fully spent separation of tx is complete this is identical // to FetchUnSpentTxByShaList - replies := make([]*btcdb.TxListReply, len(txShaList)) + replies := make([]*database.TxListReply, len(txShaList)) for i, txsha := range txShaList { tx, blockSha, height, txspent, err := db.fetchTxDataBySha(txsha) btxspent := []bool{} @@ -216,7 +216,7 @@ func (db *LevelDb) FetchTxByShaList(txShaList []*btcwire.ShaHash) []*btcdb.TxLis btxspent[idx] = (txspent[byteidx] & (byte(1) << byteoff)) != 0 } } - if err == btcdb.ErrTxShaMissing { + if err == database.ErrTxShaMissing { // if the unspent pool did not have the tx, // look in the fully spent pool (only last instance) @@ -235,7 +235,7 @@ func (db *LevelDb) FetchTxByShaList(txShaList []*btcwire.ShaHash) []*btcdb.TxLis } } } - txlre := btcdb.TxListReply{Sha: txsha, Tx: tx, BlkSha: blockSha, Height: height, TxSpent: btxspent, Err: err} + txlre := database.TxListReply{Sha: txsha, Tx: tx, BlkSha: blockSha, Height: height, TxSpent: btxspent, Err: err} replies[i] = &txlre } return replies @@ -243,11 +243,11 @@ func (db *LevelDb) FetchTxByShaList(txShaList []*btcwire.ShaHash) []*btcdb.TxLis // FetchUnSpentTxByShaList given a array of ShaHash, look up the transactions // and return them in a TxListReply array. -func (db *LevelDb) FetchUnSpentTxByShaList(txShaList []*btcwire.ShaHash) []*btcdb.TxListReply { +func (db *LevelDb) FetchUnSpentTxByShaList(txShaList []*btcwire.ShaHash) []*database.TxListReply { db.dbLock.Lock() defer db.dbLock.Unlock() - replies := make([]*btcdb.TxListReply, len(txShaList)) + replies := make([]*database.TxListReply, len(txShaList)) for i, txsha := range txShaList { tx, blockSha, height, txspent, err := db.fetchTxDataBySha(txsha) btxspent := []bool{} @@ -259,7 +259,7 @@ func (db *LevelDb) FetchUnSpentTxByShaList(txShaList []*btcwire.ShaHash) []*btcd btxspent[idx] = (txspent[byteidx] & (byte(1) << byteoff)) != 0 } } - txlre := btcdb.TxListReply{Sha: txsha, Tx: tx, BlkSha: blockSha, Height: height, TxSpent: btxspent, Err: err} + txlre := database.TxListReply{Sha: txsha, Tx: tx, BlkSha: blockSha, Height: height, TxSpent: btxspent, Err: err} replies[i] = &txlre } return replies @@ -274,7 +274,7 @@ func (db *LevelDb) fetchTxDataBySha(txsha *btcwire.ShaHash) (rtx *btcwire.MsgTx, blkHeight, txOff, txLen, txspent, err = db.getTxData(txsha) if err != nil { if err == leveldb.ErrNotFound { - err = btcdb.ErrTxShaMissing + err = database.ErrTxShaMissing } return } @@ -290,7 +290,7 @@ func (db *LevelDb) fetchTxDataByLoc(blkHeight int64, txOff int, txLen int, txspe blksha, blkbuf, err = db.getBlkByHeight(blkHeight) if err != nil { if err == leveldb.ErrNotFound { - err = btcdb.ErrTxShaMissing + err = database.ErrTxShaMissing } return } @@ -299,7 +299,7 @@ func (db *LevelDb) fetchTxDataByLoc(blkHeight int64, txOff int, txLen int, txspe // txsha, blksha, blkHeight, txOff, txLen) if len(blkbuf) < txOff+txLen { - err = btcdb.ErrTxShaMissing + err = database.ErrTxShaMissing return } rbuf := bytes.NewReader(blkbuf[txOff : txOff+txLen]) @@ -316,7 +316,7 @@ func (db *LevelDb) fetchTxDataByLoc(blkHeight int64, txOff int, txLen int, txspe } // FetchTxBySha returns some data for the given Tx Sha. -func (db *LevelDb) FetchTxBySha(txsha *btcwire.ShaHash) ([]*btcdb.TxListReply, error) { +func (db *LevelDb) FetchTxBySha(txsha *btcwire.ShaHash) ([]*database.TxListReply, error) { db.dbLock.Lock() defer db.dbLock.Unlock() @@ -327,22 +327,22 @@ func (db *LevelDb) FetchTxBySha(txsha *btcwire.ShaHash) ([]*btcdb.TxListReply, e if txerr == nil { replylen++ } else { - if txerr != btcdb.ErrTxShaMissing { - return []*btcdb.TxListReply{}, txerr + if txerr != database.ErrTxShaMissing { + return []*database.TxListReply{}, txerr } } sTxList, fSerr := db.getTxFullySpent(txsha) if fSerr != nil { - if fSerr != btcdb.ErrTxShaMissing { - return []*btcdb.TxListReply{}, fSerr + if fSerr != database.ErrTxShaMissing { + return []*database.TxListReply{}, fSerr } } else { replylen += len(sTxList) } - replies := make([]*btcdb.TxListReply, replylen) + replies := make([]*database.TxListReply, replylen) if fSerr == nil { for _, stx := range sTxList { @@ -350,7 +350,7 @@ func (db *LevelDb) FetchTxBySha(txsha *btcwire.ShaHash) ([]*btcdb.TxListReply, e stx.blkHeight, stx.txoff, stx.txlen, []byte{}) if err != nil { if err != leveldb.ErrNotFound { - return []*btcdb.TxListReply{}, err + return []*database.TxListReply{}, err } continue } @@ -358,7 +358,7 @@ func (db *LevelDb) FetchTxBySha(txsha *btcwire.ShaHash) ([]*btcdb.TxListReply, e for i := range btxspent { btxspent[i] = true } - txlre := btcdb.TxListReply{Sha: txsha, Tx: tx, BlkSha: blksha, Height: stx.blkHeight, TxSpent: btxspent, Err: nil} + txlre := database.TxListReply{Sha: txsha, Tx: tx, BlkSha: blksha, Height: stx.blkHeight, TxSpent: btxspent, Err: nil} replies[replycnt] = &txlre replycnt++ } @@ -370,7 +370,7 @@ func (db *LevelDb) FetchTxBySha(txsha *btcwire.ShaHash) ([]*btcdb.TxListReply, e byteoff := uint(idx % 8) btxspent[idx] = (txspent[byteidx] & (byte(1) << byteoff)) != 0 } - txlre := btcdb.TxListReply{Sha: txsha, Tx: tx, BlkSha: blksha, Height: height, TxSpent: btxspent, Err: nil} + txlre := database.TxListReply{Sha: txsha, Tx: tx, BlkSha: blksha, Height: height, TxSpent: btxspent, Err: nil} replies[replycnt] = &txlre replycnt++ } @@ -423,7 +423,7 @@ func bytesPrefix(prefix []byte) *util.Range { // caller wishes to seek forward in the results some amount, the 'seek' // represents how many results to skip. func (db *LevelDb) FetchTxsForAddr(addr btcutil.Address, skip int, - limit int) ([]*btcdb.TxListReply, error) { + limit int) ([]*database.TxListReply, error) { db.dbLock.Lock() defer db.dbLock.Unlock() @@ -448,7 +448,7 @@ func (db *LevelDb) FetchTxsForAddr(addr btcutil.Address, skip int, hash160 := addr.AddressPubKeyHash().Hash160() addrKey = hash160[:] default: - return nil, btcdb.ErrUnsupportedAddressType + return nil, database.ErrUnsupportedAddressType } // Create the prefix for our search. @@ -456,7 +456,7 @@ func (db *LevelDb) FetchTxsForAddr(addr btcutil.Address, skip int, copy(addrPrefix[:2], addrIndexKeyPrefix) copy(addrPrefix[2:], addrKey) - var replies []*btcdb.TxListReply + var replies []*database.TxListReply iter := db.lDb.NewIterator(bytesPrefix(addrPrefix), nil) for skip != 0 && iter.Next() { @@ -477,7 +477,7 @@ func (db *LevelDb) FetchTxsForAddr(addr btcutil.Address, skip int, } txSha, _ := tx.TxSha() - txReply := &btcdb.TxListReply{Sha: &txSha, Tx: tx, + txReply := &database.TxListReply{Sha: &txSha, Tx: tx, BlkSha: blkSha, Height: blkHeight, TxSpent: []bool{}, Err: err} replies = append(replies, txReply) @@ -502,7 +502,7 @@ func (db *LevelDb) FetchTxsForAddr(addr btcutil.Address, skip int, // append-only list for the stored value. However, this add unnecessary // overhead when storing and retrieving since the entire list must // be fetched each time. -func (db *LevelDb) UpdateAddrIndexForBlock(blkSha *btcwire.ShaHash, blkHeight int64, addrIndex btcdb.BlockAddrIndex) error { +func (db *LevelDb) UpdateAddrIndexForBlock(blkSha *btcwire.ShaHash, blkHeight int64, addrIndex database.BlockAddrIndex) error { db.dbLock.Lock() defer db.dbLock.Unlock() diff --git a/log.go b/database/log.go similarity index 98% rename from log.go rename to database/log.go index 09a03d35..b390bc40 100644 --- a/log.go +++ b/database/log.go @@ -2,7 +2,7 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. -package btcdb +package database import ( "errors" diff --git a/memdb/doc.go b/database/memdb/doc.go similarity index 74% rename from memdb/doc.go rename to database/memdb/doc.go index 985aeb60..67f240bd 100644 --- a/memdb/doc.go +++ b/database/memdb/doc.go @@ -3,8 +3,8 @@ // license that can be found in the LICENSE file. /* -Package memdb implements an instance of btcdb that uses memory for the block -storage. +Package memdb implements an instance of the database package that uses memory +for the block storage. This is primary used for testing purposes as normal operations require a persistent block storage mechanism which this is not. diff --git a/memdb/driver.go b/database/memdb/driver.go similarity index 68% rename from memdb/driver.go rename to database/memdb/driver.go index cf4dddd6..fc9c03b3 100644 --- a/memdb/driver.go +++ b/database/memdb/driver.go @@ -7,18 +7,18 @@ package memdb import ( "fmt" - "github.com/btcsuite/btcdb" + "github.com/btcsuite/btcd/database" "github.com/btcsuite/btclog" ) var log = btclog.Disabled func init() { - driver := btcdb.DriverDB{DbType: "memdb", CreateDB: CreateDB, OpenDB: OpenDB} - btcdb.AddDBDriver(driver) + driver := database.DriverDB{DbType: "memdb", CreateDB: CreateDB, OpenDB: OpenDB} + database.AddDBDriver(driver) } -// parseArgs parses the arguments from the btcdb Open/Create methods. +// parseArgs parses the arguments from the database package Open/Create methods. func parseArgs(funcName string, args ...interface{}) error { if len(args) != 0 { return fmt.Errorf("memdb.%s does not accept any arguments", @@ -29,7 +29,7 @@ func parseArgs(funcName string, args ...interface{}) error { } // OpenDB opens an existing database for use. -func OpenDB(args ...interface{}) (btcdb.Db, error) { +func OpenDB(args ...interface{}) (database.Db, error) { if err := parseArgs("OpenDB", args...); err != nil { return nil, err } @@ -39,11 +39,11 @@ func OpenDB(args ...interface{}) (btcdb.Db, error) { } // CreateDB creates, initializes, and opens a database for use. -func CreateDB(args ...interface{}) (btcdb.Db, error) { +func CreateDB(args ...interface{}) (database.Db, error) { if err := parseArgs("CreateDB", args...); err != nil { return nil, err } - log = btcdb.GetLog() + log = database.GetLog() return newMemDb(), nil } diff --git a/memdb/memdb.go b/database/memdb/memdb.go similarity index 90% rename from memdb/memdb.go rename to database/memdb/memdb.go index bacb9be6..e7c6d5f1 100644 --- a/memdb/memdb.go +++ b/database/memdb/memdb.go @@ -10,7 +10,7 @@ import ( "math" "sync" - "github.com/btcsuite/btcdb" + "github.com/btcsuite/btcd/database" "github.com/btcsuite/btcutil" "github.com/btcsuite/btcwire" ) @@ -73,7 +73,7 @@ func isFullySpent(txD *tTxInsertData) bool { return true } -// MemDb is a concrete implementation of the btcdb.Db interface which provides +// MemDb is a concrete implementation of the database.Db interface which provides // a memory-only database. Since it is memory-only, it is obviously not // persistent and is mostly only useful for testing purposes. type MemDb struct { @@ -133,7 +133,7 @@ func (db *MemDb) removeTx(msgTx *btcwire.MsgTx, txHash *btcwire.ShaHash) { } -// Close cleanly shuts down database. This is part of the btcdb.Db interface +// Close cleanly shuts down database. This is part of the database.Db interface // implementation. // // All data is purged upon close with this implementation since it is a @@ -155,7 +155,7 @@ func (db *MemDb) Close() error { // DropAfterBlockBySha removes any blocks from the database after the given // block. This is different than a simple truncate since the spend information -// for each block must also be unwound. This is part of the btcdb.Db interface +// for each block must also be unwound. This is part of the database.Db interface // implementation. func (db *MemDb) DropAfterBlockBySha(sha *btcwire.ShaHash) error { db.Lock() @@ -196,7 +196,7 @@ func (db *MemDb) DropAfterBlockBySha(sha *btcwire.ShaHash) error { } // ExistsSha returns whether or not the given block hash is present in the -// database. This is part of the btcdb.Db interface implementation. +// database. This is part of the database.Db interface implementation. func (db *MemDb) ExistsSha(sha *btcwire.ShaHash) (bool, error) { db.Lock() defer db.Unlock() @@ -213,7 +213,7 @@ func (db *MemDb) ExistsSha(sha *btcwire.ShaHash) (bool, error) { } // FetchBlockBySha returns a btcutil.Block. The implementation may cache the -// underlying data if desired. This is part of the btcdb.Db interface +// underlying data if desired. This is part of the database.Db interface // implementation. // // This implementation does not use any additional cache since the entire @@ -236,7 +236,7 @@ func (db *MemDb) FetchBlockBySha(sha *btcwire.ShaHash) (*btcutil.Block, error) { } // FetchBlockHeightBySha returns the block height for the given hash. This is -// part of the btcdb.Db interface implementation. +// part of the database.Db interface implementation. func (db *MemDb) FetchBlockHeightBySha(sha *btcwire.ShaHash) (int64, error) { db.Lock() defer db.Unlock() @@ -254,7 +254,7 @@ func (db *MemDb) FetchBlockHeightBySha(sha *btcwire.ShaHash) (int64, error) { // FetchBlockHeaderBySha returns a btcwire.BlockHeader for the given sha. The // implementation may cache the underlying data if desired. This is part of the -// btcdb.Db interface implementation. +// database.Db interface implementation. // // This implementation does not use any additional cache since the entire // database is already in memory. @@ -274,7 +274,7 @@ func (db *MemDb) FetchBlockHeaderBySha(sha *btcwire.ShaHash) (*btcwire.BlockHead } // FetchBlockShaByHeight returns a block hash based on its height in the block -// chain. This is part of the btcdb.Db interface implementation. +// chain. This is part of the database.Db interface implementation. func (db *MemDb) FetchBlockShaByHeight(height int64) (*btcwire.ShaHash, error) { db.Lock() defer db.Unlock() @@ -302,7 +302,7 @@ func (db *MemDb) FetchBlockShaByHeight(height int64) (*btcwire.ShaHash, error) { // FetchHeightRange looks up a range of blocks by the start and ending heights. // Fetch is inclusive of the start height and exclusive of the ending height. // To fetch all hashes from the start height until no more are present, use the -// special id `AllShas'. This is part of the btcdb.Db interface implementation. +// special id `AllShas'. This is part of the database.Db interface implementation. func (db *MemDb) FetchHeightRange(startHeight, endHeight int64) ([]btcwire.ShaHash, error) { db.Lock() defer db.Unlock() @@ -313,7 +313,7 @@ func (db *MemDb) FetchHeightRange(startHeight, endHeight int64) ([]btcwire.ShaHa // When the user passes the special AllShas id, adjust the end height // accordingly. - if endHeight == btcdb.AllShas { + if endHeight == database.AllShas { endHeight = int64(len(db.blocks)) } @@ -348,7 +348,7 @@ func (db *MemDb) FetchHeightRange(startHeight, endHeight int64) ([]btcwire.ShaHa } // ExistsTxSha returns whether or not the given transaction hash is present in -// the database and is not fully spent. This is part of the btcdb.Db interface +// the database and is not fully spent. This is part of the database.Db interface // implementation. func (db *MemDb) ExistsTxSha(sha *btcwire.ShaHash) (bool, error) { db.Lock() @@ -367,11 +367,11 @@ func (db *MemDb) ExistsTxSha(sha *btcwire.ShaHash) (bool, error) { // FetchTxBySha returns some data for the given transaction hash. The // implementation may cache the underlying data if desired. This is part of the -// btcdb.Db interface implementation. +// database.Db interface implementation. // // This implementation does not use any additional cache since the entire // database is already in memory. -func (db *MemDb) FetchTxBySha(txHash *btcwire.ShaHash) ([]*btcdb.TxListReply, error) { +func (db *MemDb) FetchTxBySha(txHash *btcwire.ShaHash) ([]*database.TxListReply, error) { db.Lock() defer db.Unlock() @@ -383,11 +383,11 @@ func (db *MemDb) FetchTxBySha(txHash *btcwire.ShaHash) ([]*btcdb.TxListReply, er if !exists { log.Warnf("FetchTxBySha: requested hash of %s does not exist", txHash) - return nil, btcdb.ErrTxShaMissing + return nil, database.ErrTxShaMissing } txHashCopy := *txHash - replyList := make([]*btcdb.TxListReply, len(txns)) + replyList := make([]*database.TxListReply, len(txns)) for i, txD := range txns { msgBlock := db.blocks[txD.blockHeight] blockSha, err := msgBlock.BlockSha() @@ -397,7 +397,7 @@ func (db *MemDb) FetchTxBySha(txHash *btcwire.ShaHash) ([]*btcdb.TxListReply, er spentBuf := make([]bool, len(txD.spentBuf)) copy(spentBuf, txD.spentBuf) - reply := btcdb.TxListReply{ + reply := database.TxListReply{ Sha: &txHashCopy, Tx: msgBlock.Transactions[txD.offset], BlkSha: &blockSha, @@ -422,16 +422,16 @@ func (db *MemDb) FetchTxBySha(txHash *btcwire.ShaHash) ([]*btcdb.TxListReply, er // will indicate the transaction does not exist. // // This function must be called with the db lock held. -func (db *MemDb) fetchTxByShaList(txShaList []*btcwire.ShaHash, includeSpent bool) []*btcdb.TxListReply { - replyList := make([]*btcdb.TxListReply, 0, len(txShaList)) +func (db *MemDb) fetchTxByShaList(txShaList []*btcwire.ShaHash, includeSpent bool) []*database.TxListReply { + replyList := make([]*database.TxListReply, 0, len(txShaList)) for i, hash := range txShaList { // Every requested entry needs a response, so start with nothing // more than a response with the requested hash marked missing. // The reply will be updated below with the appropriate // information if the transaction exists. - reply := btcdb.TxListReply{ + reply := database.TxListReply{ Sha: txShaList[i], - Err: btcdb.ErrTxShaMissing, + Err: database.ErrTxShaMissing, } replyList = append(replyList, &reply) @@ -480,7 +480,7 @@ func (db *MemDb) fetchTxByShaList(txShaList []*btcwire.ShaHash, includeSpent boo // FetchTxByShaList returns a TxListReply given an array of transaction hashes. // The implementation may cache the underlying data if desired. This is part of -// the btcdb.Db interface implementation. +// the database.Db interface implementation. // // This implementation does not use any additional cache since the entire // database is already in memory. @@ -491,14 +491,14 @@ func (db *MemDb) fetchTxByShaList(txShaList []*btcwire.ShaHash, includeSpent boo // increased number of transaction fetches, this function is typically more // expensive than the unspent counterpart, however the specific performance // details depend on the concrete implementation. The implementation may cache -// the underlying data if desired. This is part of the btcdb.Db interface +// the underlying data if desired. This is part of the database.Db interface // implementation. // // To fetch all versions of a specific transaction, call FetchTxBySha. // // This implementation does not use any additional cache since the entire // database is already in memory. -func (db *MemDb) FetchTxByShaList(txShaList []*btcwire.ShaHash) []*btcdb.TxListReply { +func (db *MemDb) FetchTxByShaList(txShaList []*btcwire.ShaHash) []*database.TxListReply { db.Lock() defer db.Unlock() @@ -508,7 +508,7 @@ func (db *MemDb) FetchTxByShaList(txShaList []*btcwire.ShaHash) []*btcdb.TxListR // FetchUnSpentTxByShaList returns a TxListReply given an array of transaction // hashes. Any transactions which are fully spent will indicate they do not // exist by setting the Err field to TxShaMissing. The implementation may cache -// the underlying data if desired. This is part of the btcdb.Db interface +// the underlying data if desired. This is part of the database.Db interface // implementation. // // To obtain results which do contain the most recent version of a fully spent @@ -517,7 +517,7 @@ func (db *MemDb) FetchTxByShaList(txShaList []*btcwire.ShaHash) []*btcdb.TxListR // // This implementation does not use any additional cache since the entire // database is already in memory. -func (db *MemDb) FetchUnSpentTxByShaList(txShaList []*btcwire.ShaHash) []*btcdb.TxListReply { +func (db *MemDb) FetchUnSpentTxByShaList(txShaList []*btcwire.ShaHash) []*database.TxListReply { db.Lock() defer db.Unlock() @@ -527,7 +527,7 @@ func (db *MemDb) FetchUnSpentTxByShaList(txShaList []*btcwire.ShaHash) []*btcdb. // InsertBlock inserts raw block and transaction data from a block into the // database. The first block inserted into the database will be treated as the // genesis block. Every subsequent block insert requires the referenced parent -// block to already exist. This is part of the btcdb.Db interface +// block to already exist. This is part of the database.Db interface // implementation. func (db *MemDb) InsertBlock(block *btcutil.Block) (int64, error) { db.Lock() @@ -548,7 +548,7 @@ func (db *MemDb) InsertBlock(block *btcutil.Block) (int64, error) { msgBlock := block.MsgBlock() if _, exists := db.blocksBySha[msgBlock.Header.PrevBlock]; !exists { if len(db.blocks) > 0 { - return 0, btcdb.ErrPrevShaMissing + return 0, database.ErrPrevShaMissing } } @@ -599,7 +599,7 @@ func (db *MemDb) InsertBlock(block *btcutil.Block) (int64, error) { log.Warnf("InsertBlock: requested hash "+ " of %s does not exist in-flight", tx.Sha()) - return 0, btcdb.ErrTxShaMissing + return 0, database.ErrTxShaMissing } } else { originTxns, exists := db.txns[prevOut.Hash] @@ -607,14 +607,14 @@ func (db *MemDb) InsertBlock(block *btcutil.Block) (int64, error) { log.Warnf("InsertBlock: requested hash "+ "of %s by %s does not exist", prevOut.Hash, tx.Sha()) - return 0, btcdb.ErrTxShaMissing + return 0, database.ErrTxShaMissing } originTxD := originTxns[len(originTxns)-1] if prevOut.Index > uint32(len(originTxD.spentBuf)) { log.Warnf("InsertBlock: requested hash "+ "of %s with index %d does not "+ "exist", tx.Sha(), prevOut.Index) - return 0, btcdb.ErrTxShaMissing + return 0, database.ErrTxShaMissing } } } @@ -624,7 +624,7 @@ func (db *MemDb) InsertBlock(block *btcutil.Block) (int64, error) { inFlightIndex < i { log.Warnf("Block contains duplicate transaction %s", tx.Sha()) - return 0, btcdb.ErrDuplicateSha + return 0, database.ErrDuplicateSha } // Prevent duplicate transactions unless the old one is fully @@ -634,7 +634,7 @@ func (db *MemDb) InsertBlock(block *btcutil.Block) (int64, error) { if !isFullySpent(txD) { log.Warnf("Attempt to insert duplicate "+ "transaction %s", tx.Sha()) - return 0, btcdb.ErrDuplicateSha + return 0, database.ErrDuplicateSha } } } @@ -674,7 +674,7 @@ func (db *MemDb) InsertBlock(block *btcutil.Block) (int64, error) { // NewestSha returns the hash and block height of the most recent (end) block of // the block chain. It will return the zero hash, -1 for the block height, and // no error (nil) if there are not any blocks in the database yet. This is part -// of the btcdb.Db interface implementation. +// of the database.Db interface implementation. func (db *MemDb) NewestSha() (*btcwire.ShaHash, int64, error) { db.Lock() defer db.Unlock() @@ -699,32 +699,32 @@ func (db *MemDb) NewestSha() (*btcwire.ShaHash, int64, error) { } // FetchAddrIndexTip isn't currently implemented. This is a part of the -// btcdb.Db interface implementation. +// database.Db interface implementation. func (db *MemDb) FetchAddrIndexTip() (*btcwire.ShaHash, int64, error) { - return nil, 0, btcdb.ErrNotImplemented + return nil, 0, database.ErrNotImplemented } // UpdateAddrIndexForBlock isn't currently implemented. This is a part of the -// btcdb.Db interface implementation. +// database.Db interface implementation. func (db *MemDb) UpdateAddrIndexForBlock(*btcwire.ShaHash, int64, - btcdb.BlockAddrIndex) error { - return btcdb.ErrNotImplemented + database.BlockAddrIndex) error { + return database.ErrNotImplemented } -// FetchTxsForAddr isn't currently implemented. This is a part of the btcdb.Db +// FetchTxsForAddr isn't currently implemented. This is a part of the database.Db // interface implementation. -func (db *MemDb) FetchTxsForAddr(btcutil.Address, int, int) ([]*btcdb.TxListReply, error) { - return nil, btcdb.ErrNotImplemented +func (db *MemDb) FetchTxsForAddr(btcutil.Address, int, int) ([]*database.TxListReply, error) { + return nil, database.ErrNotImplemented } -// DeleteAddrIndex isn't currently implemented. This is a part of the btcdb.Db +// DeleteAddrIndex isn't currently implemented. This is a part of the database.Db // interface implementation. func (db *MemDb) DeleteAddrIndex() error { - return btcdb.ErrNotImplemented + return database.ErrNotImplemented } // RollbackClose discards the recent database changes to the previously saved -// data at last Sync and closes the database. This is part of the btcdb.Db +// data at last Sync and closes the database. This is part of the database.Db // interface implementation. // // The database is completely purged on close with this implementation since the @@ -737,7 +737,7 @@ func (db *MemDb) RollbackClose() error { } // Sync verifies that the database is coherent on disk and no outstanding -// transactions are in flight. This is part of the btcdb.Db interface +// transactions are in flight. This is part of the database.Db interface // implementation. // // This implementation does not write any data to disk, so this function only diff --git a/memdb/memdb_test.go b/database/memdb/memdb_test.go similarity index 94% rename from memdb/memdb_test.go rename to database/memdb/memdb_test.go index de8701b3..f370fa55 100644 --- a/memdb/memdb_test.go +++ b/database/memdb/memdb_test.go @@ -8,8 +8,8 @@ import ( "reflect" "testing" - "github.com/btcsuite/btcdb" - "github.com/btcsuite/btcdb/memdb" + "github.com/btcsuite/btcd/database" + "github.com/btcsuite/btcd/database/memdb" "github.com/btcsuite/btcnet" "github.com/btcsuite/btcutil" "github.com/btcsuite/btcwire" @@ -20,7 +20,7 @@ import ( // and does not panic or otherwise misbehave for functions which do not return // errors. func TestClosed(t *testing.T) { - db, err := btcdb.CreateDB("memdb") + db, err := database.CreateDB("memdb") if err != nil { t.Errorf("Failed to open test database %v", err) return @@ -74,7 +74,7 @@ func TestClosed(t *testing.T) { "got: %d, want: %d", len(reply), len(requestHashes)) } for i, txLR := range reply { - wantReply := &btcdb.TxListReply{ + wantReply := &database.TxListReply{ Sha: requestHashes[i], Err: memdb.ErrDbClosed, } @@ -90,7 +90,7 @@ func TestClosed(t *testing.T) { "got: %d, want: %d", len(reply), len(requestHashes)) } for i, txLR := range reply { - wantReply := &btcdb.TxListReply{ + wantReply := &database.TxListReply{ Sha: requestHashes[i], Err: memdb.ErrDbClosed, } diff --git a/testdata/blocks1-256.bz2 b/database/testdata/blocks1-256.bz2 similarity index 100% rename from testdata/blocks1-256.bz2 rename to database/testdata/blocks1-256.bz2 diff --git a/doc.go b/doc.go deleted file mode 100644 index 6e529ce4..00000000 --- a/doc.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2013-2014 Conformal Systems LLC. -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -/* -Package btcdb provides a database interface for the Bitcoin block chain. - -As of July 2014, there are over 309,000 blocks in the Bitcoin block chain and -and over 42 million transactions (which turns out to be over 21GB of data). -btcdb provides a database layer to store and retrieve this data in a fairly -simple and efficient manner. The use of this should not require specific -knowledge of the database backend. - -Basic Design - -The basic design of btcdb is to provide two classes of items in a database; -blocks and transactions (tx) where the block number increases monotonically. -Each transaction belongs to a single block although a block can have a variable -number of transactions. Along with these two items, several convenience -functions for dealing with the database are provided as well as functions to -query specific items that may be present in a block or tx. - -Usage - -At the highest level, the use of this packages just requires that you import it, -setup a database, insert some data into it, and optionally, query the data back. -The first block inserted into the database will be treated as the genesis block. -Every subsequent block insert requires the referenced parent block to already -exist. -*/ -package btcdb