func newKeyspace(p *namespace, name string) (datastore.Keyspace, errors.Error) { cbNamespace := p.getPool() cbbucket, err := cbNamespace.GetBucket(name) if err != nil { logging.Infof(" keyspace %s not found %v", name, err) // go-couchbase caches the buckets // to be sure no such bucket exists right now // we trigger a refresh p.refresh(true) cbNamespace = p.getPool() // and then check one more time logging.Infof(" Retrying bucket %s", name) cbbucket, err = cbNamespace.GetBucket(name) if err != nil { // really no such bucket exists return nil, errors.NewCbKeyspaceNotFoundError(err, "keyspace "+name) } } if strings.EqualFold(cbbucket.Type, "memcached") { return nil, errors.NewCbBucketTypeNotSupportedError(nil, cbbucket.Type) } rv := &keyspace{ namespace: p, name: name, cbbucket: cbbucket, } // Initialize index providers rv.viewIndexer = newViewIndexer(rv) logging.Infof("Created New Bucket %s", name) //discover existing indexes if ierr := rv.loadIndexes(); ierr != nil { logging.Warnf("Error loading indexes for keyspace %s, Error %v", name, ierr) } var qerr errors.Error rv.gsiIndexer, qerr = gsi.NewGSIIndexer(p.site.URL(), p.Name(), name) if qerr != nil { logging.Warnf("Error loading GSI indexes for keyspace %s. Error %v", name, qerr) } return rv, nil }
func (b *keyspace) performOp(op int, inserts []datastore.Pair) ([]datastore.Pair, errors.Error) { if len(inserts) == 0 { return nil, errors.NewCbNoKeysInsertError(nil, ":(") } insertedKeys := make([]datastore.Pair, 0) var err error for _, kv := range inserts { key := kv.Key val := kv.Value.Actual() //mv := kv.Value.GetAttachment("meta") // TODO Need to also set meta switch op { case INSERT: var added bool // add the key to the backend added, err = b.cbbucket.Add(key, 0, val) if added == false { err = errors.NewError(err, "For Key "+key) } case UPDATE: // check if the key exists and if so then use the cas value // to update the key var meta map[string]interface{} var cas float64 an := kv.Value.(value.AnnotatedValue) meta = an.GetAttachment("meta").(map[string]interface{}) cas = meta["cas"].(float64) logging.Infof("CAS Value (Update) for key %v is %v", key, float64(cas)) if cas != 0 { err = b.cbbucket.Cas(key, 0, uint64(cas), val) } else { logging.Warnf("Warning: Cas value not found for key %v", key) err = b.cbbucket.Set(key, 0, val) } case UPSERT: err = b.cbbucket.Set(key, 0, val) } if err != nil { logging.Errorf("Failed to perform %s on key %s Error %v", opToString(op), key, err) } else { insertedKeys = append(insertedKeys, kv) } } if len(insertedKeys) == 0 { return nil, errors.NewCbDMLError(err, "Failed to perform "+opToString(op)) } return insertedKeys, nil }