|
@@ -14,10 +14,11 @@ var bucketSelected = []byte("selected")
|
|
|
var _ adapter.ClashCacheFile = (*CacheFile)(nil)
|
|
var _ adapter.ClashCacheFile = (*CacheFile)(nil)
|
|
|
|
|
|
|
|
type CacheFile struct {
|
|
type CacheFile struct {
|
|
|
- DB *bbolt.DB
|
|
|
|
|
|
|
+ DB *bbolt.DB
|
|
|
|
|
+ cacheID []byte
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func Open(path string) (*CacheFile, error) {
|
|
|
|
|
|
|
+func Open(path string, cacheID string) (*CacheFile, error) {
|
|
|
const fileMode = 0o666
|
|
const fileMode = 0o666
|
|
|
options := bbolt.Options{Timeout: time.Second}
|
|
options := bbolt.Options{Timeout: time.Second}
|
|
|
db, err := bbolt.Open(path, fileMode, &options)
|
|
db, err := bbolt.Open(path, fileMode, &options)
|
|
@@ -31,13 +32,39 @@ func Open(path string) (*CacheFile, error) {
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return nil, err
|
|
return nil, err
|
|
|
}
|
|
}
|
|
|
- return &CacheFile{db}, nil
|
|
|
|
|
|
|
+ var cacheIDBytes []byte
|
|
|
|
|
+ if cacheID != "" {
|
|
|
|
|
+ cacheIDBytes = append([]byte{0}, []byte(cacheID)...)
|
|
|
|
|
+ }
|
|
|
|
|
+ return &CacheFile{db, cacheIDBytes}, nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (c *CacheFile) bucket(t *bbolt.Tx, key []byte) *bbolt.Bucket {
|
|
|
|
|
+ if c.cacheID == nil {
|
|
|
|
|
+ return t.Bucket(key)
|
|
|
|
|
+ }
|
|
|
|
|
+ bucket := t.Bucket(c.cacheID)
|
|
|
|
|
+ if bucket == nil {
|
|
|
|
|
+ return nil
|
|
|
|
|
+ }
|
|
|
|
|
+ return bucket.Bucket(key)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (c *CacheFile) createBucket(t *bbolt.Tx, key []byte) (*bbolt.Bucket, error) {
|
|
|
|
|
+ if c.cacheID == nil {
|
|
|
|
|
+ return t.CreateBucketIfNotExists(key)
|
|
|
|
|
+ }
|
|
|
|
|
+ bucket, err := t.CreateBucketIfNotExists(c.cacheID)
|
|
|
|
|
+ if bucket == nil {
|
|
|
|
|
+ return nil, err
|
|
|
|
|
+ }
|
|
|
|
|
+ return bucket.CreateBucketIfNotExists(key)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (c *CacheFile) LoadSelected(group string) string {
|
|
func (c *CacheFile) LoadSelected(group string) string {
|
|
|
var selected string
|
|
var selected string
|
|
|
c.DB.View(func(t *bbolt.Tx) error {
|
|
c.DB.View(func(t *bbolt.Tx) error {
|
|
|
- bucket := t.Bucket(bucketSelected)
|
|
|
|
|
|
|
+ bucket := c.bucket(t, bucketSelected)
|
|
|
if bucket == nil {
|
|
if bucket == nil {
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
@@ -52,7 +79,7 @@ func (c *CacheFile) LoadSelected(group string) string {
|
|
|
|
|
|
|
|
func (c *CacheFile) StoreSelected(group, selected string) error {
|
|
func (c *CacheFile) StoreSelected(group, selected string) error {
|
|
|
return c.DB.Batch(func(t *bbolt.Tx) error {
|
|
return c.DB.Batch(func(t *bbolt.Tx) error {
|
|
|
- bucket, err := t.CreateBucketIfNotExists(bucketSelected)
|
|
|
|
|
|
|
+ bucket, err := c.createBucket(t, bucketSelected)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|