func (self *Dh) RemoveForeverByConditions(conditions interface{}) api.Err { var res db.Result var errs api.Err res = Collection.Find(conditions) exist, err := res.Count() if exist == 0 { errs.Push(api.Msg{ Field: "Delete: ", Error: api.ErrNoSuchRow, }) return errs } err = res.Remove() if err == nil { return errs } else { errs.Push(api.Msg{ Field: "Database delete error: ", Error: err.Error(), }) } return errs }
func (self *Dh) Delete() api.Err { var res db.Result var errs api.Err id := reflect.ValueOf(self.Model).Elem().FieldByName("Id").Interface().(int64) res = Collection.Find(db.Cond{"id": id}) exist, err := res.Count() if exist == 0 { errs.Push(api.Msg{ Field: "Delete: ", Error: api.ErrNoSuchRow, }) return errs } err = res.Remove() if err == nil { return errs } else { errs.Push(api.Msg{ Field: "Database delete error: ", Error: err.Error(), }) } return errs }
// Attempts to delete previously added rows. func TestRemove(t *testing.T) { var err error var res db.Result var sess db.Database var artist db.Collection if sess, err = db.Open(Adapter, settings); err != nil { t.Fatal(err) } defer sess.Close() if artist, err = sess.Collection("artist"); err != nil { t.Fatal(err) } // Getting the artist with id = 1 res = artist.Find(db.Cond{"id": 1}) // Trying to remove the row. if err = res.Remove(); err != nil { t.Fatal(err) } }
func TestFibonacci(t *testing.T) { var err error var res db.Result var total uint64 for _, wrapper := range wrappers { if settings[wrapper] == nil { t.Fatalf(`No such settings entry for wrapper %s.`, wrapper) } else { var sess db.Database sess, err = db.Open(wrapper, *settings[wrapper]) if err != nil { t.Fatalf(`Test for wrapper %s failed: %q`, wrapper, err) } defer sess.Close() var col db.Collection col, err = sess.Collection("fibonacci") if err != nil { if wrapper == `mongo` && err == db.ErrCollectionDoesNotExist { // Expected error with mongodb. } else { t.Fatalf(`Could not use collection with wrapper %s: %q`, wrapper, err) } } // Adding some items. var i uint64 for i = 0; i < 10; i++ { item := fibonacci{Input: i, Output: fib(i)} _, err = col.Append(item) if err != nil { t.Fatalf(`Could not append item with wrapper %s: %q`, wrapper, err) } } // Testing sorting by function. res = col.Find( // 5, 6, 7, 3 db.Or{ db.And{ db.Cond{"input >=": 5}, db.Cond{"input <=": 7}, }, db.Cond{"input": 3}, }, ) // Testing sort by function. switch wrapper { case `postgresql`: res = res.Sort(db.Raw{`RANDOM()`}) case `sqlite`: res = res.Sort(db.Raw{`RANDOM()`}) case `mysql`: res = res.Sort(db.Raw{`RAND()`}) } total, err = res.Count() if err != nil { t.Fatalf(`%s: %q`, wrapper, err) } if total != 4 { t.Fatalf("%s: Expecting a count of 4, got %d.", wrapper, total) } // Find() with IN/$in var whereIn db.Cond switch wrapper { case `mongo`: whereIn = db.Cond{"input": db.Func{"$in", []int{3, 5, 6, 7}}} default: whereIn = db.Cond{"input": db.Func{"IN", []int{3, 5, 6, 7}}} } res = col.Find(whereIn).Sort("input") total, err = res.Count() if err != nil { t.Fatalf(`%s: %q`, wrapper, err) } if total != 4 { t.Fatalf(`Expecting a count of 4.`) } res = res.Skip(1).Limit(2) for { var item fibonacci err = res.Next(&item) if err == nil { switch item.Input { case 5: case 6: if fib(item.Input) != item.Output { t.Fatalf(`Unexpected value in item with wrapper %s.`, wrapper) } default: t.Fatalf(`Unexpected item: %v with wrapper %s.`, item, wrapper) } } else if err == db.ErrNoMoreRows { break } else { t.Fatalf(`%s: %q`, wrapper, err) } } // Find() with range res = col.Find( // 5, 6, 7, 3 db.Or{ db.And{ db.Cond{"input >=": 5}, db.Cond{"input <=": 7}, }, db.Cond{"input": 3}, }, ).Sort("-input") if total, err = res.Count(); err != nil { t.Fatalf(`%s: %q`, wrapper, err) } if total != 4 { t.Fatalf(`Expecting a count of 4.`) } // Skipping. res = res.Skip(1).Limit(2) for { var item fibonacci err = res.Next(&item) if err == nil { switch item.Input { case 5: case 6: if fib(item.Input) != item.Output { t.Fatalf(`Unexpected value in item with wrapper %s.`, wrapper) } default: t.Fatalf(`Unexpected item: %v with wrapper %s.`, item, wrapper) } } else if err == db.ErrNoMoreRows { break } else { t.Fatalf(`%s: %q`, wrapper, err) } } if err = res.Remove(); err != nil { t.Fatalf(`%s: %q`, wrapper, err) } if total, err = res.Count(); err != nil { t.Fatalf(`%s: %q`, wrapper, err) } if total != 0 { t.Fatalf(`%s: Unexpected count %d.`, wrapper, total) } res = col.Find() total, err = res.Count() if total != 6 { t.Fatalf(`%s: Unexpected count %d.`, wrapper, total) } var items []fibonacci err = res.All(&items) if err != nil { t.Fatalf(`%s: %q`, wrapper, err) } for _, item := range items { switch item.Input { case 0: case 1: case 2: case 4: case 8: case 9: if fib(item.Input) != item.Output { t.Fatalf(`Unexpected value in item with wrapper %s.`, wrapper) } default: t.Fatalf(`Unexpected item: %v with wrapper %s.`, item, wrapper) } } err = res.Close() if err != nil { t.Errorf("Failed to close result %s: %q.", wrapper, err) } err = sess.Close() if err != nil { t.Errorf("Failed to close %s: %q.", wrapper, err) } } } }
func TestSimpleCRUD(t *testing.T) { var err error var controlItem birthday for _, wrapper := range wrappers { if settings[wrapper] == nil { t.Fatalf(`No such settings entry for wrapper %s.`, wrapper) } else { var sess db.Database sess, err = db.Open(wrapper, *settings[wrapper]) if err != nil { t.Fatalf(`Test for wrapper %s failed: %q`, wrapper, err) } defer sess.Close() born := time.Date(1941, time.January, 5, 0, 0, 0, 0, time.Local) controlItem = birthday{ Name: "Hayao Miyazaki", Born: born, BornUT: &timeType{born}, } col, err := sess.Collection(`birthdays`) if err != nil { if wrapper == `mongo` && err == db.ErrCollectionDoesNotExist { // Expected error with mongodb. } else { t.Fatalf(`Could not use collection with wrapper %s: %q`, wrapper, err) } } var id interface{} if id, err = col.Append(controlItem); err != nil { t.Fatalf(`Could not append item with wrapper %s: %q`, wrapper, err) } var res db.Result switch wrapper { case `mongo`: res = col.Find(db.Cond{"_id": id.(bson.ObjectId)}) case `ql`: res = col.Find(db.Cond{"id()": id}) default: res = col.Find(db.Cond{"id": id}) } var total uint64 total, err = res.Count() if total != 1 { t.Fatalf("%s: Expecting one row.", wrapper) } // No support for Marshaler and Unmarshaler is implemeted for QL and // MongoDB. if wrapper == `ql` || wrapper == `mongo` { continue } var testItem birthday err = res.One(&testItem) if err != nil { t.Fatalf("%s One(): %s", wrapper, err) } if reflect.DeepEqual(testItem, controlItem) == false { t.Errorf("%s: testItem: %v (ts: %v)\n", wrapper, testItem, testItem.BornUT.value.Unix()) t.Errorf("%s: controlItem: %v (ts: %v)\n", wrapper, controlItem, controlItem.BornUT.value.Unix()) t.Fatalf("%s: Structs are different", wrapper) } var testItems []birthday err = res.All(&testItems) if err != nil { t.Fatalf("%s All(): %s", wrapper, err) } if len(testItems) == 0 { t.Fatalf("%s All(): Expecting at least one row.", wrapper) } for _, testItem = range testItems { if reflect.DeepEqual(testItem, controlItem) == false { t.Errorf("%s: testItem: %v\n", wrapper, testItem) t.Errorf("%s: controlItem: %v\n", wrapper, controlItem) t.Fatalf("%s: Structs are different", wrapper) } } controlItem.Name = `宮崎駿` err = res.Update(controlItem) if err != nil { t.Fatalf(`Could not update with wrapper %s: %q`, wrapper, err) } res.One(&testItem) if reflect.DeepEqual(testItem, controlItem) == false { t.Fatalf("Struct is different with wrapper %s.", wrapper) } err = res.Remove() if err != nil { t.Fatalf(`Could not remove with wrapper %s: %q`, wrapper, err) } total, err = res.Count() if total != 0 { t.Fatalf(`Expecting no items %s: %q`, wrapper, err) } err = res.Close() if err != nil { t.Errorf("Failed to close result %s: %q.", wrapper, err) } err = sess.Close() if err != nil { t.Errorf("Failed to close %s: %q.", wrapper, err) } } } }
func TestSimpleCRUD(t *testing.T) { var err error var controlItem Birthday for _, wrapper := range wrappers { if settings[wrapper] == nil { t.Fatalf(`No such settings entry for wrapper %s.`, wrapper) } else { var sess db.Database sess, err = db.Open(wrapper, *settings[wrapper]) if err != nil { t.Fatalf(`Test for wrapper %s failed: %s`, wrapper, err.Error()) } controlItem = Birthday{ Name: "Hayao Miyazaki", Born: time.Date(1941, time.January, 5, 0, 0, 0, 0, time.Local), } col, err := sess.Collection(`birthdays`) if err != nil { if wrapper == `mongo` && err == db.ErrCollectionDoesNotExists { // Expected error with mongodb. } else { t.Fatalf(`Could not use collection with wrapper %s: %s`, wrapper, err.Error()) } } var id interface{} id, err = col.Append(controlItem) if err != nil { t.Fatalf(`Could not append item with wrapper %s: %s`, wrapper, err.Error()) } var res db.Result if wrapper == `mongo` { res = col.Find(db.Cond{"_id": id}) } else { res = col.Find(db.Cond{"id": id}) } var testItem Birthday res.One(&testItem) if reflect.DeepEqual(testItem, controlItem) == false { t.Errorf("Struct is different with wrapper %s.", wrapper) } controlItem.Name = `宮崎駿` err = res.Update(controlItem) if err != nil { t.Fatalf(`Could not update with wrapper %s: %s`, wrapper, err.Error()) } res.One(&testItem) if reflect.DeepEqual(testItem, controlItem) == false { t.Errorf("Struct is different with wrapper %s.", wrapper) } err = res.Remove() if err != nil { t.Fatalf(`Could not update with wrapper %s: %s`, wrapper, err.Error()) } var total uint64 total, err = res.Count() if total != 0 { t.Fatalf(`Expecting no items %s: %s`, wrapper, err.Error()) } err = res.Close() if err != nil { t.Errorf("Failed to close result %s: %s.", wrapper, err.Error()) } err = sess.Close() if err != nil { t.Errorf("Failed to close %s: %s.", wrapper, err.Error()) } } } }