-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstore.go
47 lines (42 loc) · 1.14 KB
/
store.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package main
import (
"github.com/boltdb/bolt"
"github.com/google/uuid"
)
const bucket string = "secrets"
func storeAndLink(db *bolt.DB, secret string, salt string) (string, error) {
uid := uuid.NewString()
errbd := db.Update(func(tx *bolt.Tx) error {
b, berr := tx.CreateBucketIfNotExists([]byte(bucket))
if berr != nil {
return berr
}
err := b.Put([]byte(uid), []byte(secret))
if err != nil {
return err
}
err = b.Put([]byte(uid+"_salt"), []byte(salt))
return err
})
return uid, errbd
}
func readAndDelete(db *bolt.DB, uid string) (string, string, error) {
var copyDest []byte
var copySalt []byte
err := db.Batch(func(tx *bolt.Tx) error {
b, berr := tx.CreateBucketIfNotExists([]byte(bucket))
if berr != nil {
return berr
}
result := b.Get([]byte(uid))
salt := b.Get([]byte(uid + "_salt"))
err := b.Delete([]byte(uid))
// bolt will reuse memory after transation, we need to topy it
copyDest = make([]byte, len(result), (cap(result)+1)*2)
copySalt = make([]byte, len(salt), (cap(salt)+1)*2)
copy(copyDest, result)
copy(copySalt, salt)
return err
})
return string(copyDest), string(copySalt), err
}