Help us shape the future of Go! Take the 2026 Go Developer Survey

clientdb

package
v0.3.12 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 22, 2026 License: MIT Imports: 17 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Bind

type Bind struct {
	ID        string
	IP        net.IP
	ClientMac string
	DeviceMac string
	Port      int
}

Bind - одна запись привязки клиента к порту устройства (или просто к IP/MAC для источников без устройства/порта, например smart). ID - уникальный ключ записи у внешнего источника: по нему приходят точечные обновления через Redis (см. BindEvent), не затрагивающие остальные записи.

type BindEvent

type BindEvent struct {
	DBType string          `json:"db_type"`
	Action string          `json:"action"`
	Object BindEventObject `json:"object"`
}

BindEvent - точечное изменение одной записи в bind-источнике (см. Config.Binds), приходит через Redis pub/sub в дополнение к периодическому полному reload по HTTP. В отличие от reload, применяется без перезагрузки всего источника - патчит по месту только запись с данным id, остальные записи не затрагиваются.

Формат сообщения (JSON) задан внешней системой:

{"db_type":"binds","action":"delete","object":{"id":123}}
{"db_type":"binds","action":"add","object":{"id":123,"ip":16909060,"mac":"AABBCCDDEEFF","device_mac":"AABBCCDDEEFF","port":44}}
{"db_type":"binds","action":"update","object":{"id":123,"ip":16909060,"mac":"AABBCCDDEEFF","device_mac":"AABBCCDDEEFF","port":44}}

db_type должен совпадать с одним из ключей Config.Binds (например "clients"/"smart", или один ключ "binds", если у источника только одно имя). device_mac/port опциональны - их отсутствие/пустое значение означает запись без привязки к устройству/порту (как у "smart" в HTTP-источнике). "add" и "update" оба означают upsert по object.id: если запись с таким id уже есть - заменяется целиком, если нет - создаётся.

type BindEventObject

type BindEventObject struct {
	ID        json.Number `json:"id"`
	IP        json.Number `json:"ip"`
	Mac       string      `json:"mac"`
	DeviceMac string      `json:"device_mac"`
	Port      json.Number `json:"port"`
}

type Config

type Config struct {
	DevicesURL      string            `yaml:"devices_url"`
	Binds           map[string]string `yaml:"binds"`
	RefreshInterval time.Duration     `yaml:"refresh_interval"`
	Timeout         time.Duration     `yaml:"timeout"`
	Redis           RedisConfig       `yaml:"redis"`
}

Config - параметры загрузки внешней базы устройств и привязок. Используется только скриптами (lua), api про этот пакет не знает. devices_url обязателен, binds - произвольный набор именованных источников (например clients/smart), доступных из lua через db:getBind(name, ...). Redis - опционально: точечные обновления записей binds по ID между полными reload'ами (см. BindEvent). Если Redis.Addr не задан - подписка не запускается.

type Device

type Device struct {
	IP        net.IP
	Mac       string
	ParseType string
}

type RedisConfig

type RedisConfig struct {
	Addr     string `yaml:"addr"`
	Password string `yaml:"password"`
	DB       int    `yaml:"db"`
	Channel  string `yaml:"channel"` // канал pub/sub, в который внешняя система публикует BindEvent (JSON)
}

RedisConfig - подписка на точечные обновления binds через Redis pub/sub (см. BindEvent), в дополнение к периодическому полному reload по HTTP. Полностью опциональна: если Addr не задан, подписка не запускается и Store работает как раньше, только на периодическом reload.

type Store

type Store struct {
	// contains filtered or unexported fields
}

Store - потокобезопасное хранилище с периодическим обновлением из HTTP-источников. Чтение (Get*) не блокируется обновлением - снапшот подменяется атомарно целиком. Дополнительно binds могут точечно патчиться по ID через Redis pub/sub (см. ApplyBindEvent) - это мутирует конкретный *bindIndex на месте (под его mu), не трогая остальную часть snapshot и не требуя полного reload.

func New

func New(conf Config, lg *logger.Logger) (*Store, error)

New синхронно загружает базу при старте (fail-fast), поднимает (если настроено) подписку на точечные обновления binds через Redis и запускает фоновое полное обновление по HTTP.

func (*Store) ApplyBindEvent

func (s *Store) ApplyBindEvent(ev BindEvent) error

ApplyBindEvent применяет точечное изменение (см. BindEvent), не затрагивая остальные записи и не запуская полный reload. Если в этот момент выполняется reload() (от начала HTTP-запроса к источнику до фактической подмены снапшота) - событие не применяется сразу, а откладывается (см. Store.pendingLive) и накатывается на актуальный снапшот сразу после reload (см. finishReload) - иначе оно применилось бы к снапшоту, который через мгновение целиком заменят, и было бы потеряно. Вне окна reload применяется немедленно, как и раньше.

func (*Store) Close

func (s *Store) Close()

Close останавливает фоновое обновление и подписку на Redis (если была поднята)

func (*Store) GetBind

func (s *Store) GetBind(dbName, mac, deviceMac, port string) []Bind

GetBind ищет привязки в именованном источнике dbName (см. Config.Binds). mac - мак-адрес клиента, deviceMac/port - опциональные уточнения. mac тоже может быть пустым, если заданы deviceMac+port - тогда ищутся все привязки на этом порту устройства независимо от мак-адреса клиента (порт, отданный под общий пул). Возвращает все совпадения - пустой слайс, если ничего не найдено (в т.ч. если такого dbName нет вовсе)

func (*Store) GetBindByID

func (s *Store) GetBindByID(dbName, id string) (Bind, bool)

GetBindByID ищет одну запись по её уникальному ID в именованном источнике dbName. Используется в основном для проверки результата точечных обновлений (см. ApplyBindEvent).

func (*Store) GetDeviceByMac

func (s *Store) GetDeviceByMac(mac string) (Device, bool)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL