| | |
| | | dbConf = []byte(confBucket) |
| | | |
| | | // An error indicating a given key does not exist |
| | | ErrKeyNotFound = errors.New("not found") |
| | | ErrLogNotFound = errors.New("log not found") |
| | | ErrKeyNotFound = errors.New("not found") |
| | | ErrLogNotFound = errors.New("log not found") |
| | | ErrBucketNotFound = errors.New("bucket not found") |
| | | ) |
| | | |
| | |
| | | defer tx.Rollback() |
| | | |
| | | bucket := tx.Bucket([]byte(bucketName)) |
| | | if bucket ==nil { |
| | | if bucket == nil { |
| | | return 0, ErrBucketNotFound |
| | | } |
| | | |
| | |
| | | } |
| | | defer tx.Rollback() |
| | | bucket := tx.Bucket([]byte(bucketName)) |
| | | if bucket ==nil { |
| | | if bucket == nil { |
| | | return 0, ErrBucketNotFound |
| | | } |
| | | curs := bucket.Cursor() |
| | |
| | | } |
| | | bucket := tx.Bucket([]byte(bucketName)) |
| | | if bucket == nil { |
| | | bucket,err = tx.CreateBucket([]byte(bucketName)) |
| | | bucket, err = tx.CreateBucket([]byte(bucketName)) |
| | | if err != nil { |
| | | return err |
| | | } |
| | |
| | | return tx.Commit() |
| | | } |
| | | |
| | | func (b *BoltStore) ForEach(f func(lc *LogCon) error) error { |
| | | tx, err := b.conn.Begin(true) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | defer tx.Rollback() |
| | | |
| | | start, _ := b.FirstIndex(confBucket) |
| | | end, _ := b.LastIndex(confBucket) |
| | | |
| | | for ; start <= end; start++ { |
| | | cLog := &confLog{} |
| | | err := b.GetConfLog(start, cLog) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | |
| | | bucketName := cLog.BucketName |
| | | bucket := tx.Bucket([]byte(bucketName)) |
| | | if bucket == nil { |
| | | return err |
| | | } |
| | | |
| | | bucket.ForEach(func(k, v []byte) error { |
| | | log := &Log{} |
| | | err := decodeMsgPack(v, log) |
| | | if err == nil { |
| | | f(&LogCon{cLog, log}) |
| | | } |
| | | |
| | | return err |
| | | }) |
| | | } |
| | | |
| | | return nil |
| | | } |
| | | |
| | | func (b *BoltStore) Delete(lc *LogCon) error { |
| | | tx,err := b.conn.Begin(true) |
| | | tx, err := b.conn.Begin(true) |
| | | if err != nil { |
| | | return err |
| | | } |
| | |
| | | dc := false |
| | | if bucket != nil { |
| | | if lc.Log != nil { |
| | | if dErr := bucket.Delete(uint64ToBytes(lc.Log.Index));dErr != nil { |
| | | if dErr := bucket.Delete(uint64ToBytes(lc.Log.Index)); dErr != nil { |
| | | return dErr |
| | | } |
| | | } |
| | |
| | | return nil |
| | | }) |
| | | if cbSize > 1 { |
| | | if dErr := cb.Delete(uint64ToBytes(uint64(lc.conf.Index)));dErr != nil { |
| | | if dErr := cb.Delete(uint64ToBytes(uint64(lc.conf.Index))); dErr != nil { |
| | | return dErr |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | func (b *BoltStore) UpdateTime(bucketName string, t time.Time) error { |
| | | tx,err := b.conn.Begin(true) |
| | | tx, err := b.conn.Begin(true) |
| | | if err != nil { |
| | | return err |
| | | } |
| | |
| | | if cLog.BucketName == bucketName { |
| | | cLog.UpdateTime = t |
| | | cLog.Index = int(bytesToUint64(k)) |
| | | val,err := encodeMsgPack(cLog) |
| | | if err ==nil { |
| | | if bucket.Put(k, val.Bytes()) ==nil { |
| | | val, err := encodeMsgPack(cLog) |
| | | if err == nil { |
| | | if bucket.Put(k, val.Bytes()) == nil { |
| | | flag = true |
| | | } |
| | | } |
| | |
| | | return nil |
| | | }) |
| | | if !flag { |
| | | return errors.New("conf表中未找到"+bucketName) |
| | | return errors.New("conf表中未找到" + bucketName) |
| | | } |
| | | } else { |
| | | return ErrBucketNotFound |
| | |
| | | |
| | | func (b *BoltStore) Clean(conf *Config) ([]string, []string, error) { |
| | | type kConfLog struct { |
| | | k []byte |
| | | k []byte |
| | | log *confLog |
| | | } |
| | | tx,err := b.conn.Begin(true) |
| | | tx, err := b.conn.Begin(true) |
| | | if err != nil { |
| | | return nil, nil, err |
| | | } |
| | |
| | | var allCLogs []*kConfLog |
| | | bucket.ForEach(func(k, v []byte) error { |
| | | cLog := &confLog{} |
| | | if e :=decodeMsgPack(v, cLog);e ==nil { |
| | | if e := decodeMsgPack(v, cLog); e == nil { |
| | | allCLogs = append(allCLogs, &kConfLog{ |
| | | k:k, |
| | | log:cLog, |
| | | k: k, |
| | | log: cLog, |
| | | }) |
| | | } |
| | | return nil |
| | |
| | | if len(allCLogs) > conf.bucketLimit { |
| | | arr := allCLogs[:len(allCLogs)-conf.bucketLimit] |
| | | leftClogs = allCLogs[len(allCLogs)-conf.bucketLimit:] |
| | | for _,a := range arr { |
| | | if de := tx.DeleteBucket([]byte(a.log.BucketName));de !=nil { |
| | | for _, a := range arr { |
| | | if de := tx.DeleteBucket([]byte(a.log.BucketName)); de != nil { |
| | | delErrBucketNames = append(delErrBucketNames, a.log.BucketName) |
| | | } else { |
| | | bucket.Delete(a.k) |
| | |
| | | } else { |
| | | leftClogs = allCLogs |
| | | } |
| | | if len(leftClogs) >1 { |
| | | if len(leftClogs) > 1 { |
| | | leftClogs = leftClogs[:len(leftClogs)-1] |
| | | for _,a := range leftClogs { |
| | | if int(time.Now().Sub(a.log.UpdateTime).Hours()) > conf.keepDays * 24 { |
| | | if de := tx.DeleteBucket([]byte(a.log.BucketName));de !=nil { |
| | | for _, a := range leftClogs { |
| | | if int(time.Now().Sub(a.log.UpdateTime).Hours()) > conf.keepDays*24 { |
| | | if de := tx.DeleteBucket([]byte(a.log.BucketName)); de != nil { |
| | | delErrBucketNames = append(delErrBucketNames, a.log.BucketName) |
| | | } else { |
| | | bucket.Delete(a.k) |
| | |
| | | return tx.Commit() |
| | | } |
| | | |
| | | func (b *BoltStore) Size(bucketName string) (int,error) { |
| | | func (b *BoltStore) Size(bucketName string) (int, error) { |
| | | tx, err := b.conn.Begin(false) |
| | | if err != nil { |
| | | return 0, err |