MCPcopy Create free account
hub / github.com/F-Stack/f-stack / hash_set

Function hash_set

app/redis-6.2.6/tests/modules/hash.c:21–77  ·  view source on GitHub ↗

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:". */

Source from the content-addressed store, hash-verified

19 * To delete a field, use the value ":delete:".
20 */
21int 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

Callers

nothing calls this directly

Calls 1

value_or_deleteFunction · 0.85

Tested by

no test coverage detected