aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSree Harsha Totakura <sreeharsha@totakura.in>2015-03-05 17:05:51 +0100
committerSree Harsha Totakura <sreeharsha@totakura.in>2015-03-05 17:05:51 +0100
commita3e7b3af82fc3b805b6e01114dbaa2fd0d299a25 (patch)
tree7220d90f9d9791c92fec343bb5ad71389b3c6a68
parentf92af896f8a2f07aba3a90434b2ee3aa51b45149 (diff)
downloadexchange-a3e7b3af82fc3b805b6e01114dbaa2fd0d299a25.tar.gz
exchange-a3e7b3af82fc3b805b6e01114dbaa2fd0d299a25.zip
db: Use macro while creating prepared statements
-rw-r--r--src/mint/mint_db.c639
1 files changed, 234 insertions, 405 deletions
diff --git a/src/mint/mint_db.c b/src/mint/mint_db.c
index b84af0f22..a58959f94 100644
--- a/src/mint/mint_db.c
+++ b/src/mint/mint_db.c
@@ -272,417 +272,246 @@ TALER_MINT_DB_prepare (PGconn *db_conn)
272{ 272{
273 PGresult *result; 273 PGresult *result;
274 274
275 result = PQprepare (db_conn, "get_reserve", 275#define PREPARE(name, sql, ...) \
276 "SELECT " 276 do { \
277 "current_balance_value" 277 result = PQprepare (db_conn, name, sql, __VA_ARGS__); \
278 ",current_balance_fraction" 278 if (PGRES_COMMAND_OK != PQresultStatus (result)) \
279 ",balance_currency " 279 { \
280 ",expiration_date " 280 break_db_err (result); \
281 "FROM reserves " 281 PQclear (result); result = NULL; \
282 "WHERE reserve_pub=$1 " 282 return GNUNET_SYSERR; \
283 "LIMIT 1; ", 283 } \
284 1, NULL); 284 PQclear (result); result = NULL; \
285 if (PGRES_COMMAND_OK != PQresultStatus(result)) 285 } while (0);
286 { 286
287 break_db_err (result); 287 PREPARE ("get_reserve",
288 PQclear (result); 288 "SELECT "
289 return GNUNET_SYSERR; 289 "current_balance_value"
290 } 290 ",current_balance_fraction"
291 PQclear (result); 291 ",balance_currency "
292 292 ",expiration_date "
293 result = PQprepare (db_conn, "update_reserve", 293 "FROM reserves "
294 "UPDATE reserves " 294 "WHERE reserve_pub=$1 "
295 "SET" 295 "LIMIT 1; ",
296 " current_balance_value=$2 " 296 1, NULL);
297 ",current_balance_fraction=$3 " 297 PREPARE ("update_reserve",
298 ",expiration_date=$4 " 298 "UPDATE reserves "
299 "WHERE reserve_pub=$1 ", 299 "SET"
300 4, NULL); 300 " current_balance_value=$2 "
301 if (PGRES_COMMAND_OK != PQresultStatus(result)) 301 ",current_balance_fraction=$3 "
302 { 302 ",expiration_date=$4 "
303 break_db_err (result); 303 "WHERE reserve_pub=$1 ",
304 PQclear (result); 304 4, NULL);
305 return GNUNET_SYSERR; 305 PREPARE ("insert_collectable_blindcoins",
306 } 306 "INSERT INTO collectable_blindcoins ( "
307 PQclear (result); 307 " blind_ev, blind_ev_sig "
308 result = PQprepare (db_conn, "insert_collectable_blindcoins", 308 ",denom_pub, reserve_pub, reserve_sig) "
309 "INSERT INTO collectable_blindcoins ( " 309 "VALUES ($1, $2, $3, $4, $5)",
310 " blind_ev, blind_ev_sig " 310 6, NULL);
311 ",denom_pub, reserve_pub, reserve_sig) " 311 PREPARE ("get_collectable_blindcoins",
312 "VALUES ($1, $2, $3, $4, $5)", 312 "SELECT "
313 6, NULL); 313 "blind_ev_sig, denom_pub, reserve_sig, reserve_pub "
314 if (PGRES_COMMAND_OK != PQresultStatus(result)) 314 "FROM collectable_blindcoins "
315 { 315 "WHERE blind_ev = $1",
316 break_db_err (result); 316 1, NULL);
317 PQclear (result);
318 return GNUNET_SYSERR;
319 }
320 PQclear (result);
321
322 result = PQprepare (db_conn, "get_collectable_blindcoins",
323 "SELECT "
324 "blind_ev_sig, denom_pub, reserve_sig, reserve_pub "
325 "FROM collectable_blindcoins "
326 "WHERE blind_ev = $1",
327 1, NULL);
328 if (PGRES_COMMAND_OK != PQresultStatus(result))
329 {
330 break_db_err (result);
331 PQclear (result);
332 return GNUNET_SYSERR;
333 }
334 PQclear (result);
335 317
336 /* FIXME: does it make sense to store these computed values in the DB? */ 318 /* FIXME: does it make sense to store these computed values in the DB? */
337#if 0 319#if 0
338 result = PQprepare (db_conn, "get_refresh_session", 320 PREPARE ("get_refresh_session",
339 "SELECT " 321 "SELECT "
340 " (SELECT count(*) FROM refresh_melt WHERE session_pub = $1)::INT2 as num_oldcoins " 322 " (SELECT count(*) FROM refresh_melt WHERE session_pub = $1)::INT2 as num_oldcoins "
341 ",(SELECT count(*) FROM refresh_blind_session_keys " 323 ",(SELECT count(*) FROM refresh_blind_session_keys "
342 " WHERE session_pub = $1 and cnc_index = 0)::INT2 as num_newcoins " 324 " WHERE session_pub = $1 and cnc_index = 0)::INT2 as num_newcoins "
343 ",(SELECT count(*) FROM refresh_blind_session_keys " 325 ",(SELECT count(*) FROM refresh_blind_session_keys "
344 " WHERE session_pub = $1 and newcoin_index = 0)::INT2 as kappa " 326 " WHERE session_pub = $1 and newcoin_index = 0)::INT2 as kappa "
345 ",noreveal_index" 327 ",noreveal_index"
346 ",session_commit_sig " 328 ",session_commit_sig "
347 ",reveal_ok " 329 ",reveal_ok "
348 "FROM refresh_sessions " 330 "FROM refresh_sessions "
349 "WHERE session_pub = $1", 331 "WHERE session_pub = $1",
350 1, NULL); 332 1, NULL);
351 if (PGRES_COMMAND_OK != PQresultStatus(result))
352 {
353 break_db_err (result);
354 PQclear (result);
355 return GNUNET_SYSERR;
356 }
357 PQclear (result);
358#endif 333#endif
359 334
360 result = PQprepare (db_conn, "get_known_coin", 335 PREPARE ("get_known_coin",
361 "SELECT " 336 "SELECT "
362 " coin_pub, denom_pub, denom_sig " 337 " coin_pub, denom_pub, denom_sig "
363 ",expended_value, expended_fraction, expended_currency " 338 ",expended_value, expended_fraction, expended_currency "
364 ",refresh_session_pub " 339 ",refresh_session_pub "
365 "FROM known_coins " 340 "FROM known_coins "
366 "WHERE coin_pub = $1", 341 "WHERE coin_pub = $1",
367 1, NULL); 342 1, NULL);
368 if (PGRES_COMMAND_OK != PQresultStatus(result)) 343 PREPARE ("update_known_coin",
369 { 344 "UPDATE known_coins "
370 break_db_err (result); 345 "SET "
371 PQclear (result); 346 " denom_pub = $2 "
372 return GNUNET_SYSERR; 347 ",denom_sig = $3 "
373 } 348 ",expended_value = $4 "
374 PQclear (result); 349 ",expended_fraction = $5 "
375 350 ",expended_currency = $6 "
376 result = PQprepare (db_conn, "update_known_coin", 351 ",refresh_session_pub = $7 "
377 "UPDATE known_coins " 352 "WHERE "
378 "SET " 353 " coin_pub = $1 ",
379 " denom_pub = $2 " 354 7, NULL);
380 ",denom_sig = $3 " 355 PREPARE ("insert_known_coin",
381 ",expended_value = $4 " 356 "INSERT INTO known_coins ("
382 ",expended_fraction = $5 " 357 " coin_pub"
383 ",expended_currency = $6 " 358 ",denom_pub"
384 ",refresh_session_pub = $7 " 359 ",denom_sig"
385 "WHERE " 360 ",expended_value"
386 " coin_pub = $1 ", 361 ",expended_fraction"
387 7, NULL); 362 ",expended_currency"
388 if (PGRES_COMMAND_OK != PQresultStatus(result)) 363 ",refresh_session_pub"
389 { 364 ")"
390 break_db_err (result); 365 "VALUES ($1,$2,$3,$4,$5,$6,$7)",
391 PQclear (result); 366 7, NULL);
392 return GNUNET_SYSERR; 367 PREPARE ("get_refresh_commit_link",
393 } 368 "SELECT "
394 PQclear (result); 369 " transfer_pub "
395 370 ",link_secret_enc "
396 result = PQprepare (db_conn, "insert_known_coin", 371 "FROM refresh_commit_link "
397 "INSERT INTO known_coins (" 372 "WHERE session_pub = $1 AND cnc_index = $2 AND oldcoin_index = $3",
398 " coin_pub" 373 3, NULL);
399 ",denom_pub" 374 PREPARE ("get_refresh_commit_coin",
400 ",denom_sig" 375 "SELECT "
401 ",expended_value" 376 " link_vector_enc "
402 ",expended_fraction" 377 ",coin_ev "
403 ",expended_currency" 378 "FROM refresh_commit_coin "
404 ",refresh_session_pub" 379 "WHERE session_pub = $1 AND cnc_index = $2 AND newcoin_index = $3",
405 ")" 380 3, NULL);
406 "VALUES ($1,$2,$3,$4,$5,$6,$7)", 381 PREPARE ("insert_refresh_order",
407 7, NULL); 382 "INSERT INTO refresh_order ( "
408 if (PGRES_COMMAND_OK != PQresultStatus(result)) 383 " newcoin_index "
409 { 384 ",session_pub "
410 break_db_err (result); 385 ",denom_pub "
411 PQclear (result); 386 ") "
412 return GNUNET_SYSERR; 387 "VALUES ($1, $2, $3) ",
413 } 388 3, NULL);
414 PQclear (result); 389 PREPARE ("insert_refresh_melt",
415 390 "INSERT INTO refresh_melt ( "
416 result = PQprepare (db_conn, "get_refresh_commit_link", 391 " session_pub "
417 "SELECT " 392 ",oldcoin_index "
418 " transfer_pub " 393 ",coin_pub "
419 ",link_secret_enc " 394 ",denom_pub "
420 "FROM refresh_commit_link " 395 ") "
421 "WHERE session_pub = $1 AND cnc_index = $2 AND oldcoin_index = $3", 396 "VALUES ($1, $2, $3, $4) ",
422 3, NULL); 397 3, NULL);
423 if (PGRES_COMMAND_OK != PQresultStatus(result)) 398 PREPARE ("get_refresh_order",
424 { 399 "SELECT denom_pub "
425 break_db_err (result); 400 "FROM refresh_order "
426 PQclear (result); 401 "WHERE session_pub = $1 AND newcoin_index = $2",
427 return GNUNET_SYSERR; 402 2, NULL);
428 } 403 PREPARE ("get_refresh_collectable",
429 PQclear (result); 404 "SELECT ev_sig "
430 405 "FROM refresh_collectable "
431 result = PQprepare (db_conn, "get_refresh_commit_coin", 406 "WHERE session_pub = $1 AND newcoin_index = $2",
432 "SELECT " 407 2, NULL);
433 " link_vector_enc " 408 PREPARE ("get_refresh_melt",
434 ",coin_ev " 409 "SELECT coin_pub "
435 "FROM refresh_commit_coin " 410 "FROM refresh_melt "
436 "WHERE session_pub = $1 AND cnc_index = $2 AND newcoin_index = $3", 411 "WHERE session_pub = $1 AND oldcoin_index = $2",
437 3, NULL); 412 2, NULL);
438 if (PGRES_COMMAND_OK != PQresultStatus(result)) 413 PREPARE ("insert_refresh_session",
439 { 414 "INSERT INTO refresh_sessions ( "
440 break_db_err (result); 415 " session_pub "
441 PQclear (result); 416 ",noreveal_index "
442 return GNUNET_SYSERR; 417 ") "
443 } 418 "VALUES ($1, $2) ",
444 PQclear (result); 419 2, NULL);
445 420 PREPARE ("insert_refresh_commit_link",
446 result = PQprepare (db_conn, "insert_refresh_order", 421 "INSERT INTO refresh_commit_link ( "
447 "INSERT INTO refresh_order ( " 422 " session_pub "
448 " newcoin_index " 423 ",transfer_pub "
449 ",session_pub " 424 ",cnc_index "
450 ",denom_pub " 425 ",oldcoin_index "
451 ") " 426 ",link_secret_enc "
452 "VALUES ($1, $2, $3) ", 427 ") "
453 3, NULL); 428 "VALUES ($1, $2, $3, $4, $5) ",
454 if (PGRES_COMMAND_OK != PQresultStatus(result)) 429 5, NULL);
455 { 430 PREPARE ("insert_refresh_commit_coin",
456 break_db_err (result); 431 "INSERT INTO refresh_commit_coin ( "
457 PQclear (result); 432 " session_pub "
458 return GNUNET_SYSERR; 433 ",coin_ev "
459 } 434 ",cnc_index "
460 PQclear (result); 435 ",newcoin_index "
461 436 ",link_vector_enc "
462 result = PQprepare (db_conn, "insert_refresh_melt", 437 ") "
463 "INSERT INTO refresh_melt ( " 438 "VALUES ($1, $2, $3, $4, $5) ",
464 " session_pub " 439 5, NULL);
465 ",oldcoin_index " 440 PREPARE ("insert_refresh_collectable",
466 ",coin_pub " 441 "INSERT INTO refresh_collectable ( "
467 ",denom_pub " 442 " session_pub "
468 ") " 443 ",newcoin_index "
469 "VALUES ($1, $2, $3, $4) ", 444 ",ev_sig "
470 3, NULL); 445 ") "
471 if (PGRES_COMMAND_OK != PQresultStatus(result)) 446 "VALUES ($1, $2, $3) ",
472 { 447 3, NULL);
473 break_db_err (result); 448 PREPARE ("set_reveal_ok",
474 PQclear (result); 449 "UPDATE refresh_sessions "
475 return GNUNET_SYSERR; 450 "SET reveal_ok = TRUE "
476 } 451 "WHERE session_pub = $1 ",
477 PQclear (result); 452 1, NULL);
478 453 PREPARE ("get_link",
479 result = PQprepare (db_conn, "get_refresh_order", 454 "SELECT link_vector_enc, ro.denom_pub, ev_sig "
480 "SELECT denom_pub " 455 "FROM refresh_melt rm "
481 "FROM refresh_order " 456 " JOIN refresh_order ro USING (session_pub) "
482 "WHERE session_pub = $1 AND newcoin_index = $2", 457 " JOIN refresh_commit_coin rcc USING (session_pub) "
483 2, NULL); 458 " JOIN refresh_sessions rs USING (session_pub) "
484 if (PGRES_COMMAND_OK != PQresultStatus(result)) 459 " JOIN refresh_collectable rc USING (session_pub) "
485 { 460 "WHERE rm.coin_pub = $1 "
486 break_db_err (result); 461 "AND ro.newcoin_index = rcc.newcoin_index "
487 PQclear (result); 462 "AND ro.newcoin_index = rc.newcoin_index "
488 return GNUNET_SYSERR; 463 "AND rcc.cnc_index = rs.noreveal_index % ( "
489 } 464 " SELECT count(*) FROM refresh_commit_coin rcc2 "
490 PQclear (result); 465 " WHERE rcc2.newcoin_index = 0 AND rcc2.session_pub = rs.session_pub "
491 466 " ) ",
492 result = PQprepare (db_conn, "get_refresh_collectable", 467 1, NULL);
493 "SELECT ev_sig " 468 PREPARE ("get_transfer",
494 "FROM refresh_collectable " 469 "SELECT transfer_pub, link_secret_enc "
495 "WHERE session_pub = $1 AND newcoin_index = $2", 470 "FROM refresh_melt rm "
496 2, NULL); 471 " JOIN refresh_commit_link rcl USING (session_pub) "
497 if (PGRES_COMMAND_OK != PQresultStatus(result)) 472 " JOIN refresh_sessions rs USING (session_pub) "
498 { 473 "WHERE rm.coin_pub = $1 "
499 break_db_err (result); 474 "AND rm.oldcoin_index = rcl.oldcoin_index "
500 PQclear (result); 475 "AND rcl.cnc_index = rs.noreveal_index % ( "
501 return GNUNET_SYSERR; 476 " SELECT count(*) FROM refresh_commit_coin rcc2 "
502 } 477 " WHERE newcoin_index = 0 AND rcc2.session_pub = rm.session_pub "
503 PQclear (result); 478 " ) ",
504 479 1, NULL);
505 result = PQprepare (db_conn, "get_refresh_melt", 480 PREPARE ("insert_deposit",
506 "SELECT coin_pub " 481 "INSERT INTO deposits ("
507 "FROM refresh_melt " 482 "coin_pub,"
508 "WHERE session_pub = $1 AND oldcoin_index = $2", 483 "denom_pub,"
509 2, NULL); 484 "transaction_id,"
510 if (PGRES_COMMAND_OK != PQresultStatus(result)) 485 "amount_value,"
511 { 486 "amount_fraction,"
512 break_db_err (result); 487 "amount_currency,"
513 PQclear (result); 488 "merchant_pub,"
514 return GNUNET_SYSERR; 489 "h_contract,"
515 } 490 "h_wire,"
516 PQclear (result); 491 "coin_sig,"
517 492 "wire"
518 result = PQprepare (db_conn, "insert_refresh_session", 493 ") VALUES ("
519 "INSERT INTO refresh_sessions ( " 494 "$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11"
520 " session_pub " 495 ")",
521 ",noreveal_index " 496 11, NULL);
522 ") " 497 PREPARE ("get_deposit",
523 "VALUES ($1, $2) ", 498 "SELECT "
524 2, NULL); 499 "coin_pub,"
525 if (PGRES_COMMAND_OK != PQresultStatus(result)) 500 "denom_pub,"
526 { 501 "transaction_id,"
527 break_db_err (result); 502 "amount_value,"
528 PQclear (result); 503 "amount_fraction,"
529 return GNUNET_SYSERR; 504 "amount_currency,"
530 } 505 "merchant_pub,"
531 PQclear (result); 506 "h_contract,"
532 507 "h_wire,"
533 result = PQprepare (db_conn, "insert_refresh_commit_link", 508 "coin_sig"
534 "INSERT INTO refresh_commit_link ( " 509 " FROM deposits WHERE ("
535 " session_pub " 510 "coin_pub = $1"
536 ",transfer_pub " 511 ")",
537 ",cnc_index " 512 1, NULL);
538 ",oldcoin_index "
539 ",link_secret_enc "
540 ") "
541 "VALUES ($1, $2, $3, $4, $5) ",
542 5, NULL);
543 if (PGRES_COMMAND_OK != PQresultStatus(result))
544 {
545 break_db_err (result);
546 PQclear (result);
547 return GNUNET_SYSERR;
548 }
549 PQclear (result);
550
551 result = PQprepare (db_conn, "insert_refresh_commit_coin",
552 "INSERT INTO refresh_commit_coin ( "
553 " session_pub "
554 ",coin_ev "
555 ",cnc_index "
556 ",newcoin_index "
557 ",link_vector_enc "
558 ") "
559 "VALUES ($1, $2, $3, $4, $5) ",
560 5, NULL);
561 if (PGRES_COMMAND_OK != PQresultStatus(result))
562 {
563 break_db_err (result);
564 PQclear (result);
565 return GNUNET_SYSERR;
566 }
567 PQclear (result);
568
569 result = PQprepare (db_conn, "insert_refresh_collectable",
570 "INSERT INTO refresh_collectable ( "
571 " session_pub "
572 ",newcoin_index "
573 ",ev_sig "
574 ") "
575 "VALUES ($1, $2, $3) ",
576 3, NULL);
577 if (PGRES_COMMAND_OK != PQresultStatus(result))
578 {
579 break_db_err (result);
580 PQclear (result);
581 return GNUNET_SYSERR;
582 }
583 PQclear (result);
584
585 result = PQprepare (db_conn, "set_reveal_ok",
586 "UPDATE refresh_sessions "
587 "SET reveal_ok = TRUE "
588 "WHERE session_pub = $1 ",
589 1, NULL);
590 if (PGRES_COMMAND_OK != PQresultStatus(result))
591 {
592 break_db_err (result);
593 PQclear (result);
594 return GNUNET_SYSERR;
595 }
596 PQclear (result);
597
598 result = PQprepare (db_conn, "get_link",
599 "SELECT link_vector_enc, ro.denom_pub, ev_sig "
600 "FROM refresh_melt rm "
601 " JOIN refresh_order ro USING (session_pub) "
602 " JOIN refresh_commit_coin rcc USING (session_pub) "
603 " JOIN refresh_sessions rs USING (session_pub) "
604 " JOIN refresh_collectable rc USING (session_pub) "
605 "WHERE rm.coin_pub = $1 "
606 "AND ro.newcoin_index = rcc.newcoin_index "
607 "AND ro.newcoin_index = rc.newcoin_index "
608 "AND rcc.cnc_index = rs.noreveal_index % ( "
609 " SELECT count(*) FROM refresh_commit_coin rcc2 "
610 " WHERE rcc2.newcoin_index = 0 AND rcc2.session_pub = rs.session_pub "
611 " ) ",
612 1, NULL);
613 if (PGRES_COMMAND_OK != PQresultStatus(result))
614 {
615 break_db_err (result);
616 PQclear (result);
617 return GNUNET_SYSERR;
618 }
619 PQclear (result);
620
621 result = PQprepare (db_conn, "get_transfer",
622 "SELECT transfer_pub, link_secret_enc "
623 "FROM refresh_melt rm "
624 " JOIN refresh_commit_link rcl USING (session_pub) "
625 " JOIN refresh_sessions rs USING (session_pub) "
626 "WHERE rm.coin_pub = $1 "
627 "AND rm.oldcoin_index = rcl.oldcoin_index "
628 "AND rcl.cnc_index = rs.noreveal_index % ( "
629 " SELECT count(*) FROM refresh_commit_coin rcc2 "
630 " WHERE newcoin_index = 0 AND rcc2.session_pub = rm.session_pub "
631 " ) ",
632 1, NULL);
633 if (PGRES_COMMAND_OK != PQresultStatus(result))
634 {
635 break_db_err (result);
636 PQclear (result);
637 return GNUNET_SYSERR;
638 }
639 PQclear (result);
640
641 result = PQprepare (db_conn, "insert_deposit",
642 "INSERT INTO deposits ("
643 "coin_pub,"
644 "denom_pub,"
645 "transaction_id,"
646 "amount_value,"
647 "amount_fraction,"
648 "amount_currency,"
649 "merchant_pub,"
650 "h_contract,"
651 "h_wire,"
652 "coin_sig,"
653 "wire"
654 ") VALUES ("
655 "$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11"
656 ")",
657 11, NULL);
658 EXITIF (PGRES_COMMAND_OK != PQresultStatus(result));
659 PQclear (result);
660
661 result = PQprepare (db_conn, "get_deposit",
662 "SELECT "
663 "coin_pub,"
664 "denom_pub,"
665 "transaction_id,"
666 "amount_value,"
667 "amount_fraction,"
668 "amount_currency,"
669 "merchant_pub,"
670 "h_contract,"
671 "h_wire,"
672 "coin_sig"
673 " FROM deposits WHERE ("
674 "coin_pub = $1"
675 ")",
676 1, NULL);
677 EXITIF (PGRES_COMMAND_OK != PQresultStatus(result));
678 PQclear (result);
679
680 return GNUNET_OK; 513 return GNUNET_OK;
681 514#undef PREPARE
682 EXITIF_exit:
683 break_db_err (result);
684 PQclear (result);
685 return GNUNET_SYSERR;
686} 515}
687 516
688 517