After discusing with Derek a bit, here's the patch that corrects bug
#116546.  This is against head; I've not backported to 1.8.x yet.


-- 
Matthew Vanecek
perl -e 'print $i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);'
********************************************************************************
For 93 million miles, there is nothing between the sun and my shadow except me.
I'm always getting in the way of something...
Index: ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/ChangeLog,v
retrieving revision 1.1702
diff -u -r1.1702 ChangeLog
--- ChangeLog	27 Jul 2003 04:02:02 -0000	1.1702
+++ ChangeLog	27 Jul 2003 17:09:01 -0000
@@ -1,3 +1,22 @@
+2003-07-27  Matt Vanecek  <[EMAIL PROTECTED]>
+
+    * src/backend/postgres/PostgresBackend.c: Added pgendGetBook(),
+      to retrieve the QofBook from the session, instead of storing the
+      book in the backend object.
+    - Where be->book was used, use pgendGetBook() instead.
+    - Enhanced debug messages.
+    * src/backend/postgres/PostgresBackend.h: Added the qofbook.h
+      include, and the pgendGetBook() prototype
+    * src/backend/postgres/book.c: Changed pgendGetBook to
+      pgendBookRestore() to reflect its functionality of restoring
+      the book's data to the engine.
+    * src/backend/postgres/price.c: In pgendPriceFind(), couched the
+      currenct portion of the SQL statement in an "if" statement,
+      because gnc_pricedb_lookup_latest_any_currency() can pass in
+      a NULL currency, and stpcpy() doesn't like NULLs.
+    * src/backend/postgres/escape.c: enhanced debug messages.
+    Fixes bug #116546
+
 2003-07-26  Derek Atkins  <[EMAIL PROTECTED]>
 
 	* src/engine/qofbackend.h: add a new error, ERR_BACKEND_READONLY
Index: src/backend/postgres/PostgresBackend.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/postgres/PostgresBackend.c,v
retrieving revision 1.47
diff -u -r1.47 PostgresBackend.c
--- src/backend/postgres/PostgresBackend.c	28 Jun 2003 20:56:29 -0000	1.47
+++ src/backend/postgres/PostgresBackend.c	27 Jul 2003 17:09:05 -0000
@@ -217,6 +217,17 @@
 
 /* ============================================================= */
 
+QofBook *
+pgendGetBook(PGBackend *pbe) {
+    QofBook *book;
+    
+    ENTER(" ");
+    book = qof_session_get_book(pbe->session);
+
+    LEAVE("book = %p", book);
+    return book;
+}
+
 static void 
 pgend_set_book (PGBackend *be, QofBook *book)
 {
@@ -438,7 +449,7 @@
    }
    else
    {
-      trans = xaccMallocTransaction(be->book);
+      trans = xaccMallocTransaction(pgendGetBook(be));
       xaccTransBeginEdit (trans);
       xaccTransSetGUID (trans, &trans_guid);
    }
@@ -452,7 +463,8 @@
    xaccTransSetVersion (trans, atoi(DB_GET_VAL("version",j)));
    trans->idata = atoi(DB_GET_VAL("iguid",j));
 
-   currency = gnc_string_to_commodity (DB_GET_VAL("currency",j), be->book);
+   currency = gnc_string_to_commodity (DB_GET_VAL("currency",j), 
+                                       pgendGetBook(be));
    if (currency)
      xaccTransSetCurrency (trans, currency);
    else
@@ -512,7 +524,8 @@
      gnc_commodity * commodity;
 
      pgendGetCommodity (be, ri->commodity_string);
