func (t CRUD) Delete(row interface{}) error { rowKeys := t.RowKeys() rangeKeys := t.RangeKeys() where := []string{} for _, key := range append(rowKeys, rangeKeys...) { where = append(where, strings.ToLower(fmt.Sprintf("%q", key))+" = ?") } m, ok := r.StructToMap(row) if !ok { panic("Unable to get map from struct during update") } ids := []interface{}{} for _, rowKey := range append(rowKeys, rangeKeys...) { for key, value := range m { if strings.ToLower(key) == strings.ToLower(rowKey) { ids = append(ids, value) break } } } if len(ids) < len(rowKeys)+len(rangeKeys) { return fmt.Errorf("To few key-values to delete row (%d of the required %d)", len(ids), len(rowKeys)+len(rangeKeys)) } err := t.Query(fmt.Sprintf(`DELETE FROM %q.%q WHERE %s`, t.Keyspace().Name(), t.Name(), strings.Join(where, " AND ")), ids...).Exec() if err != nil { return err } return nil }
func (t CRUD) Update(row interface{}) error { rowKeys := t.RowKeys() rangeKeys := t.RangeKeys() where := []string{} for _, key := range append(rowKeys, rangeKeys...) { where = append(where, strings.ToLower(fmt.Sprintf("%q", key))+" = ?") } m, ok := r.StructToMap(row) if !ok { panic("Unable to get map from struct during update") } ids := []interface{}{} set := []string{} vals := []interface{}{} for _, rowKey := range append(rowKeys, rangeKeys...) { for key, value := range m { if strings.ToLower(key) == strings.ToLower(rowKey) { ids = append(ids, value) break } } } for key, value := range m { isAKey := false for _, rowKey := range append(rowKeys, rangeKeys...) { if strings.ToLower(key) == strings.ToLower(rowKey) { isAKey = true break } } if !isAKey { set = append(set, strings.ToLower(fmt.Sprintf("%q", key))+" = ?") vals = append(vals, value) } } if len(ids) < len(rowKeys)+len(rangeKeys) { return fmt.Errorf("To few key-values to update row (%d of the required minimum of %d)", len(ids), len(rowKeys)+len(rangeKeys)) } err := t.Query(fmt.Sprintf(`UPDATE %q.%q SET %s WHERE %s`, t.Keyspace().Name(), t.Name(), strings.Join(set, ", "), strings.Join(where, " AND ")), append(vals, ids...)...).Exec() if err != nil { return err } return nil }
func (t CRUD) insert(row interface{}, ttl *time.Time) error { rowKeys := t.RowKeys() rangeKeys := t.RangeKeys() // TODO: Test and remove // where := []string{} // for _, key := range append(rowKeys, rangeKeys...) { // where = append(where, key+" = ?") // } m, ok := r.StructToMap(row) if !ok { panic("Unable to get map from struct during update") } fields := []string{} placeholders := []string{} vals := []interface{}{} for key, value := range m { // Check for empty row- or range keys for _, rowKey := range append(rowKeys, rangeKeys...) { if strings.ToLower(key) == strings.ToLower(rowKey) { if value == nil { return fmt.Errorf("Inserting row failed due to missing key value (for key %q)", rowKey) } break } } // Append to insertion slices fields = append(fields, strings.ToLower(fmt.Sprintf("%q", key))) placeholders = append(placeholders, "?") vals = append(vals, value) } options := "" if ttl != nil { options = "USING TTL ?" vals = append(vals, int(ttl.Sub(time.Now().UTC()).Seconds()+.5)) } err := t.Query(fmt.Sprintf(`INSERT INTO %q.%q (%s) VALUES (%s) %s`, t.Keyspace().Name(), t.Name(), strings.Join(fields, ", "), strings.Join(placeholders, ", "), options), vals...).Exec() if err != nil { for _, v := range vals { log.Printf("%T %v", v, v) } return err } return nil }
func (t Table) create(props ...string) error { if t.session == nil { t.session = defaultSession } rowKeys := t.RowKeys() rangeKeys := t.RangeKeys() pkString := "PRIMARY KEY ((" + strings.Join(rowKeys, ", ") + ")" if len(rangeKeys) > 0 { pkString = pkString + ", " + strings.Join(rangeKeys, ", ") } pkString = pkString + ")" fields := []string{} m, ok := r.StructToMap(t.Row()) if !ok { panic("Unable to get map from struct during create table") } si, _ := r.TypeMap.Get(t.Row()) for key, value := range m { key = strings.ToLower(key) typ, err := stringTypeOf(value, si.FieldsMap[key]) if err != nil { return err } fields = append(fields, fmt.Sprintf(`%q %v`, key, typ)) } // Add primary key value to fields list fields = append(fields, pkString) propertiesString := "" if len(props) > 0 { propertiesString = "WITH " + strings.Join(props, " AND ") } return t.session.Query(fmt.Sprintf(`CREATE TABLE %q.%q (%s) %s`, t.Keyspace().Name(), t.Name(), strings.Join(fields, ", "), propertiesString)).Exec() }