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.
 
 
 
 
 

123 lines
2.9 KiB

package arango_db
import (
"context"
"fmt"
driver "github.com/arangodb/go-driver"
)
type Collection struct {
db driver.Database
driver.Collection
ctx context.Context
}
// Добавление коллекции
func NewCollection(ctx context.Context, db driver.Database, name string) (*Collection, error) {
collExists, errExists := db.CollectionExists(ctx, name)
if errExists != nil {
return nil, fmt.Errorf("AddCollection: Error checking the existence of the collection: %v", errExists)
}
// Предварительно проверим существование коллекции с таким же наименованием
if collExists {
col, err := db.Collection(ctx, name)
if err != nil {
return nil, fmt.Errorf("AddCollection: failed to open existing collection %v: %v", name, err)
}
return &Collection{
db,
col,
ctx,
}, nil
}
// Создадим коллекцию
col, err := db.CreateCollection(ctx, name, nil)
if err != nil {
return nil, fmt.Errorf("AddCollection: failed to create collection %v: %v", name, err)
}
return &Collection{
db,
col,
ctx,
}, nil
}
// Добавление данных коллекции
func (col *Collection) AddData(data interface{}) error {
_, errs, err := col.CreateDocuments(col.ctx, data)
if err != nil {
return fmt.Errorf("AddData: %v", err)
} else if err := errs.FirstNonNil(); err != nil {
return fmt.Errorf("AddData: first error: %v", err)
}
return nil
}
// Получение элементов коллекции
func (col *Collection) GetData(query string) (func() (interface{}, error), error) {
cursor, err := col.db.Query(col.ctx, query, nil)
if err != nil {
return nil, fmt.Errorf("GetData: query '%v' failed: %v", query, err)
}
return func() (interface{}, error) {
var doc interface{}
/*metadata*/
_, errRead := cursor.ReadDocument(col.ctx, &doc)
if driver.IsNoMoreDocuments(errRead) {
cursor.Close()
return nil, fmt.Errorf("empty")
} else if errRead != nil {
return nil, fmt.Errorf("GetData: read document %v error %v", query, errRead)
}
return doc, nil
}, nil
}
// Изменение коллекции
func (col *Collection) UpdateData(query string, patch interface{}) error {
cursor, err := col.db.Query(col.ctx, query, nil)
if err != nil {
return fmt.Errorf("GetData: query '%v' failed: %v", query, err)
}
var doc map[string]interface{}
/*metadata*/
_, errRead := cursor.ReadDocument(col.ctx, &doc)
if driver.IsNoMoreDocuments(errRead) {
cursor.Close()
return fmt.Errorf("empty")
} else if errRead != nil {
return fmt.Errorf("UpdateData: read document %v error %v", query, errRead)
}
//
k, ok := doc["_key"]
if !ok {
return fmt.Errorf("UpdateData: key not found in %v", doc)
}
//
_, errUpdate := col.UpdateDocument(col.ctx, k.(string), patch)
if errUpdate != nil {
return fmt.Errorf("UpdateData: update error %v", errUpdate)
}
return nil
}
/*
patch := map[string]interface{}{
"name": "Frank",
}
*/