AUDIT: r17088 - gnucash/trunk/src/import-export/qif-import - Bug #512208: Upon cancellation or failure, the QIF importer now removes any new

Charles Day cedayiv at cvs.gnucash.org
Wed Apr 16 17:26:58 EDT 2008


Author: cedayiv
Date: 2008-04-16 17:26:57 -0400 (Wed, 16 Apr 2008)
New Revision: 17088
Trac: http://svn.gnucash.org/trac/changeset/17088

Modified:
   gnucash/trunk/src/import-export/qif-import/druid-qif-import.c
   gnucash/trunk/src/import-export/qif-import/file-format.txt
   gnucash/trunk/src/import-export/qif-import/qif-import.scm
   gnucash/trunk/src/import-export/qif-import/qif-to-gnc.scm
Log:
Bug #512208: Upon cancellation or failure, the QIF importer now removes any new
commodities that have been created as part of the import process. In addition,
any new accounts, splits, and transactions are explicitly destroyed to avoid
leaking memory and potentially leaving splits in an Imbalance account. Also
includes some improvements to the QIF file format documentation.
BP


Modified: gnucash/trunk/src/import-export/qif-import/druid-qif-import.c
===================================================================
--- gnucash/trunk/src/import-export/qif-import/druid-qif-import.c	2008-04-16 18:00:53 UTC (rev 17087)
+++ gnucash/trunk/src/import-export/qif-import/druid-qif-import.c	2008-04-16 21:26:57 UTC (rev 17088)
@@ -1457,6 +1457,34 @@
 
 
 /****************************************************************
+ * gnc_ui_qif_import_convert_undo
+ *
+ * This function launches the Scheme procedure that un-imports
+ * any imported accounts and transactions.
+ ****************************************************************/
+
+static void
+gnc_ui_qif_import_convert_undo(QIFImportWindow * wind)
+{
+  SCM undo = scm_c_eval_string("qif-import:qif-to-gnc-undo");
+
+  /* Undo the conversion. */
+  scm_call_1(undo, wind->imported_account_tree);
+
+  /* There's no imported account tree any more. */
+  scm_gc_unprotect_object(wind->imported_account_tree);
+  wind->imported_account_tree = SCM_BOOL_F;
+  scm_gc_protect_object(wind->imported_account_tree);
+
+
+  /* Get rid of the list of matched transactions. */
+  scm_gc_unprotect_object(wind->match_transactions);
+  wind->match_transactions = SCM_BOOL_F;
+  scm_gc_protect_object(wind->match_transactions);
+}
+
+
+/****************************************************************
  * gnc_ui_qif_import_convert
  *
  * This function launches the Scheme procedures that actually do
@@ -1503,14 +1531,12 @@
   {
     /* An error occurred during conversion. */
 