-     commodity = gnc_string_to_commodity (ri->commodity_string, be->book);
+     commodity = gnc_string_to_commodity (ri->commodity_string,
+                                          pgendGetBook(be));
 
      if (commodity)
      {
@@ -697,7 +710,7 @@
    sqlQuery *sq;
 
    ENTER ("be=%p, qry=%p", be, q);
-   if (!be || !q) return;
+   if (!be || !q) { LEAVE("(null) args"); return; }
    be->version_check = (guint32) time(0);
 
    gnc_engine_suspend_events();
@@ -708,7 +721,7 @@
    sq = sqlQuery_new();
    sql_query_string = sqlQuery_build (sq, q);
 
-   topgroup = gnc_book_get_group (be->book);
+   topgroup = gnc_book_get_group (pgendGetBook(be));
 
    /* stage transactions, save some postgres overhead */
    xaccGroupBeginStagedTransactionTraversals (topgroup);
@@ -1475,18 +1488,18 @@
 
    if (be->blist) 
    {
+      GList *node;
+      PWARN ("old book list not empty--clearing it out ");
       /* XXX not clear what this means ... should we free old books ?? */
-      /* The old book list is set by the session when the session is 
-       * created.  It is an empty book, and should be discarded in favor
-       * of the Book retrieved from the database.
-       * PWARN ("old book list not empty ");
-       */
+      for (node = be->blist; node; node = node->next) {
+          g_free(node->data);
+          node->data = NULL;
+      }
       g_list_free (be->blist);
       be->blist = NULL;
    }
+   pgendBookRestore (be, book);
    pgend_set_book (be, book);
-   pgendGetBook (be, book);
-   qof_session_set_book(be->session, book);
                         
    PINFO("Book GUID = %s\n",
            guid_to_string(qof_book_get_guid(book)));
@@ -1524,19 +1537,22 @@
    pgendDisable(be);
    be->version_check = (guint32) time(0);
 
-   pgend_set_book (be, book);
-
    pgendKVPInit(be);
 
    if (be->blist) 
    {
+      GList *node;
+      PWARN ("old book list not empty--clearing it out ");
       /* XXX not clear what this means ... should we free old books ?? */
-      PWARN ("old book list not empty ");
+      for (node = be->blist; node; node = node->next) {
+          g_free(node->data);
+          node->data = NULL;
+      }
       g_list_free (be->blist);
+      be->blist = NULL;
    }
-   pgendGetBook (be, book);
-
-   be->blist = g_list_append (NULL, book);
+   pgendBookRestore (be, book);
+   pgend_set_book (be, book);
 
    pgendGetAllAccountsInBook (be, book);
 
@@ -1557,7 +1573,9 @@
 {
    PGBackend *be = (PGBackend *)bend;
 
-   if (!be || !book) return;
+   ENTER("be = %p", bend);
+   
+   if (!be || !book) { LEAVE("(null) args"); return; }
 
    pgend_set_book (be, book);
 
@@ -1571,6 +1589,7 @@
    /* re-enable events */
    pgendEnable(be);
    gnc_engine_resume_events();
+   LEAVE(" ");
 }
 
 /* ============================================================= */
@@ -1768,7 +1787,6 @@
       g_list_free (be->blist);
       be->blist = NULL;
    }
-   pgend_set_book (be, qof_session_get_book(session));
 
    /* Parse the sessionid for the hostname, port number and db name.
     * The expected URL format is
@@ -2344,13 +2362,17 @@
 void
 pgendDisable (PGBackend *be)
 {
+   ENTER("be = %p", be);
    if (0 > be->nest_count)
    {
       PERR ("too many nested enables");
    }
    be->nest_count ++;
    PINFO("nest count=%d", be->nest_count);
-   if (1 < be->nest_count) return;
+   if (1 < be->nest_count) {
+       LEAVE("be->nest_count < 1: %d", be->nest_count); 
+       return;
+   }
 
    /* save hooks */
    be->snr.load	                = be->be.load;
@@ -2382,6 +2404,8 @@
    be->be.percentage           = NULL;
    be->be.events_pending       = NULL;
    be->be.process_events       = NULL;
+
+   LEAVE(" ");
 }
 
 /* ============================================================= */
Index: src/backend/postgres/PostgresBackend.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/postgres/PostgresBackend.h,v
retrieving revision 1.10
diff -u -r1.10 PostgresBackend.h
--- src/backend/postgres/PostgresBackend.h	28 Jun 2003 20:56:30 -0000	1.10
+++ src/backend/postgres/PostgresBackend.h	27 Jul 2003 17:09:05 -0000
@@ -42,6 +42,7 @@
 
 #include "builder.h"
 #include "qofbackend-p.h"
+#include "qofbook.h"
 
 typedef struct _pgend PGBackend;
 
@@ -125,6 +126,7 @@
 Transaction * pgendTransLookup (PGBackend *be, const GUID *txn_guid);
 Split * pgendSplitLookup (PGBackend *be, const GUID *split_guid);
 QofIdType pgendGUIDType (PGBackend *be, const GUID *guid);
+QofBook * pgendGetBook(PGBackend *pbe);
 
 void pgendDisable (PGBackend *be);
 void pgendEnable (PGBackend *be);
Index: src/backend/postgres/book.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/postgres/book.c,v
retrieving revision 1.9
diff -u -r1.9 book.c
--- src/backend/postgres/book.c	28 Jun 2003 20:56:31 -0000	1.9
+++ src/backend/postgres/book.c	27 Jul 2003 17:09:05 -0000
@@ -130,7 +130,7 @@
 /* ============================================================= */
 
 /* ============================================================= */
