package config import ( "io/ioutil" "github.com/pelletier/go-toml" ) type Size int const ( DefaultAddr string = "127.0.0.1:6380" DefaultHttpAddr string = "127.0.0.1:11181" DefaultDBName string = "goleveldb" DefaultDataDir string = "./data" ) const ( MaxBinLogFileSize int = 1024 * 1024 * 1024 MaxBinLogFileNum int = 10000 DefaultBinLogFileSize int = MaxBinLogFileSize DefaultBinLogFileNum int = 10 ) type LevelDBConfig struct { Compression bool `toml:"compression"` BlockSize int `toml:"block_size"` WriteBufferSize int `toml:"write_buffer_size"` CacheSize int `toml:"cache_size"` MaxOpenFiles int `toml:"max_open_files"` } type LMDBConfig struct { MapSize int `toml:"map_size"` NoSync bool `toml:"nosync"` } type BinLogConfig struct { MaxFileSize int `toml:"max_file_size"` MaxFileNum int `toml:"max_file_num"` } type Config struct { DataDir string `toml:"data_dir"` DBName string `toml:"db_name"` LevelDB LevelDBConfig `toml:"leveldb"` LMDB LMDBConfig `toml:"lmdb"` BinLog BinLogConfig `toml:"binlog"` SlaveOf string `toml:"slaveof"` AccessLog string `toml:"access_log"` } func NewConfigWithFile(fileName string) (*Config, error) { data, err := ioutil.ReadFile(fileName) if err != nil { return nil, err } return NewConfigWithData(data) } func NewConfigWithData(data []byte) (*Config, error) { cfg := NewConfigDefault() err := toml.Unmarshal(data, cfg) if err != nil { return nil, err } return cfg, nil } func NewConfigDefault() *Config { cfg := new(Config) cfg.DataDir = DefaultDataDir cfg.DBName = DefaultDBName // disable binlog cfg.BinLog.MaxFileNum = 0 cfg.BinLog.MaxFileSize = 0 // disable replication cfg.SlaveOf = "" // disable access log cfg.AccessLog = "" cfg.LMDB.MapSize = 20 * 1024 * 1024 cfg.LMDB.NoSync = true return cfg } func (cfg *LevelDBConfig) Adjust() { if cfg.CacheSize <= 0 { cfg.CacheSize = 4 * 1024 * 1024 } if cfg.BlockSize <= 0 { cfg.BlockSize = 4 * 1024 } if cfg.WriteBufferSize <= 0 { cfg.WriteBufferSize = 4 * 1024 * 1024 } if cfg.MaxOpenFiles < 1024 { cfg.MaxOpenFiles = 1024 } } func (cfg *BinLogConfig) Adjust() { if cfg.MaxFileSize <= 0 { cfg.MaxFileSize = DefaultBinLogFileSize } else if cfg.MaxFileSize > MaxBinLogFileSize { cfg.MaxFileSize = MaxBinLogFileSize } if cfg.MaxFileNum <= 0 { cfg.MaxFileNum = DefaultBinLogFileNum } else if cfg.MaxFileNum > MaxBinLogFileNum { cfg.MaxFileNum = MaxBinLogFileNum } }