Improve rendering of nulls in Spinner results.

This commit is contained in:
Greyson Parrelli
2023-05-08 19:47:42 -04:00
committed by Cody Henthorne
parent 970278228d
commit da27d74111
12 changed files with 19 additions and 18 deletions

View File

@@ -16,13 +16,13 @@ object GV2Transformer : ColumnTransformer {
return columnName == GroupTable.V2_DECRYPTED_GROUP
}
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String {
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String? {
return if (columnName == GroupTable.V2_DECRYPTED_GROUP) {
val groupBytes = cursor.requireBlob(GroupTable.V2_DECRYPTED_GROUP)
val group = DecryptedGroup.parseFrom(groupBytes)
group.formatAsHtml()
} else {
""
null
}
}
}

View File

@@ -16,7 +16,7 @@ object GV2UpdateTransformer : ColumnTransformer {
return columnName == MessageTable.BODY && (tableName == null || tableName == MessageTable.TABLE_NAME)
}
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String {
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String? {
val type: Long = cursor.getMessageType()
if (type == -1L) {
@@ -32,7 +32,7 @@ object GV2UpdateTransformer : ColumnTransformer {
"${gv2ChangeDescription.spannable}<br><br>${decryptedGroupV2Context.change}"
} else {
body ?: ""
body
}
}
}

View File

@@ -10,7 +10,7 @@ object IsStoryTransformer : ColumnTransformer {
return columnName == MessageTable.STORY_TYPE && (tableName == null || tableName == MessageTable.TABLE_NAME)
}
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String {
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String? {
val storyType = fromCode(cursor.requireInt(MessageTable.STORY_TYPE))
return "${cursor.requireInt(MessageTable.STORY_TYPE)}<br><br>$storyType"
}

View File

@@ -66,7 +66,7 @@ object MessageBitmaskColumnTransformer : ColumnTransformer {
return columnName == "type" || columnName == "msg_box"
}
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String {
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String? {
val type = cursor.requireLong(columnName)
val describe = """

View File

@@ -16,7 +16,7 @@ object ProfileKeyCredentialTransformer : ColumnTransformer {
return columnName == RecipientTable.EXPIRING_PROFILE_KEY_CREDENTIAL && (tableName == null || tableName == RecipientTable.TABLE_NAME)
}
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String {
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String? {
val columnDataString = cursor.requireString(RecipientTable.EXPIRING_PROFILE_KEY_CREDENTIAL) ?: return DefaultColumnTransformer.transform(tableName, columnName, cursor)
val columnDataBytes = Base64.decode(columnDataString)
val columnData = ExpiringProfileKeyCredentialColumnData.parseFrom(columnDataBytes)

View File

@@ -14,7 +14,7 @@ object TimestampTransformer : ColumnTransformer {
columnName.contains("timestamp", true)
}
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String {
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String? {
val timestamp: Long = cursor.requireLong(columnName)
return if (timestamp > LocalDateTime.of(2000, 1, 1, 0, 0, 0, 0).toMillis()) {

View File

@@ -47,7 +47,7 @@
{{#each queryResult.rows}}
<tr>
{{#each this}}
<td><pre>{{{this}}}</pre></td>
<td><pre>{{#if (eq this null)}} <em class="null">null</em> {{else}} {{{this}}} {{/if}}</pre></td>
{{/each}}
</tr>
{{/each}}

View File

@@ -93,3 +93,6 @@ table.device-info, table.device-info tr, table.device-info td {
font-style: italic;
}
.null {
color: #666
}

View File

@@ -35,7 +35,7 @@
{{#each queryResult.rows}}
<tr>
{{#each this}}
<td><pre>{{{this}}}</pre></td>
<td><pre>{{#if (eq this null)}} <em class="null">null</em> {{else}} {{{this}}} {{/if}}</pre></td>
{{/each}}
</tr>
{{/each}}

View File

@@ -14,5 +14,5 @@ interface ColumnTransformer {
/**
* In certain circumstances (like some queries), the table name may not be guaranteed.
*/
fun transform(tableName: String?, columnName: String, cursor: Cursor): String
fun transform(tableName: String?, columnName: String, cursor: Cursor): String?
}

View File

@@ -8,13 +8,11 @@ object DefaultColumnTransformer : ColumnTransformer {
return true
}
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String {
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String? {
val index = cursor.getColumnIndex(columnName)
val data: String? = when (cursor.getType(index)) {
return when (cursor.getType(index)) {
Cursor.FIELD_TYPE_BLOB -> Base64.encodeToString(cursor.getBlob(index), 0)
else -> cursor.getString(index)
}
return data ?: "null"
}
}

View File

@@ -283,13 +283,13 @@ internal class SpinnerServer(
}
var timeOfFirstRowNanos = 0L
val rows = mutableListOf<List<String>>()
val rows = mutableListOf<List<String?>>()
while (moveToNext()) {
if (timeOfFirstRowNanos == 0L) {
timeOfFirstRowNanos = System.nanoTime()
}
val row = mutableListOf<String>()
val row = mutableListOf<String?>()
for (i in 0 until numColumns) {
val columnName: String = getColumnName(i)
try {
@@ -460,7 +460,7 @@ internal class SpinnerServer(
data class QueryResult(
val columns: List<String>,
val rows: List<List<String>>,
val rows: List<List<String?>>,
val rowCount: Int = rows.size,
val timeToFirstRow: String,
val timeToReadRows: String