-/* The pgendGetBook() routine restores the all book data,
+/* The pgendBookRestore() routine restores the all book data,
  * including the account heirarchy, the price db, commodities, etc.
  */
 
@@ -155,7 +155,7 @@
 }
 
 void
-pgendGetBook (PGBackend *be, QofBook *book)
+pgendBookRestore (PGBackend *be, QofBook *book)
 {
    char * bufp;
 
Index: src/backend/postgres/book.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/postgres/book.h,v
retrieving revision 1.5
diff -u -r1.5 book.h
--- src/backend/postgres/book.h	28 Jun 2003 20:56:31 -0000	1.5
+++ src/backend/postgres/book.h	27 Jul 2003 17:09:05 -0000
@@ -32,7 +32,7 @@
 
 QofBookList * pgendGetAllBooks (PGBackend *be, QofBookList *);
 
-void pgendGetBook (PGBackend *be, QofBook *book);
+void pgendBookRestore (PGBackend *be, QofBook *book);
 void pgendStoreBookNoLock (PGBackend *be, QofBook *book, int do_check_version);
 void pgendStoreBook (PGBackend *be, QofBook *book);
 
Index: src/backend/postgres/escape.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/postgres/escape.c,v
retrieving revision 1.4
diff -u -r1.4 escape.c
--- src/backend/postgres/escape.c	28 Jun 2003 20:56:32 -0000	1.4
+++ src/backend/postgres/escape.c	27 Jul 2003 17:09:05 -0000
@@ -59,16 +59,23 @@
    char *dst_tail;
    size_t len, slen;
 
-   if (!b || !str) return NULL;
+   ENTER("str = %s", str);
+   
+   if (!b || !str) { LEAVE("(null) args"); return NULL; }
 
    /* if a string is escaped twice, just return the first */
-   if (b->escape == str)
-     return str;
+   if (b->escape == str) {
+       LEAVE("%s: already escaped", str);
+       return str;
+   }
 
    /* if nothing to escape, just return */
    len = strlen (str);
    slen = strcspn (str, "\\\'");
-   if (len == slen) return str;
+   if (len == slen) {
+       LEAVE("nothing to escape");
+       return str;
+   }
 
    /* count to see how much space we'll need */
    p = str + slen + 1;
@@ -112,6 +119,7 @@
    }
    *dst_tail = 0;
 
+   LEAVE("b->escape = %s", b->escape);
    return b->escape;
 }
 
Index: src/backend/postgres/price.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/postgres/price.c,v
retrieving revision 1.19
diff -u -r1.19 price.c
--- src/backend/postgres/price.c	28 Jun 2003 20:56:34 -0000	1.19
+++ src/backend/postgres/price.c	27 Jul 2003 17:09:05 -0000
@@ -363,7 +363,7 @@
    char * p;
 
    ENTER ("be=%p, lookup=%p", be, look);
-   if (!be || !look) return;
+   if (!be || !look) { LEAVE("(null) args"); return; }
 
    /* special case the two-way search in terms of more basic primitives */
    if (LOOKUP_NEAREST_IN_TIME == look->type)
@@ -372,6 +372,7 @@
       pgendPriceFind (bend, look);
       look->type = LOOKUP_EARLIEST_AFTER;
       pgendPriceFind (bend, look);
+      LEAVE(" ");
       return;
    }
 
@@ -389,10 +390,16 @@
    p = stpcpy (p, "SELECT * FROM gncPrice"
                   "  WHERE commodity='");
    p = stpcpy (p, sqlEscapeString (escape, commodity_str));
-   p = stpcpy (p, "'  AND currency='");
-   p = stpcpy (p, sqlEscapeString (escape, currency_str));
    p = stpcpy (p, "' ");
 
+   if (currency_str) {
+       p = stpcpy (p, "AND currency='");
+       p = stpcpy (p, sqlEscapeString (escape, currency_str));
+       p = stpcpy (p, "' ");
+   }
+
+   PINFO("query = %s", be->buff);
+
    sqlEscape_destroy (escape);
    escape = NULL;
 
@@ -429,6 +436,7 @@
          /* re-enable events */
          pgendEnable(be);
          gnc_engine_resume_events();
+         LEAVE(" ");
          return;
    }
 
@@ -442,6 +450,7 @@
    /* re-enable events */
    pgendEnable(be);
    gnc_engine_resume_events();
+   LEAVE(" ");
 }
 
 /* ============================================================= */

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
gnucash-devel mailing list
[EMAIL PROTECTED]
http://www.gnucash.org/cgi-bin/mailman/listinfo/gnucash-devel

Reply via email to