Documentation
¶
Overview ¶
Package mdbstore provides a MariaDB-backed implementation of Hypermeow's complete session storage interfaces.
New is the usual entry point. It owns the returned database connection pool, validates the server as MariaDB, and applies schema migrations before use.
Index ¶
- Constants
- Variables
- type CachedLIDMap
- func (s *CachedLIDMap) FillCache(ctx context.Context) error
- func (s *CachedLIDMap) GetLIDForPN(ctx context.Context, pn types.JID) (types.JID, error)
- func (s *CachedLIDMap) GetManyLIDsForPNs(ctx context.Context, pns []types.JID) (map[types.JID]types.JID, error)
- func (s *CachedLIDMap) GetManyPNsForLIDs(ctx context.Context, lids []types.JID) (map[types.JID]types.JID, error)
- func (s *CachedLIDMap) GetPNForLID(ctx context.Context, lid types.JID) (types.JID, error)
- func (s *CachedLIDMap) PutLIDMapping(ctx context.Context, lid, pn types.JID) error
- func (s *CachedLIDMap) PutManyLIDMappings(ctx context.Context, mappings []store.LIDMapping) error
- type Config
- type Container
- func New(ctx context.Context, dsn string, log waLog.Logger) (*Container, error)
- func NewWithConfig(ctx context.Context, dsn string, log waLog.Logger, config Config) (*Container, error)
- func NewWithDB(db *sql.DB, log waLog.Logger) *Container
- func NewWithDBConfig(db *sql.DB, log waLog.Logger, config Config) *Container
- func (c *Container) Close() error
- func (c *Container) DBStats() sql.DBStats
- func (c *Container) DeleteDevice(ctx context.Context, store *store.Device) error
- func (c *Container) GetAllDevices(ctx context.Context) ([]*store.Device, error)
- func (c *Container) GetDevice(ctx context.Context, jid types.JID) (*store.Device, error)
- func (c *Container) GetFirstDevice(ctx context.Context) (*store.Device, error)
- func (c *Container) Metrics() MetricsSnapshot
- func (c *Container) NewDevice() *store.Device
- func (c *Container) Ping(ctx context.Context) error
- func (c *Container) PutDevice(ctx context.Context, device *store.Device) error
- func (c *Container) SchemaVersion(ctx context.Context) (int, error)
- func (c *Container) Upgrade(ctx context.Context) error
- func (c *Container) Validate(ctx context.Context) error
- type DBEvent
- type MetricsSnapshot
- type Observer
- type ObserverFunc
- type SQLStore
- func (s *SQLStore) AddOutgoingEvent(ctx context.Context, chatJID types.JID, id types.MessageID, format string, ...) error
- func (s *SQLStore) ClearBufferedEventPlaintext(ctx context.Context, ciphertextHash [32]byte) error
- func (s *SQLStore) DeleteAllIdentities(ctx context.Context, phone string) error
- func (s *SQLStore) DeleteAllSessions(ctx context.Context, phone string) error
- func (s *SQLStore) DeleteAppStateMutationMACs(ctx context.Context, name string, indexMACs [][]byte) (err error)
- func (s *SQLStore) DeleteAppStateVersion(ctx context.Context, name string) error
- func (s *SQLStore) DeleteExpiredPrivacyTokens(ctx context.Context, cutoff time.Time) (int64, error)
- func (s *SQLStore) DeleteIdentity(ctx context.Context, address string) error
- func (s *SQLStore) DeleteNCTSalt(ctx context.Context) error
- func (s *SQLStore) DeleteOldBufferedHashes(ctx context.Context) error
- func (s *SQLStore) DeleteOldOutgoingEvents(ctx context.Context) error
- func (s *SQLStore) DeleteSession(ctx context.Context, address string) error
- func (s *SQLStore) DoDecryptionTxn(ctx context.Context, fn func(context.Context) error) error
- func (s *SQLStore) EnsureIdentity(ctx context.Context, address string, key [32]byte, deleteGeneration uint64) (bool, error)
- func (s *SQLStore) GenOnePreKey(ctx context.Context) (*keys.PreKey, error)
- func (s *SQLStore) GetAllAppStateSyncKeys(ctx context.Context) ([]*store.AppStateSyncKey, error)
- func (s *SQLStore) GetAllContacts(ctx context.Context) (map[types.JID]types.ContactInfo, error)
- func (s *SQLStore) GetAppStateMutationMAC(ctx context.Context, name string, indexMAC []byte) (valueMAC []byte, err error)
- func (s *SQLStore) GetAppStateSyncKey(ctx context.Context, id []byte) (*store.AppStateSyncKey, error)
- func (s *SQLStore) GetAppStateVersion(ctx context.Context, name string) (version uint64, hash [128]byte, err error)
- func (s *SQLStore) GetBufferedEvent(ctx context.Context, ciphertextHash [32]byte) (*store.BufferedEvent, error)
- func (s *SQLStore) GetChatSettings(ctx context.Context, chat types.JID) (settings types.LocalChatSettings, err error)
- func (s *SQLStore) GetContact(ctx context.Context, user types.JID) (types.ContactInfo, error)
- func (s *SQLStore) GetLatestAppStateSyncKeyID(ctx context.Context) ([]byte, error)
- func (s *SQLStore) GetManyIdentities(ctx context.Context, addresses []string) (map[string][32]byte, uint64, error)
- func (s *SQLStore) GetManySessions(ctx context.Context, addresses []string) (map[string][]byte, error)
- func (s *SQLStore) GetMessageSecret(ctx context.Context, chat, sender types.JID, id types.MessageID) (secret []byte, realSender types.JID, err error)
- func (s *SQLStore) GetNCTSalt(ctx context.Context) ([]byte, error)
- func (s *SQLStore) GetOrGenPreKeys(ctx context.Context, count uint32) ([]*keys.PreKey, error)
- func (s *SQLStore) GetOutgoingEvent(ctx context.Context, chatJID, altChatJID types.JID, id types.MessageID) (format string, result []byte, err error)
- func (s *SQLStore) GetPreKey(ctx context.Context, id uint32) (*keys.PreKey, error)
- func (s *SQLStore) GetPrivacyToken(ctx context.Context, user types.JID) (*store.PrivacyToken, error)
- func (s *SQLStore) GetSenderKey(ctx context.Context, group, user string) (key []byte, err error)
- func (s *SQLStore) GetSession(ctx context.Context, address string) (session []byte, err error)
- func (s *SQLStore) GetWASARootSecretID(ctx context.Context, chat types.JID) (id types.MessageID, err error)
- func (s *SQLStore) HasSession(ctx context.Context, address string) (has bool, err error)
- func (s *SQLStore) IsTrustedIdentity(ctx context.Context, address string, key [32]byte) (bool, error)
- func (s *SQLStore) IterateSession(ctx context.Context, address string, callback func([]byte) error) (bool, error)
- func (s *SQLStore) IterateSessions(ctx context.Context, addresses []string, callback func(string, []byte) error) error
- func (s *SQLStore) MarkPreKeysAsUploaded(ctx context.Context, upToID uint32) error
- func (s *SQLStore) MigratePNToLID(ctx context.Context, pn, lid types.JID) error
- func (s *SQLStore) PutAllContactNames(ctx context.Context, contacts []store.ContactEntry) error
- func (s *SQLStore) PutAppStateMutationMACs(ctx context.Context, name string, version uint64, ...) error
- func (s *SQLStore) PutAppStateSyncKey(ctx context.Context, id []byte, key store.AppStateSyncKey) error
- func (s *SQLStore) PutAppStateVersion(ctx context.Context, name string, version uint64, hash [128]byte) error
- func (s *SQLStore) PutArchived(ctx context.Context, chat types.JID, archived bool) error
- func (s *SQLStore) PutBufferedEvent(ctx context.Context, ciphertextHash [32]byte, plaintext []byte, ...) error
- func (s *SQLStore) PutBusinessName(ctx context.Context, user types.JID, businessName string) (bool, string, error)
- func (s *SQLStore) PutContactName(ctx context.Context, user types.JID, firstName, fullName string) error
- func (s *SQLStore) PutContactUsername(ctx context.Context, user types.JID, username string) error
- func (s *SQLStore) PutIdentity(ctx context.Context, address string, key [32]byte) error
- func (s *SQLStore) PutManyContactUsernames(ctx context.Context, entries []store.ContactUsernameEntry) error
- func (s *SQLStore) PutManyRedactedPhones(ctx context.Context, entries []store.RedactedPhoneEntry) error
- func (s *SQLStore) PutManySessions(ctx context.Context, sessions map[string][]byte) error
- func (s *SQLStore) PutMessageSecret(ctx context.Context, chat, sender types.JID, id types.MessageID, secret []byte) (err error)
- func (s *SQLStore) PutMessageSecrets(ctx context.Context, inserts []store.MessageSecretInsert) (err error)
- func (s *SQLStore) PutMutedUntil(ctx context.Context, chat types.JID, mutedUntil time.Time) error
- func (s *SQLStore) PutNCTSalt(ctx context.Context, salt []byte) error
- func (s *SQLStore) PutPinned(ctx context.Context, chat types.JID, pinned bool) error
- func (s *SQLStore) PutPrivacyTokens(ctx context.Context, tokens ...store.PrivacyToken) error
- func (s *SQLStore) PutPushName(ctx context.Context, user types.JID, pushName string) (bool, string, error)
- func (s *SQLStore) PutSenderKey(ctx context.Context, group, user string, session []byte) error
- func (s *SQLStore) PutSession(ctx context.Context, address string, session []byte) error
- func (s *SQLStore) PutWASARootSecretID(ctx context.Context, chat types.JID, id types.MessageID) error
- func (s *SQLStore) RemovePreKey(ctx context.Context, id uint32) error
- func (s *SQLStore) UploadedPreKeyCount(ctx context.Context) (count int, err error)
Constants ¶
const LatestSchemaVersion = internalSchema.LatestVersion
LatestSchemaVersion is the schema version required by this adapter release.
Variables ¶
var ErrDeviceIDMustBeSet = errors.New("device JID must be known before accessing database")
ErrDeviceIDMustBeSet is the error returned by PutDevice if you try to save a device before knowing its JID.
var ErrInvalidLength = errors.New("database returned byte array with illegal length")
ErrInvalidLength is returned by some database getters if the database returned a byte array with an unexpected length. This should be impossible, as the database schema contains CHECK()s for all the relevant columns.
Functions ¶
This section is empty.
Types ¶
type CachedLIDMap ¶
type CachedLIDMap struct {
// contains filtered or unexported fields
}
func (*CachedLIDMap) GetLIDForPN ¶
func (*CachedLIDMap) GetManyLIDsForPNs ¶
func (*CachedLIDMap) GetManyPNsForLIDs ¶
func (*CachedLIDMap) GetPNForLID ¶
func (*CachedLIDMap) PutLIDMapping ¶
func (*CachedLIDMap) PutManyLIDMappings ¶
func (s *CachedLIDMap) PutManyLIDMappings(ctx context.Context, mappings []store.LIDMapping) error
type Config ¶
type Config struct {
MaxOpenConns int
MaxIdleConns int
ConnMaxLifetime time.Duration
ConnMaxIdleTime time.Duration
MigrationLockWait time.Duration
Observer Observer
}
Config controls connection pooling and schema migration behavior.
func NewDefaultConfig ¶
func NewDefaultConfig() Config
NewDefaultConfig returns an independent configuration suitable for a service hosting multiple active sessions. Returning a copy prevents global configuration mutations and data races between callers.
type Container ¶
type Container struct {
LIDMap *CachedLIDMap
// contains filtered or unexported fields
}
Container is a wrapper for a SQL database that can contain multiple whatsmeow sessions.
func New ¶
New opens a MariaDB-backed Hypermeow session container and applies pending schema migrations. The DSN uses github.com/go-sql-driver/mysql syntax.
func NewWithConfig ¶
func NewWithConfig(ctx context.Context, dsn string, log waLog.Logger, config Config) (*Container, error)
NewWithConfig is New with explicit connection-pool and migration settings.
func NewWithDB ¶
NewWithDB borrows an existing MariaDB connection pool without changing its settings. It does not run migrations; call Upgrade before serving clients. Close does not close a borrowed pool; the caller retains ownership.
func NewWithDBConfig ¶
NewWithDBConfig borrows an existing pool and applies the explicit pool settings. Close does not close the borrowed pool.
func (*Container) Close ¶
Close closes pools opened by New. Borrowed pools passed to NewWithDB or NewWithDBConfig remain owned by their caller.
func (*Container) DBStats ¶
DBStats returns a snapshot of the underlying database/sql connection pool.
func (*Container) DeleteDevice ¶
DeleteDevice deletes the given device from this database. This should be called through Device.Delete()
func (*Container) GetAllDevices ¶
GetAllDevices finds all the devices in the database.
func (*Container) GetDevice ¶
GetDevice finds the device with the specified JID in the database.
If the device is not found, nil is returned instead.
Note that the parameter usually must be an AD-JID.
func (*Container) GetFirstDevice ¶
GetFirstDevice is a convenience method for getting the first device in the store. If there are no devices, then a new device will be created. You should only use this if you don't want to have multiple sessions simultaneously.
func (*Container) Metrics ¶
func (c *Container) Metrics() MetricsSnapshot
Metrics returns cumulative, redacted storage-operation telemetry.
func (*Container) NewDevice ¶
NewDevice creates a new device in this database.
No data is actually stored before Save is called. However, the pairing process will automatically call Save after a successful pairing, so you most likely don't need to call it yourself.
func (*Container) PutDevice ¶
PutDevice stores the given device in this database. This should be called through Device.Save() (which usually doesn't need to be called manually, as the library does that automatically when relevant).
func (*Container) SchemaVersion ¶
SchemaVersion returns the adapter schema version currently stored in MariaDB.
func (*Container) Upgrade ¶
Upgrade upgrades the database from its current schema to the latest version.
type DBEvent ¶
type DBEvent struct {
Operation string
Duration time.Duration
Failed bool
ErrorClass string
ErrorCode uint16
}
DBEvent is a redacted storage-operation measurement. SQL text and arguments are intentionally excluded because session data is sensitive.
type MetricsSnapshot ¶
type MetricsSnapshot struct {
Operations uint64 `json:"operations"`
Errors uint64 `json:"errors"`
TotalLatency time.Duration `json:"total_latency"`
Transactions uint64 `json:"transactions"`
TransactionCommits uint64 `json:"transaction_commits"`
TransactionRollbacks uint64 `json:"transaction_rollbacks"`
TransactionErrors uint64 `json:"transaction_errors"`
TransactionRetries uint64 `json:"transaction_retries"`
ObserverPanics uint64 `json:"observer_panics"`
}
MetricsSnapshot is a lock-free cumulative storage telemetry snapshot.
type Observer ¶
Observer receives completed storage-operation measurements synchronously. Implementations must return promptly and must not call back into the same Container. Panics are recovered and counted in MetricsSnapshot.
type ObserverFunc ¶
ObserverFunc adapts a function to Observer.
type SQLStore ¶
func NewSQLStore ¶
NewSQLStore creates a new SQLStore with the given database container and user JID. It contains implementations of all the different stores in the store package.
In general, you should use Container.NewDevice or Container.GetDevice instead of this.
func (*SQLStore) AddOutgoingEvent ¶
func (*SQLStore) ClearBufferedEventPlaintext ¶
func (*SQLStore) DeleteAllIdentities ¶
func (*SQLStore) DeleteAllSessions ¶
func (*SQLStore) DeleteAppStateMutationMACs ¶
func (*SQLStore) DeleteAppStateVersion ¶
func (*SQLStore) DeleteExpiredPrivacyTokens ¶
func (*SQLStore) DeleteIdentity ¶
func (*SQLStore) DeleteOldBufferedHashes ¶
func (*SQLStore) DeleteOldOutgoingEvents ¶
func (*SQLStore) DeleteSession ¶
func (*SQLStore) DoDecryptionTxn ¶
func (*SQLStore) EnsureIdentity ¶
func (*SQLStore) GenOnePreKey ¶
func (*SQLStore) GetAllAppStateSyncKeys ¶
func (*SQLStore) GetAllContacts ¶
func (*SQLStore) GetAppStateMutationMAC ¶
func (*SQLStore) GetAppStateSyncKey ¶
func (*SQLStore) GetAppStateVersion ¶
func (*SQLStore) GetBufferedEvent ¶
func (*SQLStore) GetChatSettings ¶
func (*SQLStore) GetContact ¶
func (*SQLStore) GetLatestAppStateSyncKeyID ¶
func (*SQLStore) GetManyIdentities ¶
func (*SQLStore) GetManySessions ¶
func (*SQLStore) GetMessageSecret ¶
func (*SQLStore) GetOrGenPreKeys ¶
func (*SQLStore) GetOutgoingEvent ¶
func (*SQLStore) GetPrivacyToken ¶
func (*SQLStore) GetSenderKey ¶
func (*SQLStore) GetSession ¶
func (*SQLStore) GetWASARootSecretID ¶
func (*SQLStore) HasSession ¶
func (*SQLStore) IsTrustedIdentity ¶
func (*SQLStore) IterateSession ¶
func (*SQLStore) IterateSessions ¶
func (*SQLStore) MarkPreKeysAsUploaded ¶
func (*SQLStore) MigratePNToLID ¶
func (*SQLStore) PutAllContactNames ¶
func (*SQLStore) PutAppStateMutationMACs ¶
func (*SQLStore) PutAppStateSyncKey ¶
func (*SQLStore) PutAppStateVersion ¶
func (*SQLStore) PutArchived ¶
func (*SQLStore) PutBufferedEvent ¶
func (*SQLStore) PutBusinessName ¶
func (*SQLStore) PutContactName ¶
func (*SQLStore) PutContactUsername ¶
func (*SQLStore) PutIdentity ¶
func (*SQLStore) PutManyContactUsernames ¶
func (*SQLStore) PutManyRedactedPhones ¶
func (*SQLStore) PutManySessions ¶
func (*SQLStore) PutMessageSecret ¶
func (*SQLStore) PutMessageSecrets ¶
func (*SQLStore) PutMutedUntil ¶
func (*SQLStore) PutPrivacyTokens ¶
func (*SQLStore) PutPushName ¶
func (*SQLStore) PutSenderKey ¶
func (*SQLStore) PutSession ¶
func (*SQLStore) PutWASARootSecretID ¶
func (*SQLStore) RemovePreKey ¶
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
internal
|
|
|
database
Package database implements the private SQL execution and telemetry layer.
|
Package database implements the private SQL execution and telemetry layer. |
|
schema
Package schema owns the adapter's embedded MariaDB schema and migrations.
|
Package schema owns the adapter's embedded MariaDB schema and migrations. |