mirror of https://github.com/etcd-io/bbolt.git
Add mock OS.
parent
ee24437bfc
commit
746c287b26
25
db.go
25
db.go
|
@ -1,7 +1,7 @@
|
||||||
package bolt
|
package bolt
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
. "os"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
@ -26,8 +26,9 @@ type DB struct {
|
||||||
sync.Mutex
|
sync.Mutex
|
||||||
opened bool
|
opened bool
|
||||||
|
|
||||||
file *os.File
|
os OS
|
||||||
metafile *os.File
|
file *File
|
||||||
|
metafile *File
|
||||||
data []byte
|
data []byte
|
||||||
buf []byte
|
buf []byte
|
||||||
meta0 *meta
|
meta0 *meta
|
||||||
|
@ -55,18 +56,22 @@ type DB struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDB() *DB {
|
func NewDB() *DB {
|
||||||
return &DB{}
|
return &DB{os: &sysos{}}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DB) Path() string {
|
func (db *DB) Path() string {
|
||||||
return db.path
|
return db.path
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DB) Open(path string, mode os.FileMode) error {
|
func (db *DB) Open(path string, mode FileMode) error {
|
||||||
var err error
|
var err error
|
||||||
db.Lock()
|
db.Lock()
|
||||||
defer db.Unlock()
|
defer db.Unlock()
|
||||||
|
|
||||||
|
if db.os == nil {
|
||||||
|
db.os = &sysos{}
|
||||||
|
}
|
||||||
|
|
||||||
// Exit if the database is currently open.
|
// Exit if the database is currently open.
|
||||||
if db.opened {
|
if db.opened {
|
||||||
return DatabaseAlreadyOpenedError
|
return DatabaseAlreadyOpenedError
|
||||||
|
@ -74,11 +79,11 @@ func (db *DB) Open(path string, mode os.FileMode) error {
|
||||||
|
|
||||||
// Open data file and separate sync handler for metadata writes.
|
// Open data file and separate sync handler for metadata writes.
|
||||||
db.path = path
|
db.path = path
|
||||||
if db.file, err = os.OpenFile(db.path, os.O_RDWR|os.O_CREATE, mode); err != nil {
|
if db.file, err = db.os.OpenFile(db.path, O_RDWR|O_CREATE, mode); err != nil {
|
||||||
db.close()
|
db.close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if db.metafile, err = os.OpenFile(db.path, os.O_RDWR|os.O_SYNC, mode); err != nil {
|
if db.metafile, err = db.os.OpenFile(db.path, O_RDWR|O_SYNC, mode); err != nil {
|
||||||
db.close()
|
db.close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -140,7 +145,7 @@ func (db *DB) mmap() error {
|
||||||
|
|
||||||
// Determine the map size based on the file size.
|
// Determine the map size based on the file size.
|
||||||
var size int
|
var size int
|
||||||
if info, err := os.Stat(db.file.Name()); err != nil {
|
if info, err := db.os.Stat(db.file.Name()); err != nil {
|
||||||
return err
|
return err
|
||||||
} else if info.Size() < int64(db.pageSize*2) {
|
} else if info.Size() < int64(db.pageSize*2) {
|
||||||
return &Error{"file size too small", nil}
|
return &Error{"file size too small", nil}
|
||||||
|
@ -169,7 +174,7 @@ func (db *DB) mmap() error {
|
||||||
// init creates a new database file and initializes its meta pages.
|
// init creates a new database file and initializes its meta pages.
|
||||||
func (db *DB) init() error {
|
func (db *DB) init() error {
|
||||||
// Set the page size to the OS page size unless that is larger than max page size.
|
// Set the page size to the OS page size unless that is larger than max page size.
|
||||||
db.pageSize = os.Getpagesize()
|
db.pageSize = db.os.Getpagesize()
|
||||||
if db.pageSize > maxPageSize {
|
if db.pageSize > maxPageSize {
|
||||||
db.pageSize = maxPageSize
|
db.pageSize = maxPageSize
|
||||||
}
|
}
|
||||||
|
@ -765,7 +770,7 @@ func (db *DB) SetFlags(flag int, onoff bool) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DB) Stat() *Stat {
|
func (db *DB) Stat() *stat {
|
||||||
/*
|
/*
|
||||||
int toggle;
|
int toggle;
|
||||||
|
|
||||||
|
|
22
os.go
22
os.go
|
@ -1,5 +1,25 @@
|
||||||
package bolt
|
package bolt
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type OS interface {
|
||||||
|
OpenFile(name string, flag int, perm os.FileMode) (file *os.File, err error)
|
||||||
|
Stat(name string) (fi os.FileInfo, err error)
|
||||||
|
Getpagesize() int
|
||||||
|
}
|
||||||
|
|
||||||
|
type sysos struct{}
|
||||||
|
|
||||||
|
func (o *sysos) OpenFile(name string, flag int, perm os.FileMode) (file *os.File, err error) {
|
||||||
|
return os.OpenFile(name, flag, perm)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *sysos) Stat(name string) (fi os.FileInfo, err error) {
|
||||||
|
return os.Stat(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *sysos) Getpagesize() int {
|
||||||
|
return os.Getpagesize()
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package bolt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/mock"
|
||||||
|
)
|
||||||
|
|
||||||
|
type mockos struct {
|
||||||
|
mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *mockos) OpenFile(name string, flag int, perm os.FileMode) (file *os.File, err error) {
|
||||||
|
args := m.Called(name, flag, perm)
|
||||||
|
return args.Get(0).(*os.File), args.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *mockos) Stat(name string) (fi os.FileInfo, err error) {
|
||||||
|
args := m.Called(name)
|
||||||
|
return args.Get(0).(os.FileInfo), args.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *mockos) Getpagesize() int {
|
||||||
|
args := m.Called()
|
||||||
|
return args.Int(0)
|
||||||
|
}
|
2
stat.go
2
stat.go
|
@ -1,6 +1,6 @@
|
||||||
package bolt
|
package bolt
|
||||||
|
|
||||||
type Stat struct {
|
type stat struct {
|
||||||
PageSize int
|
PageSize int
|
||||||
Depth int
|
Depth int
|
||||||
BranchPageCount int
|
BranchPageCount int
|
||||||
|
|
|
@ -1467,7 +1467,7 @@ func (t *transaction) Bucket(name string, flags int) (*Bucket, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *transaction) Stat(b Bucket) *Stat {
|
func (t *transaction) Stat(b Bucket) *stat {
|
||||||
/*
|
/*
|
||||||
if (txn == NULL || arg == NULL || dbi >= txn->mt_numdbs)
|
if (txn == NULL || arg == NULL || dbi >= txn->mt_numdbs)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
Loading…
Reference in New Issue