diff options
Diffstat (limited to 'src/backend/taler-merchant-httpd_private-patch-instances-ID.c')
-rw-r--r-- | src/backend/taler-merchant-httpd_private-patch-instances-ID.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/backend/taler-merchant-httpd_private-patch-instances-ID.c b/src/backend/taler-merchant-httpd_private-patch-instances-ID.c index 4590e6c5..62dc77a4 100644 --- a/src/backend/taler-merchant-httpd_private-patch-instances-ID.c +++ b/src/backend/taler-merchant-httpd_private-patch-instances-ID.c @@ -193,7 +193,7 @@ TMH_private_patch_instances_ID (const struct TMH_RequestHandler *rh, /* Check for changes in accounts */ { unsigned int len = json_array_size (payto_uris); - bool matches[GNUNET_NZL (len)]; + struct TMH_WireMethod *matches[GNUNET_NZL (len)]; bool matched; memset (matches, @@ -205,6 +205,7 @@ TMH_private_patch_instances_ID (const struct TMH_RequestHandler *rh, { const char *uri = json_string_value (json_object_get (wm->j_wire, "payto_uri")); + GNUNET_assert (NULL != uri); matched = false; for (unsigned int i = 0; i<len; i++) @@ -222,10 +223,10 @@ TMH_private_patch_instances_ID (const struct TMH_RequestHandler *rh, TALER_EC_GENERIC_PAYTO_URI_MALFORMED, NULL); } - if ((0 == strcasecmp (uri, - str)) ) + if (0 == strcasecmp (uri, + str)) { - if (matches[i]) + if (NULL != matches[i]) { GNUNET_break (0); TMH_db->rollback (TMH_db->cls); @@ -236,13 +237,14 @@ TMH_private_patch_instances_ID (const struct TMH_RequestHandler *rh, TALER_EC_GENERIC_PAYTO_URI_MALFORMED, str); } - matches[i] = true; + matches[i] = wm; matched = true; break; } } /* delete unmatched (= removed) accounts */ - if (! matched) + if ( (! matched) && + (wm->active) ) { /* Account was REMOVED */ GNUNET_log (GNUNET_ERROR_TYPE_INFO, @@ -267,8 +269,25 @@ TMH_private_patch_instances_ID (const struct TMH_RequestHandler *rh, struct TALER_MERCHANTDB_AccountDetails ad; struct TMH_WireMethod *wm; - if (matches[i]) - continue; /* account existed */ + if (NULL != matches[i]) + { + wm = matches[i]; + if (! wm->active) + { + qs = TMH_db->activate_account (TMH_db->cls, + &wm->h_wire); + if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs) + { + TMH_db->rollback (TMH_db->cls); + if (GNUNET_DB_STATUS_SOFT_ERROR == qs) + goto retry; + else + goto giveup; + } + } + wm->enabling = true; + continue; + } ad.payto_uri = json_string_value (json_array_get (payto_uris, i)); GNUNET_assert (NULL != ad.payto_uri); @@ -359,8 +378,11 @@ giveup: /* We did not flip the 'active' bits earlier because the DB transaction could still fail. Now it is time to update our runtime state. */ + GNUNET_assert (! (wm->deleting & wm->enabling)); if (wm->deleting) wm->active = false; + if (wm->enabling) + wm->active = true; } /* Update our 'settings' */ |