]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java
skip comments while parsing transactions
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / async / RetrieveTransactionsTask.java
index 12e53cb6f180236059c7f1026e8eff4eeb258e1e..7b898593870280e2b1302dff63ce4c44f95c3e0e 100644 (file)
@@ -51,12 +51,13 @@ import java.util.regex.Pattern;
 public class RetrieveTransactionsTask
         extends AsyncTask<Void, RetrieveTransactionsTask.Progress, Void> {
     public static final int MATCHING_TRANSACTIONS_LIMIT = 50;
+    public static final Pattern commentPattern = Pattern.compile("^\\s*;");
     private static final Pattern transactionStartPattern = Pattern.compile("<tr class=\"title\" " +
                                                                            "id=\"transaction-(\\d+)\"><td class=\"date\"[^\"]*>([\\d.-]+)</td>");
     private static final Pattern transactionDescriptionPattern =
             Pattern.compile("<tr class=\"posting\" title=\"(\\S+)\\s(.+)");
     private static final Pattern transactionDetailsPattern =
-            Pattern.compile("^\\s+" + "(\\S[\\S\\s]+\\S)\\s\\s+([-+]?\\d[\\d,.]*)(?:\\s+(\\S+)$)?");
+            Pattern.compile("^\\s+(\\S[\\S\\s]+\\S)\\s\\s+([-+]?\\d[\\d,.]*)(?:\\s+(\\S+)$)?");
     private static final Pattern endPattern = Pattern.compile("\\bid=\"addmodal\"");
     protected WeakReference<MainActivity> contextRef;
     protected int error;
@@ -144,6 +145,12 @@ public class RetrieveTransactionsTask
                         while ((line = buf.readLine()) != null) {
                             throwIfCancelled();
                             Matcher m;
+                            m = commentPattern.matcher(line);
+                            if (m.find()) {
+                                // TODO: comments are ignored for now
+                                Log.v("transaction-parser", "Ignoring comment");
+                                continue;
+                            }
                             //L(String.format("State is %d", updating));
                             switch (state) {
                                 case EXPECTING_ACCOUNT:
@@ -160,7 +167,7 @@ public class RetrieveTransactionsTask
                                         acct_name = acct_name.replace("\"", "");
                                         L(String.format("found account: %s", acct_name));
 
-                                        addAccount(db, acct_name);
+                                        profile.storeAccount(acct_name);
                                         lastAccount = new LedgerAccount(acct_name);
                                         accountList.add(lastAccount);
 
@@ -181,11 +188,8 @@ public class RetrieveTransactionsTask
                                         if (currency == null) currency = "";
                                         value = value.replace(',', '.');
                                         L("curr=" + currency + ", value=" + value);
-                                        db.execSQL(
-                                                "insert or replace into account_values(account, currency, value, keep) values(?, ?, ?, 1);",
-                                                new Object[]{lastAccount.getName(), currency,
-                                                             Float.valueOf(value)
-                                                });
+                                        profile.storeAccountValue(lastAccount.getName(), currency,
+                                                Float.valueOf(value));
                                         lastAccount.addAmount(Float.parseFloat(value), currency);
                                     }
 
@@ -244,16 +248,21 @@ public class RetrieveTransactionsTask
                                     if (line.isEmpty()) {
                                         // transaction data collected
                                         if (transaction.existsInDb(db)) {
-                                            db.execSQL("UPDATE transactions SET keep = 1 WHERE id" +
-                                                       "=?", new Integer[]{transaction.getId()});
+                                            db.execSQL("UPDATE transactions SET keep = 1 WHERE " +
+                                                       "profile = ? and id=?",
+                                                    new Object[]{profile.getUuid(),
+                                                                 transaction.getId()
+                                                    });
                                             matchedTransactionsCount++;
 
                                             if (matchedTransactionsCount ==
                                                 MATCHING_TRANSACTIONS_LIMIT)
                                             {
                                                 db.execSQL("UPDATE transactions SET keep=1 WHERE " +
-                                                           "id < ?",
-                                                        new Integer[]{transaction.getId()});
+                                                           "profile = ? and id < ?",
+                                                        new Object[]{profile.getUuid(),
+                                                                     transaction.getId()
+                                                        });
                                                 success = true;
                                                 progress.setTotal(progress.getProgress());
                                                 publishProgress(progress);
@@ -261,12 +270,7 @@ public class RetrieveTransactionsTask
                                             }
                                         }
                                         else {
-                                            db.execSQL("DELETE from transactions WHERE id=?",
-                                                    new Integer[]{transaction.getId()});
-                                            db.execSQL("DELETE from transaction_accounts WHERE " +
-                                                       "transaction_id=?",
-                                                    new Integer[]{transaction.getId()});
-                                            transaction.insertInto(db);
+                                            profile.storeTransaction(transaction);
                                             matchedTransactionsCount = 0;
                                             progress.setTotal(maxTransactionId);
                                         }
@@ -275,6 +279,7 @@ public class RetrieveTransactionsTask
                                         L(String.format(
                                                 "transaction %s saved → expecting transaction",
                                                 transaction.getId()));
+                                        transaction.finishLoading();
                                         transactionList.add(transaction);
 
 // sounds like a good idea, but transaction-1 may not be the first one chronologically
@@ -291,15 +296,17 @@ public class RetrieveTransactionsTask
                                             String acc_name = m.group(1);
                                             String amount = m.group(2);
                                             String currency = m.group(3);
+                                            if (currency == null) currency = "";
                                             amount = amount.replace(',', '.');
                                             transaction.addAccount(
                                                     new LedgerTransactionAccount(acc_name,
                                                             Float.valueOf(amount), currency));
-                                            L(String.format("%s = %s", acc_name, amount));
+                                            L(String.format("%d: %s = %s", transaction.getId(),
+                                                    acc_name, amount));
                                         }
-                                        else throw new IllegalStateException(
-                                                String.format("Can't parse transaction %d details",
-                                                        transactionId));
+                                        else throw new IllegalStateException(String.format(
+                                                "Can't parse transaction %d " + "details: %s",
+                                                transactionId, line));
                                     }
                                     break;
                                 default:
