55 lines
972 B
Go
55 lines
972 B
Go
package storm
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/boltdb/bolt"
|
|
"github.com/fatih/structs"
|
|
)
|
|
|
|
// Count counts all the records of a bucket
|
|
func (n *Node) Count(data interface{}) (int, error) {
|
|
if !structs.IsStruct(data) {
|
|
return 0, ErrBadType
|
|
}
|
|
|
|
info, err := extract(data)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
var count int
|
|
if n.tx != nil {
|
|
err = n.count(n.tx, info, &count)
|
|
return count, err
|
|
}
|
|
|
|
err = n.s.Bolt.View(func(tx *bolt.Tx) error {
|
|
return n.count(tx, info, &count)
|
|
})
|
|
return count, err
|
|
}
|
|
|
|
func (n *Node) count(tx *bolt.Tx, info *modelInfo, count *int) error {
|
|
bucket := n.GetBucket(tx, info.Name)
|
|
if bucket == nil {
|
|
return fmt.Errorf("bucket %s not found", info.Name)
|
|
}
|
|
|
|
*count = 0
|
|
c := bucket.Cursor()
|
|
for k, v := c.First(); k != nil; k, v = c.Next() {
|
|
if v == nil {
|
|
continue
|
|
}
|
|
(*count)++
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Count counts all the records of a bucket
|
|
func (s *DB) Count(data interface{}) (int, error) {
|
|
return s.root.Count(data)
|
|
}
|