diff options
| author | Christian Grothoff <christian@grothoff.org> | 2022-12-31 01:15:40 +0100 | 
|---|---|---|
| committer | Christian Grothoff <christian@grothoff.org> | 2022-12-31 01:15:40 +0100 | 
| commit | 509141b6002d49db5a92b6d573cc7cca237fc1f0 (patch) | |
| tree | 0d743c2179c27452b51bfa8091fe726c9c7d4c99 /src | |
| parent | b1d9745545ff528729b53312947ba768c336a1d8 (diff) | |
-finish implementation of new DB functions
Diffstat (limited to 'src')
| -rw-r--r-- | src/exchangedb/pg_select_deposits_above_serial_id.c | 3 | ||||
| -rw-r--r-- | src/exchangedb/pg_select_kyc_attributes.c | 132 | ||||
| -rw-r--r-- | src/exchangedb/pg_select_satisfied_kyc_processes.c | 15 | ||||
| -rw-r--r-- | src/exchangedb/pg_select_similar_kyc_attributes.c | 127 | 
4 files changed, 259 insertions, 18 deletions
diff --git a/src/exchangedb/pg_select_deposits_above_serial_id.c b/src/exchangedb/pg_select_deposits_above_serial_id.c index 52f96e5f..b3258bd4 100644 --- a/src/exchangedb/pg_select_deposits_above_serial_id.c +++ b/src/exchangedb/pg_select_deposits_above_serial_id.c @@ -137,6 +137,7 @@ deposit_serial_helper_cb (void *cls,    }  } +  enum GNUNET_DB_QueryStatus  TEH_PG_select_deposits_above_serial_id (    void *cls, @@ -157,7 +158,7 @@ TEH_PG_select_deposits_above_serial_id (    };    enum GNUNET_DB_QueryStatus qs; -      /* Fetch deposits with rowid '\geq' the given parameter */ +  /* Fetch deposits with rowid '\geq' the given parameter */    PREPARE (pg,             "audit_get_deposits_incr",             "SELECT" diff --git a/src/exchangedb/pg_select_kyc_attributes.c b/src/exchangedb/pg_select_kyc_attributes.c index 4832df7e..e8b2e43d 100644 --- a/src/exchangedb/pg_select_kyc_attributes.c +++ b/src/exchangedb/pg_select_kyc_attributes.c @@ -26,6 +26,103 @@  #include "pg_helper.h" +/** + * Closure for #get_attributes_cb(). + */ +struct GetAttributesContext +{ +  /** +   * Function to call per result. +   */ +  TALER_EXCHANGEDB_AttributeCallback cb; + +  /** +   * Closure for @e cb. +   */ +  void *cb_cls; + +  /** +   * Plugin context. +   */ +  struct PostgresClosure *pg; + +  /** +   * Key of our query. +   */ +  const struct TALER_PaytoHashP *h_payto; + +  /** +   * Flag set to #GNUNET_OK as long as everything is fine. +   */ +  enum GNUNET_GenericReturnValue status; + +}; + + +/** + * Invoke the callback for each result. + * + * @param cls a `struct GetAttributesContext *` + * @param result SQL result + * @param num_results number of rows in @a result + */ +static void +get_attributes_cb (void *cls, +                   PGresult *result, +                   unsigned int num_results) +{ +  struct GetAttributesContext *ctx = cls; + +  for (unsigned int i = 0; i < num_results; i++) +  { +    struct TALER_PaytoHashP h_payto; +    struct GNUNET_TIME_Timestamp collection_time; +    struct GNUNET_TIME_Timestamp expiration_time; +    size_t enc_attributes_size; +    void *enc_attributes; +    char *provider; +    char *birthdate = NULL; +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_auto_from_type ("h_payto", +                                            &h_payto), +      GNUNET_PQ_result_spec_string ("provider", +                                    &provider), +      GNUNET_PQ_result_spec_allow_null ( +        GNUNET_PQ_result_spec_string ("birthdate", +                                      &birthdate), +        NULL), +      GNUNET_PQ_result_spec_timestamp ("collection_time", +                                       &collection_time), +      GNUNET_PQ_result_spec_timestamp ("expiration_time", +                                       &expiration_time), +      GNUNET_PQ_result_spec_variable_size ("encrypted_attributes", +                                           &enc_attributes, +                                           &enc_attributes_size), +      GNUNET_PQ_result_spec_end +    }; + +    if (GNUNET_OK != +        GNUNET_PQ_extract_result (result, +                                  rs, +                                  i)) +    { +      GNUNET_break (0); +      ctx->status = GNUNET_SYSERR; +      return; +    } +    ctx->cb (ctx->cb_cls, +             ctx->h_payto, +             provider, +             birthdate, +             collection_time, +             expiration_time, +             enc_attributes_size, +             enc_attributes); +    GNUNET_PQ_cleanup_result (rs); +  } +} + +  enum GNUNET_DB_QueryStatus  TEH_PG_select_kyc_attributes (    void *cls, @@ -33,6 +130,37 @@ TEH_PG_select_kyc_attributes (    TALER_EXCHANGEDB_AttributeCallback cb,    void *cb_cls)  { -  GNUNET_break (0); // FIXME: not implemeted! -  return GNUNET_DB_STATUS_HARD_ERROR; +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (h_payto), +    GNUNET_PQ_query_param_end +  }; +  struct GetAttributesContext ctx = { +    .cb = cb, +    .cb_cls = cb_cls, +    .pg = pg, +    .h_payto = h_payto, +    .status = GNUNET_OK +  }; +  enum GNUNET_DB_QueryStatus qs; + +  PREPARE (pg, +           "select_kyc_attributes", +           "SELECT " +           " provider" +           ",birthdate" +           ",collection_time" +           ",expiration_time" +           ",encrypted_attributes" +           " FROM kyc_attributes" +           " WHERE h_payto=$1"); +  qs = GNUNET_PQ_eval_prepared_multi_select ( +    pg->conn, +    "select_kyc_attributes", +    params, +    &get_attributes_cb, +    &ctx); +  if (GNUNET_OK != ctx.status) +    return GNUNET_DB_STATUS_HARD_ERROR; +  return qs;  } diff --git a/src/exchangedb/pg_select_satisfied_kyc_processes.c b/src/exchangedb/pg_select_satisfied_kyc_processes.c index f2191581..e0d884ef 100644 --- a/src/exchangedb/pg_select_satisfied_kyc_processes.c +++ b/src/exchangedb/pg_select_satisfied_kyc_processes.c @@ -26,17 +26,8 @@  #include "pg_helper.h" - - - - - - - - -  /** - * Closure for #get_wire_fees_cb(). + * Closure for #get_legitimizations_cb().   */  struct GetLegitimizationsContext  { @@ -105,7 +96,6 @@ get_legitimizations_cb (void *cls,  } -  enum GNUNET_DB_QueryStatus  TEH_PG_select_satisfied_kyc_processes (    void *cls, @@ -128,7 +118,7 @@ TEH_PG_select_satisfied_kyc_processes (      .status = GNUNET_OK    };    enum GNUNET_DB_QueryStatus qs; -   /* Used in #postgres_select_satisfied_kyc_processes() */ +    PREPARE (pg,             "get_satisfied_legitimizations",             "SELECT " @@ -136,7 +126,6 @@ TEH_PG_select_satisfied_kyc_processes (             " FROM legitimization_processes"             " WHERE h_payto=$1"             "   AND expiration_time>=$2;"); -    qs = GNUNET_PQ_eval_prepared_multi_select (      pg->conn,      "get_satisfied_legitimizations", diff --git a/src/exchangedb/pg_select_similar_kyc_attributes.c b/src/exchangedb/pg_select_similar_kyc_attributes.c index 27621837..a07f2a14 100644 --- a/src/exchangedb/pg_select_similar_kyc_attributes.c +++ b/src/exchangedb/pg_select_similar_kyc_attributes.c @@ -26,6 +26,98 @@  #include "pg_helper.h" +/** + * Closure for #get_similar_attributes_cb(). + */ +struct GetAttributesContext +{ +  /** +   * Function to call per result. +   */ +  TALER_EXCHANGEDB_AttributeCallback cb; + +  /** +   * Closure for @e cb. +   */ +  void *cb_cls; + +  /** +   * Plugin context. +   */ +  struct PostgresClosure *pg; + +  /** +   * Flag set to #GNUNET_OK as long as everything is fine. +   */ +  enum GNUNET_GenericReturnValue status; + +}; + + +/** + * Invoke the callback for each result. + * + * @param cls a `struct GetAttributesContext *` + * @param result SQL result + * @param num_results number of rows in @a result + */ +static void +get_attributes_cb (void *cls, +                   PGresult *result, +                   unsigned int num_results) +{ +  struct GetAttributesContext *ctx = cls; + +  for (unsigned int i = 0; i < num_results; i++) +  { +    struct TALER_PaytoHashP h_payto; +    struct GNUNET_TIME_Timestamp collection_time; +    struct GNUNET_TIME_Timestamp expiration_time; +    size_t enc_attributes_size; +    void *enc_attributes; +    char *provider; +    char *birthdate = NULL; +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_auto_from_type ("h_payto", +                                            &h_payto), +      GNUNET_PQ_result_spec_string ("provider", +                                    &provider), +      GNUNET_PQ_result_spec_allow_null ( +        GNUNET_PQ_result_spec_string ("birthdate", +                                      &birthdate), +        NULL), +      GNUNET_PQ_result_spec_timestamp ("collection_time", +                                       &collection_time), +      GNUNET_PQ_result_spec_timestamp ("expiration_time", +                                       &expiration_time), +      GNUNET_PQ_result_spec_variable_size ("encrypted_attributes", +                                           &enc_attributes, +                                           &enc_attributes_size), +      GNUNET_PQ_result_spec_end +    }; + +    if (GNUNET_OK != +        GNUNET_PQ_extract_result (result, +                                  rs, +                                  i)) +    { +      GNUNET_break (0); +      ctx->status = GNUNET_SYSERR; +      return; +    } +    ctx->cb (ctx->cb_cls, +             &h_payto, +             provider, +             birthdate, +             collection_time, +             expiration_time, +             enc_attributes_size, +             enc_attributes); +    GNUNET_PQ_cleanup_result (rs); +  } +} + +  enum GNUNET_DB_QueryStatus  TEH_PG_select_similar_kyc_attributes (    void *cls, @@ -33,6 +125,37 @@ TEH_PG_select_similar_kyc_attributes (    TALER_EXCHANGEDB_AttributeCallback cb,    void *cb_cls)  { -  GNUNET_break (0); // FIXME: not implemeted! -  return GNUNET_DB_STATUS_HARD_ERROR; +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (kyc_prox), +    GNUNET_PQ_query_param_end +  }; +  struct GetAttributesContext ctx = { +    .cb = cb, +    .cb_cls = cb_cls, +    .pg = pg, +    .status = GNUNET_OK +  }; +  enum GNUNET_DB_QueryStatus qs; + +  PREPARE (pg, +           "select_similar_kyc_attributes", +           "SELECT " +           " h_payto" +           ",provider" +           ",birthdate" +           ",collection_time" +           ",expiration_time" +           ",encrypted_attributes" +           " FROM kyc_attributes" +           " WHERE kyc_prox=$1"); +  qs = GNUNET_PQ_eval_prepared_multi_select ( +    pg->conn, +    "select_similar_kyc_attributes", +    params, +    &get_attributes_cb, +    &ctx); +  if (GNUNET_OK != ctx.status) +    return GNUNET_DB_STATUS_HARD_ERROR; +  return qs;  }  | 
