Store the 'Recur' parameter in the preorder table.
authorWerner Koch <wk@gnupg.org>
Fri, 9 Jun 2017 13:21:49 +0000 (15:21 +0200)
committerWerner Koch <wk@gnupg.org>
Fri, 9 Jun 2017 13:21:49 +0000 (15:21 +0200)
* src/preorder.c (open_preorder_db): Add column 'recur'.
(insert_preorder_record): Handle that new column.
(get_columns): Ditto.
(format_columns): Ditto.
* src/payproc-post.c (sepapreorder): Allow inserting a recur value.

Signed-off-by: Werner Koch <wk@gnupg.org>
src/commands.c
src/payproc-post.c
src/preorder.c

index e081900..8604f98 100644 (file)
@@ -869,6 +869,7 @@ cmd_ppcheckout (conn_t conn, char *args)
 
    Amount:     The amount to charge with optional decimal fraction.
    Currency:   If given its value must be EUR.
+   Recur:      Optional recurrence value.
    Desc:       Optional description of the charge.
    Email:      Optional contact mail address of the customer
    Meta[NAME]: Meta data further described by NAME.  This is used to convey
index 32706e5..463acb1 100644 (file)
@@ -228,7 +228,7 @@ main (int argc, char **argv)
   else if (cmd == aSepaPreorder)
     {
       if (!argc || argc > 4)
-        wrong_args ("--sepa-preorder AMOUNT [NAME [EMAIL [DESC]]]");
+        wrong_args ("--sepa-preorder AMOUNT[/RECUR] [NAME [EMAIL [DESC]]]");
       sepapreorder (argv[0],
                     argc > 1? argv[1] : "",
                     argc > 2? argv[2] : "",
@@ -469,22 +469,47 @@ listpreorder (const char *refstring)
 
 
 static void
-sepapreorder (const char *amountstr, const char *name,
+sepapreorder (const char *amountstr_arg, const char *name,
               const char *email, const char *desc)
 {
   gpg_error_t err;
   keyvalue_t input = NULL;
   keyvalue_t output = NULL;
   keyvalue_t kv;
+  char *amountstr;
+  char *p;
+  int recur = 0;
+
+  amountstr = xstrdup (amountstr_arg);
+
+
+  p = strchr (amountstr, '/');
+  if (p)
+    {
+      *p++ = 0;
+      recur = atoi (p);
+    }
 
   if (!*amountstr || !convert_amount (amountstr, 2))
     {
       log_error ("Syntax error in amount or value is not positive\n");
+      xfree (amountstr);
+      return;
+    }
+
+  switch (recur)
+    {
+    case 0: case 1: case 4: case 12: break;
+    default:
+      log_error ("Syntax error in RECUR suffix - must be 0, 1, 4, or 12\n");
+      xfree (amountstr);
       return;
     }
 
   /* Find reference.  */
   err = keyvalue_put (&input, "Amount", amountstr);
+  if (!err)
+    err = keyvalue_putf (&input, "Recur", "%d", recur);
   if (!err && *name)
     err = keyvalue_put (&input, "Meta[Name]", name);
   if (!err && *email)
@@ -502,4 +527,5 @@ sepapreorder (const char *amountstr, const char *name,
 
   keyvalue_release (input);
   keyvalue_release (output);
+  xfree (amountstr);
 }
index db3cfae..8192f4d 100644 (file)
@@ -225,7 +225,8 @@ open_preorder_db (void)
                             "currency TEXT NOT NULL,"
                             "desc     TEXT,"
                             "email    TEXT,"
-                            "meta     TEXT"
+                            "meta     TEXT,"
+                            "recur    INTEGER"
                             ")",
                             -1, &stmt, NULL);
   if (res)
@@ -245,10 +246,29 @@ open_preorder_db (void)
       return gpg_error (GPG_ERR_GENERAL);
     }
 
+  /* Add the new column recur to the table.  */
+  res = sqlite3_prepare_v2 (preorder_db,
+                            "ALTER TABLE preorder ADD COLUMN \n"
+                            "recur INTEGER",
+                            -1, &stmt, NULL);
+  if (!res)
+    {
+      res = sqlite3_step (stmt);
+      sqlite3_finalize (stmt);
+      if (res != SQLITE_DONE)
+        {
+          log_error ("error adding column to preorder table: %s\n",
+                     sqlite3_errstr (res));
+          close_preorder_db (1);
+          return gpg_error (GPG_ERR_GENERAL);
+        }
+    }
+
+
   /* Prepare an insert statement.  */
   res = sqlite3_prepare_v2 (preorder_db,
                             "INSERT INTO preorder VALUES ("
-                            "?1,?2,?3,NULL,0,?4,?5,?6,?7,?8"
+                            "?1,?2,?3,NULL,0,?4,?5,?6,?7,?8,?9"
                             ")",
                             -1, &stmt, NULL);
   if (res)
@@ -377,6 +397,9 @@ insert_preorder_record (keyvalue_t *dictp)
       else
         res = sqlite3_bind_text (preorder_insert_stmt, 8, buf, -1, es_free);
     }
+  if (!res)
+    res = sqlite3_bind_int (preorder_insert_stmt,
+                            9, atoi (keyvalue_get_string (dict, "Recur")));
 
   if (res)
     {
@@ -462,6 +485,8 @@ get_columns (sqlite3_stmt *stmt, int idx, keyvalue_t *dictp)
     err = get_text_column (stmt, idx, 8, "Email", dictp);
   if (!err)
     err = get_text_column (stmt, idx, 9, "Meta", dictp);
+  if (!err)
+    err = get_text_column (stmt, idx, 10, "Recur", dictp);
 
   return err;
 }
@@ -516,8 +541,18 @@ format_columns (sqlite3_stmt *stmt, int idx, keyvalue_t *dictp)
       else
         put_membuf_str (&mb, s);
     }
+
+  i = sqlite3_column_int (stmt, 10);
+  if (!i && sqlite3_errcode (preorder_db) == SQLITE_NOMEM)
+    {
+      err = gpg_error (GPG_ERR_ENOMEM);
+      goto leave;
+    }
+  put_membuf_printf (&mb, "|%d", i);
+
   put_membuf_chr (&mb, '|');
 
+
   {
     char *p;