Files
Peter Serwylo ba87e2e8ba DB Performance fixes focussing on App Details screen.
Added indexes based on slow query logs and associated `EXPLAIN QUERY
PLAN` output.

Note: There are some composite primary keys with `repoId` +
`packageName` + ..., and we still ad an index on `packageName`.
This is because the order matters in composite keys. It might
be possible to restructure the primary key to be `packageName` +
`repoId` + ..., however this requires removing the table and
recreating it which is more complex then just adding an index on
`packageIndex` in addition to the primary key. There is also no
guarantee that things wont slow down when restructuring the primary key,
because there may be some cases where it is important that `repoId` is
first in that index.
2026-03-26 14:38:48 -03:00

1102 lines
35 KiB
JSON

{
"formatVersion": 1,
"database": {
"version": 11,
"identityHash": "7b9484dd0c09e777fb1e5baa7426123a",
"entities": [
{
"tableName": "CoreRepository",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon` TEXT, `address` TEXT NOT NULL, `webBaseUrl` TEXT, `timestamp` INTEGER NOT NULL, `version` INTEGER, `formatVersion` TEXT, `maxAge` INTEGER, `description` TEXT NOT NULL, `certificate` TEXT NOT NULL)",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "icon",
"columnName": "icon",
"affinity": "TEXT"
},
{
"fieldPath": "address",
"columnName": "address",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "webBaseUrl",
"columnName": "webBaseUrl",
"affinity": "TEXT"
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "version",
"columnName": "version",
"affinity": "INTEGER"
},
{
"fieldPath": "formatVersion",
"columnName": "formatVersion",
"affinity": "TEXT"
},
{
"fieldPath": "maxAge",
"columnName": "maxAge",
"affinity": "INTEGER"
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "certificate",
"columnName": "certificate",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"repoId"
]
}
},
{
"tableName": "Mirror",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER NOT NULL, `url` TEXT NOT NULL, `countryCode` TEXT, `isPrimary` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`repoId`, `url`), FOREIGN KEY(`repoId`) REFERENCES `CoreRepository`(`repoId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "countryCode",
"columnName": "countryCode",
"affinity": "TEXT"
},
{
"fieldPath": "isPrimary",
"columnName": "isPrimary",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"repoId",
"url"
]
},
"foreignKeys": [
{
"table": "CoreRepository",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"repoId"
],
"referencedColumns": [
"repoId"
]
}
]
},
{
"tableName": "AntiFeature",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER NOT NULL, `id` TEXT NOT NULL, `icon` TEXT NOT NULL, `name` TEXT NOT NULL, `description` TEXT NOT NULL, PRIMARY KEY(`repoId`, `id`), FOREIGN KEY(`repoId`) REFERENCES `CoreRepository`(`repoId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "icon",
"columnName": "icon",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"repoId",
"id"
]
},
"foreignKeys": [
{
"table": "CoreRepository",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"repoId"
],
"referencedColumns": [
"repoId"
]
}
]
},
{
"tableName": "Category",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER NOT NULL, `id` TEXT NOT NULL, `icon` TEXT NOT NULL, `name` TEXT NOT NULL, `description` TEXT NOT NULL, PRIMARY KEY(`repoId`, `id`), FOREIGN KEY(`repoId`) REFERENCES `CoreRepository`(`repoId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "icon",
"columnName": "icon",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"repoId",
"id"
]
},
"foreignKeys": [
{
"table": "CoreRepository",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"repoId"
],
"referencedColumns": [
"repoId"
]
}
]
},
{
"tableName": "ReleaseChannel",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER NOT NULL, `id` TEXT NOT NULL, `icon` TEXT NOT NULL, `name` TEXT NOT NULL, `description` TEXT NOT NULL, PRIMARY KEY(`repoId`, `id`), FOREIGN KEY(`repoId`) REFERENCES `CoreRepository`(`repoId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "icon",
"columnName": "icon",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"repoId",
"id"
]
},
"foreignKeys": [
{
"table": "CoreRepository",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"repoId"
],
"referencedColumns": [
"repoId"
]
}
]
},
{
"tableName": "RepositoryPreferences",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER NOT NULL, `weight` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `lastUpdated` INTEGER, `lastETag` TEXT, `userMirrors` TEXT, `disabledMirrors` TEXT, `username` TEXT, `password` TEXT, `errorCount` INTEGER NOT NULL DEFAULT 0, `lastError` TEXT, PRIMARY KEY(`repoId`))",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "weight",
"columnName": "weight",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "enabled",
"columnName": "enabled",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastUpdated",
"columnName": "lastUpdated",
"affinity": "INTEGER"
},
{
"fieldPath": "lastETag",
"columnName": "lastETag",
"affinity": "TEXT"
},
{
"fieldPath": "userMirrors",
"columnName": "userMirrors",
"affinity": "TEXT"
},
{
"fieldPath": "disabledMirrors",
"columnName": "disabledMirrors",
"affinity": "TEXT"
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT"
},
{
"fieldPath": "password",
"columnName": "password",
"affinity": "TEXT"
},
{
"fieldPath": "errorCount",
"columnName": "errorCount",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "0"
},
{
"fieldPath": "lastError",
"columnName": "lastError",
"affinity": "TEXT"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"repoId"
]
}
},
{
"tableName": "AppMetadata",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER NOT NULL, `packageName` TEXT NOT NULL, `added` INTEGER NOT NULL, `lastUpdated` INTEGER NOT NULL, `name` TEXT, `summary` TEXT, `description` TEXT, `localizedName` TEXT, `localizedSummary` TEXT, `webSite` TEXT, `changelog` TEXT, `license` TEXT, `sourceCode` TEXT, `issueTracker` TEXT, `translation` TEXT, `preferredSigner` TEXT, `video` TEXT, `authorName` TEXT, `authorEmail` TEXT, `authorWebSite` TEXT, `authorPhone` TEXT, `donate` TEXT, `liberapayID` TEXT, `liberapay` TEXT, `openCollective` TEXT, `bitcoin` TEXT, `litecoin` TEXT, `flattrID` TEXT, `categories` TEXT, `isCompatible` INTEGER NOT NULL, PRIMARY KEY(`repoId`, `packageName`), FOREIGN KEY(`repoId`) REFERENCES `CoreRepository`(`repoId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "packageName",
"columnName": "packageName",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "added",
"columnName": "added",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lastUpdated",
"columnName": "lastUpdated",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT"
},
{
"fieldPath": "summary",
"columnName": "summary",
"affinity": "TEXT"
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT"
},
{
"fieldPath": "localizedName",
"columnName": "localizedName",
"affinity": "TEXT"
},
{
"fieldPath": "localizedSummary",
"columnName": "localizedSummary",
"affinity": "TEXT"
},
{
"fieldPath": "webSite",
"columnName": "webSite",
"affinity": "TEXT"
},
{
"fieldPath": "changelog",
"columnName": "changelog",
"affinity": "TEXT"
},
{
"fieldPath": "license",
"columnName": "license",
"affinity": "TEXT"
},
{
"fieldPath": "sourceCode",
"columnName": "sourceCode",
"affinity": "TEXT"
},
{
"fieldPath": "issueTracker",
"columnName": "issueTracker",
"affinity": "TEXT"
},
{
"fieldPath": "translation",
"columnName": "translation",
"affinity": "TEXT"
},
{
"fieldPath": "preferredSigner",
"columnName": "preferredSigner",
"affinity": "TEXT"
},
{
"fieldPath": "video",
"columnName": "video",
"affinity": "TEXT"
},
{
"fieldPath": "authorName",
"columnName": "authorName",
"affinity": "TEXT"
},
{
"fieldPath": "authorEmail",
"columnName": "authorEmail",
"affinity": "TEXT"
},
{
"fieldPath": "authorWebSite",
"columnName": "authorWebSite",
"affinity": "TEXT"
},
{
"fieldPath": "authorPhone",
"columnName": "authorPhone",
"affinity": "TEXT"
},
{
"fieldPath": "donate",
"columnName": "donate",
"affinity": "TEXT"
},
{
"fieldPath": "liberapayID",
"columnName": "liberapayID",
"affinity": "TEXT"
},
{
"fieldPath": "liberapay",
"columnName": "liberapay",
"affinity": "TEXT"
},
{
"fieldPath": "openCollective",
"columnName": "openCollective",
"affinity": "TEXT"
},
{
"fieldPath": "bitcoin",
"columnName": "bitcoin",
"affinity": "TEXT"
},
{
"fieldPath": "litecoin",
"columnName": "litecoin",
"affinity": "TEXT"
},
{
"fieldPath": "flattrID",
"columnName": "flattrID",
"affinity": "TEXT"
},
{
"fieldPath": "categories",
"columnName": "categories",
"affinity": "TEXT"
},
{
"fieldPath": "isCompatible",
"columnName": "isCompatible",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"repoId",
"packageName"
]
},
"indices": [
{
"name": "index_AppMetadata_authorName",
"unique": false,
"columnNames": [
"authorName"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_AppMetadata_authorName` ON `${TABLE_NAME}` (`authorName`)"
}
],
"foreignKeys": [
{
"table": "CoreRepository",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"repoId"
],
"referencedColumns": [
"repoId"
]
}
]
},
{
"tableName": "AppMetadataFts",
"createSql": "CREATE VIRTUAL TABLE IF NOT EXISTS `${TABLE_NAME}` USING FTS4(`repoId` INTEGER NOT NULL, `name` TEXT, `summary` TEXT, `description` TEXT, `authorName` TEXT, `packageName` TEXT NOT NULL, tokenize=unicode61 `remove_diacritics=1` `separators=.` `tokenchars=-`, content=`AppMetadata`, notindexed=`repoId`)",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT"
},
{
"fieldPath": "summary",
"columnName": "summary",
"affinity": "TEXT"
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT"
},
{
"fieldPath": "authorName",
"columnName": "authorName",
"affinity": "TEXT"
},
{
"fieldPath": "packageName",
"columnName": "packageName",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": []
},
"ftsVersion": "FTS4",
"ftsOptions": {
"tokenizer": "unicode61",
"tokenizerArgs": [
"remove_diacritics=1",
"separators=.",
"tokenchars=-"
],
"contentTable": "AppMetadata",
"languageIdColumnName": "",
"matchInfo": "FTS4",
"notIndexedColumns": [
"repoId"
],
"prefixSizes": [],
"preferredOrder": "ASC"
},
"contentSyncTriggers": [
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_AppMetadataFts_BEFORE_UPDATE BEFORE UPDATE ON `AppMetadata` BEGIN DELETE FROM `AppMetadataFts` WHERE `docid`=OLD.`rowid`; END",
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_AppMetadataFts_BEFORE_DELETE BEFORE DELETE ON `AppMetadata` BEGIN DELETE FROM `AppMetadataFts` WHERE `docid`=OLD.`rowid`; END",
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_AppMetadataFts_AFTER_UPDATE AFTER UPDATE ON `AppMetadata` BEGIN INSERT INTO `AppMetadataFts`(`docid`, `repoId`, `name`, `summary`, `description`, `authorName`, `packageName`) VALUES (NEW.`rowid`, NEW.`repoId`, NEW.`name`, NEW.`summary`, NEW.`description`, NEW.`authorName`, NEW.`packageName`); END",
"CREATE TRIGGER IF NOT EXISTS room_fts_content_sync_AppMetadataFts_AFTER_INSERT AFTER INSERT ON `AppMetadata` BEGIN INSERT INTO `AppMetadataFts`(`docid`, `repoId`, `name`, `summary`, `description`, `authorName`, `packageName`) VALUES (NEW.`rowid`, NEW.`repoId`, NEW.`name`, NEW.`summary`, NEW.`description`, NEW.`authorName`, NEW.`packageName`); END"
]
},
{
"tableName": "LocalizedFile",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER NOT NULL, `packageName` TEXT NOT NULL, `type` TEXT NOT NULL, `locale` TEXT NOT NULL, `name` TEXT NOT NULL, `sha256` TEXT, `size` INTEGER, `ipfsCidV1` TEXT, PRIMARY KEY(`repoId`, `packageName`, `type`, `locale`), FOREIGN KEY(`repoId`, `packageName`) REFERENCES `AppMetadata`(`repoId`, `packageName`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "packageName",
"columnName": "packageName",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "locale",
"columnName": "locale",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "sha256",
"columnName": "sha256",
"affinity": "TEXT"
},
{
"fieldPath": "size",
"columnName": "size",
"affinity": "INTEGER"
},
{
"fieldPath": "ipfsCidV1",
"columnName": "ipfsCidV1",
"affinity": "TEXT"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"repoId",
"packageName",
"type",
"locale"
]
},
"indices": [
{
"name": "index_LocalizedFile_packageName",
"unique": false,
"columnNames": [
"packageName"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_LocalizedFile_packageName` ON `${TABLE_NAME}` (`packageName`)"
}
],
"foreignKeys": [
{
"table": "AppMetadata",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"repoId",
"packageName"
],
"referencedColumns": [
"repoId",
"packageName"
]
}
]
},
{
"tableName": "LocalizedFileList",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER NOT NULL, `packageName` TEXT NOT NULL, `type` TEXT NOT NULL, `locale` TEXT NOT NULL, `name` TEXT NOT NULL, `sha256` TEXT, `size` INTEGER, `ipfsCidV1` TEXT, PRIMARY KEY(`repoId`, `packageName`, `type`, `locale`, `name`), FOREIGN KEY(`repoId`, `packageName`) REFERENCES `AppMetadata`(`repoId`, `packageName`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "packageName",
"columnName": "packageName",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "locale",
"columnName": "locale",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "sha256",
"columnName": "sha256",
"affinity": "TEXT"
},
{
"fieldPath": "size",
"columnName": "size",
"affinity": "INTEGER"
},
{
"fieldPath": "ipfsCidV1",
"columnName": "ipfsCidV1",
"affinity": "TEXT"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"repoId",
"packageName",
"type",
"locale",
"name"
]
},
"indices": [
{
"name": "index_LocalizedFileList_packageName_repoId",
"unique": false,
"columnNames": [
"packageName",
"repoId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_LocalizedFileList_packageName_repoId` ON `${TABLE_NAME}` (`packageName`, `repoId`)"
}
],
"foreignKeys": [
{
"table": "AppMetadata",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"repoId",
"packageName"
],
"referencedColumns": [
"repoId",
"packageName"
]
}
]
},
{
"tableName": "Version",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER NOT NULL, `packageName` TEXT NOT NULL, `versionId` TEXT NOT NULL, `added` INTEGER NOT NULL, `releaseChannels` TEXT, `antiFeatures` TEXT, `whatsNew` TEXT, `appLabel` TEXT, `isCompatible` INTEGER NOT NULL, `file_name` TEXT NOT NULL, `file_sha256` TEXT NOT NULL, `file_size` INTEGER, `file_ipfsCidV1` TEXT, `src_name` TEXT, `src_sha256` TEXT, `src_size` INTEGER, `src_ipfsCidV1` TEXT, `manifest_versionName` TEXT NOT NULL, `manifest_versionCode` INTEGER NOT NULL, `manifest_maxSdkVersion` INTEGER, `manifest_nativecode` TEXT, `manifest_features` TEXT, `manifest_usesSdk_minSdkVersion` INTEGER, `manifest_usesSdk_targetSdkVersion` INTEGER, `manifest_signer_sha256` TEXT, `manifest_signer_hasMultipleSigners` INTEGER, PRIMARY KEY(`repoId`, `packageName`, `versionId`), FOREIGN KEY(`repoId`, `packageName`) REFERENCES `AppMetadata`(`repoId`, `packageName`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "packageName",
"columnName": "packageName",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "versionId",
"columnName": "versionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "added",
"columnName": "added",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "releaseChannels",
"columnName": "releaseChannels",
"affinity": "TEXT"
},
{
"fieldPath": "antiFeatures",
"columnName": "antiFeatures",
"affinity": "TEXT"
},
{
"fieldPath": "whatsNew",
"columnName": "whatsNew",
"affinity": "TEXT"
},
{
"fieldPath": "appLabel",
"columnName": "appLabel",
"affinity": "TEXT"
},
{
"fieldPath": "isCompatible",
"columnName": "isCompatible",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "file.name",
"columnName": "file_name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "file.sha256",
"columnName": "file_sha256",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "file.size",
"columnName": "file_size",
"affinity": "INTEGER"
},
{
"fieldPath": "file.ipfsCidV1",
"columnName": "file_ipfsCidV1",
"affinity": "TEXT"
},
{
"fieldPath": "src.name",
"columnName": "src_name",
"affinity": "TEXT"
},
{
"fieldPath": "src.sha256",
"columnName": "src_sha256",
"affinity": "TEXT"
},
{
"fieldPath": "src.size",
"columnName": "src_size",
"affinity": "INTEGER"
},
{
"fieldPath": "src.ipfsCidV1",
"columnName": "src_ipfsCidV1",
"affinity": "TEXT"
},
{
"fieldPath": "manifest.versionName",
"columnName": "manifest_versionName",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "manifest.versionCode",
"columnName": "manifest_versionCode",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "manifest.maxSdkVersion",
"columnName": "manifest_maxSdkVersion",
"affinity": "INTEGER"
},
{
"fieldPath": "manifest.nativecode",
"columnName": "manifest_nativecode",
"affinity": "TEXT"
},
{
"fieldPath": "manifest.features",
"columnName": "manifest_features",
"affinity": "TEXT"
},
{
"fieldPath": "manifest.usesSdk.minSdkVersion",
"columnName": "manifest_usesSdk_minSdkVersion",
"affinity": "INTEGER"
},
{
"fieldPath": "manifest.usesSdk.targetSdkVersion",
"columnName": "manifest_usesSdk_targetSdkVersion",
"affinity": "INTEGER"
},
{
"fieldPath": "manifest.signer.sha256",
"columnName": "manifest_signer_sha256",
"affinity": "TEXT"
},
{
"fieldPath": "manifest.signer.hasMultipleSigners",
"columnName": "manifest_signer_hasMultipleSigners",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"repoId",
"packageName",
"versionId"
]
},
"foreignKeys": [
{
"table": "AppMetadata",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"repoId",
"packageName"
],
"referencedColumns": [
"repoId",
"packageName"
]
}
]
},
{
"tableName": "VersionedString",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repoId` INTEGER NOT NULL, `packageName` TEXT NOT NULL, `versionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `version` INTEGER, PRIMARY KEY(`repoId`, `packageName`, `versionId`, `type`, `name`), FOREIGN KEY(`repoId`, `packageName`, `versionId`) REFERENCES `Version`(`repoId`, `packageName`, `versionId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "repoId",
"columnName": "repoId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "packageName",
"columnName": "packageName",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "versionId",
"columnName": "versionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "version",
"columnName": "version",
"affinity": "INTEGER"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"repoId",
"packageName",
"versionId",
"type",
"name"
]
},
"indices": [
{
"name": "index_VersionedString_versionId",
"unique": false,
"columnNames": [
"versionId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_VersionedString_versionId` ON `${TABLE_NAME}` (`versionId`)"
}
],
"foreignKeys": [
{
"table": "Version",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"repoId",
"packageName",
"versionId"
],
"referencedColumns": [
"repoId",
"packageName",
"versionId"
]
}
]
},
{
"tableName": "AppPrefs",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`packageName` TEXT NOT NULL, `ignoreVersionCodeUpdate` INTEGER NOT NULL, `preferredRepoId` INTEGER, `appPrefReleaseChannels` TEXT, PRIMARY KEY(`packageName`))",
"fields": [
{
"fieldPath": "packageName",
"columnName": "packageName",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "ignoreVersionCodeUpdate",
"columnName": "ignoreVersionCodeUpdate",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "preferredRepoId",
"columnName": "preferredRepoId",
"affinity": "INTEGER"
},
{
"fieldPath": "appPrefReleaseChannels",
"columnName": "appPrefReleaseChannels",
"affinity": "TEXT"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"packageName"
]
}
}
],
"views": [
{
"viewName": "LocalizedIcon",
"createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT * FROM LocalizedFile WHERE type='icon'"
},
{
"viewName": "HighestVersion",
"createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT repoId, packageName, antiFeatures FROM Version\n GROUP BY repoId, packageName HAVING MAX(manifest_versionCode)"
},
{
"viewName": "PreferredRepo",
"createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT packageName, repoId AS preferredRepoId FROM AppMetadata\n JOIN RepositoryPreferences AS pref USING (repoId)\n LEFT JOIN AppPrefs USING (packageName)\n WHERE pref.enabled = 1 AND (repoId = COALESCE(preferredRepoId, repoId) OR\n NOT EXISTS (SELECT 1 FROM AppMetadata WHERE repoId=AppPrefs.preferredRepoId AND packageName=AppPrefs.packageName)\n )\n GROUP BY packageName HAVING MAX(pref.weight)"
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7b9484dd0c09e777fb1e5baa7426123a')"
]
}
}