-    /* There's no imported account tree. */
-    scm_gc_unprotect_object(wind->imported_account_tree);
-    wind->imported_account_tree = SCM_BOOL_F;
-    scm_gc_protect_object(wind->imported_account_tree);
+    /* Remove any converted data. */
+    gnc_ui_qif_import_convert_undo(wind);
 
     /* We don't know what data structures may have become corrupted,
      * so we shouldn't allow further action. Display the failure
-     * page next, and just allow the user to cancel. */
+     * page next, and only allow the user to cancel. */
     gnome_druid_set_page(GNOME_DRUID(wind->druid),
                          get_named_page(wind, "failed_page"));
     gnome_druid_set_buttons_sensitive(GNOME_DRUID(wind->druid),
@@ -1539,6 +1565,11 @@
     if (retval == SCM_BOOL_F)
     {
       /* An error occurred during duplicate checking. */
+
+      /* Remove any converted data. */
+      gnc_ui_qif_import_convert_undo(wind);
+
+      /* Display the failure page. */
       gnome_druid_set_page(GNOME_DRUID(wind->druid),
                            get_named_page(wind, "failed_page"));
       gnome_druid_set_buttons_sensitive(GNOME_DRUID(wind->druid),
@@ -2148,15 +2179,37 @@
   gnc_ui_qif_import_druid_destroy(wind);  
 }
 
+
+/****************************************************************
+ * gnc_ui_qif_import_cancel_cb
+ *
+ * Invoked when the "Cancel" button is clicked.
+ ****************************************************************/
+
 static void
-gnc_ui_qif_import_cancel_cb (GnomeDruid * druid, 
-                             gpointer user_data)
+gnc_ui_qif_import_cancel_cb(GnomeDruid * druid, gpointer user_data)
 {
-  QIFImportWindow * wind = user_data;
-  
+  QIFImportWindow *wind = user_data;
+  GList           *pageptr;
+  GnomeDruidPage  *gtkpage;
+  QIFDruidPage    *page;
+
+  /* Remove any converted data. */
+  gnc_ui_qif_import_convert_undo(wind);
+
+  /* Remove any commodities created for druid pages. */
+  for (pageptr = wind->commodity_pages; pageptr; pageptr=pageptr->next)
+  {
+    gtkpage   = GNOME_DRUID_PAGE(pageptr->data);
+    page      = g_object_get_data(G_OBJECT(gtkpage), "page_struct");
+    gnc_commodity_destroy(page->commodity);
+  }
+
+  /* Destroy the druid. */
   gnc_ui_qif_import_druid_destroy(wind);
 }
 
+
 SCM
 gnc_ui_qif_import_druid_get_mappings(QIFImportWindow * w)
 {

Modified: gnucash/trunk/src/import-export/qif-import/file-format.txt
===================================================================
--- gnucash/trunk/src/import-export/qif-import/file-format.txt	2008-04-16 18:00:53 UTC (rev 17087)
+++ gnucash/trunk/src/import-export/qif-import/file-format.txt	2008-04-16 21:26:57 UTC (rev 17088)
@@ -264,18 +264,38 @@
 
 QIF N Line    Notes
 ============  =====
+Aktab         Same as ShrsOut.
+AktSplit      Same as StkSplit.
+Aktzu         Same as ShrsIn.
 Buy           Buy shares.
 BuyX          Buy shares. Used with an L line.
 Cash          Miscellaneous cash transaction. Used with an L line.
+CGMid         Mid-term capital gains.
+CGMidX        Mid-term capital gains. For use with an L line.
+CGLong        Long-term capital gains.
+CGLongX       Long-term capital gains. For use with an L line.
+CGShort       Short-term capital gains.
+CGShortX      Short-term capital gains. For use with an L line.
 ContribX      Same as XIn. Used for tax-advantaged accounts.
 CvrShrt       Buy shares to cover a short sale.
+CvrShrtX      Buy shares to cover a short sale. Used with an L line.
 Div           Dividend received.
 DivX          Dividend received. For use with an L line.
+Errinerg      Same as Reminder.
 Exercise      Exercise an option.
+ExercisX      Exercise an option. For use with an L line.
 Expire        Mark an option as expired. (Uses D, N, Y & M lines)
 Grant         Receive a grant of stock options.
+Int           Same as IntInc.
+IntX          Same as IntIncX.
 IntInc        Interest received.
 IntIncX       Interest received. For use with an L line.
+K.gewsp       Same as CGShort. (German)
+K.gewspX      Same as CGShortX. (German)
+Kapgew        Same as CGLong. Kapitalgewinnsteuer.(German)
+KapgewX       Same as CGLongX. Kapitalgewinnsteuer. (German)
+Kauf          Same as Buy. (German)
+KaufX         Same as BuyX. (German)
 MargInt       Margin interest paid.
 MargIntX      Margin interest paid. For use with an L line.
 MiscExp       Miscellaneous expense.
@@ -284,6 +304,13 @@
 MiscIncX      Miscellaneous income. For use with an L line.
 ReinvDiv      Reinvested dividend.
 ReinvInt      Reinvested interest.
+ReinvLG       Reinvested long-term capital gains.
+Reinvkur      Same as ReinvLG.
+Reinvksp      Same as ReinvSh.
+ReinvMd       Reinvested mid-term capital gains.
+ReinvSG       Same as ReinvSh.
+ReinvSh       Reinvested short-term capital gains.
+Reinvzin      Same as ReinvDiv.
 Reminder      Reminder. (Uses D, N, C & M lines)
 RtrnCap       Return of capital.
 RtrnCapX      Return of capital. For use with an L line.
@@ -293,9 +320,12 @@
 ShrsIn        Deposit shares.
 ShrsOut       Withdraw shares.
 StkSplit      Stock split.
+Verkauf       Same as Sell. (German)
+VerkaufX      Same as SellX. (German)
+Vest          Mark options as vested. (Uses N, Y, Q, C & M lines)
+WithDrwX      Same as XOut. Used for tax-advantaged accounts.
 XIn           Transfer cash from another account.
 XOut          Transfer cash to another account.
-Vest          Mark options as vested. (Uses N, Y, Q, C & M lines)
 
 Category/Transfer/Class line: 
 -----------------------------

Modified: gnucash/trunk/src/import-export/qif-import/qif-import.scm
===================================================================
--- gnucash/trunk/src/import-export/qif-import/qif-import.scm	2008-04-16 18:00:53 UTC (rev 17087)
+++ gnucash/trunk/src/import-export/qif-import/qif-import.scm	2008-04-16 21:26:57 UTC (rev 17088)
@@ -35,7 +35,6 @@
 
 (export make-qif-file)
 (export make-ticker-map)
-(export qif-import:qif-to-gnc)
 (export qif-import:get-all-accts)
 (export qif-import:fix-from-acct)
 (export qif-import:any-new-accts?)
@@ -43,6 +42,8 @@
 (export qif-import:refresh-match-selection)
 (export qif-import:save-map-prefs)
 (export qif-import:load-map-prefs)
+(export qif-import:qif-to-gnc)
+(export qif-import:qif-to-gnc-undo)
 
 (export qif-map-entry:gnc-name)
 (export qif-map-entry:set-gnc-name!)

Modified: gnucash/trunk/src/import-export/qif-import/qif-to-gnc.scm
===================================================================
--- gnucash/trunk/src/import-export/qif-import/qif-to-gnc.scm	2008-04-16 18:00:53 UTC (rev 17087)
+++ gnucash/trunk/src/import-export/qif-import/qif-to-gnc.scm	2008-04-16 21:26:57 UTC (rev 17088)
@@ -197,8 +197,9 @@
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; qif-import:qif-to-gnc 
-;; this is the top-level of the back end conversion from 
-;; QIF to GNC.  all the account mappings and so on should be 
+;;
+;; This is the top-level of the back end conversion from QIF
+;; to GnuCash. All the account mappings and so on should be 
 ;; done before this is called. 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
@@ -327,7 +328,7 @@
                            (splitloop (cdr splits))))))
                (qif-file:xtns qif-file)))
             qif-files-list)
-       
+
            (if (> work-to-do 100)
                (begin 
                  (set! progress-dialog (gnc-progress-dialog-new window #f))
@@ -351,7 +352,7 @@
                      (qif-import:mark-matching-xtns xtn rest))
                  (if (not (null? (cdr rest)))
                      (xloop (car rest) (cdr rest)))))
-       
+
            ;; iterate over files. Going in the sort order by number of 
            ;; transactions should give us a small speed advantage.
            (for-each 
@@ -1178,3 +1179,22 @@
               (loop (cdr splits)))))
     (if all-marked
         (qif-xtn:set-mark! xtn #t))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;  qif-import:qif-to-gnc-undo
+;;
+;;  Cancel the import by removing all newly created accounts,
+;;  splits, and transactions.
+;;
+;;  NOTE: Any new commodities should be destroyed by the druid.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(define (qif-import:qif-to-gnc-undo root)
+  (if root
+    (let ((txns (gnc:account-tree-get-transactions root)))
+      ;; Destroy all the transactions and their splits.
+      (for-each (lambda (elt) (xaccTransDestroy elt)) txns)
+
+      ;; Destroy the accounts
+      (xaccAccountBeginEdit root)
+      (xaccAccountDestroy root))))



More information about the gnucash-changes mailing list