@@ -311,12 +318,13 @@ public class RetrieveTransactionsTask
 
                         throwIfCancelled();
 
-                        db.execSQL("DELETE FROM transactions WHERE keep = 0");
+                        db.execSQL("DELETE FROM transactions WHERE profile=? AND keep = 0",
+                                new String[]{profile.getUuid()});
                         db.setTransactionSuccessful();
 
                         Log.d("db", "Updating transaction value stamp");
                         Date now = new Date();
-                        MLDB.set_option_value(MLDB.OPT_TRANSACTION_LIST_STAMP, now.getTime());
+                        profile.set_option_value(MLDB.OPT_LAST_SCRAPE, now.getTime());
                         Data.lastUpdateDate.set(now);
                         Data.transactions.set(transactionList);
                     }
@@ -350,17 +358,6 @@ public class RetrieveTransactionsTask
     private MainActivity getContext() {
         return contextRef.get();
     }
-    private void addAccount(SQLiteDatabase db, String name) {
-        do {
-            LedgerAccount acc = new LedgerAccount(name);
-            db.execSQL("update accounts set level = ?, keep = 1 where name = ?",
-                    new Object[]{acc.getLevel(), name});
-            db.execSQL("insert into accounts(name, name_upper, parent_name, level) select ?,?," +
-                       "?,? " + "where (select changes() = 0)",
-                    new Object[]{name, name.toUpperCase(), acc.getParentName(), acc.getLevel()});
-            name = acc.getParentName();
-        } while (name != null);
-    }
     private void throwIfCancelled() {
         if (isCancelled()) throw new OperationCanceledException(null);
     }