Documentation
¶
Overview ¶
Package zorm provides SQL audit and telemetry functionality for database operations.
Package zorm provides atomic DDL operations and database schema management.
Index ¶
- func And(conds ...interface{}) *ormCondEx
- func AtomicCreateTables(db ZormDBIFace, logger DDLLogger, models ...interface{}) error
- func AtomicCreateTablesWithContext(ctx context.Context, db ZormDBIFace, logger DDLLogger, models ...interface{}) error
- func Between(field string, i interface{}, j interface{}) *ormCond
- func Cond(c string, args ...interface{}) *ormCond
- func CreateTable(db ZormDBIFace, tableName string, model interface{}, config *DDLConfig) error
- func CreateTables(db ZormDBIFace, models ...interface{}) error
- func DropTable(db ZormDBIFace, tableName string) error
- func Eq(field string, i interface{}) *ormCond
- func Fields(fields ...string) *fieldsItem
- func FullJoin(table string, on ...interface{}) *joinItem
- func GLOB(field string, pattern string) *ormCond
- func GroupBy(fields ...string) *groupByItem
- func Gt(field string, i interface{}) *ormCond
- func Gte(field string, i interface{}) *ormCond
- func Having(conds ...interface{}) *havingItem
- func In(field string, args ...interface{}) *ormCond
- func IndexedBy(idx string) *indexedByItem
- func InnerJoin(table string, on ...interface{}) *joinItem
- func Join(stmt string) *joinItem
- func LeftJoin(table string, on ...interface{}) *joinItem
- func Like(field string, pattern string) *ormCond
- func Limit(i ...interface{}) *limitItem
- func Lt(field string, i interface{}) *ormCond
- func Lte(field string, i interface{}) *ormCond
- func Neq(field string, i interface{}) *ormCond
- func OnConflictDoUpdateSet(fields []string, keyVals V) *onConflictDoUpdateSetItem
- func Or(conds ...interface{}) *ormCondEx
- func OrderBy(orders ...string) *orderByItem
- func RightJoin(table string, on ...interface{}) *joinItem
- func SetConnectionPool(db *sql.DB, pool *ConnectionPool)
- func TableExists(db ZormDBIFace, tableName string) (bool, error)
- func Where(conds ...interface{}) *whereItem
- func ZormMock(tbl, fun, caller, file, pkg string, data interface{}, ret int, err error)
- func ZormMockFinish() error
- type AlterTableCommand
- type AuditLogger
- type AuditableDB
- func (adb *AuditableDB) Disable()
- func (adb *AuditableDB) Enable()
- func (adb *AuditableDB) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
- func (adb *AuditableDB) GetTelemetryMetrics() map[string]interface{}
- func (adb *AuditableDB) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
- func (adb *AuditableDB) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row
- type CallSite
- type ColumnDef
- type Config
- type ConnectionPool
- type ConnectionPoolStats
- type CreateIndexCommand
- type CreateTableCommand
- type DDLCommand
- type DDLConfig
- type DDLLogger
- type DDLManager
- func (dm *DDLManager) CreateTables(ctx context.Context, models ...interface{}) error
- func (dm *DDLManager) ExecuteSchemaPlan(ctx context.Context, plan *SchemaPlan) error
- func (dm *DDLManager) GenerateSchemaPlan(ctx context.Context, targetModels []interface{}) (*SchemaPlan, error)
- func (dm *DDLManager) GetCurrentSchema(ctx context.Context) (*SchemaInfo, error)
- type DataBindingItem
- type DefaultAuditLogger
- type DefaultDDLLogger
- type DefaultTelemetryCollector
- type DropIndexCommand
- type DropTableCommand
- type FieldInfo
- type FileAuditLogger
- type IndexInfo
- type JSONAuditLogger
- func (l *JSONAuditLogger) LogAuditEvent(ctx context.Context, event *SQLAuditEvent)
- func (l *JSONAuditLogger) LogCommand(ctx context.Context, cmd DDLCommand, err error)
- func (l *JSONAuditLogger) LogSchemaChange(ctx context.Context, plan *SchemaPlan, err error)
- func (l *JSONAuditLogger) LogTelemetryData(ctx context.Context, data *TelemetryData)
- type MapFieldInfo
- type MockMatcher
- type ReadWriteDB
- func (rw *ReadWriteDB) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
- func (rw *ReadWriteDB) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
- func (rw *ReadWriteDB) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row
- type SQLAuditEvent
- type SchemaInfo
- type SchemaPlan
- type StructFieldInfo
- type TableInfo
- type TelemetryCollector
- type TelemetryData
- type U
- type V
- type ZormDBIFace
- type ZormItem
- type ZormTable
- func (t *ZormTable) Audit(auditLogger interface{}, telemetryCollector interface{}) *ZormTable
- func (t *ZormTable) Debug() *ZormTable
- func (t *ZormTable) Delete(args ...ZormItem) (int, error)
- func (t *ZormTable) Exec(query string, args ...interface{}) (int, error)
- func (t *ZormTable) Insert(objs interface{}, args ...ZormItem) (int, error)
- func (t *ZormTable) InsertIgnore(objs interface{}, args ...ZormItem) (int, error)
- func (t *ZormTable) NoReuse() *ZormTable
- func (t *ZormTable) NoSafeReuse() *ZormTable
- func (t *ZormTable) ReplaceInto(objs interface{}, args ...ZormItem) (int, error)
- func (t *ZormTable) Reuse() *ZormTable
- func (t *ZormTable) SafeReuse() *ZormTable
- func (t *ZormTable) Select(res interface{}, args ...ZormItem) (int, error)
- func (t *ZormTable) ToTimestamp() *ZormTable
- func (t *ZormTable) Update(obj interface{}, args ...ZormItem) (int, error)
- func (t *ZormTable) UseNameWhenTagEmpty() *ZormTable
- type ZormTx
- func (tx *ZormTx) Commit() error
- func (tx *ZormTx) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
- func (tx *ZormTx) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
- func (tx *ZormTx) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row
- func (tx *ZormTx) Rollback() error
- type ZormTxIFace
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AtomicCreateTables ¶
func AtomicCreateTables(db ZormDBIFace, logger DDLLogger, models ...interface{}) error
AtomicCreateTables performs atomic table creation with audit logging
func AtomicCreateTablesWithContext ¶
func AtomicCreateTablesWithContext(ctx context.Context, db ZormDBIFace, logger DDLLogger, models ...interface{}) error
AtomicCreateTablesWithContext performs atomic table creation with context and audit logging
func CreateTable ¶
func CreateTable(db ZormDBIFace, tableName string, model interface{}, config *DDLConfig) error
CreateTable creates a table from struct definition
func CreateTables ¶
func CreateTables(db ZormDBIFace, models ...interface{}) error
CreateTables automatically creates table schemas
func DropTable ¶
func DropTable(db ZormDBIFace, tableName string) error
DropTable drops a table if it exists
func OnConflictDoUpdateSet ¶
OnConflictDoUpdateSet .
func SetConnectionPool ¶
func SetConnectionPool(db *sql.DB, pool *ConnectionPool)
SetConnectionPool 设置连接池
func TableExists ¶
func TableExists(db ZormDBIFace, tableName string) (bool, error)
TableExists checks if a table exists Priority: SQLite implementation first, MySQL as fallback
Types ¶
type AlterTableCommand ¶
type AlterTableCommand struct {
TableName string
Operation string // ADD, DROP, MODIFY, RENAME
Column *ColumnDef
OldName string // for RENAME operations
NewName string // for RENAME operations
}
AlterTableCommand represents an ALTER TABLE command
func (*AlterTableCommand) Description ¶
func (c *AlterTableCommand) Description() string
func (*AlterTableCommand) Execute ¶
func (c *AlterTableCommand) Execute(ctx context.Context, db ZormDBIFace) error
func (*AlterTableCommand) SQL ¶
func (c *AlterTableCommand) SQL() string
type AuditLogger ¶
type AuditLogger interface {
LogAuditEvent(ctx context.Context, event *SQLAuditEvent)
LogTelemetryData(ctx context.Context, data *TelemetryData)
}
AuditLogger interface for logging SQL audit events
type AuditableDB ¶
type AuditableDB struct {
// contains filtered or unexported fields
}
AuditableDB wraps a ZormDBIFace with audit logging
func NewAuditableDB ¶
func NewAuditableDB(db ZormDBIFace, auditLogger AuditLogger, telemetryCollector TelemetryCollector) *AuditableDB
NewAuditableDB creates a new auditable database wrapper
func (*AuditableDB) ExecContext ¶
func (adb *AuditableDB) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
ExecContext implements ZormDBIFace with audit logging
func (*AuditableDB) GetTelemetryMetrics ¶
func (adb *AuditableDB) GetTelemetryMetrics() map[string]interface{}
GetTelemetryMetrics returns current telemetry metrics
func (*AuditableDB) QueryContext ¶
func (adb *AuditableDB) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
QueryContext implements ZormDBIFace with audit logging
func (*AuditableDB) QueryRowContext ¶
func (adb *AuditableDB) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row
QueryRowContext implements ZormDBIFace with audit logging
type ColumnDef ¶
type ColumnDef struct {
Name string
Type string
Nullable bool
DefaultValue string
AutoIncrement bool
Comment string
}
ColumnDef represents a column definition
type Config ¶
type Config struct {
Debug bool
Reuse bool // 默认开启,提供2-14倍性能提升
UseNameWhenTagEmpty bool
ToTimestamp bool
}
Config .
type ConnectionPool ¶
type ConnectionPool struct {
MaxOpenConns int // 最大打开连接数
MaxIdleConns int // 最大空闲连接数
ConnMaxLifetime time.Duration // 连接最大生存时间
ConnMaxIdleTime time.Duration // 连接最大空闲时间
}
ConnectionPool 连接池配置
func DefaultConnectionPool ¶
func DefaultConnectionPool() *ConnectionPool
DefaultConnectionPool 默认连接池配置
type ConnectionPoolStats ¶
type ConnectionPoolStats struct {
OpenConnections int `json:"open_connections"`
InUseConnections int `json:"in_use_connections"`
IdleConnections int `json:"idle_connections"`
WaitCount int64 `json:"wait_count"`
WaitDuration time.Duration `json:"wait_duration_ms"`
MaxIdleClosed int64 `json:"max_idle_closed"`
MaxIdleTimeClosed int64 `json:"max_idle_time_closed"`
MaxLifetimeClosed int64 `json:"max_lifetime_closed"`
}
ConnectionPoolStats represents connection pool statistics
type CreateIndexCommand ¶
CreateIndexCommand represents a CREATE INDEX command
func (*CreateIndexCommand) Description ¶
func (c *CreateIndexCommand) Description() string
func (*CreateIndexCommand) Execute ¶
func (c *CreateIndexCommand) Execute(ctx context.Context, db ZormDBIFace) error
func (*CreateIndexCommand) SQL ¶
func (c *CreateIndexCommand) SQL() string
type CreateTableCommand ¶
CreateTableCommand represents a CREATE TABLE command
func (*CreateTableCommand) Description ¶
func (c *CreateTableCommand) Description() string
func (*CreateTableCommand) Execute ¶
func (c *CreateTableCommand) Execute(ctx context.Context, db ZormDBIFace) error
func (*CreateTableCommand) SQL ¶
func (c *CreateTableCommand) SQL() string
type DDLCommand ¶
type DDLCommand interface {
Execute(ctx context.Context, db ZormDBIFace) error
SQL() string
Description() string
}
DDLCommand represents a single atomic DDL operation
type DDLConfig ¶
type DDLConfig struct {
SchemaManagement bool // Whether to enable schema management
}
DDLConfig DDL configuration
func DefaultDDLConfig ¶
func DefaultDDLConfig() *DDLConfig
DefaultDDLConfig returns default DDL configuration for SQLite
type DDLLogger ¶
type DDLLogger interface {
LogCommand(ctx context.Context, cmd DDLCommand, err error)
LogSchemaChange(ctx context.Context, plan *SchemaPlan, err error)
}
DDLLogger interface for logging DDL operations
type DDLManager ¶
type DDLManager struct {
// contains filtered or unexported fields
}
DDLManager manages DDL operations with audit logging
func NewDDLManager ¶
func NewDDLManager(db ZormDBIFace, logger DDLLogger) *DDLManager
NewDDLManager creates a new DDL manager
func (*DDLManager) CreateTables ¶
func (dm *DDLManager) CreateTables(ctx context.Context, models ...interface{}) error
CreateTables performs atomic table creation using the new DDL system
func (*DDLManager) ExecuteSchemaPlan ¶
func (dm *DDLManager) ExecuteSchemaPlan(ctx context.Context, plan *SchemaPlan) error
ExecuteSchemaPlan executes a schema plan
func (*DDLManager) GenerateSchemaPlan ¶
func (dm *DDLManager) GenerateSchemaPlan(ctx context.Context, targetModels []interface{}) (*SchemaPlan, error)
GenerateSchemaPlan generates a schema plan to transform current schema to target schema
func (*DDLManager) GetCurrentSchema ¶
func (dm *DDLManager) GetCurrentSchema(ctx context.Context) (*SchemaInfo, error)
GetCurrentSchema retrieves current database schema
type DataBindingItem ¶
type DefaultAuditLogger ¶
type DefaultAuditLogger struct {
// contains filtered or unexported fields
}
DefaultAuditLogger is a simple console audit logger
func (*DefaultAuditLogger) LogAuditEvent ¶
func (l *DefaultAuditLogger) LogAuditEvent(ctx context.Context, event *SQLAuditEvent)
func (*DefaultAuditLogger) LogTelemetryData ¶
func (l *DefaultAuditLogger) LogTelemetryData(ctx context.Context, data *TelemetryData)
type DefaultDDLLogger ¶
type DefaultDDLLogger struct{}
DefaultDDLLogger is a simple console logger
func (*DefaultDDLLogger) LogCommand ¶
func (l *DefaultDDLLogger) LogCommand(ctx context.Context, cmd DDLCommand, err error)
func (*DefaultDDLLogger) LogSchemaChange ¶
func (l *DefaultDDLLogger) LogSchemaChange(ctx context.Context, plan *SchemaPlan, err error)
type DefaultTelemetryCollector ¶
type DefaultTelemetryCollector struct {
// contains filtered or unexported fields
}
DefaultTelemetryCollector collects and stores telemetry data
func NewDefaultTelemetryCollector ¶
func NewDefaultTelemetryCollector() *DefaultTelemetryCollector
func (*DefaultTelemetryCollector) CollectTelemetry ¶
func (c *DefaultTelemetryCollector) CollectTelemetry(ctx context.Context, data *TelemetryData)
func (*DefaultTelemetryCollector) GetMetrics ¶
func (c *DefaultTelemetryCollector) GetMetrics() map[string]interface{}
type DropIndexCommand ¶
DropIndexCommand represents a DROP INDEX command
func (*DropIndexCommand) Description ¶
func (c *DropIndexCommand) Description() string
func (*DropIndexCommand) Execute ¶
func (c *DropIndexCommand) Execute(ctx context.Context, db ZormDBIFace) error
func (*DropIndexCommand) SQL ¶
func (c *DropIndexCommand) SQL() string
type DropTableCommand ¶
DropTableCommand represents a DROP TABLE command
func (*DropTableCommand) Description ¶
func (c *DropTableCommand) Description() string
func (*DropTableCommand) Execute ¶
func (c *DropTableCommand) Execute(ctx context.Context, db ZormDBIFace) error
func (*DropTableCommand) SQL ¶
func (c *DropTableCommand) SQL() string
type FieldInfo ¶
type FieldInfo interface {
GetName() string
GetValue(ptr unsafe.Pointer) interface{}
GetType() reflect2.Type
}
FieldInfo 通用字段信息接口
type FileAuditLogger ¶
type FileAuditLogger struct {
// contains filtered or unexported fields
}
FileAuditLogger logs audit events to a file
func NewFileAuditLogger ¶
func NewFileAuditLogger(filename string) *FileAuditLogger
func (*FileAuditLogger) LogAuditEvent ¶
func (l *FileAuditLogger) LogAuditEvent(ctx context.Context, event *SQLAuditEvent)
func (*FileAuditLogger) LogTelemetryData ¶
func (l *FileAuditLogger) LogTelemetryData(ctx context.Context, data *TelemetryData)
type JSONAuditLogger ¶
type JSONAuditLogger struct {
// contains filtered or unexported fields
}
JSONAuditLogger logs audit events as JSON
func NewJSONAuditLogger ¶
func NewJSONAuditLogger() *JSONAuditLogger
func (*JSONAuditLogger) LogAuditEvent ¶
func (l *JSONAuditLogger) LogAuditEvent(ctx context.Context, event *SQLAuditEvent)
func (*JSONAuditLogger) LogCommand ¶
func (l *JSONAuditLogger) LogCommand(ctx context.Context, cmd DDLCommand, err error)
LogCommand implements DDLLogger interface
func (*JSONAuditLogger) LogSchemaChange ¶
func (l *JSONAuditLogger) LogSchemaChange(ctx context.Context, plan *SchemaPlan, err error)
LogSchemaChange implements DDLLogger interface
func (*JSONAuditLogger) LogTelemetryData ¶
func (l *JSONAuditLogger) LogTelemetryData(ctx context.Context, data *TelemetryData)
type MapFieldInfo ¶
type MapFieldInfo struct {
// contains filtered or unexported fields
}
MapFieldInfo map字段信息实现
func (*MapFieldInfo) GetName ¶
func (f *MapFieldInfo) GetName() string
func (*MapFieldInfo) GetType ¶
func (f *MapFieldInfo) GetType() reflect2.Type
func (*MapFieldInfo) GetValue ¶
func (f *MapFieldInfo) GetValue(ptr unsafe.Pointer) interface{}
type MockMatcher ¶
type MockMatcher struct {
Tbl string
Func string
Caller string
File string
Pkg string
Data interface{}
Ret int
Err error
}
MockMatcher .
type ReadWriteDB ¶
type ReadWriteDB struct {
Master ZormDBIFace // 主库(写)
Slaves []ZormDBIFace // 从库(读)
// contains filtered or unexported fields
}
ReadWriteDB 读写分离数据库
func NewReadWriteDB ¶
func NewReadWriteDB(master ZormDBIFace, slaves ...ZormDBIFace) *ReadWriteDB
NewReadWriteDB 创建读写分离数据库
func (*ReadWriteDB) ExecContext ¶
func (rw *ReadWriteDB) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
ExecContext 实现 ZormDBIFace 接口(写操作使用主库)
func (*ReadWriteDB) QueryContext ¶
func (rw *ReadWriteDB) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
QueryContext 实现 ZormDBIFace 接口(读操作使用从库)
func (*ReadWriteDB) QueryRowContext ¶
func (rw *ReadWriteDB) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row
QueryRowContext 实现 ZormDBIFace 接口(读操作使用从库)
type SQLAuditEvent ¶
type SQLAuditEvent struct {
ID string `json:"id"`
Timestamp time.Time `json:"timestamp"`
Operation string `json:"operation"` // SELECT, INSERT, UPDATE, DELETE, DDL
TableName string `json:"table_name"`
SQL string `json:"sql"`
Args []interface{} `json:"args"`
Duration time.Duration `json:"duration_ms"`
RowsAffected int64 `json:"rows_affected"`
Error string `json:"error,omitempty"`
UserID string `json:"user_id,omitempty"`
SessionID string `json:"session_id,omitempty"`
Metadata map[string]interface{} `json:"metadata,omitempty"`
}
SQLAuditEvent represents a SQL execution event for auditing
type SchemaInfo ¶
SchemaInfo represents current database schema information
type SchemaPlan ¶
type SchemaPlan struct {
Commands []DDLCommand
Summary string
}
SchemaPlan represents a plan for database schema changes
type StructFieldInfo ¶
type StructFieldInfo struct {
// contains filtered or unexported fields
}
StructFieldInfo struct字段信息实现
func (*StructFieldInfo) GetName ¶
func (f *StructFieldInfo) GetName() string
func (*StructFieldInfo) GetType ¶
func (f *StructFieldInfo) GetType() reflect2.Type
func (*StructFieldInfo) GetValue ¶
func (f *StructFieldInfo) GetValue(ptr unsafe.Pointer) interface{}
type TelemetryCollector ¶
type TelemetryCollector interface {
CollectTelemetry(ctx context.Context, data *TelemetryData)
GetMetrics() map[string]interface{}
}
TelemetryCollector interface for collecting telemetry data
type TelemetryData ¶
type TelemetryData struct {
ID string `json:"id"`
Timestamp time.Time `json:"timestamp"`
Operation string `json:"operation"`
TableName string `json:"table_name"`
Duration time.Duration `json:"duration_ms"`
RowsAffected int64 `json:"rows_affected"`
CacheHit bool `json:"cache_hit"`
ReuseEnabled bool `json:"reuse_enabled"`
ConnectionPool *ConnectionPoolStats `json:"connection_pool,omitempty"`
QueryComplexity int `json:"query_complexity"`
Error string `json:"error,omitempty"`
Metadata map[string]interface{} `json:"metadata,omitempty"`
}
TelemetryData represents performance and usage telemetry data
type ZormDBIFace ¶
type ZormDBIFace interface {
QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row
QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
}
ZormDBIFace .
type ZormTable ¶
type ZormTable struct {
DB ZormDBIFace
Name string
Cfg Config
// contains filtered or unexported fields
}
ZormTable .
func TableContext ¶
func TableContext(ctx context.Context, db ZormDBIFace, name string) *ZormTable
TableContext 创建带Context的Table,参数顺序:context, db, name
func (*ZormTable) Exec ¶
Exec executes a raw SQL statement with optional parameters Returns the number of affected rows and any error
func (*ZormTable) InsertIgnore ¶
InsertIgnore .
func (*ZormTable) NoSafeReuse ¶
NoSafeReuse 已合并进 Reuse,保持兼容
func (*ZormTable) ReplaceInto ¶
ReplaceInto .
func (*ZormTable) UseNameWhenTagEmpty ¶
UseNameWhenTagEmpty .
type ZormTx ¶
type ZormTx struct {
// contains filtered or unexported fields
}
ZormTx 事务实现
func (*ZormTx) ExecContext ¶
func (tx *ZormTx) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
ExecContext 实现 ZormDBIFace 接口
func (*ZormTx) QueryContext ¶
func (tx *ZormTx) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
QueryContext 实现 ZormDBIFace 接口
func (*ZormTx) QueryRowContext ¶
QueryRowContext 实现 ZormDBIFace 接口
type ZormTxIFace ¶
type ZormTxIFace interface {
ZormDBIFace
Commit() error
Rollback() error
}
ZormTxIFace 事务接口
func BeginContext ¶
func BeginContext(ctx context.Context, db ZormDBIFace) (ZormTxIFace, error)
BeginContext 带上下文开始事务
Directories
¶
| Path | Synopsis |
|---|---|
|
examples
|
|
|
audit_chain
command
|
|
|
auto_increment_tags
command
|
|
|
basic_select
command
|
|
|
camel_to_snake
command
|
|
|
crud_map
command
|
|
|
crud_struct
command
|
|
|
ddl_schema_management
command
|
|
|
join_query
command
|
|
|
on_conflict
command
|
|
|
raw_sql_exec
command
|
|
|
reuse
command
|
|
|
select_map
command
|
|
|
tag_formats
command
|