some optimizations and indexes for the main key list query
This commit is contained in:
@@ -54,7 +54,7 @@ import java.io.IOException;
|
|||||||
*/
|
*/
|
||||||
public class KeychainDatabase extends SQLiteOpenHelper {
|
public class KeychainDatabase extends SQLiteOpenHelper {
|
||||||
private static final String DATABASE_NAME = "openkeychain.db";
|
private static final String DATABASE_NAME = "openkeychain.db";
|
||||||
private static final int DATABASE_VERSION = 13;
|
private static final int DATABASE_VERSION = 14;
|
||||||
static Boolean apgHack = false;
|
static Boolean apgHack = false;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
|
|
||||||
@@ -74,12 +74,14 @@ public class KeychainDatabase extends SQLiteOpenHelper {
|
|||||||
"CREATE TABLE IF NOT EXISTS keyrings_public ("
|
"CREATE TABLE IF NOT EXISTS keyrings_public ("
|
||||||
+ KeyRingsColumns.MASTER_KEY_ID + " INTEGER PRIMARY KEY,"
|
+ KeyRingsColumns.MASTER_KEY_ID + " INTEGER PRIMARY KEY,"
|
||||||
+ KeyRingsColumns.KEY_RING_DATA + " BLOB"
|
+ KeyRingsColumns.KEY_RING_DATA + " BLOB"
|
||||||
|
+ "PRIMARY KEY(" + KeyRingsColumns.MASTER_KEY_ID + "),"
|
||||||
+ ")";
|
+ ")";
|
||||||
|
|
||||||
private static final String CREATE_KEYRINGS_SECRET =
|
private static final String CREATE_KEYRINGS_SECRET =
|
||||||
"CREATE TABLE IF NOT EXISTS keyrings_secret ("
|
"CREATE TABLE IF NOT EXISTS keyrings_secret ("
|
||||||
+ KeyRingsColumns.MASTER_KEY_ID + " INTEGER PRIMARY KEY,"
|
+ KeyRingsColumns.MASTER_KEY_ID + " INTEGER PRIMARY KEY,"
|
||||||
+ KeyRingsColumns.KEY_RING_DATA + " BLOB,"
|
+ KeyRingsColumns.KEY_RING_DATA + " BLOB,"
|
||||||
|
+ "PRIMARY KEY(" + KeyRingsColumns.MASTER_KEY_ID + "),"
|
||||||
+ "FOREIGN KEY(" + KeyRingsColumns.MASTER_KEY_ID + ") "
|
+ "FOREIGN KEY(" + KeyRingsColumns.MASTER_KEY_ID + ") "
|
||||||
+ "REFERENCES keyrings_public(" + KeyRingsColumns.MASTER_KEY_ID + ") ON DELETE CASCADE"
|
+ "REFERENCES keyrings_public(" + KeyRingsColumns.MASTER_KEY_ID + ") ON DELETE CASCADE"
|
||||||
+ ")";
|
+ ")";
|
||||||
@@ -220,6 +222,13 @@ public class KeychainDatabase extends SQLiteOpenHelper {
|
|||||||
db.execSQL(CREATE_API_APPS);
|
db.execSQL(CREATE_API_APPS);
|
||||||
db.execSQL(CREATE_API_APPS_ACCOUNTS);
|
db.execSQL(CREATE_API_APPS_ACCOUNTS);
|
||||||
db.execSQL(CREATE_API_APPS_ALLOWED_KEYS);
|
db.execSQL(CREATE_API_APPS_ALLOWED_KEYS);
|
||||||
|
|
||||||
|
db.execSQL("CREATE INDEX keys_by_rank ON keys (" + KeysColumns.RANK + ");");
|
||||||
|
db.execSQL("CREATE INDEX uids_by_rank ON user_packets (" + UserPacketsColumns.RANK + ", "
|
||||||
|
+ UserPacketsColumns.USER_ID + ", " + UserPacketsColumns.MASTER_KEY_ID + ");");
|
||||||
|
db.execSQL("CREATE INDEX verified_certs ON certs ("
|
||||||
|
+ CertsColumns.VERIFIED + ", " + CertsColumns.MASTER_KEY_ID + ");");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -291,13 +300,14 @@ public class KeychainDatabase extends SQLiteOpenHelper {
|
|||||||
db.execSQL("DELETE FROM api_accounts WHERE key_id BETWEEN 0 AND 3");
|
db.execSQL("DELETE FROM api_accounts WHERE key_id BETWEEN 0 AND 3");
|
||||||
case 12:
|
case 12:
|
||||||
db.execSQL(CREATE_UPDATE_KEYS);
|
db.execSQL(CREATE_UPDATE_KEYS);
|
||||||
if (oldVersion == 10) {
|
|
||||||
// no consolidate if we are updating from 10, we're just here for
|
|
||||||
// the api_accounts fix and the new update keys table
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case 13:
|
case 13:
|
||||||
// do nothing here, just consolidate
|
// do nothing here, just consolidate
|
||||||
|
case 14:
|
||||||
|
db.execSQL("CREATE INDEX keys_by_rank ON keys (" + KeysColumns.RANK + ");");
|
||||||
|
db.execSQL("CREATE INDEX uids_by_rank ON user_packets (" + UserPacketsColumns.RANK + ", "
|
||||||
|
+ UserPacketsColumns.USER_ID + ", " + UserPacketsColumns.MASTER_KEY_ID + ");");
|
||||||
|
db.execSQL("CREATE INDEX verified_certs ON certs ("
|
||||||
|
+ CertsColumns.VERIFIED + ", " + CertsColumns.MASTER_KEY_ID + ");");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -303,14 +303,14 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
projectionMap.put(KeyRings.FINGERPRINT, Tables.KEYS + "." + Keys.FINGERPRINT);
|
projectionMap.put(KeyRings.FINGERPRINT, Tables.KEYS + "." + Keys.FINGERPRINT);
|
||||||
projectionMap.put(KeyRings.USER_ID, Tables.USER_PACKETS + "." + UserPackets.USER_ID);
|
projectionMap.put(KeyRings.USER_ID, Tables.USER_PACKETS + "." + UserPackets.USER_ID);
|
||||||
projectionMap.put(KeyRings.HAS_DUPLICATE_USER_ID,
|
projectionMap.put(KeyRings.HAS_DUPLICATE_USER_ID,
|
||||||
"(SELECT COUNT (*) FROM " + Tables.USER_PACKETS + " AS dups"
|
"(EXISTS (SELECT * FROM " + Tables.USER_PACKETS + " AS dups"
|
||||||
+ " WHERE dups." + UserPackets.MASTER_KEY_ID
|
+ " WHERE dups." + UserPackets.MASTER_KEY_ID
|
||||||
+ " != " + Tables.KEYS + "." + Keys.MASTER_KEY_ID
|
+ " != " + Tables.KEYS + "." + Keys.MASTER_KEY_ID
|
||||||
+ " AND dups." + UserPackets.RANK + " = 0"
|
+ " AND dups." + UserPackets.RANK + " = 0"
|
||||||
+ " AND dups." + UserPackets.USER_ID
|
+ " AND dups." + UserPackets.USER_ID
|
||||||
+ " = "+ Tables.USER_PACKETS + "." + UserPackets.USER_ID
|
+ " = "+ Tables.USER_PACKETS + "." + UserPackets.USER_ID
|
||||||
+ ") AS " + KeyRings.HAS_DUPLICATE_USER_ID);
|
+ ")) AS " + KeyRings.HAS_DUPLICATE_USER_ID);
|
||||||
projectionMap.put(KeyRings.VERIFIED, KeyRings.VERIFIED);
|
projectionMap.put(KeyRings.VERIFIED, Tables.CERTS + "." + Certs.VERIFIED);
|
||||||
projectionMap.put(KeyRings.PUBKEY_DATA,
|
projectionMap.put(KeyRings.PUBKEY_DATA,
|
||||||
Tables.KEY_RINGS_PUBLIC + "." + KeyRingData.KEY_RING_DATA
|
Tables.KEY_RINGS_PUBLIC + "." + KeyRingData.KEY_RING_DATA
|
||||||
+ " AS " + KeyRings.PUBKEY_DATA);
|
+ " AS " + KeyRings.PUBKEY_DATA);
|
||||||
@@ -319,10 +319,8 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
+ " AS " + KeyRings.PRIVKEY_DATA);
|
+ " AS " + KeyRings.PRIVKEY_DATA);
|
||||||
projectionMap.put(KeyRings.HAS_SECRET, Tables.KEYS + "." + KeyRings.HAS_SECRET);
|
projectionMap.put(KeyRings.HAS_SECRET, Tables.KEYS + "." + KeyRings.HAS_SECRET);
|
||||||
projectionMap.put(KeyRings.HAS_ANY_SECRET,
|
projectionMap.put(KeyRings.HAS_ANY_SECRET,
|
||||||
"(EXISTS (SELECT * FROM " + Tables.KEY_RINGS_SECRET
|
"(" + Tables.KEY_RINGS_SECRET + "." + KeyRings.MASTER_KEY_ID + " IS NOT NULL)" +
|
||||||
+ " WHERE " + Tables.KEY_RINGS_SECRET + "." + KeyRingData.MASTER_KEY_ID
|
" AS " + KeyRings.HAS_ANY_SECRET);
|
||||||
+ " = " + Tables.KEYS + "." + Keys.MASTER_KEY_ID
|
|
||||||
+ ")) AS " + KeyRings.HAS_ANY_SECRET);
|
|
||||||
projectionMap.put(KeyRings.HAS_ENCRYPT,
|
projectionMap.put(KeyRings.HAS_ENCRYPT,
|
||||||
"kE." + Keys.KEY_ID + " AS " + KeyRings.HAS_ENCRYPT);
|
"kE." + Keys.KEY_ID + " AS " + KeyRings.HAS_ENCRYPT);
|
||||||
projectionMap.put(KeyRings.HAS_SIGN,
|
projectionMap.put(KeyRings.HAS_SIGN,
|
||||||
@@ -363,7 +361,7 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
+ " = "
|
+ " = "
|
||||||
+ Tables.KEY_RINGS_PUBLIC + "." + KeyRingData.MASTER_KEY_ID
|
+ Tables.KEY_RINGS_PUBLIC + "." + KeyRingData.MASTER_KEY_ID
|
||||||
+ ")" : "")
|
+ ")" : "")
|
||||||
+ (plist.contains(KeyRings.PRIVKEY_DATA) ?
|
+ (plist.contains(KeyRings.PRIVKEY_DATA) || plist.contains(KeyRings.HAS_ANY_SECRET) ?
|
||||||
" LEFT JOIN " + Tables.KEY_RINGS_SECRET + " ON ("
|
" LEFT JOIN " + Tables.KEY_RINGS_SECRET + " ON ("
|
||||||
+ Tables.KEYS + "." + Keys.MASTER_KEY_ID
|
+ Tables.KEYS + "." + Keys.MASTER_KEY_ID
|
||||||
+ " = "
|
+ " = "
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ public class KeyListFragment extends LoaderFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
static final String ORDER =
|
static final String ORDER =
|
||||||
KeyRings.HAS_ANY_SECRET + " DESC, UPPER(" + KeyRings.USER_ID + ") ASC";
|
KeyRings.HAS_ANY_SECRET + " DESC, " + KeyRings.USER_ID + " COLLATE NOCASE ASC";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
|
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
|
||||||
|
|||||||
Reference in New Issue
Block a user