Documentation
¶
Index ¶
- Constants
- Variables
- func ContainsLockType(a []LockType, typ LockType) bool
- func TrimName(name string) string
- func WALChecksum(bo binary.ByteOrder, s0, s1 uint32, b []byte) (uint32, uint32)
- func WriteStreamFrame(w io.Writer, f StreamFrame) error
- type Client
- type DB
- func (db *DB) AcquireWriteLock(ctx context.Context) (_ *GuardSet, err error)
- func (db *DB) ApplyLTX(ctx context.Context, path string) error
- func (db *DB) CommitJournal(mode JournalMode) error
- func (db *DB) CommitWAL() error
- func (db *DB) CreateJournal() (*os.File, error)
- func (db *DB) CreateSHM() (*os.File, error)
- func (db *DB) CreateWAL() (*os.File, error)
- func (db *DB) DatabasePath() string
- func (db *DB) EnforceRetention(ctx context.Context, minTime time.Time) error
- func (db *DB) GuardSet() *GuardSet
- func (db *DB) InWriteTx() bool
- func (db *DB) JournalPath() string
- func (db *DB) LTXDir() string
- func (db *DB) LTXPath(minTXID, maxTXID uint64) string
- func (db *DB) Name() string
- func (db *DB) Open() error
- func (db *DB) OpenLTXFile(txID uint64) (*os.File, error)
- func (db *DB) Path() string
- func (db *DB) Pos() Pos
- func (db *DB) ReadLTXDir() ([]fs.DirEntry, error)
- func (db *DB) SHMPath() string
- func (db *DB) Store() *Store
- func (db *DB) TXID() uint64
- func (db *DB) WALPath() string
- func (db *DB) WriteDatabase(f *os.File, data []byte, offset int64) error
- func (db *DB) WriteJournal(f *os.File, data []byte, offset int64) error
- func (db *DB) WriteSHM(f *os.File, data []byte, offset int64) (int, error)
- func (db *DB) WriteSnapshotTo(ctx context.Context, dst io.Writer) (header ltx.Header, trailer ltx.Trailer, err error)
- func (db *DB) WriteWAL(f *os.File, data []byte, offset int64) error
- type DBMode
- type EndStreamFrame
- type FileType
- type GuardSet
- func (s *GuardSet) Ckpt() *RWMutexGuard
- func (s *GuardSet) DMS() *RWMutexGuard
- func (s *GuardSet) Guard(lockType LockType) *RWMutexGuard
- func (s *GuardSet) Pending() *RWMutexGuard
- func (s *GuardSet) Read0() *RWMutexGuard
- func (s *GuardSet) Read1() *RWMutexGuard
- func (s *GuardSet) Read2() *RWMutexGuard
- func (s *GuardSet) Read3() *RWMutexGuard
- func (s *GuardSet) Read4() *RWMutexGuard
- func (s *GuardSet) Recover() *RWMutexGuard
- func (s *GuardSet) Reserved() *RWMutexGuard
- func (s *GuardSet) Shared() *RWMutexGuard
- func (s *GuardSet) Unlock()
- func (s *GuardSet) UnlockDatabase()
- func (s *GuardSet) UnlockSHM()
- func (s *GuardSet) Write() *RWMutexGuard
- type Invalidator
- type JournalMode
- type JournalReader
- type LTXStreamFrame
- type Lease
- type Leaser
- type LockType
- type Pos
- type PrimaryInfo
- type RWMutex
- type RWMutexGuard
- func (g *RWMutexGuard) CanLock() (canLock bool, mutexState RWMutexState)
- func (g *RWMutexGuard) CanRLock() bool
- func (g *RWMutexGuard) Lock(ctx context.Context) error
- func (g *RWMutexGuard) RLock(ctx context.Context) error
- func (g *RWMutexGuard) State() RWMutexState
- func (g *RWMutexGuard) TryLock() bool
- func (g *RWMutexGuard) TryRLock() bool
- func (g *RWMutexGuard) Unlock()
- type RWMutexState
- type ReadyStreamFrame
- type StaticLease
- type StaticLeaser
- type Store
- func (s *Store) Candidate() bool
- func (s *Store) Close() error
- func (s *Store) CreateDB(name string) (*DB, *os.File, error)
- func (s *Store) CreateDBIfNotExists(name string) (*DB, error)
- func (s *Store) DB(name string) *DB
- func (s *Store) DBDir() string
- func (s *Store) DBPath(name string) string
- func (s *Store) DBs() []*DB
- func (s *Store) DebugFn(msg any)
- func (s *Store) EnforceRetention(ctx context.Context) (err error)
- func (s *Store) ID() string
- func (s *Store) IsPrimary() bool
- func (s *Store) MarkDirty(name string)
- func (s *Store) Open() error
- func (s *Store) Path() string
- func (s *Store) PosMap() map[string]Pos
- func (s *Store) PrimaryCtx(ctx context.Context) context.Context
- func (s *Store) PrimaryInfo() *PrimaryInfo
- func (s *Store) ReadyCh() chan struct{}
- func (s *Store) Subscribe() *Subscriber
- func (s *Store) Unsubscribe(sub *Subscriber)
- type StoreVar
- type StreamFrame
- type StreamFrameType
- type Subscriber
- type WALReader
Constants ¶
const ( DBModeRollback = DBMode(0) DBModeWAL = DBMode(1) )
Database journal modes.
const ( SQLITE_DATABASE_HEADER_STRING = "SQLite format 3\x00" // Location of the database size, in pages, in the main database file. SQLITE_DATABASE_SIZE_OFFSET = 28 /// Magic header string that identifies a SQLite journal header. /// https://www.sqlite.org/fileformat.html#the_rollback_journal SQLITE_JOURNAL_HEADER_STRING = "\xd9\xd5\x05\xf9\x20\xa1\x63\xd7" // Size of the journal header, in bytes. SQLITE_JOURNAL_HEADER_SIZE = 28 )
const ( // Database file locks LockTypePending = LockType(0x40000000) // 1073741824 LockTypeReserved = LockType(0x40000001) // 1073741825 // SHM file locks LockTypeWrite = LockType(120) LockTypeCkpt = LockType(121) LockTypeRecover = LockType(122) LockTypeRead0 = LockType(123) LockTypeRead1 = LockType(124) LockTypeRead2 = LockType(125) LockTypeRead3 = LockType(126) LockTypeRead4 = LockType(127) LockTypeDMS = LockType(128) )
const ( WALHeaderSize = 32 WALFrameHeaderSize = 24 WALIndexHeaderSize = 136 )
SQLite constants
const ( PENDING_BYTE = 0x40000000 RESERVED_BYTE = (PENDING_BYTE + 1) SHARED_FIRST = (PENDING_BYTE + 2) SHARED_SIZE = 510 )
SQLite rollback journal lock constants.
const ( WAL_WRITE_LOCK = 120 WAL_CKPT_LOCK = 121 WAL_RECOVER_LOCK = 122 WAL_READ_LOCK0 = 123 WAL_READ_LOCK1 = 124 WAL_READ_LOCK2 = 125 WAL_READ_LOCK3 = 126 WAL_READ_LOCK4 = 127 )
SQLite WAL lock constants.
const ( F_OFD_GETLK = 36 F_OFD_SETLK = 37 F_OFD_SETLKW = 38 )
Open file description lock constants.
const ( JournalModeDelete = "DELETE" JournalModeTruncate = "TRUNCATE" JournalModePersist = "PERSIST" JournalModeWAL = "WAL" )
const ( FileTypeNone = FileType(iota) FileTypeDatabase FileTypeJournal FileTypeWAL FileTypeSHM FileTypePos )
Database file types.
const ( StreamFrameTypeLTX = StreamFrameType(1) StreamFrameTypeReady = StreamFrameType(2) StreamFrameTypeEnd = StreamFrameType(3) )
const ( RWMutexStateUnlocked = RWMutexState(iota) RWMutexStateExclusive )
const ( DefaultRetentionDuration = 1 * time.Minute DefaultRetentionMonitorInterval = 1 * time.Minute )
Default store settings.
const IDLength = 24
IDLength is the length of a node ID, in bytes.
const RWMutexInterval = 10 * time.Microsecond
RWMutexInterval is the time between reattempting lock acquisition.
Variables ¶
var ( ErrDatabaseNotFound = fmt.Errorf("database not found") ErrDatabaseExists = fmt.Errorf("database already exists") ErrNoPrimary = errors.New("no primary") ErrPrimaryExists = errors.New("primary exists") ErrLeaseExpired = errors.New("lease expired") ErrReadOnlyReplica = fmt.Errorf("read only replica") )
LiteFS errors
Functions ¶
func ContainsLockType ¶ added in v0.3.0
ContainsLockType returns true if a contains typ.
func WALChecksum ¶ added in v0.3.0
WALChecksum computes a running SQLite WAL checksum over a byte slice.
func WriteStreamFrame ¶
func WriteStreamFrame(w io.Writer, f StreamFrame) error
WriteStreamFrame writes the stream type & frame to the writer.
Types ¶
type Client ¶
type Client interface {
// Stream starts a long-running connection to stream changes from another node.
Stream(ctx context.Context, rawurl string, id string, posMap map[string]Pos) (io.ReadCloser, error)
}
Client represents a client for connecting to other LiteFS nodes.
type DB ¶
type DB struct {
// Returns the current time. Used for mocking time in tests.
Now func() time.Time
// contains filtered or unexported fields
}
DB represents a SQLite database.
func (*DB) AcquireWriteLock ¶ added in v0.3.0
AcquireWriteLock acquires the appropriate locks for a write depending on if the database uses a rollback journal or WAL.
func (*DB) CommitJournal ¶
func (db *DB) CommitJournal(mode JournalMode) error
CommitJournal deletes the journal file which commits or rolls back the transaction.
func (*DB) CommitWAL ¶ added in v0.3.0
commitWAL is called when the client releases the WAL_WRITE_LOCK(120). The transaction data is copied from the WAL into an LTX file and committed.
func (*DB) CreateJournal ¶
CreateJournal creates a new journal file on disk.
func (*DB) DatabasePath ¶ added in v0.1.1
DatabasePath returns the path to the underlying database file.
func (*DB) EnforceRetention ¶ added in v0.2.0
EnforceRetention removes all LTX files created before minTime.
func (*DB) GuardSet ¶ added in v0.2.0
GuardSet returns a set of guards that can control locking for the database file.
func (*DB) JournalPath ¶ added in v0.1.1
JournalPath returns the path to the underlying journal file.
func (*DB) OpenLTXFile ¶
OpenLTXFile returns a file handle to an LTX file that contains the given TXID.
func (*DB) ReadLTXDir ¶ added in v0.2.0
ReadLTXDir returns DirEntry for every LTX file.
func (*DB) WriteDatabase ¶
WriteDatabase writes data to the main database file.
func (*DB) WriteJournal ¶
WriteJournal writes data to the rollback journal file.
type DBMode ¶ added in v0.3.0
type DBMode int
DBMode represents either a rollback journal or WAL mode.
type EndStreamFrame ¶ added in v0.3.0
type EndStreamFrame struct{}
func (*EndStreamFrame) ReadFrom ¶ added in v0.3.0
func (f *EndStreamFrame) ReadFrom(r io.Reader) (int64, error)
func (*EndStreamFrame) Type ¶ added in v0.3.0
func (f *EndStreamFrame) Type() StreamFrameType
type GuardSet ¶ added in v0.2.0
type GuardSet struct {
// contains filtered or unexported fields
}
GuardSet represents a set of mutex guards by a single owner.
func (*GuardSet) Ckpt ¶ added in v0.3.0
func (s *GuardSet) Ckpt() *RWMutexGuard
Ckpt returns a reference to the CKPT mutex guard.
func (*GuardSet) DMS ¶ added in v0.3.0
func (s *GuardSet) DMS() *RWMutexGuard
DMS returns a reference to the DMS mutex guard.
func (*GuardSet) Guard ¶ added in v0.2.0
func (s *GuardSet) Guard(lockType LockType) *RWMutexGuard
Guard returns a guard by lock type. Panic on invalid lock type.
func (*GuardSet) Pending ¶ added in v0.3.0
func (s *GuardSet) Pending() *RWMutexGuard
Pending returns a reference to the PENDING mutex guard.
func (*GuardSet) Read0 ¶ added in v0.3.0
func (s *GuardSet) Read0() *RWMutexGuard
Read0 returns a reference to the READ0 mutex guard.
func (*GuardSet) Read1 ¶ added in v0.3.0
func (s *GuardSet) Read1() *RWMutexGuard
Read1 returns a reference to the READ1 mutex guard.
func (*GuardSet) Read2 ¶ added in v0.3.0
func (s *GuardSet) Read2() *RWMutexGuard
Read2 returns a reference to the READ2 mutex guard.
func (*GuardSet) Read3 ¶ added in v0.3.0
func (s *GuardSet) Read3() *RWMutexGuard
Read3 returns a reference to the READ3 mutex guard.
func (*GuardSet) Read4 ¶ added in v0.3.0
func (s *GuardSet) Read4() *RWMutexGuard
Read4 returns a reference to the READ4 mutex guard.
func (*GuardSet) Recover ¶ added in v0.3.0
func (s *GuardSet) Recover() *RWMutexGuard
Recover returns a reference to the RECOVER mutex guard.
func (*GuardSet) Reserved ¶ added in v0.3.0
func (s *GuardSet) Reserved() *RWMutexGuard
Reserved returns a reference to the RESERVED mutex guard.
func (*GuardSet) Shared ¶ added in v0.3.0
func (s *GuardSet) Shared() *RWMutexGuard
Shared returns a reference to the SHARED mutex guard.
func (*GuardSet) Unlock ¶ added in v0.2.0
func (s *GuardSet) Unlock()
Unlock unlocks all the guards in reversed order that they are acquired by SQLite.
func (*GuardSet) UnlockDatabase ¶ added in v0.3.0
func (s *GuardSet) UnlockDatabase()
UnlockDatabase unlocks all the database file guards.
func (*GuardSet) UnlockSHM ¶ added in v0.3.0
func (s *GuardSet) UnlockSHM()
UnlockSHM unlocks all the SHM file guards.
func (*GuardSet) Write ¶ added in v0.3.0
func (s *GuardSet) Write() *RWMutexGuard
Write returns a reference to the WRITE mutex guard.
type Invalidator ¶ added in v0.1.1
type Invalidator interface {
InvalidateDB(db *DB, offset, size int64) error
InvalidateSHM(db *DB) error
InvalidatePos(db *DB) error
}
Invalidator is a callback for the store to use to invalidate the kernel page cache.
type JournalReader ¶ added in v0.3.0
type JournalReader struct {
// contains filtered or unexported fields
}
JouralReader represents a reader of the SQLite journal file format.
func NewJournalReader ¶ added in v0.3.0
func NewJournalReader(f *os.File, pageSize uint32) *JournalReader
JournalReader returns a new instance of JournalReader.
func (*JournalReader) DatabaseSize ¶ added in v0.3.0
func (r *JournalReader) DatabaseSize() int64
DatabaseSize returns the size of the database before the journal transaction, in bytes.
func (*JournalReader) Next ¶ added in v0.3.0
func (r *JournalReader) Next() (err error)
Next reads the next segment of the journal. Returns io.EOF if no more segments exist.
type LTXStreamFrame ¶
type LTXStreamFrame struct {
Name string // database name
}
func (*LTXStreamFrame) Type ¶
func (*LTXStreamFrame) Type() StreamFrameType
Type returns the type of stream frame.
type Lease ¶
type Lease interface {
RenewedAt() time.Time
TTL() time.Duration
// Renew attempts to reset the TTL on the lease.
// Returns ErrLeaseExpired if the lease has expired or was deleted.
Renew(ctx context.Context) error
// Close attempts to remove the lease from the server.
Close() error
}
Lease represents an acquired lease from a Leaser.
type Leaser ¶
type Leaser interface {
io.Closer
AdvertiseURL() string
// Acquire attempts to acquire the lease to become the primary.
Acquire(ctx context.Context) (Lease, error)
// PrimaryInfo attempts to read the current primary data.
// Returns ErrNoPrimary if no primary currently has the lease.
PrimaryInfo(ctx context.Context) (PrimaryInfo, error)
}
Leaser represents an API for obtaining a lease for leader election.
type LockType ¶
type LockType int
LockType represents a SQLite lock type.
func ParseDatabaseLockRange ¶ added in v0.3.0
ParseDatabaseLockRange returns a list of SQLite database locks that are within a range.
func ParseWALLockRange ¶
ParseWALLockRange returns a list of SQLite WAL locks that are within a range.
type PrimaryInfo ¶ added in v0.2.0
type PrimaryInfo struct {
Hostname string `json:"hostname"`
AdvertiseURL string `json:"advertise-url"`
}
PrimaryInfo is the JSON object stored in the Consul lease value.
func (*PrimaryInfo) Clone ¶ added in v0.2.0
func (info *PrimaryInfo) Clone() *PrimaryInfo
Clone returns a copy of info.
type RWMutex ¶
type RWMutex struct {
// contains filtered or unexported fields
}
RWMutex is a reader/writer mutual exclusion lock. It wraps the sync package to provide additional capabilities such as lock upgrades & downgrades. It only supports TryLock() & TryRLock() as that is what's supported by our FUSE file system.
func (*RWMutex) Guard ¶ added in v0.2.0
func (rw *RWMutex) Guard() RWMutexGuard
Guard returns an unlocked guard for the mutex.
func (*RWMutex) State ¶
func (rw *RWMutex) State() RWMutexState
State returns whether the mutex has a exclusive lock, one or more shared locks, or if the mutex is unlocked.
type RWMutexGuard ¶
type RWMutexGuard struct {
// contains filtered or unexported fields
}
RWMutexGuard is a reference to a mutex. Locking, unlocking, upgrading, & downgrading operations are all performed via the guard instead of directly on the RWMutex itself as this works similarly to how POSIX locks work.
func (*RWMutexGuard) CanLock ¶
func (g *RWMutexGuard) CanLock() (canLock bool, mutexState RWMutexState)
CanLock returns true if the guard can become an exclusive lock. Also returns the current state of the underlying mutex to determine if the lock is blocked by a shared or exclusive lock.
func (*RWMutexGuard) CanRLock ¶ added in v0.2.0
func (g *RWMutexGuard) CanRLock() bool
CanRLock returns true if the guard can become a shared lock.
func (*RWMutexGuard) Lock ¶ added in v0.2.0
func (g *RWMutexGuard) Lock(ctx context.Context) error
Lock attempts to obtain a exclusive lock for the guard. Returns an error if ctx is done.
func (*RWMutexGuard) RLock ¶
func (g *RWMutexGuard) RLock(ctx context.Context) error
RLock attempts to obtain a shared lock for the guard. Returns an error if ctx is done.
func (*RWMutexGuard) State ¶ added in v0.3.0
func (g *RWMutexGuard) State() RWMutexState
State returns the current state of the guard.
func (*RWMutexGuard) TryLock ¶
func (g *RWMutexGuard) TryLock() bool
TryLock upgrades the lock from a shared lock to an exclusive lock. This is a no-op if the lock is already an exclusive lock.
func (*RWMutexGuard) TryRLock ¶ added in v0.2.0
func (g *RWMutexGuard) TryRLock() bool
TryRLock attempts to obtain a shared lock on the mutex for the guard. This will upgrade an unlocked guard and downgrade an exclusive guard. Shared guards are a no-op.
type RWMutexState ¶
type RWMutexState int
RWMutexState represents the lock state of an RWMutex or RWMutexGuard.
func (RWMutexState) String ¶ added in v0.2.0
func (s RWMutexState) String() string
String returns the string representation of the state.
type ReadyStreamFrame ¶ added in v0.2.0
type ReadyStreamFrame struct{}
func (*ReadyStreamFrame) ReadFrom ¶ added in v0.2.0
func (f *ReadyStreamFrame) ReadFrom(r io.Reader) (int64, error)
func (*ReadyStreamFrame) Type ¶ added in v0.2.0
func (f *ReadyStreamFrame) Type() StreamFrameType
type StaticLease ¶ added in v0.2.0
type StaticLease struct {
// contains filtered or unexported fields
}
StaticLease represents a lease for a fixed primary.
func (*StaticLease) Close ¶ added in v0.2.0
func (l *StaticLease) Close() error
func (*StaticLease) Renew ¶ added in v0.2.0
func (l *StaticLease) Renew(ctx context.Context) error
Renew is a no-op.
func (*StaticLease) RenewedAt ¶ added in v0.2.0
func (l *StaticLease) RenewedAt() time.Time
RenewedAt returns the Unix epoch in UTC.
func (*StaticLease) TTL ¶ added in v0.2.0
func (l *StaticLease) TTL() time.Duration
TTL returns the duration until the lease expires which is a time well into the future.
type StaticLeaser ¶ added in v0.2.0
type StaticLeaser struct {
// contains filtered or unexported fields
}
StaticLeaser always returns a lease to a static primary.
func NewStaticLeaser ¶ added in v0.2.0
func NewStaticLeaser(isPrimary bool, hostname, advertiseURL string) *StaticLeaser
NewStaticLeaser returns a new instance of StaticLeaser.
func (*StaticLeaser) Acquire ¶ added in v0.2.0
func (l *StaticLeaser) Acquire(ctx context.Context) (Lease, error)
Acquire returns a lease if this node is the static primary. Otherwise returns ErrPrimaryExists.
func (*StaticLeaser) AdvertiseURL ¶ added in v0.2.0
func (l *StaticLeaser) AdvertiseURL() string
AdvertiseURL returns the primary URL if this is the primary. Otherwise returns blank.
func (*StaticLeaser) Close ¶ added in v0.2.0
func (l *StaticLeaser) Close() (err error)
Close is a no-op.
func (*StaticLeaser) IsPrimary ¶ added in v0.2.0
func (l *StaticLeaser) IsPrimary() bool
IsPrimary returns true if the current node is the primary.
func (*StaticLeaser) PrimaryInfo ¶ added in v0.2.0
func (l *StaticLeaser) PrimaryInfo(ctx context.Context) (PrimaryInfo, error)
PrimaryInfo returns the primary's info. Returns ErrNoPrimary if the node is the primary.
type Store ¶
type Store struct {
// Client used to connect to other LiteFS instances.
Client Client
// Leaser manages the lease that controls leader election.
Leaser Leaser
// Length of time to retain LTX files.
RetentionDuration time.Duration
RetentionMonitorInterval time.Duration
// Callback to notify kernel of file changes.
Invalidator Invalidator
// If true, enables debug logging.
Debug bool
// If true, computes and verifies the checksum of the entire database
// after every transaction. Should only be used during testing.
StrictVerify bool
// contains filtered or unexported fields
}
Store represents a collection of databases.
func (*Store) Candidate ¶ added in v0.2.0
Candidate returns true if store is eligible to be the primary.
func (*Store) CreateDB ¶
CreateDB creates a new database with the given name. The returned file handle must be closed by the caller. Returns an error if a database with the same name already exists.
func (*Store) CreateDBIfNotExists ¶ added in v0.2.0
CreateDBIfNotExists creates an empty database with the given name.
func (*Store) EnforceRetention ¶ added in v0.2.0
EnforceRetention enforces retention of LTX files on all databases.
func (*Store) ID ¶ added in v0.2.0
ID returns the unique identifier for this instance. Available after Open(). Persistent across restarts if underlying storage is persistent.
func (*Store) PrimaryCtx ¶ added in v0.2.0
PrimaryCtx wraps ctx with another context that will cancel when no longer primary.
func (*Store) PrimaryInfo ¶ added in v0.2.0
func (s *Store) PrimaryInfo() *PrimaryInfo
PrimaryInfo returns info about the current primary.
func (*Store) ReadyCh ¶ added in v0.2.0
func (s *Store) ReadyCh() chan struct{}
ReadyCh returns a channel that is closed once the store has become primary or once it has connected to the primary.
func (*Store) Subscribe ¶
func (s *Store) Subscribe() *Subscriber
Subscribe creates a new subscriber for store changes.
func (*Store) Unsubscribe ¶
func (s *Store) Unsubscribe(sub *Subscriber)
Unsubscribe removes a subscriber from the store.
type StreamFrame ¶
type StreamFrame interface {
io.ReaderFrom
io.WriterTo
Type() StreamFrameType
}
func ReadStreamFrame ¶
func ReadStreamFrame(r io.Reader) (StreamFrame, error)
ReadStreamFrame reads a the stream type & frame from the reader.
type StreamFrameType ¶
type StreamFrameType uint32
type Subscriber ¶
type Subscriber struct {
// contains filtered or unexported fields
}
Subscriber subscribes to changes to databases in the store.
It implements a set of "dirty" databases instead of a channel of all events as clients can be slow and we don't want to cause channels to back up. It is the responsibility of the caller to determine the state changes which is usually just checking the position of the client versus the store's database.
func (*Subscriber) Close ¶
func (s *Subscriber) Close() error
Close removes the subscriber from the store.
func (*Subscriber) DirtySet ¶
func (s *Subscriber) DirtySet() map[string]struct{}
DirtySet returns a set of database IDs that have changed since the last call to DirtySet(). This call clears the set.
func (*Subscriber) MarkDirty ¶
func (s *Subscriber) MarkDirty(name string)
MarkDirty marks a database ID as dirty.
func (*Subscriber) NotifyCh ¶
func (s *Subscriber) NotifyCh() <-chan struct{}
NotifyCh returns a channel that receives a value when the dirty set has changed.
type WALReader ¶ added in v0.3.0
type WALReader struct {
// contains filtered or unexported fields
}
WALReader wraps an io.Reader and parses SQLite WAL frames.
This reader verifies the salt & checksum integrity while it reads. It does not enforce transaction boundaries (i.e. it may return uncommitted frames). It is the responsibility of the caller to handle this.
func NewWALReader ¶ added in v0.3.0
NewWALReader returns a new instance of WALReader.
func (*WALReader) Offset ¶ added in v0.3.0
Offset returns the file offset of the last read frame. Returns zero if no frames have been read.
func (*WALReader) PageSize ¶ added in v0.3.0
PageSize returns the page size from the header. Must call ReadHeader() first.
func (*WALReader) ReadFrame ¶ added in v0.3.0
ReadFrame reads the next frame from the WAL and returns the page number. Returns io.EOF at the end of the valid WAL.
func (*WALReader) ReadHeader ¶ added in v0.3.0
ReadHeader reads the WAL header into the reader. Returns io.EOF if WAL is invalid.