int Ardb::HIncrbyFloat(Context& ctx, RedisCommandFrame& cmd) { double increment, val = 0; if (!GetDoubleValue(ctx, cmd.GetArguments()[2], increment)) { return 0; } ValueObject meta; int err = GetMetaValue(ctx, cmd.GetArguments()[0], HASH_META, meta); CHECK_ARDB_RETURN_VALUE(ctx.reply, err); Data value; Data field(cmd.GetArguments()[1]); if (0 == err) { HashGet(ctx, meta, field, value); if (!value.GetDouble(val)) { fill_error_reply(ctx.reply, "value is not a float or out of range"); return 0; } } val += increment; std::string tmp; fast_dtoa(val, 10, tmp); value.SetString(tmp, false); HashSet(ctx, meta, field, value); fill_str_reply(ctx.reply, tmp); return 0; }
int main() { Hash *h = HashCreateN(1024); HashSet(h, (String) { "abc", 3 }, "def"); printf("%s\n", (char*) HashGet(h, (String) { GC_STRDUP("abc"), 3 })); }
int Ardb::HIncrby(Context& ctx, RedisCommandFrame& cmd) { int64 increment, val = 0; if (!GetInt64Value(ctx, cmd.GetArguments()[2], increment)) { return 0; } ValueObject meta; int err = GetMetaValue(ctx, cmd.GetArguments()[0], HASH_META, meta); CHECK_ARDB_RETURN_VALUE(ctx.reply, err); Data field(cmd.GetArguments()[1]); Data value; if (err == 0) { err = HashGet(ctx, meta, field, value); } if (err == ERR_NOT_EXIST) { value.SetInt64(increment); } else { if (!value.GetInt64(val)) { fill_error_reply(ctx.reply, "value is not a integer or out of range"); return 0; } value.SetInt64(val + increment); } HashSet(ctx, meta, field, value); fill_int_reply(ctx.reply, val + increment); return 0; }
static int Clear(HashTable *ht) { HashIndex HashIdx,*hi; for (hi = first(&HashIdx); hi; hi = next(hi)) HashSet(ht, hi->This->key, hi->This->klen, NULL); return 1; }
static int Remove(HashTable *ht,const void *key,size_t klen) { HashEntry **hep = HashSet(ht,key,klen,NULL); if (hep) return 1; return 0; }
int Ardb::HSet(Context& ctx, RedisCommandFrame& cmd) { ValueObject meta; int err = GetMetaValue(ctx, cmd.GetArguments()[0], HASH_META, meta); CHECK_ARDB_RETURN_VALUE(ctx.reply, err); Data field(cmd.GetArguments()[1]), value(cmd.GetArguments()[2]); HashSet(ctx, meta, field, value); //fill_int_reply(ctx.reply, err); return 0; }
static Object symbolFromCString(string str) { Object oString = makeStringFromCString(str); Object obj = HashGet(symbol_table, oString); if (!obj) { obj = malloc(sizeof(sObject)); obj->type = SYMBOL; obj->value.stringValue = str; obj->print = &printSymbol; obj->eval = &evalSymbol; HashSet(symbol_table, oString, obj); } return obj; }
int Ardb::RenameHash(Context& ctx, DBID srcdb, const std::string& srckey, DBID dstdb, const std::string& dstkey) { Context tmpctx; tmpctx.currentDB = srcdb; ValueObject v; int err = GetMetaValue(tmpctx, srckey, HASH_META, v); CHECK_ARDB_RETURN_VALUE(ctx.reply, err); if (0 != err) { fill_error_reply(ctx.reply, "no such key or some error"); return 0; } if (v.meta.encoding == COLLECTION_ECODING_ZIPMAP) { DelKeyValue(tmpctx, v.key); v.key.encode_buf.Clear(); v.key.db = dstdb; v.key.key = dstkey; v.meta.expireat = 0; SetKeyValue(ctx, v); } else { HashIterator iter; HashIter(ctx, v, "", iter, false); tmpctx.currentDB = dstdb; ValueObject dstmeta; dstmeta.key.type = KEY_META; dstmeta.key.key = dstkey; dstmeta.type = HASH_META; dstmeta.meta.encoding = COLLECTION_ECODING_ZIPMAP; BatchWriteGuard guard(GetKeyValueEngine()); while (iter.Valid()) { HashSet(tmpctx, dstmeta, *(iter.Field()), *(iter.Value())); iter.Next(); } SetKeyValue(tmpctx, dstmeta); tmpctx.currentDB = srcdb; DeleteKey(tmpctx, srckey); } ctx.data_change = true; return 0; }
int Ardb::HSetNX(Context& ctx, RedisCommandFrame& cmd) { ValueObject meta; int err = GetMetaValue(ctx, cmd.GetArguments()[0], HASH_META, meta); CHECK_ARDB_RETURN_VALUE(ctx.reply, err); Data value; Data field(cmd.GetArguments()[1]); err = HashGet(ctx, meta, field, value); if (err == ERR_NOT_EXIST) { value.SetString(cmd.GetArguments()[2], true); HashSet(ctx, meta, field, value); err = 1; } else { err = 0; } fill_int_reply(ctx.reply, err); return 0; }