// GetMulti will return a map of multi values func (client *Client) GetMulti(keys []string) (rv map[string]*Item, err error) { client.lock() defer client.unlock() nKeys := len(keys) var rawKeys []string if len(client.prefix) == 0 { rawKeys = keys } else { rawKeys = make([]string, len(keys)) for i, key := range keys { rawKeys[i] = client.addPrefix(key) } } cKeys := make([]*C.char, nKeys) cKeyLens := make([]C.size_t, nKeys) cNKeys := C.size_t(nKeys) for i, rawKey := range rawKeys { cKey := C.CString(rawKey) defer C.free(unsafe.Pointer(cKey)) cKeyLen := C.size_t(len(rawKey)) cKeys[i] = cKey cKeyLens[i] = cKeyLen } var rst **C.retrieval_result_t var n C.size_t errCode := C.client_get(client._imp, &cKeys[0], &cKeyLens[0], cNKeys, &rst, &n) defer C.client_destroy_retrieval_result(client._imp) if errCode != 0 { err = errors.New(errorMessage[errCode]) return } if int(n) == 0 { return } sr := unsafe.Sizeof(*rst) rv = make(map[string]*Item, int(n)) for i := 0; i < int(n); i++ { rawKey := C.GoStringN((*rst).key, C.int((*rst).key_len)) dataBlock := C.GoBytes(unsafe.Pointer((*rst).data_block), C.int((*rst).bytes)) flags := uint32((*rst).flags) key := client.removePrefix(rawKey) rv[key] = &Item{Key: key, Value: dataBlock, Flags: flags} rst = (**C.retrieval_result_t)(unsafe.Pointer(uintptr(unsafe.Pointer(rst)) + sr)) } return }
func (client *Client) getOrGets(cmd string, key string) (item *Item, err error) { client.lock() defer client.unlock() rawKey := client.addPrefix(key) cKey := C.CString(rawKey) defer C.free(unsafe.Pointer(cKey)) cKeyLen := C.size_t(len(rawKey)) var rst **C.retrieval_result_t var n C.size_t var errCode C.int switch cmd { case "get": errCode = C.client_get(client._imp, &cKey, &cKeyLen, 1, &rst, &n) case "gets": errCode = C.client_gets(client._imp, &cKey, &cKeyLen, 1, &rst, &n) } defer C.client_destroy_retrieval_result(client._imp) if errCode != 0 { if errCode == C.RET_INVALID_KEY_ERR { err = ErrMalformedKey } else { err = networkError(errorMessage[errCode]) } return } if int(n) == 0 { err = ErrCacheMiss return } dataBlock := C.GoBytes(unsafe.Pointer((*rst).data_block), C.int((*rst).bytes)) flags := uint32((*rst).flags) if cmd == "get" { item = &Item{Key: key, Value: dataBlock, Flags: flags} return } casid := uint64((*rst).cas_unique) item = &Item{Key: key, Value: dataBlock, Flags: flags, casid: casid} return }