schema.go 1.73 KB
package db

import (
	"reflect"
	"strings"
)

type Schema struct {
	mgo *MgoColl
	reflectValue *reflect.Value
	reflectType  reflect.Type

	cacheFields map[string]interface{}

	pri interface{}
	schema interface{}
}

func NewSchema(key string, schema interface{}) *Schema {
	s := reflect.ValueOf(schema)
	if s.Kind() == reflect.Ptr {
		s = reflect.ValueOf(schema).Elem()
	}
	sch := &Schema{
		reflectValue: &s,
		reflectType: s.Type(),
		cacheFields: make(map[string]interface{}),
		schema: schema,
	}
	sch.mgo = NewMongoColl(sch)
	sch.pri =  GetBsonD(sch.getPriTag(), key)
	return sch
}

func (s *Schema) GetSchemaType() reflect.Type  {
	return s.reflectType
}

func (s *Schema) GetCollName() string {
	return strings.ToLower(s.GetSchemaType().Name())
}

func (s *Schema) getPriTag() string {
	var pri string
	for i := 0; i < s.reflectType.NumField(); i++ {
		if s.reflectType.Field(i).Tag.Get("pri") == "1" {
			pri = strings.ToLower(s.reflectType.Field(i).Name)
			break
		}
	}
	return pri
}

func (s *Schema) GetPri() interface{} {
	return s.pri
}

func (s *Schema) GetSchema() interface{} {
	return s.schema
}

func (s *Schema) Load() error {
	return s.mgo.Load()
}

func (s *Schema) Create() error {
	_, err := s.mgo.Create()
	return err
}

func (s *Schema) Update() {
	if s.cacheFields != nil {
		s.mgo.UpdateProperties(s.cacheFields)
		s.cacheFields = make(map[string]interface{})
	}
}

func (s *Schema) SetProperty(key string, val interface{}) {
	s.reflectValue.FieldByName(key).Set(reflect.ValueOf(val))
	s.cacheFields[strings.ToLower(key)] = val
}

func (s *Schema) SetProperties(properties map[string]interface{}) {
	for key, val := range properties {
		s.reflectValue.FieldByName(key).Set(reflect.ValueOf(val))
		s.cacheFields[strings.ToLower(key)] = val
	}
}