diff options
Diffstat (limited to 'src/backenddb')
-rw-r--r-- | src/backenddb/pg_lookup_products.c | 44 | ||||
-rw-r--r-- | src/backenddb/pg_lookup_products.h | 5 | ||||
-rw-r--r-- | src/backenddb/test_merchantdb.c | 6 |
3 files changed, 47 insertions, 8 deletions
diff --git a/src/backenddb/pg_lookup_products.c b/src/backenddb/pg_lookup_products.c index d16aeb8d..fa2887a8 100644 --- a/src/backenddb/pg_lookup_products.c +++ b/src/backenddb/pg_lookup_products.c @@ -65,9 +65,12 @@ lookup_products_cb (void *cls, for (unsigned int i = 0; i < num_results; i++) { char *product_id; + uint64_t product_serial; struct GNUNET_PQ_ResultSpec rs[] = { GNUNET_PQ_result_spec_string ("product_id", &product_id), + GNUNET_PQ_result_spec_uint64 ("product_serial", + &product_serial), GNUNET_PQ_result_spec_end }; @@ -81,6 +84,7 @@ lookup_products_cb (void *cls, return; } plc->cb (plc->cb_cls, + product_serial, product_id); GNUNET_PQ_cleanup_result (rs); } @@ -90,10 +94,13 @@ lookup_products_cb (void *cls, enum GNUNET_DB_QueryStatus TMH_PG_lookup_products (void *cls, const char *instance_id, + uint64_t offset, + int64_t limit, TALER_MERCHANTDB_ProductsCallback cb, void *cb_cls) { struct PostgresClosure *pg = cls; + uint64_t plimit = (uint64_t) ((limit < 0) ? -limit : limit); struct LookupProductsContext plc = { .cb = cb, .cb_cls = cb_cls, @@ -102,24 +109,45 @@ TMH_PG_lookup_products (void *cls, }; struct GNUNET_PQ_QueryParam params[] = { GNUNET_PQ_query_param_string (instance_id), + GNUNET_PQ_query_param_uint64 (&offset), + GNUNET_PQ_query_param_uint64 (&plimit), GNUNET_PQ_query_param_end }; enum GNUNET_DB_QueryStatus qs; check_connection (pg); PREPARE (pg, - "lookup_products", + "lookup_products_asc", "SELECT" - " product_id" + " product_id" + " ,product_serial" " FROM merchant_inventory" " JOIN merchant_instances" " USING (merchant_serial)" - " WHERE merchant_instances.merchant_id=$1"); - qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, - "lookup_products", - params, - &lookup_products_cb, - &plc); + " WHERE merchant_instances.merchant_id=$1" + " AND product_serial > $2" + " ORDER BY product_serial ASC" + " LIMIT $3"); + PREPARE (pg, + "lookup_products_desc", + "SELECT" + " product_id" + " ,product_serial" + " FROM merchant_inventory" + " JOIN merchant_instances" + " USING (merchant_serial)" + " WHERE merchant_instances.merchant_id=$1" + " AND product_serial < $2" + " ORDER BY product_serial DESC" + " LIMIT $3"); + qs = GNUNET_PQ_eval_prepared_multi_select ( + pg->conn, + (limit > 0) + ? "lookup_products_asc" + : "lookup_products_desc", + params, + &lookup_products_cb, + &plc); /* If there was an error inside lookup_products_cb, return a hard error. */ if (plc.extract_failed) return GNUNET_DB_STATUS_HARD_ERROR; diff --git a/src/backenddb/pg_lookup_products.h b/src/backenddb/pg_lookup_products.h index 398b5eac..d96328c8 100644 --- a/src/backenddb/pg_lookup_products.h +++ b/src/backenddb/pg_lookup_products.h @@ -30,6 +30,9 @@ * * @param cls closure * @param instance_id instance to lookup products for + * @param offset transfer_serial number of the transfer we want to offset from + * @param limit number of entries to return, negative for descending, + * positive for ascending * @param cb function to call on all products found * @param cb_cls closure for @a cb * @return database result code @@ -37,6 +40,8 @@ enum GNUNET_DB_QueryStatus TMH_PG_lookup_products (void *cls, const char *instance_id, + uint64_t offset, + int64_t limit, TALER_MERCHANTDB_ProductsCallback cb, void *cb_cls); diff --git a/src/backenddb/test_merchantdb.c b/src/backenddb/test_merchantdb.c index 53902b3d..60a0b08b 100644 --- a/src/backenddb/test_merchantdb.c +++ b/src/backenddb/test_merchantdb.c @@ -906,13 +906,17 @@ struct TestLookupProducts_Closure * Function called after calling @e test_lookup_products * * @param cls a pointer to the lookup closure. + * @param product_serial DB row ID * @param product_id the identifier of the product found. */ static void lookup_products_cb (void *cls, + uint64_t product_serial, const char *product_id) { struct TestLookupProducts_Closure *cmp = cls; + + GNUNET_assert (product_serial > 0); if (NULL == cmp) return; cmp->results_length += 1; @@ -948,6 +952,8 @@ test_lookup_products (const struct InstanceData *instance, memset (results_matching, 0, sizeof (unsigned int) * products_length); if (0 > plugin->lookup_products (plugin->cls, instance->instance.id, + 0, + 20, &lookup_products_cb, &cls)) { |