/**
* Sets the {@code generationId} of the platform key for user {@code userId}.
*
- * @return The primary key ID of the relation.
+ * @return The number of updated rows.
*/
public long setPlatformKeyGenerationId(int userId, int generationId) {
SQLiteDatabase db = mKeyStoreDbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(UserMetadataEntry.COLUMN_NAME_USER_ID, userId);
values.put(UserMetadataEntry.COLUMN_NAME_PLATFORM_KEY_GENERATION_ID, generationId);
- long result = db.replace(
- UserMetadataEntry.TABLE_NAME, /*nullColumnHack=*/ null, values);
- if (result != -1) {
- invalidateKeysWithOldGenerationId(userId, generationId);
- }
- return result;
+ String selection = UserMetadataEntry.COLUMN_NAME_USER_ID + " = ?";
+ String[] selectionArguments = new String[] {String.valueOf(userId)};
+
+ ensureUserMetadataEntryExists(userId);
+ return db.update(UserMetadataEntry.TABLE_NAME, values, selection, selectionArguments);
}
/**
/**
* Sets the {@code serialNumber} for the user {@code userId}.
*
- * @return The primary key of the inserted row, or -1 if failed.
+ * @return The number of updated rows.
*/
public long setUserSerialNumber(int userId, long serialNumber) {
SQLiteDatabase db = mKeyStoreDbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(UserMetadataEntry.COLUMN_NAME_USER_ID, userId);
values.put(UserMetadataEntry.COLUMN_NAME_USER_SERIAL_NUMBER, serialNumber);
- long result = db.replace(
- UserMetadataEntry.TABLE_NAME, /*nullColumnHack=*/ null, values);
- return result;
+ String selection = UserMetadataEntry.COLUMN_NAME_USER_ID + " = ?";
+ String[] selectionArguments = new String[] {String.valueOf(userId)};
+
+ ensureUserMetadataEntryExists(userId);
+ return db.update(UserMetadataEntry.TABLE_NAME, values, selection, selectionArguments);
+
}
/**
}
/**
+ * Creates an empty row in the user metadata table if such a row doesn't exist for
+ * the given userId, so db.update will succeed.
+ */
+ private void ensureUserMetadataEntryExists(int userId) {
+ SQLiteDatabase db = mKeyStoreDbHelper.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put(UserMetadataEntry.COLUMN_NAME_USER_ID, userId);
+ db.insertWithOnConflict(UserMetadataEntry.TABLE_NAME, /*nullColumnHack=*/ null,
+ values, SQLiteDatabase.CONFLICT_IGNORE);
+ }
+
+ /**
* Closes all open connections to the database.
*/
public void close() {
}
@Test
+ public void setUserSerialNumbers_keepsPlatformKeyGenerationId() {
+ int userId = 42;
+ int generationId = 110;
+ Long serialNumber = 10L;
+
+ mRecoverableKeyStoreDb.setPlatformKeyGenerationId(userId, generationId);
+ mRecoverableKeyStoreDb.setUserSerialNumber(userId, serialNumber);
+
+ assertEquals(generationId, mRecoverableKeyStoreDb.getPlatformKeyGenerationId(userId));
+ }
+
+ @Test
+ public void setPlatformKeyGenerationId_keepsUserSerialNumber() {
+ int userId = 42;
+ int generationId = 110;
+ Long serialNumber = 10L;
+
+ mRecoverableKeyStoreDb.setPlatformKeyGenerationId(userId, generationId);
+ mRecoverableKeyStoreDb.setUserSerialNumber(userId, serialNumber);
+ mRecoverableKeyStoreDb.setPlatformKeyGenerationId(userId, generationId + 1);
+
+ assertEquals(serialNumber, mRecoverableKeyStoreDb.getUserSerialNumbers().get(userId));
+ }
+
+
+ @Test
public void removeUserFromAllTables_removesData() throws Exception {
int userId = 12;
int generationId = 24;