From df6611e8deb2ad2acdb9a5976a413dbd636bdda5 Mon Sep 17 00:00:00 2001 From: Philipp Heckel Date: Mon, 17 Jan 2022 19:14:51 -0500 Subject: [PATCH] Store encoding in cache database --- server/cache_sqlite.go | 53 +++++++++++++++++++++++++++++++++++------- server/server_test.go | 10 +++++++- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/server/cache_sqlite.go b/server/cache_sqlite.go index 6b121f5b..4aac778b 100644 --- a/server/cache_sqlite.go +++ b/server/cache_sqlite.go @@ -29,30 +29,31 @@ const ( attachment_expires INT NOT NULL, attachment_url TEXT NOT NULL, attachment_owner TEXT NOT NULL, + encoding TEXT NOT NULL, published INT NOT NULL ); CREATE INDEX IF NOT EXISTS idx_topic ON messages (topic); COMMIT; ` insertMessageQuery = ` - INSERT INTO messages (id, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, attachment_owner, published) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + INSERT INTO messages (id, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, attachment_owner, encoding, published) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ` pruneMessagesQuery = `DELETE FROM messages WHERE time < ? AND published = 1` selectMessagesSinceTimeQuery = ` - SELECT id, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, attachment_owner + SELECT id, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, attachment_owner, encoding FROM messages WHERE topic = ? AND time >= ? AND published = 1 ORDER BY time ASC ` selectMessagesSinceTimeIncludeScheduledQuery = ` - SELECT id, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, attachment_owner + SELECT id, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, attachment_owner, encoding FROM messages WHERE topic = ? AND time >= ? ORDER BY time ASC ` selectMessagesDueQuery = ` - SELECT id, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, attachment_owner + SELECT id, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, attachment_owner, encoding FROM messages WHERE time <= ? AND published = 0 ` @@ -66,7 +67,7 @@ const ( // Schema management queries const ( - currentSchemaVersion = 3 + currentSchemaVersion = 4 createSchemaVersionTableQuery = ` CREATE TABLE IF NOT EXISTS schemaVersion ( id INT PRIMARY KEY, @@ -103,6 +104,10 @@ const ( ALTER TABLE messages ADD COLUMN attachment_url TEXT NOT NULL DEFAULT(''); COMMIT; ` + // 3 -> 4 + migrate3To4AlterMessagesTableQuery = ` + ALTER TABLE messages ADD COLUMN encoding TEXT NOT NULL DEFAULT(''); + ` ) type sqliteCache struct { @@ -156,6 +161,7 @@ func (c *sqliteCache) AddMessage(m *message) error { attachmentExpires, attachmentURL, attachmentOwner, + m.Encoding, published, ) return err @@ -278,8 +284,25 @@ func readMessages(rows *sql.Rows) ([]*message, error) { for rows.Next() { var timestamp, attachmentSize, attachmentExpires int64 var priority int - var id, topic, msg, title, tagsStr, click, attachmentName, attachmentType, attachmentURL, attachmentOwner string - if err := rows.Scan(&id, ×tamp, &topic, &msg, &title, &priority, &tagsStr, &click, &attachmentName, &attachmentType, &attachmentSize, &attachmentExpires, &attachmentURL, &attachmentOwner); err != nil { + var id, topic, msg, title, tagsStr, click, attachmentName, attachmentType, attachmentURL, attachmentOwner, encoding string + err := rows.Scan( + &id, + ×tamp, + &topic, + &msg, + &title, + &priority, + &tagsStr, + &click, + &attachmentName, + &attachmentType, + &attachmentSize, + &attachmentExpires, + &attachmentURL, + &attachmentOwner, + &encoding, + ) + if err != nil { return nil, err } var tags []string @@ -308,6 +331,7 @@ func readMessages(rows *sql.Rows) ([]*message, error) { Tags: tags, Click: click, Attachment: att, + Encoding: encoding, }) } if err := rows.Err(); err != nil { @@ -347,6 +371,8 @@ func setupDB(db *sql.DB) error { return migrateFrom1(db) } else if schemaVersion == 2 { return migrateFrom2(db) + } else if schemaVersion == 3 { + return migrateFrom3(db) } return fmt.Errorf("unexpected schema version found: %d", schemaVersion) } @@ -397,5 +423,16 @@ func migrateFrom2(db *sql.DB) error { if _, err := db.Exec(updateSchemaVersion, 3); err != nil { return err } + return migrateFrom3(db) +} + +func migrateFrom3(db *sql.DB) error { + log.Print("Migrating cache database schema: from 3 to 4") + if _, err := db.Exec(migrate3To4AlterMessagesTableQuery); err != nil { + return err + } + if _, err := db.Exec(updateSchemaVersion, 4); err != nil { + return err + } return nil // Update this when a new version is added } diff --git a/server/server_test.go b/server/server_test.go index ac80348d..061e6e81 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -625,7 +625,7 @@ func TestServer_UnifiedPushDiscovery(t *testing.T) { require.Equal(t, `{"unifiedpush":{"version":1}}`+"\n", response.Body.String()) } -func TestServer_PublishUnifiedPushBinary(t *testing.T) { +func TestServer_PublishUnifiedPushBinary_AndPoll(t *testing.T) { b := make([]byte, 12) // Max length _, err := rand.Read(b) require.Nil(t, err) @@ -639,6 +639,14 @@ func TestServer_PublishUnifiedPushBinary(t *testing.T) { b2, err := base64.StdEncoding.DecodeString(m.Message) require.Nil(t, err) require.Equal(t, b, b2) + + response = request(t, s, "GET", "/mytopic/json?poll=1", string(b), nil) + require.Equal(t, 200, response.Code) + m = toMessage(t, response.Body.String()) + require.Equal(t, "base64", m.Encoding) + b2, err = base64.StdEncoding.DecodeString(m.Message) + require.Nil(t, err) + require.Equal(t, b, b2) } func TestServer_PublishUnifiedPushBinary_Truncated(t *testing.T) {