You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.3 KiB
118 lines
3.3 KiB
package bitcask |
|
|
|
import ( |
|
"os" |
|
|
|
"git.mills.io/prologic/bitcask/internal/config" |
|
) |
|
|
|
const ( |
|
// DefaultDirFileModeBeforeUmask is the default os.FileMode used when creating directories |
|
DefaultDirFileModeBeforeUmask = os.FileMode(0700) |
|
|
|
// DefaultFileFileModeBeforeUmask is the default os.FileMode used when creating files |
|
DefaultFileFileModeBeforeUmask = os.FileMode(0600) |
|
|
|
// DefaultMaxDatafileSize is the default maximum datafile size in bytes |
|
DefaultMaxDatafileSize = 1 << 20 // 1MB |
|
|
|
// DefaultMaxKeySize is the default maximum key size in bytes |
|
DefaultMaxKeySize = uint32(64) // 64 bytes |
|
|
|
// DefaultMaxValueSize is the default value size in bytes |
|
DefaultMaxValueSize = uint64(1 << 16) // 65KB |
|
|
|
// DefaultSync is the default file synchronization action |
|
DefaultSync = false |
|
|
|
// DefaultAutoRecovery is the default auto-recovery action. |
|
|
|
CurrentDBVersion = uint32(1) |
|
) |
|
|
|
// Option is a function that takes a config struct and modifies it |
|
type Option func(*config.Config) error |
|
|
|
func withConfig(src *config.Config) Option { |
|
return func(cfg *config.Config) error { |
|
cfg.MaxDatafileSize = src.MaxDatafileSize |
|
cfg.MaxKeySize = src.MaxKeySize |
|
cfg.MaxValueSize = src.MaxValueSize |
|
cfg.Sync = src.Sync |
|
cfg.AutoRecovery = src.AutoRecovery |
|
cfg.DirFileModeBeforeUmask = src.DirFileModeBeforeUmask |
|
cfg.FileFileModeBeforeUmask = src.FileFileModeBeforeUmask |
|
return nil |
|
} |
|
} |
|
|
|
// WithAutoRecovery sets auto recovery of data and index file recreation. |
|
// IMPORTANT: This flag MUST BE used only if a proper backup was made of all |
|
// the existing datafiles. |
|
func WithAutoRecovery(enabled bool) Option { |
|
return func(cfg *config.Config) error { |
|
cfg.AutoRecovery = enabled |
|
return nil |
|
} |
|
} |
|
|
|
// WithDirFileModeBeforeUmask sets the FileMode used for each new file created. |
|
func WithDirFileModeBeforeUmask(mode os.FileMode) Option { |
|
return func(cfg *config.Config) error { |
|
cfg.DirFileModeBeforeUmask = mode |
|
return nil |
|
} |
|
} |
|
|
|
// WithFileFileModeBeforeUmask sets the FileMode used for each new file created. |
|
func WithFileFileModeBeforeUmask(mode os.FileMode) Option { |
|
return func(cfg *config.Config) error { |
|
cfg.FileFileModeBeforeUmask = mode |
|
return nil |
|
} |
|
} |
|
|
|
// WithMaxDatafileSize sets the maximum datafile size option |
|
func WithMaxDatafileSize(size int) Option { |
|
return func(cfg *config.Config) error { |
|
cfg.MaxDatafileSize = size |
|
return nil |
|
} |
|
} |
|
|
|
// WithMaxKeySize sets the maximum key size option |
|
func WithMaxKeySize(size uint32) Option { |
|
return func(cfg *config.Config) error { |
|
cfg.MaxKeySize = size |
|
return nil |
|
} |
|
} |
|
|
|
// WithMaxValueSize sets the maximum value size option |
|
func WithMaxValueSize(size uint64) Option { |
|
return func(cfg *config.Config) error { |
|
cfg.MaxValueSize = size |
|
return nil |
|
} |
|
} |
|
|
|
// WithSync causes Sync() to be called on every key/value written increasing |
|
// durability and safety at the expense of performance |
|
func WithSync(sync bool) Option { |
|
return func(cfg *config.Config) error { |
|
cfg.Sync = sync |
|
return nil |
|
} |
|
} |
|
|
|
func newDefaultConfig() *config.Config { |
|
return &config.Config{ |
|
MaxDatafileSize: DefaultMaxDatafileSize, |
|
MaxKeySize: DefaultMaxKeySize, |
|
MaxValueSize: DefaultMaxValueSize, |
|
Sync: DefaultSync, |
|
DirFileModeBeforeUmask: DefaultDirFileModeBeforeUmask, |
|
FileFileModeBeforeUmask: DefaultFileFileModeBeforeUmask, |
|
DBVersion: CurrentDBVersion, |
|
} |
|
}
|
|
|