summaryrefslogtreecommitdiff
path: root/system/db/query.go
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2016-10-06 03:14:10 -0700
committerSteve Manuel <nilslice@gmail.com>2016-10-06 03:14:10 -0700
commitc0ba07669d8403f428ec250e3f3da74844c6c587 (patch)
tree94313747d9abea02b2f3b01c06308225d9db5e4a /system/db/query.go
parent698173a6176762f966be0abd1dc77b85e482a03a (diff)
adding authentication & token-based persistence for users, init setup for first-use, pulling out some handlers into separate file for readability and navigation
Diffstat (limited to 'system/db/query.go')
-rw-r--r--system/db/query.go207
1 files changed, 0 insertions, 207 deletions
diff --git a/system/db/query.go b/system/db/query.go
deleted file mode 100644
index 480946f..0000000
--- a/system/db/query.go
+++ /dev/null
@@ -1,207 +0,0 @@
-package db
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "log"
- "net/url"
- "strconv"
- "strings"
-
- "github.com/boltdb/bolt"
- "github.com/gorilla/schema"
- "github.com/nilslice/cms/content"
- "github.com/nilslice/cms/management/editor"
- "github.com/nilslice/cms/management/manager"
-)
-
-var store *bolt.DB
-
-// Init creates a db connection and initializes db with required info
-func Init() {
- var err error
- store, err = bolt.Open("store.db", 0666, nil)
- if err != nil {
- log.Fatal(err)
- }
-
- // initialize db with all content type buckets
- store.Update(func(tx *bolt.Tx) error {
- for t := range content.Types {
- _, err := tx.CreateBucketIfNotExists([]byte(t))
- if err != nil {
- return err
- }
- }
-
- return nil
- })
-
-}
-
-// Set inserts or updates values in the database.
-// The `target` argument is a string made up of namespace:id (string:int)
-func Set(target string, data url.Values) (int, error) {
- t := strings.Split(target, ":")
- ns, id := t[0], t[1]
-
- // check if content id == -1 (indicating new post).
- // if so, run an insert which will assign the next auto incremented int.
- // this is done because boltdb begins its bucket auto increment value at 0,
- // which is the zero-value of an int in the Item struct field for ID.
- // this is a problem when the original first post (with auto ID = 0) gets
- // overwritten by any new post, originally having no ID, defauting to 0.
- if id == "-1" {
- return insert(ns, data)
- }
-
- return update(ns, id, data)
-}
-
-func update(ns, id string, data url.Values) (int, error) {
- cid, err := strconv.Atoi(id)
- if err != nil {
- return 0, err
- }
-
- err = store.Update(func(tx *bolt.Tx) error {
- b, err := tx.CreateBucketIfNotExists([]byte(ns))
- if err != nil {
- return err
- }
-
- j, err := toJSON(ns, data)
- if err != nil {
- return err
- }
-
- err = b.Put([]byte(fmt.Sprintf("%d", cid)), j)
- if err != nil {
- return err
- }
-
- return nil
- })
- if err != nil {
- return 0, nil
- }
-
- return cid, nil
-}
-
-func insert(ns string, data url.Values) (int, error) {
- var effectedID int
- err := store.Update(func(tx *bolt.Tx) error {
- b, err := tx.CreateBucketIfNotExists([]byte(ns))
- if err != nil {
- return err
- }
-
- // get the next available ID and convert to string
- // also set effectedID to int of ID
- id, err := b.NextSequence()
- if err != nil {
- return err
- }
- cid := strconv.FormatUint(id, 10)
- effectedID, err = strconv.Atoi(cid)
- if err != nil {
- return err
- }
- data.Add("id", cid)
-
- j, err := toJSON(ns, data)
- if err != nil {
- return err
- }
-
- err = b.Put([]byte(cid), j)
- if err != nil {
- return err
- }
-
- return nil
- })
- if err != nil {
- return 0, err
- }
-
- return effectedID, nil
-}
-
-func toJSON(ns string, data url.Values) ([]byte, error) {
- // find the content type and decode values into it
- t, ok := content.Types[ns]
- if !ok {
- return nil, fmt.Errorf(content.ErrTypeNotRegistered, ns)
- }
- post := t()
-
- dec := schema.NewDecoder()
- dec.SetAliasTag("json") // allows simpler struct tagging when creating a content type
- dec.IgnoreUnknownKeys(true) // will skip over form values submitted, but not in struct
- err := dec.Decode(post, data)
- if err != nil {
- return nil, err
- }
-
- slug, err := manager.Slug(post.(editor.Editable))
- if err != nil {
- return nil, err
- }
- post.(editor.Editable).SetSlug(slug)
-
- // marshall content struct to json for db storage
- j, err := json.Marshal(post)
- if err != nil {
- return nil, err
- }
-
- return j, nil
-}
-
-// Get retrives one item from the database. Non-existent values will return an empty []byte
-// The `target` argument is a string made up of namespace:id (string:int)
-func Get(target string) ([]byte, error) {
- t := strings.Split(target, ":")
- ns, id := t[0], t[1]
-
- val := &bytes.Buffer{}
- err := store.View(func(tx *bolt.Tx) error {
- b := tx.Bucket([]byte(ns))
- _, err := val.Write(b.Get([]byte(id)))
- if err != nil {
- fmt.Println(err)
- return err
- }
-
- return nil
- })
- if err != nil {
- return nil, err
- }
-
- return val.Bytes(), nil
-}
-
-// GetAll retrives all items from the database within the provided namespace
-func GetAll(namespace string) [][]byte {
- var posts [][]byte
- store.View(func(tx *bolt.Tx) error {
- b := tx.Bucket([]byte(namespace))
-
- len := b.Stats().KeyN
- posts = make([][]byte, 0, len)
-
- b.ForEach(func(k, v []byte) error {
- posts = append(posts, v)
-
- return nil
- })
-
- return nil
- })
-
- return posts
-}