|
@@ -8,6 +8,7 @@ import (
|
|
|
"net/netip"
|
|
"net/netip"
|
|
|
"strings"
|
|
"strings"
|
|
|
"time"
|
|
"time"
|
|
|
|
|
+ "sync"
|
|
|
|
|
|
|
|
_ "github.com/mattn/go-sqlite3" // SQLite driver
|
|
_ "github.com/mattn/go-sqlite3" // SQLite driver
|
|
|
"heckel.io/ntfy/v2/log"
|
|
"heckel.io/ntfy/v2/log"
|
|
@@ -35,7 +36,7 @@ const (
|
|
|
priority INT NOT NULL,
|
|
priority INT NOT NULL,
|
|
|
tags TEXT NOT NULL,
|
|
tags TEXT NOT NULL,
|
|
|
click TEXT NOT NULL,
|
|
click TEXT NOT NULL,
|
|
|
- icon TEXT NOT NULL,
|
|
|
|
|
|
|
+ icon TEXT NOT NULL,
|
|
|
actions TEXT NOT NULL,
|
|
actions TEXT NOT NULL,
|
|
|
attachment_name TEXT NOT NULL,
|
|
attachment_name TEXT NOT NULL,
|
|
|
attachment_type TEXT NOT NULL,
|
|
attachment_type TEXT NOT NULL,
|
|
@@ -72,30 +73,30 @@ const (
|
|
|
selectRowIDFromMessageID = `SELECT id FROM messages WHERE mid = ?` // Do not include topic, see #336 and TestServer_PollSinceID_MultipleTopics
|
|
selectRowIDFromMessageID = `SELECT id FROM messages WHERE mid = ?` // Do not include topic, see #336 and TestServer_PollSinceID_MultipleTopics
|
|
|
selectMessagesByIDQuery = `
|
|
selectMessagesByIDQuery = `
|
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
|
- FROM messages
|
|
|
|
|
|
|
+ FROM messages
|
|
|
WHERE mid = ?
|
|
WHERE mid = ?
|
|
|
`
|
|
`
|
|
|
selectMessagesSinceTimeQuery = `
|
|
selectMessagesSinceTimeQuery = `
|
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
|
- FROM messages
|
|
|
|
|
|
|
+ FROM messages
|
|
|
WHERE topic = ? AND time >= ? AND published = 1
|
|
WHERE topic = ? AND time >= ? AND published = 1
|
|
|
ORDER BY time, id
|
|
ORDER BY time, id
|
|
|
`
|
|
`
|
|
|
selectMessagesSinceTimeIncludeScheduledQuery = `
|
|
selectMessagesSinceTimeIncludeScheduledQuery = `
|
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
|
- FROM messages
|
|
|
|
|
|
|
+ FROM messages
|
|
|
WHERE topic = ? AND time >= ?
|
|
WHERE topic = ? AND time >= ?
|
|
|
ORDER BY time, id
|
|
ORDER BY time, id
|
|
|
`
|
|
`
|
|
|
selectMessagesSinceIDQuery = `
|
|
selectMessagesSinceIDQuery = `
|
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
|
- FROM messages
|
|
|
|
|
|
|
+ FROM messages
|
|
|
WHERE topic = ? AND id > ? AND published = 1
|
|
WHERE topic = ? AND id > ? AND published = 1
|
|
|
ORDER BY time, id
|
|
ORDER BY time, id
|
|
|
`
|
|
`
|
|
|
selectMessagesSinceIDIncludeScheduledQuery = `
|
|
selectMessagesSinceIDIncludeScheduledQuery = `
|
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
|
- FROM messages
|
|
|
|
|
|
|
+ FROM messages
|
|
|
WHERE topic = ? AND (id > ? OR published = 0)
|
|
WHERE topic = ? AND (id > ? OR published = 0)
|
|
|
ORDER BY time, id
|
|
ORDER BY time, id
|
|
|
`
|
|
`
|
|
@@ -105,10 +106,10 @@ const (
|
|
|
WHERE topic = ? AND published = 1
|
|
WHERE topic = ? AND published = 1
|
|
|
ORDER BY time DESC, id DESC
|
|
ORDER BY time DESC, id DESC
|
|
|
LIMIT 1
|
|
LIMIT 1
|
|
|
- `
|
|
|
|
|
|
|
+ `
|
|
|
selectMessagesDueQuery = `
|
|
selectMessagesDueQuery = `
|
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding
|
|
|
- FROM messages
|
|
|
|
|
|
|
+ FROM messages
|
|
|
WHERE time <= ? AND published = 0
|
|
WHERE time <= ? AND published = 0
|
|
|
ORDER BY time, id
|
|
ORDER BY time, id
|
|
|
`
|
|
`
|
|
@@ -281,6 +282,7 @@ var (
|
|
|
type messageCache struct {
|
|
type messageCache struct {
|
|
|
db *sql.DB
|
|
db *sql.DB
|
|
|
queue *util.BatchingQueue[*message]
|
|
queue *util.BatchingQueue[*message]
|
|
|
|
|
+ mu sync.Mutex
|
|
|
nop bool
|
|
nop bool
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -340,6 +342,8 @@ func (c *messageCache) AddMessage(m *message) error {
|
|
|
// addMessages synchronously stores a match of messages. If the database is locked, the transaction waits until
|
|
// addMessages synchronously stores a match of messages. If the database is locked, the transaction waits until
|
|
|
// SQLite's busy_timeout is exceeded before erroring out.
|
|
// SQLite's busy_timeout is exceeded before erroring out.
|
|
|
func (c *messageCache) addMessages(ms []*message) error {
|
|
func (c *messageCache) addMessages(ms []*message) error {
|
|
|
|
|
+ c.mu.Lock()
|
|
|
|
|
+ defer c.mu.Unlock()
|
|
|
if c.nop {
|
|
if c.nop {
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|