HASH.SET key flags field1 value1 [field2 value2 ..] * * Sets 1-4 fields. Returns the same as RedisModule_HashSet(). * Flags is a string of "nxa" where n = NX, x = XX, a = COUNT_ALL. * To delete a field, use the value ":delete:". */
| 19 | * To delete a field, use the value ":delete:". |
| 20 | */ |
| 21 | int hash_set(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { |
| 22 | if (argc < 5 || argc % 2 == 0 || argc > 11) |
| 23 | return RedisModule_WrongArity(ctx); |
| 24 | |
| 25 | RedisModule_AutoMemory(ctx); |
| 26 | RedisModuleKey *key = RedisModule_OpenKey(ctx, argv[1], REDISMODULE_WRITE); |
| 27 | |
| 28 | size_t flags_len; |
| 29 | const char *flags_str = RedisModule_StringPtrLen(argv[2], &flags_len); |
| 30 | int flags = REDISMODULE_HASH_NONE; |
| 31 | for (size_t i = 0; i < flags_len; i++) { |
| 32 | switch (flags_str[i]) { |
| 33 | case 'n': flags |= REDISMODULE_HASH_NX; break; |
| 34 | case 'x': flags |= REDISMODULE_HASH_XX; break; |
| 35 | case 'a': flags |= REDISMODULE_HASH_COUNT_ALL; break; |
| 36 | } |
| 37 | } |
| 38 | |
| 39 | /* Test some varargs. (In real-world, use a loop and set one at a time.) */ |
| 40 | int result; |
| 41 | errno = 0; |
| 42 | if (argc == 5) { |
| 43 | result = RedisModule_HashSet(key, flags, |
| 44 | argv[3], value_or_delete(argv[4]), |
| 45 | NULL); |
| 46 | } else if (argc == 7) { |
| 47 | result = RedisModule_HashSet(key, flags, |
| 48 | argv[3], value_or_delete(argv[4]), |
| 49 | argv[5], value_or_delete(argv[6]), |
| 50 | NULL); |
| 51 | } else if (argc == 9) { |
| 52 | result = RedisModule_HashSet(key, flags, |
| 53 | argv[3], value_or_delete(argv[4]), |
| 54 | argv[5], value_or_delete(argv[6]), |
| 55 | argv[7], value_or_delete(argv[8]), |
| 56 | NULL); |
| 57 | } else if (argc == 11) { |
| 58 | result = RedisModule_HashSet(key, flags, |
| 59 | argv[3], value_or_delete(argv[4]), |
| 60 | argv[5], value_or_delete(argv[6]), |
| 61 | argv[7], value_or_delete(argv[8]), |
| 62 | argv[9], value_or_delete(argv[10]), |
| 63 | NULL); |
| 64 | } else { |
| 65 | return RedisModule_ReplyWithError(ctx, "ERR too many fields"); |
| 66 | } |
| 67 | |
| 68 | /* Check errno */ |
| 69 | if (result == 0) { |
| 70 | if (errno == ENOTSUP) |
| 71 | return RedisModule_ReplyWithError(ctx, REDISMODULE_ERRORMSG_WRONGTYPE); |
| 72 | else |
| 73 | RedisModule_Assert(errno == ENOENT); |
| 74 | } |
| 75 | |
| 76 | return RedisModule_ReplyWithLongLong(ctx, result); |
| 77 | } |
| 78 |
nothing calls this directly
no test coverage detected