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.

63 lines
1.5 KiB

  1. package cassandra2
  2. import (
  3. "context"
  4. "encoding/base64"
  5. "fmt"
  6. "github.com/gocql/gocql"
  7. "github.com/seaweedfs/seaweedfs/weed/filer"
  8. "github.com/seaweedfs/seaweedfs/weed/util"
  9. )
  10. func (store *Cassandra2Store) KvPut(ctx context.Context, key []byte, value []byte) (err error) {
  11. dir, name := genDirAndName(key)
  12. if err := store.session.Query(
  13. "INSERT INTO filemeta (dirhash,directory,name,meta) VALUES(?,?,?,?) USING TTL ? ",
  14. util.HashStringToLong(dir), dir, name, value, 0).Exec(); err != nil {
  15. return fmt.Errorf("kv insert: %s", err)
  16. }
  17. return nil
  18. }
  19. func (store *Cassandra2Store) KvGet(ctx context.Context, key []byte) (data []byte, err error) {
  20. dir, name := genDirAndName(key)
  21. if err := store.session.Query(
  22. "SELECT meta FROM filemeta WHERE dirhash=? AND directory=? AND name=?",
  23. util.HashStringToLong(dir), dir, name).Scan(&data); err != nil {
  24. if err != gocql.ErrNotFound {
  25. return nil, filer.ErrKvNotFound
  26. }
  27. }
  28. if len(data) == 0 {
  29. return nil, filer.ErrKvNotFound
  30. }
  31. return data, nil
  32. }
  33. func (store *Cassandra2Store) KvDelete(ctx context.Context, key []byte) (err error) {
  34. dir, name := genDirAndName(key)
  35. if err := store.session.Query(
  36. "DELETE FROM filemeta WHERE dirhash=? AND directory=? AND name=?",
  37. util.HashStringToLong(dir), dir, name).Exec(); err != nil {
  38. return fmt.Errorf("kv delete: %v", err)
  39. }
  40. return nil
  41. }
  42. func genDirAndName(key []byte) (dir string, name string) {
  43. for len(key) < 8 {
  44. key = append(key, 0)
  45. }
  46. dir = base64.StdEncoding.EncodeToString(key[:8])
  47. name = base64.StdEncoding.EncodeToString(key[8:])
  48. return
  49. }