aboutsummaryrefslogtreecommitdiff
path: root/examples/redis-unstable/tests/modules/rdbloadsave.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/redis-unstable/tests/modules/rdbloadsave.c')
-rw-r--r--examples/redis-unstable/tests/modules/rdbloadsave.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/examples/redis-unstable/tests/modules/rdbloadsave.c b/examples/redis-unstable/tests/modules/rdbloadsave.c
new file mode 100644
index 0000000..687269a
--- /dev/null
+++ b/examples/redis-unstable/tests/modules/rdbloadsave.c
@@ -0,0 +1,162 @@
1#include "redismodule.h"
2
3#include <stdlib.h>
4#include <unistd.h>
5#include <fcntl.h>
6#include <memory.h>
7#include <errno.h>
8
9/* Sanity tests to verify inputs and return values. */
10int sanity(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
11 REDISMODULE_NOT_USED(argv);
12 REDISMODULE_NOT_USED(argc);
13
14 RedisModuleRdbStream *s = RedisModule_RdbStreamCreateFromFile("dbnew.rdb");
15
16 /* NULL stream should fail. */
17 if (RedisModule_RdbLoad(ctx, NULL, 0) == REDISMODULE_OK || errno != EINVAL) {
18 RedisModule_ReplyWithError(ctx, strerror(errno));
19 goto out;
20 }
21
22 /* Invalid flags should fail. */
23 if (RedisModule_RdbLoad(ctx, s, 188) == REDISMODULE_OK || errno != EINVAL) {
24 RedisModule_ReplyWithError(ctx, strerror(errno));
25 goto out;
26 }
27
28 /* Missing file should fail. */
29 if (RedisModule_RdbLoad(ctx, s, 0) == REDISMODULE_OK || errno != ENOENT) {
30 RedisModule_ReplyWithError(ctx, strerror(errno));
31 goto out;
32 }
33
34 /* Save RDB file. */
35 if (RedisModule_RdbSave(ctx, s, 0) != REDISMODULE_OK || errno != 0) {
36 RedisModule_ReplyWithError(ctx, strerror(errno));
37 goto out;
38 }
39
40 /* Load the saved RDB file. */
41 if (RedisModule_RdbLoad(ctx, s, 0) != REDISMODULE_OK || errno != 0) {
42 RedisModule_ReplyWithError(ctx, strerror(errno));
43 goto out;
44 }
45
46 RedisModule_ReplyWithSimpleString(ctx, "OK");
47
48 out:
49 RedisModule_RdbStreamFree(s);
50 return REDISMODULE_OK;
51}
52
53int cmd_rdbsave(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
54 if (argc != 2) {
55 RedisModule_WrongArity(ctx);
56 return REDISMODULE_OK;
57 }
58
59 size_t len;
60 const char *filename = RedisModule_StringPtrLen(argv[1], &len);
61
62 char tmp[len + 1];
63 memcpy(tmp, filename, len);
64 tmp[len] = '\0';
65
66 RedisModuleRdbStream *stream = RedisModule_RdbStreamCreateFromFile(tmp);
67
68 if (RedisModule_RdbSave(ctx, stream, 0) != REDISMODULE_OK || errno != 0) {
69 RedisModule_ReplyWithError(ctx, strerror(errno));
70 goto out;
71 }
72
73 RedisModule_ReplyWithSimpleString(ctx, "OK");
74
75out:
76 RedisModule_RdbStreamFree(stream);
77 return REDISMODULE_OK;
78}
79
80/* Fork before calling RM_RdbSave(). */
81int cmd_rdbsave_fork(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
82 if (argc != 2) {
83 RedisModule_WrongArity(ctx);
84 return REDISMODULE_OK;
85 }
86
87 size_t len;
88 const char *filename = RedisModule_StringPtrLen(argv[1], &len);
89
90 char tmp[len + 1];
91 memcpy(tmp, filename, len);
92 tmp[len] = '\0';
93
94 int fork_child_pid = RedisModule_Fork(NULL, NULL);
95 if (fork_child_pid < 0) {
96 RedisModule_ReplyWithError(ctx, strerror(errno));
97 return REDISMODULE_OK;
98 } else if (fork_child_pid > 0) {
99 /* parent */
100 RedisModule_ReplyWithSimpleString(ctx, "OK");
101 return REDISMODULE_OK;
102 }
103
104 RedisModuleRdbStream *stream = RedisModule_RdbStreamCreateFromFile(tmp);
105
106 int ret = 0;
107 if (RedisModule_RdbSave(ctx, stream, 0) != REDISMODULE_OK) {
108 ret = errno;
109 }
110 RedisModule_RdbStreamFree(stream);
111
112 RedisModule_ExitFromChild(ret);
113 return REDISMODULE_OK;
114}
115
116int cmd_rdbload(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
117 if (argc != 2) {
118 RedisModule_WrongArity(ctx);
119 return REDISMODULE_OK;
120 }
121
122 size_t len;
123 const char *filename = RedisModule_StringPtrLen(argv[1], &len);
124
125 char tmp[len + 1];
126 memcpy(tmp, filename, len);
127 tmp[len] = '\0';
128
129 RedisModuleRdbStream *stream = RedisModule_RdbStreamCreateFromFile(tmp);
130
131 if (RedisModule_RdbLoad(ctx, stream, 0) != REDISMODULE_OK || errno != 0) {
132 RedisModule_RdbStreamFree(stream);
133 RedisModule_ReplyWithError(ctx, strerror(errno));
134 return REDISMODULE_OK;
135 }
136
137 RedisModule_RdbStreamFree(stream);
138 RedisModule_ReplyWithSimpleString(ctx, "OK");
139 return REDISMODULE_OK;
140}
141
142int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
143 REDISMODULE_NOT_USED(argv);
144 REDISMODULE_NOT_USED(argc);
145
146 if (RedisModule_Init(ctx, "rdbloadsave", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR)
147 return REDISMODULE_ERR;
148
149 if (RedisModule_CreateCommand(ctx, "test.sanity", sanity, "", 0, 0, 0) == REDISMODULE_ERR)
150 return REDISMODULE_ERR;
151
152 if (RedisModule_CreateCommand(ctx, "test.rdbsave", cmd_rdbsave, "", 0, 0, 0) == REDISMODULE_ERR)
153 return REDISMODULE_ERR;
154
155 if (RedisModule_CreateCommand(ctx, "test.rdbsave_fork", cmd_rdbsave_fork, "", 0, 0, 0) == REDISMODULE_ERR)
156 return REDISMODULE_ERR;
157
158 if (RedisModule_CreateCommand(ctx, "test.rdbload", cmd_rdbload, "", 0, 0, 0) == REDISMODULE_ERR)
159 return REDISMODULE_ERR;
160
161 return REDISMODULE_OK;
162}