mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-21 17:29:32 +01:00
Update to latest backup protos; Bump to libsignal v0.73.1
This commit is contained in:
@@ -54,6 +54,7 @@ import org.signal.core.util.readToSingleObject
|
||||
import org.signal.core.util.requireBlob
|
||||
import org.signal.core.util.requireBoolean
|
||||
import org.signal.core.util.requireInt
|
||||
import org.signal.core.util.requireIntOrNull
|
||||
import org.signal.core.util.requireLong
|
||||
import org.signal.core.util.requireNonNullBlob
|
||||
import org.signal.core.util.requireNonNullString
|
||||
@@ -264,7 +265,7 @@ class AttachmentTable(
|
||||
$UPLOAD_TIMESTAMP INTEGER DEFAULT 0,
|
||||
$DATA_HASH_START TEXT DEFAULT NULL,
|
||||
$DATA_HASH_END TEXT DEFAULT NULL,
|
||||
$ARCHIVE_CDN INTEGER DEFAULT 0,
|
||||
$ARCHIVE_CDN INTEGER DEFAULT NULL,
|
||||
$ARCHIVE_TRANSFER_FILE TEXT DEFAULT NULL,
|
||||
$ARCHIVE_TRANSFER_STATE INTEGER DEFAULT ${ArchiveTransferState.NONE.value},
|
||||
$THUMBNAIL_FILE TEXT DEFAULT NULL,
|
||||
@@ -705,7 +706,7 @@ class AttachmentTable(
|
||||
.update(TABLE_NAME)
|
||||
.values(
|
||||
ARCHIVE_TRANSFER_STATE to ArchiveTransferState.NONE.value,
|
||||
ARCHIVE_CDN to 0
|
||||
ARCHIVE_CDN to null
|
||||
)
|
||||
.where("$REMOTE_DIGEST = ?", digest)
|
||||
.run()
|
||||
@@ -1977,7 +1978,7 @@ class AttachmentTable(
|
||||
displayOrder = jsonObject.getInt(DISPLAY_ORDER),
|
||||
uploadTimestamp = jsonObject.getLong(UPLOAD_TIMESTAMP),
|
||||
dataHash = jsonObject.getString(DATA_HASH_END),
|
||||
archiveCdn = jsonObject.getInt(ARCHIVE_CDN),
|
||||
archiveCdn = if (jsonObject.isNull(ARCHIVE_CDN)) null else jsonObject.getInt(ARCHIVE_CDN),
|
||||
thumbnailRestoreState = ThumbnailRestoreState.deserialize(jsonObject.getInt(THUMBNAIL_RESTORE_STATE)),
|
||||
archiveTransferState = ArchiveTransferState.deserialize(jsonObject.getInt(ARCHIVE_TRANSFER_STATE)),
|
||||
uuid = UuidUtil.parseOrNull(jsonObject.getString(ATTACHMENT_UUID))
|
||||
@@ -2064,7 +2065,7 @@ class AttachmentTable(
|
||||
writableDatabase
|
||||
.update(TABLE_NAME)
|
||||
.values(
|
||||
ARCHIVE_CDN to 0
|
||||
ARCHIVE_CDN to null
|
||||
)
|
||||
.where(query.where, query.whereArgs)
|
||||
.run()
|
||||
@@ -2075,7 +2076,7 @@ class AttachmentTable(
|
||||
writableDatabase
|
||||
.updateAll(TABLE_NAME)
|
||||
.values(
|
||||
ARCHIVE_CDN to 0,
|
||||
ARCHIVE_CDN to null,
|
||||
ARCHIVE_TRANSFER_STATE to ArchiveTransferState.NONE.value
|
||||
)
|
||||
.run()
|
||||
@@ -2630,7 +2631,7 @@ class AttachmentTable(
|
||||
displayOrder = cursor.requireInt(DISPLAY_ORDER),
|
||||
uploadTimestamp = cursor.requireLong(UPLOAD_TIMESTAMP),
|
||||
dataHash = cursor.requireString(DATA_HASH_END),
|
||||
archiveCdn = cursor.requireInt(ARCHIVE_CDN),
|
||||
archiveCdn = cursor.requireIntOrNull(ARCHIVE_CDN),
|
||||
thumbnailRestoreState = ThumbnailRestoreState.deserialize(cursor.requireInt(THUMBNAIL_RESTORE_STATE)),
|
||||
archiveTransferState = ArchiveTransferState.deserialize(cursor.requireInt(ARCHIVE_TRANSFER_STATE)),
|
||||
uuid = UuidUtil.parseOrNull(cursor.requireString(ATTACHMENT_UUID))
|
||||
@@ -2658,7 +2659,7 @@ class AttachmentTable(
|
||||
hashEnd = this.requireString(DATA_HASH_END),
|
||||
transformProperties = TransformProperties.parse(this.requireString(TRANSFORM_PROPERTIES)),
|
||||
uploadTimestamp = this.requireLong(UPLOAD_TIMESTAMP),
|
||||
archiveCdn = this.requireInt(ARCHIVE_CDN),
|
||||
archiveCdn = this.requireIntOrNull(ARCHIVE_CDN),
|
||||
archiveTransferState = this.requireInt(ARCHIVE_TRANSFER_STATE),
|
||||
thumbnailFile = this.requireString(THUMBNAIL_FILE),
|
||||
thumbnailRandom = this.requireBlob(THUMBNAIL_RANDOM),
|
||||
@@ -2726,7 +2727,7 @@ class AttachmentTable(
|
||||
val hashEnd: String?,
|
||||
val transformProperties: TransformProperties,
|
||||
val uploadTimestamp: Long,
|
||||
val archiveCdn: Int,
|
||||
val archiveCdn: Int?,
|
||||
val archiveTransferState: Int,
|
||||
val thumbnailFile: String?,
|
||||
val thumbnailRandom: ByteArray?,
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.signal.core.util.readToList
|
||||
import org.signal.core.util.readToSet
|
||||
import org.signal.core.util.requireBoolean
|
||||
import org.signal.core.util.requireInt
|
||||
import org.signal.core.util.requireIntOrNull
|
||||
import org.signal.core.util.requireNonNullBlob
|
||||
import org.signal.core.util.requireNonNullString
|
||||
import org.signal.core.util.select
|
||||
@@ -257,7 +258,7 @@ class BackupMediaSnapshotTable(context: Context, database: SignalDatabase) : Dat
|
||||
class ArchiveMediaItem(
|
||||
val mediaId: String,
|
||||
val thumbnailMediaId: String,
|
||||
val cdn: Int,
|
||||
val cdn: Int?,
|
||||
val digest: ByteArray
|
||||
)
|
||||
|
||||
@@ -268,7 +269,7 @@ class BackupMediaSnapshotTable(context: Context, database: SignalDatabase) : Dat
|
||||
|
||||
class MediaEntry(
|
||||
val mediaId: String,
|
||||
val cdn: Int,
|
||||
val cdn: Int?,
|
||||
val digest: ByteArray,
|
||||
val isThumbnail: Boolean
|
||||
) {
|
||||
@@ -276,7 +277,7 @@ class BackupMediaSnapshotTable(context: Context, database: SignalDatabase) : Dat
|
||||
fun fromCursor(cursor: Cursor): MediaEntry {
|
||||
return MediaEntry(
|
||||
mediaId = cursor.requireNonNullString(MEDIA_ID),
|
||||
cdn = cursor.requireInt(CDN),
|
||||
cdn = cursor.requireIntOrNull(CDN),
|
||||
digest = cursor.requireNonNullBlob(REMOTE_DIGEST),
|
||||
isThumbnail = cursor.requireBoolean(IS_THUMBNAIL)
|
||||
)
|
||||
|
||||
@@ -130,6 +130,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V272_UpdateUnreadCo
|
||||
import org.thoughtcrime.securesms.database.helpers.migration.V273_FixUnreadOriginalMessages
|
||||
import org.thoughtcrime.securesms.database.helpers.migration.V274_BackupMediaSnapshotLastSeenOnRemote
|
||||
import org.thoughtcrime.securesms.database.helpers.migration.V275_EnsureDefaultAllChatsFolder
|
||||
import org.thoughtcrime.securesms.database.helpers.migration.V276_AttachmentCdnDefaultValueMigration
|
||||
import org.thoughtcrime.securesms.database.SQLiteDatabase as SignalSqliteDatabase
|
||||
|
||||
/**
|
||||
@@ -265,10 +266,11 @@ object SignalDatabaseMigrations {
|
||||
272 to V272_UpdateUnreadCountIndices,
|
||||
273 to V273_FixUnreadOriginalMessages,
|
||||
274 to V274_BackupMediaSnapshotLastSeenOnRemote,
|
||||
275 to V275_EnsureDefaultAllChatsFolder
|
||||
275 to V275_EnsureDefaultAllChatsFolder,
|
||||
276 to V276_AttachmentCdnDefaultValueMigration
|
||||
)
|
||||
|
||||
const val DATABASE_VERSION = 275
|
||||
const val DATABASE_VERSION = 276
|
||||
|
||||
@JvmStatic
|
||||
fun migrate(context: Application, db: SignalSqliteDatabase, oldVersion: Int, newVersion: Int) {
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright 2025 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.thoughtcrime.securesms.database.helpers.migration
|
||||
|
||||
import android.app.Application
|
||||
import org.signal.core.util.Stopwatch
|
||||
import org.signal.core.util.logging.Log
|
||||
import org.thoughtcrime.securesms.database.SQLiteDatabase
|
||||
|
||||
/**
|
||||
* We want to be able to distinguish between an unset CDN (null) and CDN 0. But we default the current CDN values to zero.
|
||||
* This migration updates things so that the CDN columns default to null. We also consider all current CDN 0's to actually be unset values.
|
||||
*/
|
||||
object V276_AttachmentCdnDefaultValueMigration : SignalDatabaseMigration {
|
||||
|
||||
private val TAG = Log.tag(V276_AttachmentCdnDefaultValueMigration::class)
|
||||
|
||||
override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
|
||||
val stopwatch = Stopwatch("v276")
|
||||
|
||||
db.execSQL("UPDATE attachment SET archive_cdn = NULL WHERE archive_cdn = 0")
|
||||
stopwatch.split("fix-old-data")
|
||||
|
||||
db.execSQL(
|
||||
"""
|
||||
CREATE TABLE attachment_tmp (
|
||||
_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
message_id INTEGER,
|
||||
content_type TEXT,
|
||||
remote_key TEXT,
|
||||
remote_location TEXT,
|
||||
remote_digest BLOB,
|
||||
remote_incremental_digest BLOB,
|
||||
remote_incremental_digest_chunk_size INTEGER DEFAULT 0,
|
||||
cdn_number INTEGER DEFAULT 0,
|
||||
transfer_state INTEGER,
|
||||
transfer_file TEXT DEFAULT NULL,
|
||||
data_file TEXT,
|
||||
data_size INTEGER,
|
||||
data_random BLOB,
|
||||
file_name TEXT,
|
||||
fast_preflight_id TEXT,
|
||||
voice_note INTEGER DEFAULT 0,
|
||||
borderless INTEGER DEFAULT 0,
|
||||
video_gif INTEGER DEFAULT 0,
|
||||
quote INTEGER DEFAULT 0,
|
||||
width INTEGER DEFAULT 0,
|
||||
height INTEGER DEFAULT 0,
|
||||
caption TEXT DEFAULT NULL,
|
||||
sticker_pack_id TEXT DEFAULT NULL,
|
||||
sticker_pack_key DEFAULT NULL,
|
||||
sticker_id INTEGER DEFAULT -1,
|
||||
sticker_emoji STRING DEFAULT NULL,
|
||||
blur_hash TEXT DEFAULT NULL,
|
||||
transform_properties TEXT DEFAULT NULL,
|
||||
display_order INTEGER DEFAULT 0,
|
||||
upload_timestamp INTEGER DEFAULT 0,
|
||||
data_hash_start TEXT DEFAULT NULL,
|
||||
data_hash_end TEXT DEFAULT NULL,
|
||||
archive_cdn INTEGER DEFAULT NULL,
|
||||
archive_transfer_file TEXT DEFAULT NULL,
|
||||
archive_transfer_state INTEGER DEFAULT 0,
|
||||
thumbnail_file TEXT DEFAULT NULL,
|
||||
thumbnail_random BLOB DEFAULT NULL,
|
||||
thumbnail_restore_state INTEGER DEFAULT 0,
|
||||
attachment_uuid TEXT DEFAULT NULL,
|
||||
remote_iv BLOB DEFAULT NULL,
|
||||
offload_restored_at INTEGER DEFAULT 0
|
||||
)
|
||||
"""
|
||||
)
|
||||
stopwatch.split("create-new-table")
|
||||
|
||||
db.execSQL("INSERT INTO attachment_tmp SELECT * FROM attachment")
|
||||
stopwatch.split("copy-data")
|
||||
|
||||
db.execSQL("DROP TABLE attachment")
|
||||
stopwatch.split("drop-table")
|
||||
|
||||
db.execSQL("ALTER TABLE attachment_tmp RENAME TO attachment")
|
||||
stopwatch.split("rename-table")
|
||||
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_message_id_index ON attachment (message_id);")
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_transfer_state_index ON attachment (transfer_state);")
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_sticker_pack_id_index ON attachment (sticker_pack_id);")
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_data_hash_start_index ON attachment (data_hash_start);")
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_data_hash_end_index ON attachment (data_hash_end);")
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_data_index ON attachment (data_file);")
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_archive_transfer_state ON attachment (archive_transfer_state);")
|
||||
db.execSQL("CREATE INDEX IF NOT EXISTS attachment_remote_digest_index ON attachment (remote_digest);")
|
||||
stopwatch.split("create-indexes")
|
||||
|
||||
db.execSQL(
|
||||
"""
|
||||
CREATE TRIGGER msl_attachment_delete AFTER DELETE ON attachment
|
||||
BEGIN
|
||||
DELETE FROM msl_payload WHERE _id IN (SELECT payload_id FROM msl_message WHERE msl_message.message_id = old.message_id);
|
||||
END
|
||||
"""
|
||||
)
|
||||
stopwatch.split("create-triggers")
|
||||
|
||||
stopwatch.stop(TAG)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user