1 /* check-sources:disable-copyright-check */
2 /*
3  * get ID with a provided buffer
4  */
5 
6 #include <droplet.h>
7 #include <assert.h>
8 
main(int argc,char ** argv)9 int main(int argc, char** argv)
10 {
11   int ret;
12   dpl_ctx_t* ctx;
13   dpl_dict_t* metadata = NULL;
14   char* data_buf = NULL;
15   size_t data_len;
16   char* data_buf_returned = NULL;
17   u_int data_len_returned;
18   dpl_dict_t* metadata_returned = NULL;
19   dpl_dict_var_t* metadatum = NULL;
20   dpl_option_t option;
21   dpl_sysmd_t sysmd;
22   char* force_id = NULL;
23 
24   if (2 == argc) {
25     force_id = argv[1];
26   } else if (1 != argc) {
27     fprintf(stderr, "usage: idtest [id]\n");
28     ret = 1;
29     goto end;
30   }
31 
32   ret = dpl_init();  // init droplet library
33   if (DPL_SUCCESS != ret) {
34     fprintf(stderr, "dpl_init failed\n");
35     ret = 1;
36     goto end;
37   }
38 
39   // open default profile
40   ctx = dpl_ctx_new(NULL,   // droplet directory, default: "~/.droplet"
41                     NULL);  // droplet profile, default:   "default"
42   if (NULL == ctx) {
43     fprintf(stderr, "dpl_ctx_new failed\n");
44     ret = 1;
45     goto free_dpl;
46   }
47 
48   // ctx->trace_level = ~0;
49   // ctx->trace_buffers = 1;
50 
51   data_len = 10000;
52   data_buf = malloc(data_len);
53   if (NULL == data_buf) {
54     fprintf(stderr, "alloc data failed\n");
55     ret = 1;
56     goto free_all;
57   }
58 
59   memset(data_buf, 'z', data_len);
60 
61   metadata = dpl_dict_new(13);
62   if (NULL == metadata) {
63     fprintf(stderr, "dpl_dict_new failed\n");
64     ret = 1;
65     goto free_all;
66   }
67 
68   ret = dpl_dict_add(metadata, "foo", "bar", 0);
69   if (DPL_SUCCESS != ret) {
70     fprintf(stderr, "dpl_dict_add failed\n");
71     ret = 1;
72     goto free_all;
73   }
74 
75   ret = dpl_dict_add(metadata, "foo2", "qux", 0);
76   if (DPL_SUCCESS != ret) {
77     fprintf(stderr, "dpl_dict_add failed\n");
78     ret = 1;
79     goto free_all;
80   }
81 
82   /**/
83 
84   fprintf(stderr, "setting object+MD\n");
85 
86   if (force_id) {
87     // we have a broken cloud storage with no POST
88     ret = dpl_put_id(ctx,            // the context
89                      NULL,           // no bucket
90                      force_id,       // the id
91                      NULL,           // no option
92                      DPL_FTYPE_REG,  // regular object
93                      NULL,           // no condition
94                      NULL,           // no range
95                      metadata,       // the metadata
96                      NULL,           // no sysmd
97                      data_buf,       // object body
98                      data_len);      // object length
99     if (DPL_SUCCESS != ret) {
100       fprintf(stderr, "dpl_put_id failed: %s (%d)\n", dpl_status_str(ret), ret);
101       ret = 1;
102       goto free_all;
103     }
104 
105     // emulate returned sysmd
106     memset(&sysmd, 0, sizeof(sysmd));
107     strncpy(sysmd.id, force_id, sizeof(sysmd.id));
108   } else {
109     ret = dpl_post_id(ctx,            // the context
110                       NULL,           // no bucket
111                       NULL,           // no id
112                       NULL,           // no option
113                       DPL_FTYPE_REG,  // regular object
114                       NULL,           // condition
115                       NULL,           // range
116                       metadata,       // the metadata
117                       NULL,           // no sysmd
118                       data_buf,       // object body
119                       data_len,       // object length
120                       NULL,           // no query params
121                       &sysmd);        // the returned sysmd
122     if (DPL_SUCCESS != ret) {
123       fprintf(stderr, "dpl_post_id failed: %s (%d)\n", dpl_status_str(ret),
124               ret);
125       ret = 1;
126       goto free_all;
127     }
128 
129     if (!(sysmd.mask & DPL_SYSMD_MASK_ID)) {
130       fprintf(stderr, "backend is not capable of retrieving resource id\n");
131       exit(1);
132     }
133 
134     fprintf(stderr, "id=%s\n", sysmd.id);
135   }
136 
137   /**/
138 
139   fprintf(stderr, "getting object+MD\n");
140 
141   option.mask = DPL_OPTION_NOALLOC;  // provide buffer
142   data_buf_returned = malloc(data_len);
143   if (NULL == data_buf_returned) {
144     fprintf(stderr, "malloc failed\n");
145     exit(1);
146   }
147   data_len_returned = data_len;
148 
149   ret = dpl_get_id(ctx,                 // the context
150                    NULL,                // no bucket
151                    sysmd.id,            // the key
152                    &option,             // options
153                    DPL_FTYPE_REG,       // object type
154                    NULL,                // no condition
155                    NULL,                // no range
156                    &data_buf_returned,  // data object
157                    &data_len_returned,  // data object length
158                    &metadata_returned,  // metadata
159                    NULL);               // sysmd
160   if (DPL_SUCCESS != ret) {
161     fprintf(stderr, "dpl_get_id failed: %s (%d)\n", dpl_status_str(ret), ret);
162     ret = 1;
163     goto free_all;
164   }
165 
166   fprintf(stderr, "checking object\n");
167 
168   if (data_len != data_len_returned) {
169     fprintf(stderr, "data lengths mismatch %d != %ld (orig)\n",
170             data_len_returned, data_len);
171     ret = 1;
172     goto free_all;
173   }
174 
175   if (0 != memcmp(data_buf, data_buf_returned, data_len)) {
176     fprintf(stderr, "data content mismatch\n");
177     ret = 1;
178     goto free_all;
179   }
180 
181   fprintf(stderr, "checking metadata\n");
182 
183   metadatum = dpl_dict_get(metadata_returned, "foo");
184   if (NULL == metadatum) {
185     fprintf(stderr, "missing metadatum\n");
186     ret = 1;
187     goto free_all;
188   }
189 
190   assert(metadatum->val->type == DPL_VALUE_STRING);
191   if (strcmp(dpl_sbuf_get_str(metadatum->val->string), "bar")) {
192     fprintf(stderr, "bad value in metadatum\n");
193     ret = 1;
194     goto free_all;
195   }
196 
197   metadatum = dpl_dict_get(metadata_returned, "foo2");
198   if (NULL == metadatum) {
199     fprintf(stderr, "missing metadatum\n");
200     ret = 1;
201     goto free_all;
202   }
203 
204   assert(metadatum->val->type == DPL_VALUE_STRING);
205   if (strcmp(dpl_sbuf_get_str(metadatum->val->string), "qux")) {
206     fprintf(stderr, "bad value in metadatum\n");
207     ret = 1;
208     goto free_all;
209   }
210 
211   /**/
212 
213   fprintf(stderr, "delete object+MD\n");
214 
215   ret = dpl_delete_id(ctx,              // the context
216                       NULL,             // no bucket
217                       sysmd.id,         // the key
218                       NULL,             // no option
219                       DPL_FTYPE_UNDEF,  // no matter the file type
220                       NULL);            // no condition
221   if (DPL_SUCCESS != ret) {
222     fprintf(stderr, "error deleting object: %s (%d)\n", dpl_status_str(ret),
223             ret);
224     ret = 1;
225     goto free_all;
226   }
227 
228   ret = 0;
229 
230 free_all:
231 
232   if (NULL != metadata_returned) dpl_dict_free(metadata_returned);
233 
234   if (NULL != data_buf_returned) free(data_buf_returned);
235 
236   if (NULL != metadata) dpl_dict_free(metadata);
237 
238   if (NULL != data_buf) free(data_buf);
239 
240   dpl_ctx_free(ctx);  // free context
241 
242 free_dpl:
243   dpl_free();  // free droplet library
244 
245 end:
246   return ret;
247 }
248