func (q *Query) HasPartExec() error { var e error var lastJson []toolkit.M q.ReadFile(&lastJson, q.Connection().(*Connection).filePath) if toolkit.SliceLen(lastJson) > 0 { getWhere := []*dbox.Filter{} for _, v := range q.whereData { getWhere = []*dbox.Filter{v} i := dbox.Find(q.sliceData, getWhere) for idSlice, _ := range q.sliceData { if toolkit.HasMember(i, idSlice) { idata := dbox.Find(lastJson, getWhere) for idx, _ := range lastJson { if toolkit.HasMember(idata, idx) { lastJson[idx] = q.sliceData[idSlice] } } if toolkit.SliceLen(idata) == 0 { lastJson = append(lastJson, q.sliceData[idSlice]) // toolkit.Printf("idata>%v\n", q.sliceData[idSlice]) } } } } q.sliceData = lastJson } e = q.WriteFile(q.sliceData) if e != nil { return errorlib.Error(packageName, modQuery+".Exec", "HasPartExec", e.Error()) } return nil }
func (q *Query) HasPartExec() error { var e error var lastJson []toolkit.M q.ReadFile(&lastJson, q.Connection().(*Connection).filePath) if toolkit.SliceLen(lastJson) > 0 { getWhere := []*dbox.Filter{} for _, v := range q.whereData { getWhere = []*dbox.Filter{v} i := dbox.Find(q.sliceData, getWhere) for idSlice := range q.sliceData { if toolkit.HasMember(i, idSlice) { idata := dbox.Find(lastJson, getWhere) for idx := range lastJson { if toolkit.HasMember(idata, idx) { lastJson[idx] = q.sliceData[idSlice] } } if toolkit.SliceLen(idata) == 0 { lastJson = append(lastJson, q.sliceData[idSlice]) } } } } q.sliceData = lastJson } else { idx := []int{} for _, v := range q.whereData { getWhere := []*dbox.Filter{v} idx = dbox.Find(q.sliceData, getWhere) } // toolkit.Printf("newdata>%v\n", idx) if toolkit.SliceLen(idx) > 1 { newdata := toolkit.M{} for idslice, dataslice := range q.sliceData { if toolkit.HasMember(idx, idslice) { idf, _ := toolkit.IdInfo(dataslice) newdata = q.sliceData[idslice] toolkit.CopyM(&dataslice, &newdata, false, []string{idf}) } } q.sliceData = []toolkit.M{} q.sliceData = append(q.sliceData, newdata) } } e = q.WriteFile(q.sliceData) if e != nil { return errorlib.Error(packageName, modQuery+".Exec", "HasPartExec", e.Error()) } return nil }
func (c *Cursor) ResetFetch() error { if c.where != nil { c.indexes = dbox.Find(c.q.data, c.where) } c.currentIndex = 0 return nil }
func (q *Query) Cursor(in toolkit.M) (dbox.ICursor, error) { var cursor *Cursor setting, e := q.prepare(in) if e != nil { return nil, err.Error(packageName, modQuery, "Cursor", e.Error()) } commandtype := setting.GetString("commandtype") if commandtype != dbox.QueryPartSelect { return nil, err.Error(packageName, modQuery, "Cursor", "Cursor is only working with select command, for "+commandtype+" please use .Exec instead") } e = q.openFile() if e != nil { return nil, err.Error(packageName, modQuery, "Cursor", e.Error()) } //toolkit.Printf("Data count: %d \n", len(q.data)) cursor = newCursor(q) where := setting.Get("where", []*dbox.Filter{}).([]*dbox.Filter) if len(where) > 0 { cursor.where = where cursor.indexes = dbox.Find(q.data, where) } return cursor, nil }
func (q *Query) Cursor(in toolkit.M) (dbox.ICursor, error) { var cursor *Cursor setting, e := q.prepare(in) if e != nil { return nil, err.Error(packageName, modQuery, "Cursor", e.Error()) } commandtype := setting.GetString("commandtype") if commandtype != dbox.QueryPartSelect { return nil, err.Error(packageName, modQuery, "Cursor", "Cursor is only working with select command, for "+commandtype+" please use .Exec instead") } e = q.openFile(commandtype) if e != nil { return nil, err.Error(packageName, modQuery, "Cursor", e.Error()) } cursor = newCursor(q) skip := 0 if skip = setting.Get("skip").(int); skip > 0 { cursor.skip = skip } take := 0 if take = setting.Get("take").(int); take > 0 { cursor.take = take } if sort := setting.Get("sort").([]string); toolkit.SliceLen(sort) > 0 { fb := new(json.FilterBuilder) sorter := fb.SortFetch(sort, q.data) q.data = sorter } cursor.jsonSelect = setting.Get("fields").([]string) var count int count = toolkit.SliceLen(q.data) where := setting.Get("where", []*dbox.Filter{}).([]*dbox.Filter) if len(where) > 0 { cursor.where = where cursor.indexes = dbox.Find(q.data, where) count = toolkit.SliceLen(cursor.indexes) } if count <= skip { count = 0 } else { count -= skip } if count >= take && take > 0 { count = take } cursor.count = count return cursor, nil }
func TestFind(t *testing.T) { ms := []toolkit.M{} for i := 1; i <= 10; i++ { m := toolkit.M{} m.Set("_id", i) m.Set("random", toolkit.RandInt(100)) ms = append(ms, m) } toolkit.Printf("Original Value\n%s\n", toolkit.JsonString(ms)) indexes := dbox.Find(ms, []*dbox.Filter{ //dbox.Or(dbox.Lt("random", 20), dbox.And(dbox.Gte("random", 60), dbox.Lte("random", 70)))}) dbox.And(dbox.Gte("random", 30), dbox.Lte("random", 80))}) records := []toolkit.M{} for _, v := range indexes { records = append(records, ms[v]) } for _, r := range records { toolkit.Printf("Record: %s \n", toolkit.JsonString(r)) } toolkit.Printf("Find %d records of %d records\n", len(indexes), len(ms)) }
func (q *Query) Exec(in toolkit.M) error { setting, e := q.prepare(in) commandType := setting["commandtype"].(string) //toolkit.Printf("Command type: %s\n", commandType) if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType, e.Error()) } if setting.GetString("commandtype") == dbox.QueryPartSelect { return err.Error(packageName, modQuery, "Exec: "+commandType, "Exec is not working with select command, please use .Cursor instead") } q.Lock() defer q.Unlock() var dataM toolkit.M var dataMs []toolkit.M hasData := in.Has("data") dataIsSlice := false data := in.Get("data") if toolkit.IsSlice(data) { dataIsSlice = true e = toolkit.Unjson(toolkit.Jsonify(data), dataMs) if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType, "Data encoding error: "+e.Error()) } } else { dataM, e = toolkit.ToM(data) dataMs = append(dataMs, dataM) if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType, "Data encoding error: "+e.Error()) } } hasWhere := setting.Has("where") where := setting.Get("where", []*dbox.Filter{}).([]*dbox.Filter) if hasWhere && len(where) == 0 { inWhere := in.Get("where") if inWhere == nil { hasWhere = false where = nil } else { if !toolkit.IsSlice(inWhere) { where = append(where, inWhere.(*dbox.Filter)) } else { where = inWhere.([]*dbox.Filter) } } } if hasData && hasWhere == false && toolkit.HasMember([]interface{}{dbox.QueryPartInsert, dbox.QueryPartDelete, dbox.QueryPartUpdate, dbox.QueryPartSave}, commandType) { hasWhere = true //toolkit.Println("check where") if toolkit.IsSlice(data) { ids := []interface{}{} idField := "" if idField == "" { return err.Error(packageName, modQuery, "Exec: "+commandType, "Data send is a slice, but its element has no ID") } dataCount := toolkit.SliceLen(data) for i := 0; i < dataCount; i++ { dataI := toolkit.SliceItem(data, i) if i == 0 { idField = toolkit.IdField(dataI) } ids = append(ids, toolkit.Id(dataI)) } where = []*dbox.Filter{dbox.In(idField, ids)} } else { idfield := "_id" id := toolkit.Id(data) if !toolkit.IsNilOrEmpty(id) { where = []*dbox.Filter{dbox.Eq(idfield, id)} } else { where = nil hasWhere = false } } } /* toolkit.Printf("CommandType: %s HasData: %v HasWhere: %v Where: %s\n", commandType, hasData, hasWhere, toolkit.JsonString(where)) */ e = q.openFile(commandType) //toolkit.Printf(commandType+" Open File, found record: %d\nData:%s\n", len(q.data), toolkit.JsonString(q.data)) if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType, e.Error()) } var indexes []interface{} if hasWhere && commandType != dbox.QueryPartInsert { whereIndex := dbox.Find(q.data, where) indexes = toolkit.ToInterfaceArray(&whereIndex) //toolkit.Printf("Where Index: %s Index:%s\n", toolkit.JsonString(whereIndex), toolkit.JsonString(indexes)) } if commandType == dbox.QueryPartInsert { if !hasData { return err.Error(packageName, modQuery, "Exec: "+commandType, "Data is empty") } if !dataIsSlice { dataMs = []toolkit.M{dataM} } //-- validate for _, datam := range dataMs { idField, idValue := toolkit.IdInfo(datam) toolkit.Serde(dbox.Find(q.data, []*dbox.Filter{dbox.Eq(idField, idValue)}), &indexes, "") if len(indexes) > 0 { return err.Error(packageName, modQuery, "Exec: "+commandType, toolkit.Sprintf("Data %v already exist", idValue)) } } //-- insert the data q.data = append(q.data, dataMs...) } else if commandType == dbox.QueryPartUpdate { //-- valida if !hasData { return err.Error(packageName, modQuery, "Exec: "+commandType, "Data is empty") } var dataUpdate toolkit.M var updateDataIndex int // if it is a slice then we need to update each data passed on its slice isDataSlice := toolkit.IsSlice(data) if isDataSlice == false { isDataSlice = false e = toolkit.Serde(data, &dataUpdate, "") if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType, "Serde data fail"+e.Error()) } } var idField string //toolkit.Printf("Indexes: %s\n", toolkit.JsonString(indexes)) for i, v := range q.data { // update only data that match given inde if toolkit.HasMember(indexes, i) || !hasWhere { if idField == "" { idField = toolkit.IdField(v) if idField == "" { return err.Error(packageName, modQuery, "Exec: "+commandType, "No ID") } } // If dataslice is sent, iterate f if isDataSlice { e = toolkit.Serde(toolkit.SliceItem(data, updateDataIndex), &dataUpdate, "") if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType, "Serde data fail "+e.Error()) } updateDataIndex++ } dataOrigin := q.data[i] toolkit.CopyM(&dataUpdate, &dataOrigin, false, []string{"_id"}) toolkit.Serde(dataOrigin, &v, "") q.data[i] = v } } } else if commandType == dbox.QueryPartDelete { if hasWhere && len(where) > 0 { indexes := dbox.Find(q.data, where) if len(indexes) > 0 { newdata := []toolkit.M{} for index, v := range q.data { partOfIndex := toolkit.HasMember(indexes, index) if partOfIndex == false { newdata = append(newdata, v) } //toolkit.Println("i:", indexes, ", index:", index, ", p.ofIndex: ", partOfIndex, ", data: ", toolkit.JsonString(newdata)) } q.data = newdata } } else { q.data = []toolkit.M{} } //toolkit.Printf("Data now: %s\n", toolkit.JsonString(q.data)) } else if commandType == dbox.QueryPartSave { if !hasData { return err.Error(packageName, modQuery, "Exec: "+commandType, "Data is empty") } var dataMs []toolkit.M var dataM toolkit.M if !toolkit.IsSlice(data) { e = toolkit.Serde(&data, &dataM, "json") if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType+" Serde data fail", e.Error()) } dataMs = append(dataMs, dataM) } else { e = toolkit.Serde(&data, &dataMs, "json") if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType+" Serde data fail", e.Error()) } } //toolkit.Printf("Saving: %s\n", toolkit.JsonString(dataMs)) for _, v := range dataMs { idField, idValue := toolkit.IdInfo(v) indexes := dbox.Find(q.data, []*dbox.Filter{dbox.Eq(idField, idValue)}) if len(indexes) == 0 { q.data = append(q.data, v) } else { dataOrigin := q.data[indexes[0]] //toolkit.Printf("Copy data %s to %s\n", toolkit.JsonString(v), toolkit.JsonString(dataOrigin)) toolkit.CopyM(&v, &dataOrigin, false, []string{idField}) q.data[indexes[0]] = dataOrigin } } } e = q.writeFile() if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType+" Write fail", e.Error()) } return nil }
func (q *Query) Exec(parm toolkit.M) error { var ( e error updatedValue, dataMs []toolkit.M dataM toolkit.M ) filters, e := q.Filters(parm) if e != nil { return errorlib.Error(packageName, modQuery, "Exec", e.Error()) } if parm == nil { parm = toolkit.M{} } data := parm.Get("data", nil) filePath := q.Connection().(*Connection).filePath commandType := filters.Get("cmdType").(string) hasWhere := filters.Has("where") hasCmdType := toolkit.M{} hasData := parm.Has("data") getWhere := filters.Get("where", []*dbox.Filter{}).([]*dbox.Filter) dataIsSlice := toolkit.IsSlice(data) if dataIsSlice { e = toolkit.Unjson(toolkit.Jsonify(data), &dataMs) if e != nil { return errorlib.Error(packageName, modQuery, "Exec: "+commandType, "Data encoding error: "+e.Error()) } for _, v := range dataMs { id := toolkit.Id(v) idF := toolkit.IdField(v) if toolkit.IsNilOrEmpty(id) { return errorlib.Error(packageName, modCursor+".Exec", commandType, "Unable to find ID in slice data") } else { getWhere = []*dbox.Filter{dbox.Eq(idF, id)} } } } else { dataM, e = toolkit.ToM(data) if e != nil { return errorlib.Error(packageName, modQuery, "Exec: "+commandType, "Unable to Map, error: "+e.Error()) } id := toolkit.Id(dataM) if !toolkit.IsNilOrEmpty(id) { getWhere = []*dbox.Filter{dbox.Eq(toolkit.IdField(dataM), id)} } } var dataMaps []toolkit.M q.ReadFile(&dataMaps, filePath) if commandType == dbox.QueryPartInsert { hasCmdType.Set("hasInsert", true) if !hasData { return errorlib.Error(packageName, modCursor+".Exec", commandType, "Sorry data not found!, unable to insert data") } result := dbox.Find(dataMaps, getWhere) if len(result) > 0 { return errorlib.Error(packageName, modCursor+".Exec", commandType, "ID already exist, unable insert data ") } if dataIsSlice { var sliceData []toolkit.M for _, v := range dataMs { sliceData = finUpdateObj(dataMaps, v, "insert") } updatedValue = sliceData } else { updatedValue = finUpdateObj(dataMaps, dataM, "insert") } } else if commandType == dbox.QueryPartUpdate { hasCmdType.Set("hasUpdate", true) if !hasData { return errorlib.Error(packageName, modCursor+".Exec", commandType, "Sorry data not found!, unable to update data") } if hasWhere { var indexes []interface{} whereIndex := dbox.Find(dataMaps, getWhere) indexes = toolkit.ToInterfaceArray(&whereIndex) // toolkit.Printf("whereIndex>%v indexes%v\n", whereIndex, indexes) var dataUpdate toolkit.M var updateDataIndex int isDataSlice := toolkit.IsSlice(data) if isDataSlice == false { isDataSlice = false data, e = toolkit.ToM(data) if e != nil { return errorlib.Error(packageName, modQuery, "Exec: "+commandType, "Serde data fail"+e.Error()) } e = toolkit.Serde(data, &dataUpdate, "") if e != nil { return errorlib.Error(packageName, modQuery, "Exec: "+commandType, "Serde data fail"+e.Error()) } } for i, v := range dataMaps { if toolkit.HasMember(indexes, i) || !hasWhere { if isDataSlice { e = toolkit.Serde(toolkit.SliceItem(data, updateDataIndex), &dataUpdate, "") if e != nil { return errorlib.Error(packageName, modQuery, "Exec: "+commandType, "Serde data fail"+e.Error()) } updateDataIndex++ } dataOrigin := dataMaps[i] toolkit.CopyM(&dataUpdate, &dataOrigin, false, []string{"_id"}) toolkit.Serde(dataOrigin, &v, "") dataMaps[i] = v } } updatedValue = dataMaps } else { updatedValue = finUpdateObj(dataMaps, dataM, "update") } } else if commandType == dbox.QueryPartDelete { hasCmdType.Set("hasDelete", true) // if multi { if hasWhere { result := dbox.Find(dataMaps, getWhere) if len(result) > 0 { for i, v := range dataMaps { if toolkit.HasMember(result, i) == false { updatedValue = append(updatedValue, v) } } } } else { updatedValue = []toolkit.M{} } } else if commandType == dbox.QueryPartSave { hasCmdType.Set("hasSave", true) if !hasData { return errorlib.Error(packageName, modCursor+".Exec", commandType, "Sorry data not found!, unable to update data") } q.dataType = "save" q.whereData = append(q.whereData, getWhere...) q.sliceData = append(q.sliceData, dataM) } if hasCmdType.Has("hasInsert") || hasCmdType.Has("hasUpdate") || hasCmdType.Has("hasDelete") { e = q.WriteFile(updatedValue) if e != nil { return errorlib.Error(packageName, modQuery+".Exec", commandType, e.Error()) } } return nil }
func (q *Query) Cursor(in toolkit.M) (dbox.ICursor, error) { var ( e error dataMaps []toolkit.M ) q.ReadFile(&dataMaps, q.Connection().(*Connection).filePath) cursor := dbox.NewCursor(new(Cursor)) cursor = cursor.SetConnection(q.Connection()) filters, e := q.Filters(in) if e != nil { return nil, errorlib.Error(packageName, modQuery, "Cursor", e.Error()) } commandType := filters.GetString("cmdType") if commandType != dbox.QueryPartSelect { return nil, errorlib.Error(packageName, modQuery, "Cursor", "Cursor is only working with select command, for "+commandType+" please use .Exec instead") } aggregate := false hasWhere := filters.Has("where") hasAggregate := filters.Get("aggregate").(bool) if hasAggregate { aggregate = true } if !aggregate { if hasWhere { // toolkit.Println("where:", toolkit.JsonString(filters.Get("where"))) cursor.(*Cursor).whereFields = filters.Get("where").([]*dbox.Filter) cursor.(*Cursor).isWhere = true cursor.(*Cursor).indexes = dbox.Find(dataMaps, filters.Get("where", []*dbox.Filter{}).([]*dbox.Filter)) } // toolkit.Println("skip:", toolkit.JsonString(filters.Get("skip"))) skip := 0 if skip = filters.Get("skip").(int); skip > 0 { cursor.(*Cursor).skip = skip } // toolkit.Println("take:", toolkit.JsonString(filters.Get("take"))) take := 0 if take = filters.Get("take").(int); take > 0 { cursor.(*Cursor).take = take } if sort := filters.Get("sort").([]string); toolkit.SliceLen(sort) > 0 { fb := new(FilterBuilder) // toolkit.Printf("sorter:%v\n", sort) sorter := fb.SortFetch(sort, dataMaps) cursor.(*Cursor).datas = sorter } else { cursor.(*Cursor).datas = dataMaps } var count int if hasWhere { count = toolkit.SliceLen(cursor.(*Cursor).indexes) } else { count = toolkit.SliceLen(cursor.(*Cursor).datas) } if count <= skip { count = 0 } else { count -= skip } if count >= take && take > 0 { count = take } cursor.(*Cursor).count = count cursor.(*Cursor).jsonSelect = filters.Get("select").([]string) } else { return nil, errorlib.Error(packageName, modQuery, "Cursor", "No Aggregate function") } return cursor, nil }
func (c *Cursor) Fetch(m interface{}, n int, closeWhenDone bool) error { if closeWhenDone { c.Close() } var first, last int dataJson := []toolkit.M{} var datas []toolkit.M toolkit.Unjson(c.readFile, &datas) c.count = len(datas) if n == 0 { last = c.count } else if n > 0 { switch { case c.lastFeteched == 0: last = n c.lastFeteched = n case n > c.lastFeteched || n < c.lastFeteched || n == c.lastFeteched: first = c.lastFeteched last = c.lastFeteched + n c.lastFeteched = last if c.lastFeteched > c.count { if first > c.count { return errorlib.Error(packageName, modCursor, "Fetch", "No more data to fetched!") } last = c.count } // toolkit.Printf("first>%v last>%v lastfetched>%v count>%v\n", first, last, c.lastFeteched, c.count) } } if c.isWhere { i := dbox.Find(datas, c.whereFields) last = len(i) for _, index := range i[first:last] { dataJson = append(dataJson, datas[index]) } } else { dataJson = datas[first:last] } if toolkit.SliceLen(c.jsonSelect) > 0 { var getRemField = toolkit.M{} for _, v := range dataJson { for i, _ := range v { getRemField.Set(i, i) } if c.jsonSelect[0] != "*" { fields := c.removeDuplicatesUnordered(getRemField, c.jsonSelect) for _, field := range fields { v.Unset(field) } } } } e := toolkit.Serde(dataJson, m, "json") if e != nil { return errorlib.Error(packageName, modCursor, "Fetch", e.Error()) } return nil }
func (q *Query) Exec(in toolkit.M) error { setting, e := q.prepare(in) commandType := setting["commandtype"].(string) if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType, e.Error()) } if setting.GetString("commandtype") == dbox.QueryPartSelect { return err.Error(packageName, modQuery, "Exec: "+commandType, "Exec is not working with select command, please use .Cursor instead") } q.Lock() defer q.Unlock() var dataM toolkit.M var dataMs []toolkit.M hasData := in.Has("data") dataIsSlice := false data := in.Get("data") if toolkit.IsSlice(data) { dataIsSlice = true e = toolkit.Unjson(toolkit.Jsonify(data), dataMs) if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType, "Data encoding error: "+e.Error()) } } else { dataM, e = toolkit.ToM(data) dataMs = append(dataMs, dataM) if e != nil { return err.Error(packageName, modQuery, "Exec: "+commandType, "Data encoding error: "+e.Error()) } } hasWhere := in.Has("where") where := in.Get("where", []*dbox.Filter{}).([]*dbox.Filter) if hasData && hasWhere == false && toolkit.HasMember([]interface{}{dbox.QueryPartInsert, dbox.QueryPartUpdate, dbox.QueryPartSave}, commandType) { hasWhere = true if toolkit.IsSlice(data) { ids := []interface{}{} idField := "" if idField == "" { return err.Error(packageName, modQuery, "Exec:"+commandType, "Data send is a slice, but its element has no ID") } dataCount := toolkit.SliceLen(data) for i := 0; i < dataCount; i++ { dataI := toolkit.SliceItem(data, i) if i == 0 { idField = toolkit.IdField(dataI) } ids = append(ids, toolkit.Id(dataI)) } where = []*dbox.Filter{dbox.In(idField, ids)} } else { id := toolkit.Id(data) if toolkit.IsNilOrEmpty(id) { where = []*dbox.Filter{dbox.Eq(toolkit.IdField(id), id)} } else { where = nil hasWhere = false } } } q.openFile() if commandType == dbox.QueryPartInsert { if !hasData { return err.Error(packageName, modQuery, "Exec:"+commandType, "Data is empty") } if dataIsSlice { q.data = append(q.data, dataMs...) } else { q.data = append(q.data, dataM) } } else if commandType == dbox.QueryPartUpdate { if !hasData { return err.Error(packageName, modQuery, "Exec:"+commandType, "Data is empty") } var indexes []interface{} if hasWhere { toolkit.Serde(dbox.Find(q.data, where), &indexes, "") } var dataUpdate toolkit.M var updateDataIndex int isDataSlice := toolkit.IsSlice(data) if isDataSlice == false { isDataSlice = false e = toolkit.Serde(data, &dataUpdate, "") if e != nil { return err.Error(packageName, modQuery, "Exec:"+commandType, "Unable to serialize data. "+e.Error()) } } var idField string for i, v := range q.data { if toolkit.HasMember(indexes, i) || len(indexes) == 0 { if idField == "" { idField = toolkit.IdField(v) if idField == "" { return err.Error(packageName, modQuery, "Exec:"+commandType, "No ID") } } var dataOrigin toolkit.M e = toolkit.Serde(v, &dataOrigin, "") if e != nil { return err.Error(packageName, modQuery, "Exec:"+commandType, "Unable to serialize data origin. "+e.Error()) } if isDataSlice { e = toolkit.Serde(toolkit.SliceItem(data, updateDataIndex), &dataUpdate, "") if e != nil { return err.Error(packageName, modQuery, "Exec:"+commandType, "Unable to serialize data. "+e.Error()) } updateDataIndex++ } for fieldName, fieldValue := range dataUpdate { if fieldName != idField { if dataOrigin.Has(fieldName) { dataOrigin.Set(fieldName, fieldValue) } } } toolkit.Serde(dataOrigin, &v, "") q.data[i] = v } } } else if commandType == dbox.QueryPartDelete { if hasWhere { var indexes []interface{} toolkit.Serde(dbox.Find(q.data, where), &indexes, "") if len(indexes) > 0 { newdata := []toolkit.M{} for index, v := range q.data { if toolkit.HasMember(indexes, index) == false { newdata = append(newdata, v) } } q.data = newdata } } else { q.data = []toolkit.M{} } } else if commandType == dbox.QueryPartSave { if !hasData { return err.Error(packageName, modQuery, "Exec:"+commandType, "Data is empty") } } q.writeFile() return nil }