]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java
some renames to better reflect the function
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / async / RetrieveTransactionsTask.java
index e63f30d2d026cc30988b1f191f0a38657f67472e..190aa7ed543cb9918706fd1591b1068acb4febab 100644 (file)
@@ -26,7 +26,7 @@ import android.util.Log;
 import net.ktnx.mobileledger.R;
 import net.ktnx.mobileledger.TransactionListActivity;
 import net.ktnx.mobileledger.model.LedgerTransaction;
-import net.ktnx.mobileledger.model.LedgerTransactionItem;
+import net.ktnx.mobileledger.model.LedgerTransactionAccount;
 import net.ktnx.mobileledger.utils.MLDB;
 import net.ktnx.mobileledger.utils.NetworkUtil;
 
@@ -38,6 +38,7 @@ import java.io.InputStreamReader;
 import java.lang.ref.WeakReference;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
+import java.util.Date;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -58,7 +59,7 @@ public class RetrieveTransactionsTask extends
         this.contextRef = contextRef;
     }
     private static final void L(String msg) {
-        Log.d("transaction-parser", msg);
+//        Log.d("transaction-parser", msg);
     }
     @Override
     protected void onProgressUpdate(Progress... values) {
@@ -85,6 +86,7 @@ public class RetrieveTransactionsTask extends
     @Override
     protected Void doInBackground(Params... params) {
         Progress progress = new Progress();
+        int maxTransactionId = Progress.INDETERMINATE;
         success = false;
         try {
             HttpURLConnection http =
@@ -99,16 +101,16 @@ public class RetrieveTransactionsTask extends
                             String.format("HTTP error %d", http.getResponseCode()));
                     db.beginTransaction();
                     try {
-                        db.execSQL("DELETE FROM transactions;");
-                        db.execSQL("DELETE FROM transaction_accounts");
+                        db.execSQL("UPDATE transactions set keep=0");
 
                         int state = ParserState.EXPECTING_JOURNAL;
                         String line;
                         BufferedReader buf =
                                 new BufferedReader(new InputStreamReader(resp, "UTF-8"));
 
-                        int transactionCount = 0;
+                        int processedTransactionCount = 0;
                         int transactionId = 0;
+                        int matchedTransactionsCount = 0;
                         LedgerTransaction transaction = null;
                         LINES:
                         while ((line = buf.readLine()) != null) {
@@ -132,8 +134,11 @@ public class RetrieveTransactionsTask extends
                                         L(String.format(
                                                 "found transaction %d → expecting " + "description",
                                                 transactionId));
-                                        progress.setProgress(++transactionCount);
-                                        if (progress.getTotal() == Progress.INDETERMINATE)
+                                        progress.setProgress(++processedTransactionCount);
+                                        if (maxTransactionId < transactionId)
+                                            maxTransactionId = transactionId;
+                                        if ((progress.getTotal() == Progress.INDETERMINATE) ||
+                                            (progress.getTotal() < transactionId))
                                             progress.setTotal(transactionId);
                                         publishProgress(progress);
                                     }
@@ -165,7 +170,31 @@ public class RetrieveTransactionsTask extends
                                 case ParserState.EXPECTING_TRANSACTION_DETAILS:
                                     if (line.isEmpty()) {
                                         // transaction data collected
-                                        transaction.insertInto(db);
+                                        if (transaction.existsInDb(db)) {
+                                            db.execSQL("UPDATE transactions SET keep = 1 WHERE id" +
+                                                       "=?", new Integer[]{transaction.getId()});
+                                            matchedTransactionsCount++;
+
+                                            if (matchedTransactionsCount == 100) {
+                                                db.execSQL("UPDATE transactions SET keep=1 WHERE " +
+                                                           "id < ?",
+                                                        new Integer[]{transaction.getId()});
+                                                success = true;
+                                                progress.setTotal(progress.getProgress());
+                                                publishProgress(progress);
+                                                break LINES;
+                                            }
+                                        }
+                                        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);
+                                            matchedTransactionsCount = 0;
+                                            progress.setTotal(maxTransactionId);
+                                        }
 
                                         state = ParserState.EXPECTING_TRANSACTION;
                                         L(String.format(
@@ -186,20 +215,25 @@ public class RetrieveTransactionsTask extends
                                             String acc_name = m.group(1);
                                             String amount = m.group(2);
                                             amount = amount.replace(',', '.');
-                                            transaction.add_item(new LedgerTransactionItem(acc_name,
-                                                    Float.valueOf(amount)));
+                                            transaction.addAccount(
+                                                    new LedgerTransactionAccount(acc_name,
+                                                            Float.valueOf(amount)));
                                             L(String.format("%s = %s", acc_name, amount));
                                         }
                                         else throw new IllegalStateException(
-                                                String.format("Can't parse transaction details"));
+                                                String.format("Can't parse transaction %d details",
+                                                        transactionId));
                                     }
                                     break;
                                 default:
                                     throw new RuntimeException(
-                                            String.format("Unknown " + "parser state %d", state));
+                                            String.format("Unknown parser state %d", state));
                             }
                         }
-                        if (!isCancelled()) db.setTransactionSuccessful();
+                        if (!isCancelled()) {
+                            db.execSQL("DELETE FROM transactions WHERE keep = 0");
+                            db.setTransactionSuccessful();
+                        }
                     }
                     finally {
                         db.endTransaction();
@@ -207,7 +241,11 @@ public class RetrieveTransactionsTask extends
                 }
             }
 
-            if (success && !isCancelled()) ctx.model.reloadTransactions(ctx);
+            if (success && !isCancelled()) {
+                Log.d("db", "Updating transaction list stamp");
+                MLDB.set_option_value(ctx, MLDB.OPT_TRANSACTION_LIST_STAMP, new Date().getTime());
+                ctx.model.reloadTransactions(ctx);
+            }
         }
         catch (MalformedURLException e) {
             error = R.string.err_bad_backend_url;
@@ -228,33 +266,14 @@ public class RetrieveTransactionsTask extends
     }
 
     public static class Params {
-        static final int DEFAULT_LIMIT = 100;
         private SharedPreferences backendPref;
-        private String accountsRoot;
-        private int limit;
 
         public Params(SharedPreferences backendPref) {
             this.backendPref = backendPref;
-            this.accountsRoot = null;
-            this.limit = DEFAULT_LIMIT;
-        }
-        Params(SharedPreferences backendPref, String accountsRoot) {
-            this(backendPref, accountsRoot, DEFAULT_LIMIT);
-        }
-        Params(SharedPreferences backendPref, String accountsRoot, int limit) {
-            this.backendPref = backendPref;
-            this.accountsRoot = accountsRoot;
-            this.limit = limit;
-        }
-        String getAccountsRoot() {
-            return accountsRoot;
         }
         SharedPreferences getBackendPref() {
             return backendPref;
         }
-        int getLimit() {
-            return limit;
-        }
     }
 
     public class Progress {