func (client *Client) store(cmd string, item *Item) error { client.lock() defer client.unlock() key := client.addPrefix(item.Key) cKey := C.CString(key) defer C.free(unsafe.Pointer(cKey)) cKeyLen := C.size_t(len(key)) cFlags := C.flags_t(item.Flags) cExptime := C.exptime_t(item.Expiration) cNoreply := C.bool(client.noreply) cValue := C.CString(string(item.Value)) defer C.free(unsafe.Pointer(cValue)) cValueSize := C.size_t(len(item.Value)) var rst **C.message_result_t var n C.size_t var errCode C.int switch cmd { case "set": errCode = C.client_set( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, nil, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) case "add": errCode = C.client_add( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, nil, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) case "replace": errCode = C.client_replace( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, nil, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) case "prepend": errCode = C.client_prepend( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, nil, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) case "append": errCode = C.client_append( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, nil, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) case "cas": cCasUnique := C.cas_unique_t(item.casid) errCode = C.client_cas( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, &cCasUnique, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) } defer C.client_destroy_message_result(client._imp) if errCode == 0 { if client.noreply { return nil } else if int(n) == 1 { switch (*rst).type_ { case C.MSG_STORED: return nil case C.MSG_NOT_STORED: return ErrNotStored case C.MSG_EXISTS: return ErrCASConflict case C.MSG_NOT_FOUND: return ErrCacheMiss } } } else if errCode == C.RET_INVALID_KEY_ERR { return ErrMalformedKey } return networkError(errorMessage[errCode]) }
func (client *Client) store(cmd string, item *Item) error { client.lock() defer client.unlock() key := client.addPrefix(item.Key) cKey := C.CString(key) defer C.free(unsafe.Pointer(cKey)) cKeyLen := C.size_t(len(key)) cFlags := C.flags_t(item.Flags) cExptime := C.exptime_t(item.Expiration) cNoreply := C.bool(client.noreply) cValue := C.CString(string(item.Value)) defer C.free(unsafe.Pointer(cValue)) cValueSize := C.size_t(len(item.Value)) var rst **C.message_result_t var n C.size_t var errCode C.int switch cmd { case "set": errCode = C.client_set( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, nil, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) case "add": errCode = C.client_add( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, nil, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) case "replace": errCode = C.client_replace( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, nil, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) case "prepend": errCode = C.client_prepend( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, nil, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) case "append": errCode = C.client_append( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, nil, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) case "cas": cCasUnique := C.cas_unique_t(item.casid) errCode = C.client_cas( client._imp, &cKey, &cKeyLen, &cFlags, cExptime, &cCasUnique, cNoreply, &cValue, &cValueSize, 1, &rst, &n, ) } defer C.client_destroy_message_result(client._imp) if errCode == 0 { if client.noreply { return nil } else if int(n) == 1 && (*rst).type_ == C.MSG_STORED { return nil } } return errors.New(errorMessage[errCode]) }