/* * Copyright (C) 2015 Actor LLC. <https://actor.im> */ package im.actor.runtime.android.storage; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; import java.util.List; import im.actor.runtime.storage.KeyValueRecord; import im.actor.runtime.storage.KeyValueStorage; public class SQLiteKeyValue implements KeyValueStorage { private SQLiteStatement insertStatement; private SQLiteStatement deleteStatement; private SQLiteDatabase db; private String name; private boolean isSqliteChecked = false; public SQLiteKeyValue(SQLiteDatabase db, String name) { this.db = db; this.name = name; } private void checkSqlite() { if (!isSqliteChecked) { isSqliteChecked = true; if (!SQLiteHelpers.isTableExists(db, name)) { db.execSQL("CREATE TABLE IF NOT EXISTS \"" + name + "\" (" + // "\"ID\" INTEGER NOT NULL," + // 0: id "\"BYTES\" BLOB NOT NULL," + // 1: bytes "PRIMARY KEY(\"ID\"));"); } } } private void checkInsertStatement() { if (insertStatement == null) { insertStatement = db.compileStatement("INSERT OR REPLACE INTO \"" + name + "\" " + "(\"ID\",\"BYTES\") VALUES (?,?)"); } } private void checkDeleteStatement() { if (deleteStatement == null) { deleteStatement = db.compileStatement("DELETE FROM \"" + name + "\" WHERE \"ID\"=?"); } } @Override public void addOrUpdateItem(long id, byte[] data) { checkSqlite(); checkInsertStatement(); db.beginTransaction(); try { insertStatement.bindLong(1, id); insertStatement.bindBlob(2, data); insertStatement.executeInsert(); db.setTransactionSuccessful(); } finally { db.endTransaction(); } } @Override public void addOrUpdateItems(List<KeyValueRecord> values) { checkSqlite(); checkInsertStatement(); db.beginTransaction(); try { for (KeyValueRecord r : values) { insertStatement.bindLong(1, r.getId()); insertStatement.bindBlob(2, r.getData()); insertStatement.executeInsert(); } db.setTransactionSuccessful(); } finally { db.endTransaction(); } } @Override public void removeItem(long id) { checkSqlite(); checkDeleteStatement(); db.beginTransaction(); try { deleteStatement.bindLong(1, id); deleteStatement.execute(); db.setTransactionSuccessful(); } finally { db.endTransaction(); } } @Override public void removeItems(long[] ids) { checkSqlite(); checkDeleteStatement(); db.beginTransaction(); try { for (long id : ids) { deleteStatement.bindLong(1, id); deleteStatement.execute(); } db.setTransactionSuccessful(); } finally { db.endTransaction(); } } @Override public byte[] loadItem(long key) { checkSqlite(); Cursor cursor = db.query("\"" + name + "\"", new String[]{"\"BYTES\""}, "\"ID\" = ?", new String[]{"" + key}, null, null, null); if (cursor == null) { return null; } try { if (cursor.moveToFirst()) { return cursor.getBlob(0); } } finally { cursor.close(); } return null; } @Override public List<KeyValueRecord> loadItems(long[] keys) { return null; } @Override public List<KeyValueRecord> loadAllItems() { return null; } @Override public void clear() { checkSqlite(); db.beginTransaction(); try { db.execSQL("DELETE FROM \"" + name + "\""); db.setTransactionSuccessful(); } finally { db.endTransaction(); } } }