diff options
Diffstat (limited to 'src/stasis/plugin_anastasis_postgres.c')
-rw-r--r-- | src/stasis/plugin_anastasis_postgres.c | 788 |
1 files changed, 413 insertions, 375 deletions
diff --git a/src/stasis/plugin_anastasis_postgres.c b/src/stasis/plugin_anastasis_postgres.c index 8ee16ad..b78dbdb 100644 --- a/src/stasis/plugin_anastasis_postgres.c +++ b/src/stasis/plugin_anastasis_postgres.c | |||
@@ -81,7 +81,7 @@ struct PostgresClosure | |||
81 | * @param cls closure our `struct Plugin` | 81 | * @param cls closure our `struct Plugin` |
82 | * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure | 82 | * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure |
83 | */ | 83 | */ |
84 | static int | 84 | static enum GNUNET_GenericReturnValue |
85 | postgres_drop_tables (void *cls) | 85 | postgres_drop_tables (void *cls) |
86 | { | 86 | { |
87 | struct PostgresClosure *pg = cls; | 87 | struct PostgresClosure *pg = cls; |
@@ -100,6 +100,416 @@ postgres_drop_tables (void *cls) | |||
100 | 100 | ||
101 | 101 | ||
102 | /** | 102 | /** |
103 | * Initialize tables. | ||
104 | * | ||
105 | * @param cls the `struct PostgresClosure` with the plugin-specific state | ||
106 | * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure | ||
107 | */ | ||
108 | static enum GNUNET_GenericReturnValue | ||
109 | postgres_create_tables (void *cls) | ||
110 | { | ||
111 | struct PostgresClosure *pc = cls; | ||
112 | struct GNUNET_PQ_Context *conn; | ||
113 | |||
114 | conn = GNUNET_PQ_connect_with_cfg (pc->cfg, | ||
115 | "stasis-postgres", | ||
116 | "stasis-", | ||
117 | NULL, | ||
118 | NULL); | ||
119 | if (NULL == conn) | ||
120 | return GNUNET_SYSERR; | ||
121 | GNUNET_PQ_disconnect (conn); | ||
122 | return GNUNET_OK; | ||
123 | } | ||
124 | |||
125 | |||
126 | /** | ||
127 | * Establish connection to the database. | ||
128 | * | ||
129 | * @param cls plugin context | ||
130 | * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure | ||
131 | */ | ||
132 | static enum GNUNET_GenericReturnValue | ||
133 | postgres_connect (void *cls) | ||
134 | { | ||
135 | struct PostgresClosure *pg = cls; | ||
136 | struct GNUNET_PQ_PreparedStatement ps[] = { | ||
137 | GNUNET_PQ_make_prepare ("user_insert", | ||
138 | "INSERT INTO anastasis_user " | ||
139 | "(user_id" | ||
140 | ",expiration_date" | ||
141 | ") VALUES " | ||
142 | "($1, $2);", | ||
143 | 2), | ||
144 | GNUNET_PQ_make_prepare ("do_commit", | ||
145 | "COMMIT", | ||
146 | 0), | ||
147 | GNUNET_PQ_make_prepare ("user_select", | ||
148 | "SELECT" | ||
149 | " expiration_date " | ||
150 | "FROM anastasis_user" | ||
151 | " WHERE user_id=$1" | ||
152 | " FOR UPDATE;", | ||
153 | 1), | ||
154 | GNUNET_PQ_make_prepare ("user_update", | ||
155 | "UPDATE anastasis_user" | ||
156 | " SET " | ||
157 | " expiration_date=$1" | ||
158 | " WHERE user_id=$2;", | ||
159 | 2), | ||
160 | GNUNET_PQ_make_prepare ("recdoc_payment_insert", | ||
161 | "INSERT INTO anastasis_recdoc_payment " | ||
162 | "(user_id" | ||
163 | ",post_counter" | ||
164 | ",amount_val" | ||
165 | ",amount_frac" | ||
166 | ",payment_identifier" | ||
167 | ",creation_date" | ||
168 | ") VALUES " | ||
169 | "($1, $2, $3, $4, $5, $6);", | ||
170 | 6), | ||
171 | GNUNET_PQ_make_prepare ("challenge_payment_insert", | ||
172 | "INSERT INTO anastasis_challenge_payment " | ||
173 | "(truth_uuid" | ||
174 | ",amount_val" | ||
175 | ",amount_frac" | ||
176 | ",payment_identifier" | ||
177 | ",creation_date" | ||
178 | ") VALUES " | ||
179 | "($1, $2, $3, $4, $5);", | ||
180 | 5), | ||
181 | GNUNET_PQ_make_prepare ("truth_payment_insert", | ||
182 | "INSERT INTO anastasis_truth_payment " | ||
183 | "(truth_uuid" | ||
184 | ",amount_val" | ||
185 | ",amount_frac" | ||
186 | ",expiration" | ||
187 | ") VALUES " | ||
188 | "($1, $2, $3, $4);", | ||
189 | 4), | ||
190 | GNUNET_PQ_make_prepare ("recdoc_payment_done", | ||
191 | "UPDATE anastasis_recdoc_payment " | ||
192 | "SET" | ||
193 | " paid=TRUE " | ||
194 | "WHERE" | ||
195 | " payment_identifier=$1" | ||
196 | " AND" | ||
197 | " user_id=$2" | ||
198 | " AND" | ||
199 | " paid=FALSE;", | ||
200 | 2), | ||
201 | GNUNET_PQ_make_prepare ("challenge_refund_update", | ||
202 | "UPDATE anastasis_challenge_payment " | ||
203 | "SET" | ||
204 | " refunded=TRUE " | ||
205 | "WHERE" | ||
206 | " payment_identifier=$1" | ||
207 | " AND" | ||
208 | " paid=TRUE" | ||
209 | " AND" | ||
210 | " truth_uuid=$2;", | ||
211 | 2), | ||
212 | GNUNET_PQ_make_prepare ("challenge_payment_done", | ||
213 | "UPDATE anastasis_challenge_payment " | ||
214 | "SET" | ||
215 | " paid=TRUE " | ||
216 | "WHERE" | ||
217 | " payment_identifier=$1" | ||
218 | " AND" | ||
219 | " refunded=FALSE" | ||
220 | " AND" | ||
221 | " truth_uuid=$2" | ||
222 | " AND" | ||
223 | " paid=FALSE;", | ||
224 | 2), | ||
225 | GNUNET_PQ_make_prepare ("recdoc_payment_select", | ||
226 | "SELECT" | ||
227 | " creation_date" | ||
228 | ",post_counter" | ||
229 | ",amount_val" | ||
230 | ",amount_frac" | ||
231 | ",paid" | ||
232 | " FROM anastasis_recdoc_payment" | ||
233 | " WHERE payment_identifier=$1;", | ||
234 | 1), | ||
235 | GNUNET_PQ_make_prepare ("truth_payment_select", | ||
236 | "SELECT" | ||
237 | " expiration" | ||
238 | " FROM anastasis_truth_payment" | ||
239 | " WHERE truth_uuid=$1" | ||
240 | " AND expiration>$2;", | ||
241 | 2), | ||
242 | GNUNET_PQ_make_prepare ("challenge_payment_select", | ||
243 | "SELECT" | ||
244 | " creation_date" | ||
245 | ",amount_val" | ||
246 | ",amount_frac" | ||
247 | ",paid" | ||
248 | " FROM anastasis_challenge_payment" | ||
249 | " WHERE payment_identifier=$1" | ||
250 | " AND truth_uuid=$2" | ||
251 | " AND refunded=FALSE" | ||
252 | " AND counter>0;", | ||
253 | 1), | ||
254 | GNUNET_PQ_make_prepare ("challenge_pending_payment_select", | ||
255 | "SELECT" | ||
256 | " creation_date" | ||
257 | ",payment_identifier" | ||
258 | ",amount_val" | ||
259 | ",amount_frac" | ||
260 | " FROM anastasis_challenge_payment" | ||
261 | " WHERE" | ||
262 | " paid=FALSE" | ||
263 | " AND" | ||
264 | " refunded=FALSE" | ||
265 | " AND" | ||
266 | " truth_uuid=$1" | ||
267 | " AND" | ||
268 | " creation_date > $2;", | ||
269 | 1), | ||
270 | GNUNET_PQ_make_prepare ("recdoc_payments_select", | ||
271 | "SELECT" | ||
272 | " user_id" | ||
273 | ",payment_identifier" | ||
274 | ",amount_val" | ||
275 | ",amount_frac" | ||
276 | " FROM anastasis_recdoc_payment" | ||
277 | " WHERE paid=FALSE;", | ||
278 | 0), | ||
279 | GNUNET_PQ_make_prepare ("gc_accounts", | ||
280 | "DELETE FROM anastasis_user " | ||
281 | "WHERE" | ||
282 | " expiration_date < $1;", | ||
283 | 1), | ||
284 | GNUNET_PQ_make_prepare ("gc_recdoc_pending_payments", | ||
285 | "DELETE FROM anastasis_recdoc_payment " | ||
286 | "WHERE" | ||
287 | " paid=FALSE" | ||
288 | " AND" | ||
289 | " creation_date < $1;", | ||
290 | 1), | ||
291 | GNUNET_PQ_make_prepare ("gc_challenge_pending_payments", | ||
292 | "DELETE FROM anastasis_challenge_payment " | ||
293 | "WHERE" | ||
294 | " (paid=FALSE" | ||
295 | " OR" | ||
296 | " refunded=TRUE)" | ||
297 | " AND" | ||
298 | " creation_date < $1;", | ||
299 | 1), | ||
300 | GNUNET_PQ_make_prepare ("truth_insert", | ||
301 | "INSERT INTO anastasis_truth " | ||
302 | "(truth_uuid" | ||
303 | ",key_share_data" | ||
304 | ",method_name" | ||
305 | ",encrypted_truth" | ||
306 | ",truth_mime" | ||
307 | ",expiration" | ||
308 | ") VALUES " | ||
309 | "($1, $2, $3, $4, $5, $6);", | ||
310 | 6), | ||
311 | |||
312 | GNUNET_PQ_make_prepare ("test_auth_iban_payment", | ||
313 | "SELECT" | ||
314 | " credit_val" | ||
315 | ",credit_frac" | ||
316 | ",wire_subject" | ||
317 | " FROM anastasis_auth_iban_in" | ||
318 | " WHERE debit_account_details=$1" | ||
319 | " AND execution_date>=$2;", | ||
320 | 2), | ||
321 | GNUNET_PQ_make_prepare ("store_auth_iban_payment_details", | ||
322 | "INSERT INTO anastasis_auth_iban_in " | ||
323 | "(wire_reference" | ||
324 | ",wire_subject" | ||
325 | ",credit_val" | ||
326 | ",credit_frac" | ||
327 | ",debit_account_details" | ||
328 | ",credit_account_details" | ||
329 | ",execution_date" | ||
330 | ") VALUES " | ||
331 | "($1, $2, $3, $4, $5, $6, $7);", | ||
332 | 7), | ||
333 | |||
334 | |||
335 | GNUNET_PQ_make_prepare ("recovery_document_insert", | ||
336 | "INSERT INTO anastasis_recoverydocument " | ||
337 | "(user_id" | ||
338 | ",version" | ||
339 | ",account_sig" | ||
340 | ",recovery_data_hash" | ||
341 | ",recovery_data" | ||
342 | ") VALUES " | ||
343 | "($1, $2, $3, $4, $5);", | ||
344 | 5), | ||
345 | GNUNET_PQ_make_prepare ("truth_select", | ||
346 | "SELECT " | ||
347 | " method_name" | ||
348 | ",encrypted_truth" | ||
349 | ",truth_mime" | ||
350 | " FROM anastasis_truth" | ||
351 | " WHERE truth_uuid =$1;", | ||
352 | 1), | ||
353 | GNUNET_PQ_make_prepare ("latest_recoverydocument_select", | ||
354 | "SELECT " | ||
355 | " version" | ||
356 | ",account_sig" | ||
357 | ",recovery_data_hash" | ||
358 | ",recovery_data" | ||
359 | " FROM anastasis_recoverydocument" | ||
360 | " WHERE user_id =$1 " | ||
361 | " ORDER BY version DESC" | ||
362 | " LIMIT 1;", | ||
363 | 1), | ||
364 | GNUNET_PQ_make_prepare ("latest_recovery_version_select", | ||
365 | "SELECT" | ||
366 | " version" | ||
367 | ",recovery_data_hash" | ||
368 | ",expiration_date" | ||
369 | " FROM anastasis_recoverydocument" | ||
370 | " JOIN anastasis_user USING (user_id)" | ||
371 | " WHERE user_id=$1" | ||
372 | " ORDER BY version DESC" | ||
373 | " LIMIT 1;", | ||
374 | 1), | ||
375 | GNUNET_PQ_make_prepare ("recoverydocument_select", | ||
376 | "SELECT " | ||
377 | " account_sig" | ||
378 | ",recovery_data_hash" | ||
379 | ",recovery_data" | ||
380 | " FROM anastasis_recoverydocument" | ||
381 | " WHERE user_id=$1" | ||
382 | " AND version=$2;", | ||
383 | 2), | ||
384 | GNUNET_PQ_make_prepare ("postcounter_select", | ||
385 | "SELECT" | ||
386 | " post_counter" | ||
387 | " FROM anastasis_recdoc_payment" | ||
388 | " WHERE user_id=$1" | ||
389 | " AND payment_identifier=$2;", | ||
390 | 2), | ||
391 | GNUNET_PQ_make_prepare ("postcounter_update", | ||
392 | "UPDATE " | ||
393 | "anastasis_recdoc_payment " | ||
394 | "SET " | ||
395 | "post_counter=$1 " | ||
396 | "WHERE user_id =$2 " | ||
397 | "AND payment_identifier=$3;", | ||
398 | 3), | ||
399 | GNUNET_PQ_make_prepare ("key_share_select", | ||
400 | "SELECT " | ||
401 | "key_share_data " | ||
402 | "FROM " | ||
403 | "anastasis_truth " | ||
404 | "WHERE truth_uuid =$1;", | ||
405 | 1), | ||
406 | GNUNET_PQ_make_prepare ("challengecode_insert", | ||
407 | "INSERT INTO anastasis_challengecode " | ||
408 | "(truth_uuid" | ||
409 | ",code" | ||
410 | ",creation_date" | ||
411 | ",expiration_date" | ||
412 | ",retry_counter" | ||
413 | ") VALUES " | ||
414 | "($1, $2, $3, $4, $5);", | ||
415 | 5), | ||
416 | GNUNET_PQ_make_prepare ("challengecode_select", | ||
417 | "SELECT " | ||
418 | " code" | ||
419 | ",satisfied" | ||
420 | " FROM anastasis_challengecode" | ||
421 | " WHERE truth_uuid=$1" | ||
422 | " AND expiration_date > $2" | ||
423 | " AND retry_counter != 0;", | ||
424 | 2), | ||
425 | GNUNET_PQ_make_prepare ("challengecode_set_satisfied", | ||
426 | "UPDATE anastasis_challengecode" | ||
427 | " SET satisfied=TRUE" | ||
428 | " WHERE truth_uuid=$1" | ||
429 | " AND code=$2" | ||
430 | " AND creation_date IN" | ||
431 | " (SELECT creation_date" | ||
432 | " FROM anastasis_challengecode" | ||
433 | " WHERE truth_uuid=$1" | ||
434 | " AND code=$2" | ||
435 | " ORDER BY creation_date DESC" | ||
436 | " LIMIT 1);", | ||
437 | 2), | ||
438 | GNUNET_PQ_make_prepare ("challengecode_test_satisfied", | ||
439 | "SELECT 1 FROM anastasis_challengecode" | ||
440 | " WHERE truth_uuid=$1" | ||
441 | " AND satisfied=TRUE" | ||
442 | " AND code=$2" | ||
443 | " AND creation_date >= $3" | ||
444 | " LIMIT 1;", | ||
445 | 3), | ||
446 | GNUNET_PQ_make_prepare ("challengecode_select_meta", | ||
447 | "SELECT " | ||
448 | " code" | ||
449 | ",retry_counter" | ||
450 | ",retransmission_date" | ||
451 | " FROM anastasis_challengecode" | ||
452 | " WHERE truth_uuid=$1" | ||
453 | " AND expiration_date > $2" | ||
454 | " AND creation_date > $3" | ||
455 | " ORDER BY creation_date DESC" | ||
456 | " LIMIT 1;", | ||
457 | 2), | ||
458 | GNUNET_PQ_make_prepare ("challengecode_update_retry", | ||
459 | "UPDATE anastasis_challengecode" | ||
460 | " SET retry_counter=retry_counter - 1" | ||
461 | " WHERE truth_uuid=$1" | ||
462 | " AND code=$2" | ||
463 | " AND retry_counter != 0;", | ||
464 | 1), | ||
465 | GNUNET_PQ_make_prepare ("challengepayment_dec_counter", | ||
466 | "UPDATE anastasis_challenge_payment" | ||
467 | " SET counter=counter - 1" | ||
468 | " WHERE truth_uuid=$1" | ||
469 | " AND payment_identifier=$2" | ||
470 | " AND counter > 0;", | ||
471 | 2), | ||
472 | GNUNET_PQ_make_prepare ("challengecode_mark_sent", | ||
473 | "UPDATE anastasis_challengecode" | ||
474 | " SET retransmission_date=$3" | ||
475 | " WHERE truth_uuid=$1" | ||
476 | " AND code=$2" | ||
477 | " AND creation_date IN" | ||
478 | " (SELECT creation_date" | ||
479 | " FROM anastasis_challengecode" | ||
480 | " WHERE truth_uuid=$1" | ||
481 | " AND code=$2" | ||
482 | " ORDER BY creation_date DESC" | ||
483 | " LIMIT 1);", | ||
484 | 3), | ||
485 | GNUNET_PQ_make_prepare ("get_last_auth_iban_payment", | ||
486 | "SELECT " | ||
487 | " wire_reference" | ||
488 | " FROM anastasis_auth_iban_in" | ||
489 | " WHERE credit_account_details=$1" | ||
490 | " ORDER BY wire_reference DESC" | ||
491 | " LIMIT 1;", | ||
492 | 1), | ||
493 | GNUNET_PQ_make_prepare ("gc_challengecodes", | ||
494 | "DELETE FROM anastasis_challengecode " | ||
495 | "WHERE " | ||
496 | "expiration_date < $1;", | ||
497 | 1), | ||
498 | GNUNET_PQ_PREPARED_STATEMENT_END | ||
499 | }; | ||
500 | |||
501 | pg->conn = GNUNET_PQ_connect_with_cfg (pg->cfg, | ||
502 | "stasis-postgres", | ||
503 | NULL, | ||
504 | NULL, | ||
505 | ps); | ||
506 | if (NULL == pg->conn) | ||
507 | return GNUNET_SYSERR; | ||
508 | return GNUNET_OK; | ||
509 | } | ||
510 | |||
511 | |||
512 | /** | ||
103 | * Check that the database connection is still up. | 513 | * Check that the database connection is still up. |
104 | * | 514 | * |
105 | * @param cls a `struct PostgresClosure` with connection to check | 515 | * @param cls a `struct PostgresClosure` with connection to check |
@@ -2281,383 +2691,9 @@ libanastasis_plugin_db_postgres_init (void *cls) | |||
2281 | struct GNUNET_CONFIGURATION_Handle *cfg = cls; | 2691 | struct GNUNET_CONFIGURATION_Handle *cfg = cls; |
2282 | struct PostgresClosure *pg; | 2692 | struct PostgresClosure *pg; |
2283 | struct ANASTASIS_DatabasePlugin *plugin; | 2693 | struct ANASTASIS_DatabasePlugin *plugin; |
2284 | struct GNUNET_PQ_PreparedStatement ps[] = { | ||
2285 | GNUNET_PQ_make_prepare ("user_insert", | ||
2286 | "INSERT INTO anastasis_user " | ||
2287 | "(user_id" | ||
2288 | ",expiration_date" | ||
2289 | ") VALUES " | ||
2290 | "($1, $2);", | ||
2291 | 2), | ||
2292 | GNUNET_PQ_make_prepare ("do_commit", | ||
2293 | "COMMIT", | ||
2294 | 0), | ||
2295 | GNUNET_PQ_make_prepare ("user_select", | ||
2296 | "SELECT" | ||
2297 | " expiration_date " | ||
2298 | "FROM anastasis_user" | ||
2299 | " WHERE user_id=$1" | ||
2300 | " FOR UPDATE;", | ||
2301 | 1), | ||
2302 | GNUNET_PQ_make_prepare ("user_update", | ||
2303 | "UPDATE anastasis_user" | ||
2304 | " SET " | ||
2305 | " expiration_date=$1" | ||
2306 | " WHERE user_id=$2;", | ||
2307 | 2), | ||
2308 | GNUNET_PQ_make_prepare ("recdoc_payment_insert", | ||
2309 | "INSERT INTO anastasis_recdoc_payment " | ||
2310 | "(user_id" | ||
2311 | ",post_counter" | ||
2312 | ",amount_val" | ||
2313 | ",amount_frac" | ||
2314 | ",payment_identifier" | ||
2315 | ",creation_date" | ||
2316 | ") VALUES " | ||
2317 | "($1, $2, $3, $4, $5, $6);", | ||
2318 | 6), | ||
2319 | GNUNET_PQ_make_prepare ("challenge_payment_insert", | ||
2320 | "INSERT INTO anastasis_challenge_payment " | ||
2321 | "(truth_uuid" | ||
2322 | ",amount_val" | ||
2323 | ",amount_frac" | ||
2324 | ",payment_identifier" | ||
2325 | ",creation_date" | ||
2326 | ") VALUES " | ||
2327 | "($1, $2, $3, $4, $5);", | ||
2328 | 5), | ||
2329 | GNUNET_PQ_make_prepare ("truth_payment_insert", | ||
2330 | "INSERT INTO anastasis_truth_payment " | ||
2331 | "(truth_uuid" | ||
2332 | ",amount_val" | ||
2333 | ",amount_frac" | ||
2334 | ",expiration" | ||
2335 | ") VALUES " | ||
2336 | "($1, $2, $3, $4);", | ||
2337 | 4), | ||
2338 | GNUNET_PQ_make_prepare ("recdoc_payment_done", | ||
2339 | "UPDATE anastasis_recdoc_payment " | ||
2340 | "SET" | ||
2341 | " paid=TRUE " | ||
2342 | "WHERE" | ||
2343 | " payment_identifier=$1" | ||
2344 | " AND" | ||
2345 | " user_id=$2" | ||
2346 | " AND" | ||
2347 | " paid=FALSE;", | ||
2348 | 2), | ||
2349 | GNUNET_PQ_make_prepare ("challenge_refund_update", | ||
2350 | "UPDATE anastasis_challenge_payment " | ||
2351 | "SET" | ||
2352 | " refunded=TRUE " | ||
2353 | "WHERE" | ||
2354 | " payment_identifier=$1" | ||
2355 | " AND" | ||
2356 | " paid=TRUE" | ||
2357 | " AND" | ||
2358 | " truth_uuid=$2;", | ||
2359 | 2), | ||
2360 | GNUNET_PQ_make_prepare ("challenge_payment_done", | ||
2361 | "UPDATE anastasis_challenge_payment " | ||
2362 | "SET" | ||
2363 | " paid=TRUE " | ||
2364 | "WHERE" | ||
2365 | " payment_identifier=$1" | ||
2366 | " AND" | ||
2367 | " refunded=FALSE" | ||
2368 | " AND" | ||
2369 | " truth_uuid=$2" | ||
2370 | " AND" | ||
2371 | " paid=FALSE;", | ||
2372 | 2), | ||
2373 | GNUNET_PQ_make_prepare ("recdoc_payment_select", | ||
2374 | "SELECT" | ||
2375 | " creation_date" | ||
2376 | ",post_counter" | ||
2377 | ",amount_val" | ||
2378 | ",amount_frac" | ||
2379 | ",paid" | ||
2380 | " FROM anastasis_recdoc_payment" | ||
2381 | " WHERE payment_identifier=$1;", | ||
2382 | 1), | ||
2383 | GNUNET_PQ_make_prepare ("truth_payment_select", | ||
2384 | "SELECT" | ||
2385 | " expiration" | ||
2386 | " FROM anastasis_truth_payment" | ||
2387 | " WHERE truth_uuid=$1" | ||
2388 | " AND expiration>$2;", | ||
2389 | 2), | ||
2390 | GNUNET_PQ_make_prepare ("challenge_payment_select", | ||
2391 | "SELECT" | ||
2392 | " creation_date" | ||
2393 | ",amount_val" | ||
2394 | ",amount_frac" | ||
2395 | ",paid" | ||
2396 | " FROM anastasis_challenge_payment" | ||
2397 | " WHERE payment_identifier=$1" | ||
2398 | " AND truth_uuid=$2" | ||
2399 | " AND refunded=FALSE" | ||
2400 | " AND counter>0;", | ||
2401 | 1), | ||
2402 | GNUNET_PQ_make_prepare ("challenge_pending_payment_select", | ||
2403 | "SELECT" | ||
2404 | " creation_date" | ||
2405 | ",payment_identifier" | ||
2406 | ",amount_val" | ||
2407 | ",amount_frac" | ||
2408 | " FROM anastasis_challenge_payment" | ||
2409 | " WHERE" | ||
2410 | " paid=FALSE" | ||
2411 | " AND" | ||
2412 | " refunded=FALSE" | ||
2413 | " AND" | ||
2414 | " truth_uuid=$1" | ||
2415 | " AND" | ||
2416 | " creation_date > $2;", | ||
2417 | 1), | ||
2418 | GNUNET_PQ_make_prepare ("recdoc_payments_select", | ||
2419 | "SELECT" | ||
2420 | " user_id" | ||
2421 | ",payment_identifier" | ||
2422 | ",amount_val" | ||
2423 | ",amount_frac" | ||
2424 | " FROM anastasis_recdoc_payment" | ||
2425 | " WHERE paid=FALSE;", | ||
2426 | 0), | ||
2427 | GNUNET_PQ_make_prepare ("gc_accounts", | ||
2428 | "DELETE FROM anastasis_user " | ||
2429 | "WHERE" | ||
2430 | " expiration_date < $1;", | ||
2431 | 1), | ||
2432 | GNUNET_PQ_make_prepare ("gc_recdoc_pending_payments", | ||
2433 | "DELETE FROM anastasis_recdoc_payment " | ||
2434 | "WHERE" | ||
2435 | " paid=FALSE" | ||
2436 | " AND" | ||
2437 | " creation_date < $1;", | ||
2438 | 1), | ||
2439 | GNUNET_PQ_make_prepare ("gc_challenge_pending_payments", | ||
2440 | "DELETE FROM anastasis_challenge_payment " | ||
2441 | "WHERE" | ||
2442 | " (paid=FALSE" | ||
2443 | " OR" | ||
2444 | " refunded=TRUE)" | ||
2445 | " AND" | ||
2446 | " creation_date < $1;", | ||
2447 | 1), | ||
2448 | GNUNET_PQ_make_prepare ("truth_insert", | ||
2449 | "INSERT INTO anastasis_truth " | ||
2450 | "(truth_uuid" | ||
2451 | ",key_share_data" | ||
2452 | ",method_name" | ||
2453 | ",encrypted_truth" | ||
2454 | ",truth_mime" | ||
2455 | ",expiration" | ||
2456 | ") VALUES " | ||
2457 | "($1, $2, $3, $4, $5, $6);", | ||
2458 | 6), | ||
2459 | |||
2460 | GNUNET_PQ_make_prepare ("test_auth_iban_payment", | ||
2461 | "SELECT" | ||
2462 | " credit_val" | ||
2463 | ",credit_frac" | ||
2464 | ",wire_subject" | ||
2465 | " FROM anastasis_auth_iban_in" | ||
2466 | " WHERE debit_account_details=$1" | ||
2467 | " AND execution_date>=$2;", | ||
2468 | 2), | ||
2469 | GNUNET_PQ_make_prepare ("store_auth_iban_payment_details", | ||
2470 | "INSERT INTO anastasis_auth_iban_in " | ||
2471 | "(wire_reference" | ||
2472 | ",wire_subject" | ||
2473 | ",credit_val" | ||
2474 | ",credit_frac" | ||
2475 | ",debit_account_details" | ||
2476 | ",credit_account_details" | ||
2477 | ",execution_date" | ||
2478 | ") VALUES " | ||
2479 | "($1, $2, $3, $4, $5, $6, $7);", | ||
2480 | 7), | ||
2481 | |||
2482 | |||
2483 | GNUNET_PQ_make_prepare ("recovery_document_insert", | ||
2484 | "INSERT INTO anastasis_recoverydocument " | ||
2485 | "(user_id" | ||
2486 | ",version" | ||
2487 | ",account_sig" | ||
2488 | ",recovery_data_hash" | ||
2489 | ",recovery_data" | ||
2490 | ") VALUES " | ||
2491 | "($1, $2, $3, $4, $5);", | ||
2492 | 5), | ||
2493 | GNUNET_PQ_make_prepare ("truth_select", | ||
2494 | "SELECT " | ||
2495 | " method_name" | ||
2496 | ",encrypted_truth" | ||
2497 | ",truth_mime" | ||
2498 | " FROM anastasis_truth" | ||
2499 | " WHERE truth_uuid =$1;", | ||
2500 | 1), | ||
2501 | GNUNET_PQ_make_prepare ("latest_recoverydocument_select", | ||
2502 | "SELECT " | ||
2503 | " version" | ||
2504 | ",account_sig" | ||
2505 | ",recovery_data_hash" | ||
2506 | ",recovery_data" | ||
2507 | " FROM anastasis_recoverydocument" | ||
2508 | " WHERE user_id =$1 " | ||
2509 | " ORDER BY version DESC" | ||
2510 | " LIMIT 1;", | ||
2511 | 1), | ||
2512 | GNUNET_PQ_make_prepare ("latest_recovery_version_select", | ||
2513 | "SELECT" | ||
2514 | " version" | ||
2515 | ",recovery_data_hash" | ||
2516 | ",expiration_date" | ||
2517 | " FROM anastasis_recoverydocument" | ||
2518 | " JOIN anastasis_user USING (user_id)" | ||
2519 | " WHERE user_id=$1" | ||
2520 | " ORDER BY version DESC" | ||
2521 | " LIMIT 1;", | ||
2522 | 1), | ||
2523 | GNUNET_PQ_make_prepare ("recoverydocument_select", | ||
2524 | "SELECT " | ||
2525 | " account_sig" | ||
2526 | ",recovery_data_hash" | ||
2527 | ",recovery_data" | ||
2528 | " FROM anastasis_recoverydocument" | ||
2529 | " WHERE user_id=$1" | ||
2530 | " AND version=$2;", | ||
2531 | 2), | ||
2532 | GNUNET_PQ_make_prepare ("postcounter_select", | ||
2533 | "SELECT" | ||
2534 | " post_counter" | ||
2535 | " FROM anastasis_recdoc_payment" | ||
2536 | " WHERE user_id=$1" | ||
2537 | " AND payment_identifier=$2;", | ||
2538 | 2), | ||
2539 | GNUNET_PQ_make_prepare ("postcounter_update", | ||
2540 | "UPDATE " | ||
2541 | "anastasis_recdoc_payment " | ||
2542 | "SET " | ||
2543 | "post_counter=$1 " | ||
2544 | "WHERE user_id =$2 " | ||
2545 | "AND payment_identifier=$3;", | ||
2546 | 3), | ||
2547 | GNUNET_PQ_make_prepare ("key_share_select", | ||
2548 | "SELECT " | ||
2549 | "key_share_data " | ||
2550 | "FROM " | ||
2551 | "anastasis_truth " | ||
2552 | "WHERE truth_uuid =$1;", | ||
2553 | 1), | ||
2554 | GNUNET_PQ_make_prepare ("challengecode_insert", | ||
2555 | "INSERT INTO anastasis_challengecode " | ||
2556 | "(truth_uuid" | ||
2557 | ",code" | ||
2558 | ",creation_date" | ||
2559 | ",expiration_date" | ||
2560 | ",retry_counter" | ||
2561 | ") VALUES " | ||
2562 | "($1, $2, $3, $4, $5);", | ||
2563 | 5), | ||
2564 | GNUNET_PQ_make_prepare ("challengecode_select", | ||
2565 | "SELECT " | ||
2566 | " code" | ||
2567 | ",satisfied" | ||
2568 | " FROM anastasis_challengecode" | ||
2569 | " WHERE truth_uuid=$1" | ||
2570 | " AND expiration_date > $2" | ||
2571 | " AND retry_counter != 0;", | ||
2572 | 2), | ||
2573 | GNUNET_PQ_make_prepare ("challengecode_set_satisfied", | ||
2574 | "UPDATE anastasis_challengecode" | ||
2575 | " SET satisfied=TRUE" | ||
2576 | " WHERE truth_uuid=$1" | ||
2577 | " AND code=$2" | ||
2578 | " AND creation_date IN" | ||
2579 | " (SELECT creation_date" | ||
2580 | " FROM anastasis_challengecode" | ||
2581 | " WHERE truth_uuid=$1" | ||
2582 | " AND code=$2" | ||
2583 | " ORDER BY creation_date DESC" | ||
2584 | " LIMIT 1);", | ||
2585 | 2), | ||
2586 | GNUNET_PQ_make_prepare ("challengecode_test_satisfied", | ||
2587 | "SELECT 1 FROM anastasis_challengecode" | ||
2588 | " WHERE truth_uuid=$1" | ||
2589 | " AND satisfied=TRUE" | ||
2590 | " AND code=$2" | ||
2591 | " AND creation_date >= $3" | ||
2592 | " LIMIT 1;", | ||
2593 | 3), | ||
2594 | GNUNET_PQ_make_prepare ("challengecode_select_meta", | ||
2595 | "SELECT " | ||
2596 | " code" | ||
2597 | ",retry_counter" | ||
2598 | ",retransmission_date" | ||
2599 | " FROM anastasis_challengecode" | ||
2600 | " WHERE truth_uuid=$1" | ||
2601 | " AND expiration_date > $2" | ||
2602 | " AND creation_date > $3" | ||
2603 | " ORDER BY creation_date DESC" | ||
2604 | " LIMIT 1;", | ||
2605 | 2), | ||
2606 | GNUNET_PQ_make_prepare ("challengecode_update_retry", | ||
2607 | "UPDATE anastasis_challengecode" | ||
2608 | " SET retry_counter=retry_counter - 1" | ||
2609 | " WHERE truth_uuid=$1" | ||
2610 | " AND code=$2" | ||
2611 | " AND retry_counter != 0;", | ||
2612 | 1), | ||
2613 | GNUNET_PQ_make_prepare ("challengepayment_dec_counter", | ||
2614 | "UPDATE anastasis_challenge_payment" | ||
2615 | " SET counter=counter - 1" | ||
2616 | " WHERE truth_uuid=$1" | ||
2617 | " AND payment_identifier=$2" | ||
2618 | " AND counter > 0;", | ||
2619 | 2), | ||
2620 | GNUNET_PQ_make_prepare ("challengecode_mark_sent", | ||
2621 | "UPDATE anastasis_challengecode" | ||
2622 | " SET retransmission_date=$3" | ||
2623 | " WHERE truth_uuid=$1" | ||
2624 | " AND code=$2" | ||
2625 | " AND creation_date IN" | ||
2626 | " (SELECT creation_date" | ||
2627 | " FROM anastasis_challengecode" | ||
2628 | " WHERE truth_uuid=$1" | ||
2629 | " AND code=$2" | ||
2630 | " ORDER BY creation_date DESC" | ||
2631 | " LIMIT 1);", | ||
2632 | 3), | ||
2633 | GNUNET_PQ_make_prepare ("get_last_auth_iban_payment", | ||
2634 | "SELECT " | ||
2635 | " wire_reference" | ||
2636 | " FROM anastasis_auth_iban_in" | ||
2637 | " WHERE credit_account_details=$1" | ||
2638 | " ORDER BY wire_reference DESC" | ||
2639 | " LIMIT 1;", | ||
2640 | 1), | ||
2641 | GNUNET_PQ_make_prepare ("gc_challengecodes", | ||
2642 | "DELETE FROM anastasis_challengecode " | ||
2643 | "WHERE " | ||
2644 | "expiration_date < $1;", | ||
2645 | 1), | ||
2646 | GNUNET_PQ_PREPARED_STATEMENT_END | ||
2647 | }; | ||
2648 | 2694 | ||
2649 | pg = GNUNET_new (struct PostgresClosure); | 2695 | pg = GNUNET_new (struct PostgresClosure); |
2650 | pg->cfg = cfg; | 2696 | pg->cfg = cfg; |
2651 | pg->conn = GNUNET_PQ_connect_with_cfg (cfg, | ||
2652 | "stasis-postgres", | ||
2653 | "stasis-", | ||
2654 | NULL, | ||
2655 | ps); | ||
2656 | if (NULL == pg->conn) | ||
2657 | { | ||
2658 | GNUNET_free (pg); | ||
2659 | return NULL; | ||
2660 | } | ||
2661 | if (GNUNET_OK != | 2697 | if (GNUNET_OK != |
2662 | GNUNET_CONFIGURATION_get_value_string (cfg, | 2698 | GNUNET_CONFIGURATION_get_value_string (cfg, |
2663 | "taler", | 2699 | "taler", |
@@ -2673,6 +2709,8 @@ libanastasis_plugin_db_postgres_init (void *cls) | |||
2673 | } | 2709 | } |
2674 | plugin = GNUNET_new (struct ANASTASIS_DatabasePlugin); | 2710 | plugin = GNUNET_new (struct ANASTASIS_DatabasePlugin); |
2675 | plugin->cls = pg; | 2711 | plugin->cls = pg; |
2712 | plugin->connect = &postgres_connect; | ||
2713 | plugin->create_tables = &postgres_create_tables; | ||
2676 | plugin->drop_tables = &postgres_drop_tables; | 2714 | plugin->drop_tables = &postgres_drop_tables; |
2677 | plugin->gc = &postgres_gc; | 2715 | plugin->gc = &postgres_gc; |
2678 | plugin->preflight = &postgres_preflight; | 2716 | plugin->preflight = &postgres_preflight; |