package androidx.room.util; import android.database.Cursor; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RestrictTo; import androidx.room.ColumnInfo; import androidx.sqlite.db.SupportSQLiteDatabase; import c.d.b.a.a; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; @RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public class TableInfo { public static final int CREATED_FROM_DATABASE = 2; public static final int CREATED_FROM_ENTITY = 1; public static final int CREATED_FROM_UNKNOWN = 0; public final Map columns; public final Set foreignKeys; @Nullable public final Set indices; public final String name; public static class Column { @ColumnInfo.SQLiteTypeAffinity public final int affinity; public final String defaultValue; private final int mCreatedFrom; public final String name; public final boolean notNull; public final int primaryKeyPosition; public final String type; @Deprecated public Column(String str, String str2, boolean z2, int i) { this(str, str2, z2, i, null, 0); } public Column(String str, String str2, boolean z2, int i, String str3, int i2) { this.name = str; this.type = str2; this.notNull = z2; this.primaryKeyPosition = i; this.affinity = findAffinity(str2); this.defaultValue = str3; this.mCreatedFrom = i2; } @ColumnInfo.SQLiteTypeAffinity private static int findAffinity(@Nullable String str) { if (str == null) { return 5; } String upperCase = str.toUpperCase(Locale.US); if (upperCase.contains("INT")) { return 3; } if (upperCase.contains("CHAR") || upperCase.contains("CLOB") || upperCase.contains("TEXT")) { return 2; } if (upperCase.contains("BLOB")) { return 5; } return (upperCase.contains("REAL") || upperCase.contains("FLOA") || upperCase.contains("DOUB")) ? 4 : 1; } public boolean equals(Object obj) { String str; String str2; String str3; if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Column column = (Column) obj; if (this.primaryKeyPosition != column.primaryKeyPosition || !this.name.equals(column.name) || this.notNull != column.notNull) { return false; } if (this.mCreatedFrom == 1 && column.mCreatedFrom == 2 && (str3 = this.defaultValue) != null && !str3.equals(column.defaultValue)) { return false; } if (this.mCreatedFrom == 2 && column.mCreatedFrom == 1 && (str2 = column.defaultValue) != null && !str2.equals(this.defaultValue)) { return false; } int i = this.mCreatedFrom; return (i == 0 || i != column.mCreatedFrom || ((str = this.defaultValue) == null ? column.defaultValue == null : str.equals(column.defaultValue))) && this.affinity == column.affinity; } public int hashCode() { return (((((this.name.hashCode() * 31) + this.affinity) * 31) + (this.notNull ? 1231 : 1237)) * 31) + this.primaryKeyPosition; } public boolean isPrimaryKey() { return this.primaryKeyPosition > 0; } public String toString() { StringBuilder L = a.L("Column{name='"); L.append(this.name); L.append('\''); L.append(", type='"); L.append(this.type); L.append('\''); L.append(", affinity='"); L.append(this.affinity); L.append('\''); L.append(", notNull="); L.append(this.notNull); L.append(", primaryKeyPosition="); L.append(this.primaryKeyPosition); L.append(", defaultValue='"); L.append(this.defaultValue); L.append('\''); L.append('}'); return L.toString(); } } @RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public static class ForeignKey { @NonNull public final List columnNames; @NonNull public final String onDelete; @NonNull public final String onUpdate; @NonNull public final List referenceColumnNames; @NonNull public final String referenceTable; public ForeignKey(@NonNull String str, @NonNull String str2, @NonNull String str3, @NonNull List list, @NonNull List list2) { this.referenceTable = str; this.onDelete = str2; this.onUpdate = str3; this.columnNames = Collections.unmodifiableList(list); this.referenceColumnNames = Collections.unmodifiableList(list2); } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } ForeignKey foreignKey = (ForeignKey) obj; if (this.referenceTable.equals(foreignKey.referenceTable) && this.onDelete.equals(foreignKey.onDelete) && this.onUpdate.equals(foreignKey.onUpdate) && this.columnNames.equals(foreignKey.columnNames)) { return this.referenceColumnNames.equals(foreignKey.referenceColumnNames); } return false; } public int hashCode() { int m = a.m(this.onUpdate, a.m(this.onDelete, this.referenceTable.hashCode() * 31, 31), 31); return this.referenceColumnNames.hashCode() + ((this.columnNames.hashCode() + m) * 31); } public String toString() { StringBuilder L = a.L("ForeignKey{referenceTable='"); L.append(this.referenceTable); L.append('\''); L.append(", onDelete='"); L.append(this.onDelete); L.append('\''); L.append(", onUpdate='"); L.append(this.onUpdate); L.append('\''); L.append(", columnNames="); L.append(this.columnNames); L.append(", referenceColumnNames="); L.append(this.referenceColumnNames); L.append('}'); return L.toString(); } } @RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public static class ForeignKeyWithSequence implements Comparable { public final String mFrom; public final int mId; public final int mSequence; public final String mTo; public ForeignKeyWithSequence(int i, int i2, String str, String str2) { this.mId = i; this.mSequence = i2; this.mFrom = str; this.mTo = str2; } public int compareTo(@NonNull ForeignKeyWithSequence foreignKeyWithSequence) { int i = this.mId - foreignKeyWithSequence.mId; return i == 0 ? this.mSequence - foreignKeyWithSequence.mSequence : i; } } @RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public static class Index { public static final String DEFAULT_PREFIX = "index_"; public final List columns; public final String name; public final boolean unique; public Index(String str, boolean z2, List list) { this.name = str; this.unique = z2; this.columns = list; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Index index = (Index) obj; if (this.unique == index.unique && this.columns.equals(index.columns)) { return this.name.startsWith("index_") ? index.name.startsWith("index_") : this.name.equals(index.name); } return false; } public int hashCode() { return this.columns.hashCode() + ((((this.name.startsWith("index_") ? -1184239155 : this.name.hashCode()) * 31) + (this.unique ? 1 : 0)) * 31); } public String toString() { StringBuilder L = a.L("Index{name='"); L.append(this.name); L.append('\''); L.append(", unique="); L.append(this.unique); L.append(", columns="); L.append(this.columns); L.append('}'); return L.toString(); } } public TableInfo(String str, Map map, Set set) { this(str, map, set, Collections.emptySet()); } public TableInfo(String str, Map map, Set set, Set set2) { this.name = str; this.columns = Collections.unmodifiableMap(map); this.foreignKeys = Collections.unmodifiableSet(set); this.indices = set2 == null ? null : Collections.unmodifiableSet(set2); } public static TableInfo read(SupportSQLiteDatabase supportSQLiteDatabase, String str) { return new TableInfo(str, readColumns(supportSQLiteDatabase, str), readForeignKeys(supportSQLiteDatabase, str), readIndices(supportSQLiteDatabase, str)); } private static Map readColumns(SupportSQLiteDatabase supportSQLiteDatabase, String str) { Cursor query = supportSQLiteDatabase.query("PRAGMA table_info(`" + str + "`)"); HashMap hashMap = new HashMap(); try { if (query.getColumnCount() > 0) { int columnIndex = query.getColumnIndex("name"); int columnIndex2 = query.getColumnIndex("type"); int columnIndex3 = query.getColumnIndex("notnull"); int columnIndex4 = query.getColumnIndex("pk"); int columnIndex5 = query.getColumnIndex("dflt_value"); while (query.moveToNext()) { String string = query.getString(columnIndex); hashMap.put(string, new Column(string, query.getString(columnIndex2), query.getInt(columnIndex3) != 0, query.getInt(columnIndex4), query.getString(columnIndex5), 2)); } } return hashMap; } finally { query.close(); } } private static List readForeignKeyFieldMappings(Cursor cursor) { int columnIndex = cursor.getColumnIndex("id"); int columnIndex2 = cursor.getColumnIndex("seq"); int columnIndex3 = cursor.getColumnIndex("from"); int columnIndex4 = cursor.getColumnIndex("to"); int count = cursor.getCount(); ArrayList arrayList = new ArrayList(); for (int i = 0; i < count; i++) { cursor.moveToPosition(i); arrayList.add(new ForeignKeyWithSequence(cursor.getInt(columnIndex), cursor.getInt(columnIndex2), cursor.getString(columnIndex3), cursor.getString(columnIndex4))); } Collections.sort(arrayList); return arrayList; } private static Set readForeignKeys(SupportSQLiteDatabase supportSQLiteDatabase, String str) { HashSet hashSet = new HashSet(); Cursor query = supportSQLiteDatabase.query("PRAGMA foreign_key_list(`" + str + "`)"); try { int columnIndex = query.getColumnIndex("id"); int columnIndex2 = query.getColumnIndex("seq"); int columnIndex3 = query.getColumnIndex("table"); int columnIndex4 = query.getColumnIndex("on_delete"); int columnIndex5 = query.getColumnIndex("on_update"); List readForeignKeyFieldMappings = readForeignKeyFieldMappings(query); int count = query.getCount(); for (int i = 0; i < count; i++) { query.moveToPosition(i); if (query.getInt(columnIndex2) == 0) { int i2 = query.getInt(columnIndex); ArrayList arrayList = new ArrayList(); ArrayList arrayList2 = new ArrayList(); for (ForeignKeyWithSequence foreignKeyWithSequence : readForeignKeyFieldMappings) { if (foreignKeyWithSequence.mId == i2) { arrayList.add(foreignKeyWithSequence.mFrom); arrayList2.add(foreignKeyWithSequence.mTo); } } hashSet.add(new ForeignKey(query.getString(columnIndex3), query.getString(columnIndex4), query.getString(columnIndex5), arrayList, arrayList2)); } } return hashSet; } finally { query.close(); } } @Nullable private static Index readIndex(SupportSQLiteDatabase supportSQLiteDatabase, String str, boolean z2) { Cursor query = supportSQLiteDatabase.query("PRAGMA index_xinfo(`" + str + "`)"); try { int columnIndex = query.getColumnIndex("seqno"); int columnIndex2 = query.getColumnIndex("cid"); int columnIndex3 = query.getColumnIndex("name"); if (!(columnIndex == -1 || columnIndex2 == -1)) { if (columnIndex3 != -1) { TreeMap treeMap = new TreeMap(); while (query.moveToNext()) { if (query.getInt(columnIndex2) >= 0) { int i = query.getInt(columnIndex); treeMap.put(Integer.valueOf(i), query.getString(columnIndex3)); } } ArrayList arrayList = new ArrayList(treeMap.size()); arrayList.addAll(treeMap.values()); Index index = new Index(str, z2, arrayList); query.close(); return index; } } return null; } finally { query.close(); } } @Nullable private static Set readIndices(SupportSQLiteDatabase supportSQLiteDatabase, String str) { Cursor query = supportSQLiteDatabase.query("PRAGMA index_list(`" + str + "`)"); try { int columnIndex = query.getColumnIndex("name"); int columnIndex2 = query.getColumnIndex("origin"); int columnIndex3 = query.getColumnIndex("unique"); if (!(columnIndex == -1 || columnIndex2 == -1)) { if (columnIndex3 != -1) { HashSet hashSet = new HashSet(); while (query.moveToNext()) { if ("c".equals(query.getString(columnIndex2))) { String string = query.getString(columnIndex); boolean z2 = true; if (query.getInt(columnIndex3) != 1) { z2 = false; } Index readIndex = readIndex(supportSQLiteDatabase, string, z2); if (readIndex == null) { query.close(); return null; } hashSet.add(readIndex); } } query.close(); return hashSet; } } return null; } finally { query.close(); } } public boolean equals(Object obj) { Set set; if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } TableInfo tableInfo = (TableInfo) obj; String str = this.name; if (str == null ? tableInfo.name != null : !str.equals(tableInfo.name)) { return false; } Map map = this.columns; if (map == null ? tableInfo.columns != null : !map.equals(tableInfo.columns)) { return false; } Set set2 = this.foreignKeys; if (set2 == null ? tableInfo.foreignKeys != null : !set2.equals(tableInfo.foreignKeys)) { return false; } Set set3 = this.indices; if (set3 == null || (set = tableInfo.indices) == null) { return true; } return set3.equals(set); } public int hashCode() { String str = this.name; int i = 0; int hashCode = (str != null ? str.hashCode() : 0) * 31; Map map = this.columns; int hashCode2 = (hashCode + (map != null ? map.hashCode() : 0)) * 31; Set set = this.foreignKeys; if (set != null) { i = set.hashCode(); } return hashCode2 + i; } public String toString() { StringBuilder L = a.L("TableInfo{name='"); L.append(this.name); L.append('\''); L.append(", columns="); L.append(this.columns); L.append(", foreignKeys="); L.append(this.foreignKeys); L.append(", indices="); L.append(this.indices); L.append('}'); return L.toString(); } }