Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 342048e9 authored by Vincent Breitmoser's avatar Vincent Breitmoser
Browse files

StoragePerister: use statement for delete, drop intermediate map

parent 40b4ebbc
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -67,16 +67,14 @@ public class StorageEditor {
                for (String removeKey : removals) {
                    ops.remove(removeKey);
                }
                Map<String, String> insertables = new HashMap<>();
                for (Entry<String, String> entry : changes.entrySet()) {
                    String key = entry.getKey();
                    String newValue = entry.getValue();
                    String oldValue = snapshot.get(key);
                    if (removals.contains(key) || !newValue.equals(oldValue)) {
                        insertables.put(key, newValue);
                        ops.put(key, newValue);
                    }
                }
                ops.put(insertables);
            }

            @Override
+23 −20
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ public class StoragePersister {
            StoragePersistOperations storagePersistOperations = new StoragePersistOperations(workingStorage, workingDb);
            workingDb.beginTransaction();
            operationCallback.persist(storagePersistOperations);
            storagePersistOperations.close();
            workingDb.setTransactionSuccessful();

            operationCallback.onPersistTransactionSuccess(workingStorage);
@@ -83,38 +84,40 @@ public class StoragePersister {
    }

    static class StoragePersistOperations {
        private SQLiteDatabase workingDB;
        private Map<String, String> workingStorage;
        private final SQLiteStatement deleteStatement;
        private final SQLiteStatement insertStatement;

        private StoragePersistOperations(Map<String, String> workingStorage, SQLiteDatabase workingDb) {
            this.workingDB = workingDb;
        private StoragePersistOperations(Map<String, String> workingStorage, SQLiteDatabase database) {
            this.workingStorage = workingStorage;
        }

        void put(Map<String, String> insertables) {
            String sql = "INSERT INTO preferences_storage (primkey, value) VALUES (?, ?)";
            SQLiteStatement stmt = workingDB.compileStatement(sql);

            for (Map.Entry<String, String> entry : insertables.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                stmt.bindString(1, key);
                stmt.bindString(2, value);
                stmt.execute();
                stmt.clearBindings();
                liveUpdate(key, value);
            }
            stmt.close();
            insertStatement = database.compileStatement(
                    "INSERT INTO preferences_storage (primkey, value) VALUES (?, ?)");
            deleteStatement = database.compileStatement(
                    "DELETE FROM preferences_storage WHERE primkey = ?");
        }

        private void liveUpdate(String key, String value) {
        void put(String key, String value) {
            insertStatement.bindString(1, key);
            insertStatement.bindString(2, value);
            insertStatement.execute();
            insertStatement.clearBindings();

            workingStorage.put(key, value);
        }

        void remove(String key) {
            workingDB.delete("preferences_storage", "primkey = ?", new String[] { key });
            deleteStatement.bindString(1, key);
            deleteStatement.executeUpdateDelete();
            deleteStatement.clearBindings();

            workingStorage.remove(key);
        }

        private void close() {
            insertStatement.close();
            deleteStatement.close();
        }
    }

    interface StoragePersistOperationCallback {