models

package
v1.127.1 Latest Latest
Warning

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

Go to latest
Published: Oct 9, 2026 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

View Source
const CatalogueFormat = "postgresql"

CatalogueFormat is the catalogue document's "catalogue" member: the database the model is rendered for.

Variables

This section is empty.

Functions

func BuildCreateContextDDL

func BuildCreateContextDDL(dbType base.DXDatabaseType, namespace string) string

BuildCreateContextDDL generates DDL to create the application context (required for Oracle) For other databases, this returns an empty string or comment

func BuildGetSessionConfigExpr

func BuildGetSessionConfigExpr(dbType base.DXDatabaseType, key string) (string, error)

BuildGetSessionConfigExpr returns the SQL expression to retrieve a session configuration value. The key is validated first to prevent SQL injection (key must be literal in view DDL). PostgreSQL: current_setting('app.key') SQL Server: SESSION_CONTEXT(N'key') Oracle: SYS_CONTEXT('APP_CTX', 'key') MariaDB/MySQL: @key

func BuildGetSessionConfigSQL

func BuildGetSessionConfigSQL(dbType base.DXDatabaseType, key string) (string, []any)

BuildGetSessionConfigSQL generates a parameterized SQL query to retrieve a session configuration value. Returns the SQL string with placeholders and the corresponding args slice. PostgreSQL: SELECT current_setting($1) SQL Server: SELECT CAST(SESSION_CONTEXT(@p1) AS NVARCHAR(MAX)) Oracle: SELECT SYS_CONTEXT(:1, :2) FROM DUAL MariaDB/MySQL: SELECT @varName (varName is derived from validated key, not user data)

func BuildSetSessionConfigSQL

func BuildSetSessionConfigSQL(dbType base.DXDatabaseType, key string, value string) (string, []any)

BuildSetSessionConfigSQL generates a parameterized SQL query to set a session-level configuration variable. Returns the SQL string with placeholders and the corresponding args slice. PostgreSQL: SELECT set_config($1, $2, false) SQL Server: EXEC sp_set_session_context @key = @p1, @value = @p2 Oracle: BEGIN DBMS_SESSION.SET_CONTEXT(:1, :2, :3); END; MariaDB/MySQL: SET @varName = ? (varName is derived from validated key, not user data)

func BuildUIDDefaultExpr

func BuildUIDDefaultExpr(dbType base.DXDatabaseType) string

BuildUIDDefaultExpr generates a databases-specific default expression for unique ID generation Format: hex(timestamp_microseconds) + uuid

func GetSessionConfig

func GetSessionConfig(db *sql.DB, dbType base.DXDatabaseType, key string) (string, error)

GetSessionConfig retrieves a session configuration value from the databases using parameterized queries This is safe from SQL injection as it validates the key and uses parameterized queries

func NormalizeFieldValueForDBType

func NormalizeFieldValueForDBType(field *ModelDBField, dbType base.DXDatabaseType, val any) any

NormalizeFieldValueForDBType converts a value into the form the column it is bound to actually stores, for the cases where that differs by engine.

Today there is exactly one such case, and it exists because MariaDB has no column type that can hold a UTC offset. DataTypeISO8601 is therefore ISO-8601 text there and a real instant type everywhere else -- see the comment on DataTypeISO8601 for why -- and text needs the value written in the layout the column's ordering depends on.

Without this the driver decides, and what it decides is a connection setting. go-sql-driver/mysql encodes a time.Time as a MySQL datetime literal, which MariaDB then coerces into the VARCHAR -- not ISO-8601, no offset, and rendered in whatever zone the DSN's `loc` names. Measured against MariaDB 11.8 with one instant, 2026-08-31T19:00:00+07:00:

loc unset (UTC)     stored "2026-08-31 12:00:00"
loc=Asia/Jakarta    stored "2026-08-31 19:00:00"
through this func   stored "2026-08-31T12:00:00.000000000Z" either way

One instant, two different strings, and nothing in the column says which rule produced it. That is the exact failure DataTypeISO8601 exists to prevent, so the DDL change and this conversion are one change; neither is correct alone. Text that is not ISO-8601 is also strictly worse than the DATETIME it replaced, which at least had date semantics.

A string that already parses as a timestamp is re-rendered rather than passed through, so a caller handing over "2026-08-31T12:00:00+07:00" gets the same instant, stored in the one layout that sorts. A string that does not parse is left exactly as it was: this function normalises, it does not validate, and swallowing an unparseable value here would hide it from the error the database is about to raise.

func SetSessionConfig

func SetSessionConfig(db *sql.DB, dbType base.DXDatabaseType, key string, value string) error

SetSessionConfig executes the SET command on a databases connection using parameterized queries This is safe from SQL injection as it validates the key and uses parameterized queries for the value

func ValidateSessionConfigKey

func ValidateSessionConfigKey(key string) error

ValidateSessionConfigKey validates that a session config key contains only safe characters Allowed: alphanumeric, dots, underscores Returns error if the key contains unsafe characters

Types

type ModelDB

type ModelDB struct {
	Name       string
	Extensions map[base.DXDatabaseType][]string // Database-specific extensions/features
	Schemas    []*ModelDBSchema
}

ModelDB represents a databases with extensions and schemas

func NewModelDB

func NewModelDB(name string, extensions map[base.DXDatabaseType][]string) *ModelDB

NewModelDB creates a new databases with optional extensions

func (*ModelDB) AddExtensions

func (d *ModelDB) AddExtensions(dbType base.DXDatabaseType, extensions ...string)

AddExtensions adds extensions for a specific databases type

func (*ModelDB) CatalogueAsJSON added in v1.126.7

func (d *ModelDB) CatalogueAsJSON(path, commit string) ([]byte, error)

CatalogueAsJSON returns the model's catalogue document. path and commit are written as the document's "path" and "commit" members, which name the source the catalogue was made from and the commit that last changed it; the model cannot know them, so the caller passes them, or "" for none.

func (*ModelDB) CreateDDL

func (d *ModelDB) CreateDDL(dbType base.DXDatabaseType) (string, error)

CreateDDL generates DDL script for the databases including extensions and all schemas

func (*ModelDB) GetExtensions

func (d *ModelDB) GetExtensions(dbType base.DXDatabaseType) []string

GetExtensions returns extensions for a specific databases type

func (*ModelDB) Init

func (d *ModelDB) Init() error

Init resolves all field References to ResolvedReferenceField pointers. Tables are processed in Order to ensure referenced tables are resolved first. Returns an error if any References string cannot be resolved.

func (*ModelDB) SetExtensions

func (d *ModelDB) SetExtensions(dbType base.DXDatabaseType, extensions []string)

SetExtensions sets extensions for a specific databases type (replaces existing)

type ModelDBAggregateType

type ModelDBAggregateType int
const (
	ModelDBAggregateCount ModelDBAggregateType = iota
	ModelDBAggregateSum
	ModelDBAggregateAvg
	ModelDBAggregateMin
	ModelDBAggregateMax
)

func (ModelDBAggregateType) String

func (a ModelDBAggregateType) String() string

type ModelDBEntity

type ModelDBEntity struct {
	Name   string
	Type   ModelDBEntityType
	Order  int
	Schema *ModelDBSchema
}

func (*ModelDBEntity) FullName

func (t *ModelDBEntity) FullName() string

FullName returns the entity name with schema prefix

type ModelDBEntityType

type ModelDBEntityType int
const (
	ModelDBEntityTypeTable ModelDBEntityType = iota
	ModelDBEntityTypeView
	ModelDBEntityTypeMaterializedView
	ModelDBEntityTypeFunction
	ModelDBEntityTypeIndex
	ModelDBEntityTypeTrigger
)

type ModelDBField

type ModelDBField struct {
	Owner                  *ModelDBTable
	Order                  int
	Type                   types.DataType
	IsPrimaryKey           bool
	IsAutoIncrement        bool
	IsNotNull              bool
	IsUnique               bool
	DefaultValue           any                         // SQL expression for DEFAULT clause (used when DefaultValueByDBType not specified)
	DefaultValueByDBType   map[base.DXDatabaseType]any // Database-specific default values. Keys: "postgresql", "sqlserver", "oracle", "mariadb"
	References             string                      // Foreign key reference in format "schema.table.field"
	ResolvedReferenceField *ModelDBField               // Resolved reference field pointer (set by NewModelDBTable)

	// for encrypted field only
	DecryptedFieldName  string
	EncryptionKeySource ModelDBKeySource // "config" (PostgreSQL current_setting), "literal", "env"
	EncryptionKeyValue  string           // e.g., "app.encryption_key" for config, or literal key value
	HashFieldName       string           // e.g., "fullname_hashed" - companion hash field name
	HashSaltKeySource   ModelDBKeySource // "config", "literal", "env"
	HashSaltKeyValue    string           // salt value or config name

	// for generated/computed columns
	IsGenerated                 bool                           // true = this column is generated/computed
	GeneratedExpression         string                         // default SQL expression (used when GeneratedExpressionByDBType not specified)
	GeneratedExpressionByDBType map[base.DXDatabaseType]string // database-specific expressions (syntax varies across engines)
	IsStored                    bool                           // true = STORED/PERSISTED, false = VIRTUAL
}

func (*ModelDBField) GetName

func (f *ModelDBField) GetName() string

type ModelDBFunction

type ModelDBFunction struct {
	ModelDBEntity
	Parameters      []ModelDBFunctionParameter
	ReturnType      string                         // Return type (e.g., "TRIGGER", "INTEGER", "TABLE", "VOID")
	ReturnTypeByDB  map[base.DXDatabaseType]string // Database-specific return type override
	Language        string                         // plpgsql, sql, etc.
	Body            string                         // Function body (between $$ and $$)
	BodyByDB        map[base.DXDatabaseType]string // Database-specific body override
	IsReplace       bool                           // CREATE OR REPLACE
	Volatility      string                         // VOLATILE, STABLE, IMMUTABLE (PostgreSQL)
	SecurityDefiner bool                           // SECURITY DEFINER vs SECURITY INVOKER
}

ModelDBFunction represents a databases function or stored procedure

func NewModelDBFunction

func NewModelDBFunction(schema *ModelDBSchema, name string, order int, returnType string, language string, body string) *ModelDBFunction

NewModelDBFunction creates a new databases function and registers it with the schema

func (*ModelDBFunction) AddParameter

func (f *ModelDBFunction) AddParameter(name string, dataType string, mode string, defaultValue string) *ModelDBFunction

AddParameter adds a parameter to the function

func (*ModelDBFunction) CreateDDL

func (f *ModelDBFunction) CreateDDL(dbType base.DXDatabaseType) (string, error)

CreateDDL generates DDL script for the function based on databases type

func (*ModelDBFunction) SetBodyByDB

func (f *ModelDBFunction) SetBodyByDB(dbType base.DXDatabaseType, body string) *ModelDBFunction

SetBodyByDB sets databases-specific function body

type ModelDBFunctionParameter

type ModelDBFunctionParameter struct {
	Name         string
	DataType     string                         // Generic type string
	DataTypeByDB map[base.DXDatabaseType]string // Database-specific type override
	Mode         string                         // IN, OUT, INOUT (default: IN)
	DefaultValue string                         // Optional default value
}

ModelDBFunctionParameter represents a function parameter

type ModelDBIndex

type ModelDBIndex struct {
	ModelDBEntity
	Columns     []ModelDBIndexColumn
	IsUnique    bool
	Method      ModelDBIndexMethod // BTREE, HASH, GIST, etc.
	Where       string             // Partial index condition (PostgreSQL)
	Include     []string           // INCLUDE columns (PostgreSQL 11+)
	Tablespace  string             // Optional tablespace
	Concurrent  bool               // CREATE INDEX CONCURRENTLY (PostgreSQL)
	IfNotExists bool               // CREATE INDEX IF NOT EXISTS

	// Owner reference - either Table or MaterializedView (set by NewDBIndex*)
	OwnerTable            *ModelDBTable
	OwnerMaterializedView *ModelDBMaterializedView
}

ModelDBIndex represents a databases index

func NewModelDBIndexForMaterializedView

func NewModelDBIndexForMaterializedView(mv *ModelDBMaterializedView, name string, order int, columns []ModelDBIndexColumn, isUnique bool) *ModelDBIndex

NewDBIndexForMaterializedView creates a new index for a materialized view

func NewModelDBIndexForTable

func NewModelDBIndexForTable(table *ModelDBTable, name string, order int, columns []ModelDBIndexColumn, isUnique bool) *ModelDBIndex

NewDBIndexForTable creates a new index for a table

func (*ModelDBIndex) CreateDDL

func (i *ModelDBIndex) CreateDDL(dbType base.DXDatabaseType) (string, error)

CreateDDL generates DDL script for the index based on databases type

func (*ModelDBIndex) GetOwnerName

func (i *ModelDBIndex) GetOwnerName() string

GetOwnerName returns the name of the table or materialized view that owns this index

func (*ModelDBIndex) SetInclude

func (i *ModelDBIndex) SetInclude(columns []string) *ModelDBIndex

SetInclude sets the INCLUDE columns

func (*ModelDBIndex) SetMethod

func (i *ModelDBIndex) SetMethod(method ModelDBIndexMethod) *ModelDBIndex

SetMethod sets the index method

func (*ModelDBIndex) SetWhere

func (i *ModelDBIndex) SetWhere(condition string) *ModelDBIndex

SetWhere sets the partial index condition

type ModelDBIndexColumn

type ModelDBIndexColumn struct {
	Name       string
	Order      string // ASC, DESC, empty for default
	NullsOrder string // NULLS FIRST, NULLS LAST, empty for default
}

ModelDBIndexColumn represents a column in the index

type ModelDBIndexMethod

type ModelDBIndexMethod string

ModelDBIndexMethod represents the index method/type

const (
	ModelDBIndexMethodBTree  ModelDBIndexMethod = "BTREE"
	ModelDBIndexMethodHash   ModelDBIndexMethod = "HASH"
	ModelDBIndexMethodGiST   ModelDBIndexMethod = "GIST"
	ModelDBIndexMethodGIN    ModelDBIndexMethod = "GIN"
	ModelDBIndexMethodSPGiST ModelDBIndexMethod = "SPGIST"
	ModelDBIndexMethodBRIN   ModelDBIndexMethod = "BRIN"
)

type ModelDBJoin

type ModelDBJoin struct {
	JoinType        ModelDBJoinType
	TargetTable     *ModelDBEntity // The table or view to join TO (changed from *ModelDBTable to support views)
	TargetAlias     string         // Optional: alias for the target table/view (e.g., "st", "st2" for multiple joins)
	FromLocalField  *ModelDBField  // ModelDBField from the source/left table
	ToTargetField   *ModelDBField  // ModelDBField from the target/right table
	TargetTableName string         // Optional: override target table name (for self-joins or subqueries)
}

ModelDBJoin represents a join between two tables or views

type ModelDBJoinByName

type ModelDBJoinByName struct {
	JoinType      ModelDBJoinType
	TargetViewRef *ModelDBViewRef // The view/table to join TO
	FromFieldExpr string          // ModelDBField expression from source (e.g., "vfe.id" or just "id")
	ToFieldExpr   string          // ModelDBField expression from target (e.g., "fee.user_role_membership_id")
	OnCondition   string          // Optional: full ON condition override (e.g., "a.id = b.id AND a.type = b.type")
}

ModelDBJoinByName represents a join using string-based table/field names Use this when joining to views or when *ModelDBField references are not available

type ModelDBJoinType

type ModelDBJoinType int
const (
	ModelDBJoinTypeInner ModelDBJoinType = iota
	ModelDBJoinTypeLeft
	ModelDBJoinTypeRight
	ModelDBJoinTypeFull
)

func (ModelDBJoinType) String

func (j ModelDBJoinType) String() string

type ModelDBKeySource

type ModelDBKeySource int
const (
	ModelDBKeySourceRaw ModelDBKeySource = iota
	ModelDBKeySourceEnv
	ModelDBKeySourceConfig
	ModelDBKeySourceDbSessionCurrentSetting
	ModelDBKeySourceSecureMemory
)

type ModelDBMaterializedView

type ModelDBMaterializedView struct {
	ModelDBEntity               // Embedded base entity (Name, Type, Order, Schema)
	UseTDE             bool     // If true, use USING tde_heap (PostgreSQL specific)
	UniqueIndexColumns []string // Columns for unique index (required for CONCURRENTLY refresh)

	// Builder pattern fields - Source table/view (use ONE of these)
	FromTable   *ModelDBTable   // Main table to select from (when using ModelDBTable)
	FromViewRef *ModelDBViewRef // Main view/table to select from (when using view reference by name)

	// Builder pattern fields - Columns and clauses
	Columns     []ModelDBViewColumn // Columns to select (for ModelDBTable fields)
	ColumnExprs []string            // Column expressions as strings (for view references)
	Joins       []ModelDBJoin       // Join clauses (for ModelDBTable)
	JoinsByName []ModelDBJoinByName // Join clauses using view/table names
	Where       string              // WHERE clause (without the "WHERE" keyword)
	GroupBy     []string            // GROUP BY columns (field names or expressions)
	Having      string              // HAVING clause (without the "HAVING" keyword)
	OrderBy     []ModelDBOrderBy    // ORDER BY clause
	Distinct    bool                // SELECT DISTINCT

	// RawSQL for complex queries (CTEs, RECURSIVE, window functions, etc.)
	// When set, bypasses builder pattern entirely
	RawSQL string

	// Indexes on this materialized view
	Indexes []*ModelDBIndex
}

ModelDBMaterializedView represents a materialized view in the databases Supports both builder pattern (for simple queries) and RawSQL (for complex queries) Low IQ Tax Code Principle: Simple queries use builder, complex queries use RawSQL

func NewModelDBMaterializedView

func NewModelDBMaterializedView(schema *ModelDBSchema, name string, fromTable *ModelDBTable, useTDE bool, uniqueIndexColumns []string) *ModelDBMaterializedView

NewModelDBMaterializedView creates a materialized view using builder pattern

func NewModelDBMaterializedViewFromViewRef

func NewModelDBMaterializedViewFromViewRef(schema *ModelDBSchema, name string, fromViewRef *ModelDBViewRef, useTDE bool, uniqueIndexColumns []string) *ModelDBMaterializedView

NewModelDBMaterializedViewFromViewRef creates a materialized view from a view reference Use this when the source is a view (not a ModelDBTable)

func NewModelDBMaterializedViewRawSQL

func NewModelDBMaterializedViewRawSQL(schema *ModelDBSchema, name string, rawSQL string, useTDE bool, uniqueIndexColumns []string) *ModelDBMaterializedView

NewModelDBMaterializedViewRawSQL creates a materialized view with raw SQL Use this for complex queries (CTEs, RECURSIVE, window functions, etc.)

func (*ModelDBMaterializedView) AddColumn

AddColumn adds a simple column from the main table

func (*ModelDBMaterializedView) AddColumnExpr

func (mv *ModelDBMaterializedView) AddColumnExpr(expr string) *ModelDBMaterializedView

AddColumnExpr adds a column expression string (for use with FromViewRef) Example: "vfe.id AS user_role_membership_id" or "COUNT(*) as total"

func (*ModelDBMaterializedView) AddColumnFromTable

func (mv *ModelDBMaterializedView) AddColumnFromTable(table *ModelDBEntity, field *ModelDBField, alias string) *ModelDBMaterializedView

AddColumnFromTable adds a column from a joined table

func (*ModelDBMaterializedView) AddExpression

func (mv *ModelDBMaterializedView) AddExpression(expr string, alias string) *ModelDBMaterializedView

AddExpression adds a raw SQL expression (like COUNT(*), SUM(amount))

func (*ModelDBMaterializedView) AddGroupBy

func (mv *ModelDBMaterializedView) AddGroupBy(columnExpr string) *ModelDBMaterializedView

AddGroupBy adds a GROUP BY column

func (*ModelDBMaterializedView) AddJoin

func (mv *ModelDBMaterializedView) AddJoin(joinType ModelDBJoinType, targetTable *ModelDBEntity, fromField *ModelDBField, toField *ModelDBField) *ModelDBMaterializedView

AddJoin adds a join to another table

func (*ModelDBMaterializedView) AddJoinByName

func (mv *ModelDBMaterializedView) AddJoinByName(joinType ModelDBJoinType, targetViewRef *ModelDBViewRef, fromFieldExpr, toFieldExpr string) *ModelDBMaterializedView

AddJoinByName adds a join to a view/table by name fromFieldExpr: field from source table (e.g., "vfe.id") toFieldExpr: field from target (e.g., "fee.user_role_membership_id")

func (*ModelDBMaterializedView) AddJoinByNameWithCondition

func (mv *ModelDBMaterializedView) AddJoinByNameWithCondition(joinType ModelDBJoinType, targetViewRef *ModelDBViewRef, onCondition string) *ModelDBMaterializedView

AddJoinByNameWithCondition adds a join with a custom ON condition onCondition: full ON condition (e.g., "a.id = b.id AND a.type = b.type")

func (*ModelDBMaterializedView) AddOrderBy

func (mv *ModelDBMaterializedView) AddOrderBy(columnExpr string, orderType ModelDBOrderByType) *ModelDBMaterializedView

AddOrderBy adds an ORDER BY column

func (*ModelDBMaterializedView) CreateDDL

func (mv *ModelDBMaterializedView) CreateDDL(dbType base.DXDatabaseType) (string, error)

CreateDDL generates the CREATE MATERIALIZED VIEW DDL statement

func (*ModelDBMaterializedView) DropDDL

func (mv *ModelDBMaterializedView) DropDDL(dbType base.DXDatabaseType) string

DropDDL generates the DROP MATERIALIZED VIEW DDL statement

func (*ModelDBMaterializedView) FullMaterializedViewName

func (mv *ModelDBMaterializedView) FullMaterializedViewName() string

FullMaterializedViewName returns the materialized view name with schema prefix

func (*ModelDBMaterializedView) RefreshDDL

func (mv *ModelDBMaterializedView) RefreshDDL(dbType base.DXDatabaseType, concurrently bool) (string, error)

RefreshDDL generates the REFRESH MATERIALIZED VIEW DDL statement

func (*ModelDBMaterializedView) SetDistinct

func (mv *ModelDBMaterializedView) SetDistinct(distinct bool) *ModelDBMaterializedView

SetDistinct enables SELECT DISTINCT

func (*ModelDBMaterializedView) SetHaving

SetHaving sets the HAVING clause

func (*ModelDBMaterializedView) SetOrder

SetOrder sets the view Order (for global view creation ordering)

func (*ModelDBMaterializedView) SetWhere

SetWhere sets the WHERE clause

type ModelDBOrderBy

type ModelDBOrderBy struct {
	ColumnExpr  string // Can be field name or expression like "COUNT(*)"
	OrderByType ModelDBOrderByType
}

type ModelDBOrderByType

type ModelDBOrderByType int
const (
	ModelDBOrderByTypeAsc ModelDBOrderByType = iota
	ModelDBOrderByTypeDesc
)

func (ModelDBOrderByType) String

func (o ModelDBOrderByType) String() string

type ModelDBSchema

type ModelDBSchema struct {
	Name              string
	Order             int
	DB                *ModelDB
	Functions         []*ModelDBFunction
	Tables            []*ModelDBTable
	Views             []*ModelDBView
	MaterializedViews []*ModelDBMaterializedView
	Triggers          []*ModelDBTrigger // Pointer list to all triggers in this schema (owned by tables)
}

func NewModelDBSchema

func NewModelDBSchema(db *ModelDB, name string, order int) *ModelDBSchema

NewModelDBSchema creates a new databases schema and registers it with the ModelDB

func (*ModelDBSchema) CreateDDL

func (s *ModelDBSchema) CreateDDL(dbType base.DXDatabaseType) (string, error)

CreateDDL generates DDL script for the schema and all its entities Order: function -> table -> (index table) -> trigger table -> view -> materialized view -> index materialized view

type ModelDBTDEConfig

type ModelDBTDEConfig struct {
	// PostgreSQL: Table access method name for TDE (e.g., "tde_heap")
	ModelDBPostgreSQLAccessMethod string

	// Oracle: Encrypted tablespace name where the table will be created
	OracleTablespace string

	// SQLServer: Flag indicating that databases-level TDE should be enabled
	// No per-table syntax is needed; this is for documentation/validation purposes
	SQLServerTDEEnabled bool

	// MariaDB: Encryption option for InnoDB tables ('Y' for enabled, 'N' or empty for disabled)
	MariaDBEncryption string
}

ModelDBTDEConfig holds Transparent Data Encryption configuration for different databases types Each databases has different TDE approaches: - PostgreSQL: Uses table access method (e.g., "tde_heap" with pg_tde extension) - Oracle: Uses encrypted tablespace (tables created in pre-configured encrypted tablespace) - SQL Server: Database-level TDE (no per-table syntax, just a marker that TDE is expected) - MariaDB/MySQL: Uses InnoDB table encryption option (ENCRYPTION='Y')

func (ModelDBTDEConfig) IsEnabled

func (t ModelDBTDEConfig) IsEnabled(dbType base.DXDatabaseType) bool

IsEnabled checks if TDE is configured for the specified databases type key

type ModelDBTable

type ModelDBTable struct {
	ModelDBEntity
	Fields            map[string]*ModelDBField
	TDE               ModelDBTDEConfig // Database-specific TDE configuration
	UseTableSuffix    bool
	PhysicalTableName string
	Indexes           []*ModelDBIndex   // Indexes on this table
	Triggers          []*ModelDBTrigger // Triggers on this table
}

func NewModelDBTable

func NewModelDBTable(schema *ModelDBSchema, name string, order int, fields map[string]*ModelDBField, tde ModelDBTDEConfig) *ModelDBTable

NewModelDBTable creates a new databases table and registers it with the schema. Note: ModelDBField References are resolved lazily by ModelDB.Init() using the Order field.

func (*ModelDBTable) CreateDDL

func (t *ModelDBTable) CreateDDL(dbType base.DXDatabaseType) (string, error)

CreateDDL generates a DDL script for the table based on databases type

func (*ModelDBTable) Delete

func (t *ModelDBTable) Delete(db *sql.DB, where string, args ...any) error

func (*ModelDBTable) FullTableName

func (t *ModelDBTable) FullTableName() string

FullTableName returns the table name with schema prefix if schema is set

func (*ModelDBTable) Insert

func (t *ModelDBTable) Insert(db *sql.DB, dbType base.DXDatabaseType, data utils.JSON) error

Insert inserts a new row into the table

func (*ModelDBTable) SelectMany

func (t *ModelDBTable) SelectMany(db *sql.DB, dbType base.DXDatabaseType, where string, args ...any) ([]utils.JSON, error)

SelectMany selects multiple rows from the table

func (*ModelDBTable) SelectOne

func (t *ModelDBTable) SelectOne(db *sql.DB, dbType base.DXDatabaseType, where string, args ...any) (utils.JSON, error)

SelectOne selects a single row from the table

func (*ModelDBTable) TableName

func (t *ModelDBTable) TableName() string

TableName returns the physical table name (without a schema prefix)

func (*ModelDBTable) Update

func (t *ModelDBTable) Update(db *sql.DB, dbType base.DXDatabaseType, data utils.JSON, where string, whereArgs ...any) error

Update updates existing rows in the table

type ModelDBTrigger

type ModelDBTrigger struct {
	ModelDBEntity
	Timing              ModelDBTriggerTiming
	Events              []ModelDBTriggerEvent // INSERT, UPDATE, DELETE, TRUNCATE
	UpdateColumns       []string              // Columns for UPDATE OF (optional)
	Scope               ModelDBTriggerScope   // FOR EACH ROW or FOR EACH STATEMENT
	When                string                // WHEN condition (optional)
	ExecuteFunction     *ModelDBFunction      // Reference to the function to execute
	ExecuteFunctionName string                // Or just the function name if not using ModelDBFunction reference
	IsConstraint        bool                  // Constraint trigger (PostgreSQL)
	Deferrable          bool                  // DEFERRABLE (constraint triggers)
	InitiallyDeferred   bool                  // INITIALLY DEFERRED (constraint triggers)

	// Owner reference - the table this trigger is on
	OwnerTable *ModelDBTable
}

ModelDBTrigger represents a databases trigger

func NewModelDBTrigger

func NewModelDBTrigger(table *ModelDBTable, name string, order int, timing ModelDBTriggerTiming, events []ModelDBTriggerEvent, scope ModelDBTriggerScope, executeFunctionName string) *ModelDBTrigger

NewModelDBTrigger creates a new trigger for a table

func (*ModelDBTrigger) CreateDDL

func (t *ModelDBTrigger) CreateDDL(dbType base.DXDatabaseType) (string, error)

CreateDDL generates DDL script for the trigger based on databases type

func (*ModelDBTrigger) GetOwnerName

func (t *ModelDBTrigger) GetOwnerName() string

GetOwnerName returns the name of the table that owns this trigger

func (*ModelDBTrigger) SetExecuteFunction

func (t *ModelDBTrigger) SetExecuteFunction(fn *ModelDBFunction) *ModelDBTrigger

SetExecuteFunction sets the function reference

func (*ModelDBTrigger) SetUpdateColumns

func (t *ModelDBTrigger) SetUpdateColumns(columns []string) *ModelDBTrigger

SetUpdateColumns sets the columns for UPDATE OF

func (*ModelDBTrigger) SetWhen

func (t *ModelDBTrigger) SetWhen(condition string) *ModelDBTrigger

SetWhen sets the WHEN condition

type ModelDBTriggerEvent

type ModelDBTriggerEvent string

ModelDBTriggerEvent represents the event that fires the trigger

const (
	ModelDBTriggerEventInsert   ModelDBTriggerEvent = "INSERT"
	ModelDBTriggerEventUpdate   ModelDBTriggerEvent = "UPDATE"
	ModelDBTriggerEventDelete   ModelDBTriggerEvent = "DELETE"
	ModelDBTriggerEventTruncate ModelDBTriggerEvent = "TRUNCATE"
)

type ModelDBTriggerScope

type ModelDBTriggerScope string

DBTriggerScope represents the trigger scope

const (
	ModelDBTriggerScopeRow       ModelDBTriggerScope = "FOR EACH ROW"
	ModelDBTriggerScopeStatement ModelDBTriggerScope = "FOR EACH STATEMENT"
)

type ModelDBTriggerTiming

type ModelDBTriggerTiming string

ModelDBTriggerTiming represents when the trigger fires

const (
	ModelDBTriggerTimingBefore    ModelDBTriggerTiming = "BEFORE"
	ModelDBTriggerTimingAfter     ModelDBTriggerTiming = "AFTER"
	ModelDBTriggerTimingInsteadOf ModelDBTriggerTiming = "INSTEAD OF"
)

type ModelDBView

type ModelDBView struct {
	ModelDBEntity                                          // Embedded base entity (Name, Type, Order, Schema)
	FromTable       *ModelDBTable                          // Main table to select from
	Columns         []ModelDBViewColumn                    // Columns to select
	Joins           []ModelDBJoin                          // Join clauses
	Where           string                                 // WHERE clause (without the "WHERE" keyword)
	GroupBy         []string                               // GROUP BY columns (field names or expressions)
	Having          string                                 // HAVING clause (without the "HAVING" keyword)
	OrderBy         []ModelDBOrderBy                       // ORDER BY clause
	Distinct        bool                                   // SELECT DISTINCT
	RawSQL          string                                 // Raw SQL for complex views (bypasses builder when set)
	RawSQLFunc      func(base.DXDatabaseType) string       // DB-specific raw SQL generator (overrides RawSQL and builder when set)
	ViewBuilderFunc func(base.DXDatabaseType) *ModelDBView // DB-specific structured view builder (overrides builder when set)
}

func NewModelDBView

func NewModelDBView(schema *ModelDBSchema, name string, fromTable *ModelDBTable) *ModelDBView

NewDBView creates a new databases view and registers it with the schema

func NewModelDBViewBuilderFunc

func NewModelDBViewBuilderFunc(schema *ModelDBSchema, name string, fn func(base.DXDatabaseType) *ModelDBView) *ModelDBView

NewModelDBViewBuilderFunc creates a view whose structure is built per DB type using the structured ModelDBView builder. Use this for views that need DB-specific expressions (e.g. array aggregation) but want to keep the structured style.

func NewModelDBViewRawSQL

func NewModelDBViewRawSQL(schema *ModelDBSchema, name string, rawSQL string) *ModelDBView

NewDBViewRawSQL creates a databases view with raw SQL definition Use this for complex views that are difficult to express with the builder pattern

func NewModelDBViewRawSQLFunc

func NewModelDBViewRawSQLFunc(schema *ModelDBSchema, name string, fn func(base.DXDatabaseType) string) *ModelDBView

NewModelDBViewRawSQLFunc creates a view whose body SQL is generated per DB type. Use this for views that use DB-specific syntax (array aggregation, string aggregation, etc.).

func (*ModelDBView) AddColumn

func (v *ModelDBView) AddColumn(field *ModelDBField, alias string) *ModelDBView

AddColumn adds a simple column from the main table

func (*ModelDBView) AddColumnFromTable

func (v *ModelDBView) AddColumnFromTable(table *ModelDBEntity, field *ModelDBField, alias string) *ModelDBView

AddColumnFromTable adds a column from a joined table

func (*ModelDBView) AddDecryptedColumn

func (v *ModelDBView) AddDecryptedColumn(encryptedColumn string, alias string, keyConfigName string) *ModelDBView

AddDecryptedColumn adds a column that decrypts an encrypted physical column. encryptedColumn: the physical column name (e.g., "fullname_encrypted") alias: the name to expose in the view (e.g., "fullname") keyConfigName: the session config key for the encryption key (e.g., "app.encryption_key")

func (*ModelDBView) AddExpression

func (v *ModelDBView) AddExpression(expr string, alias string) *ModelDBView

AddExpression adds a raw SQL expression (like COUNT(*), SUM(amount))

func (*ModelDBView) AddGroupBy

func (v *ModelDBView) AddGroupBy(columnExpr string) *ModelDBView

AddGroupBy adds a GROUP BY column

func (*ModelDBView) AddJoin

func (v *ModelDBView) AddJoin(joinType ModelDBJoinType, targetTable *ModelDBEntity, fromField *ModelDBField, toField *ModelDBField) *ModelDBView

AddJoin adds a join to another table

func (*ModelDBView) AddOrderBy

func (v *ModelDBView) AddOrderBy(columnExpr string, orderType ModelDBOrderByType) *ModelDBView

AddOrderBy adds an ORDER BY column

func (*ModelDBView) CreateDDL

func (v *ModelDBView) CreateDDL(dbType base.DXDatabaseType) (string, error)

CreateDDL generates the CREATE VIEW DDL statement

func (*ModelDBView) CreateOrReplaceDDL

func (v *ModelDBView) CreateOrReplaceDDL(dbType base.DXDatabaseType) (string, error)

CreateOrReplaceDDL generates CREATE OR REPLACE VIEW (where supported)

func (*ModelDBView) DropDDL

func (v *ModelDBView) DropDDL(dbType base.DXDatabaseType) string

DropDDL generates the DROP VIEW DDL statement

func (*ModelDBView) FullViewName

func (v *ModelDBView) FullViewName() string

FullViewName returns the view name with a schema prefix

func (*ModelDBView) SetDistinct

func (v *ModelDBView) SetDistinct(distinct bool) *ModelDBView

SetDistinct enables SELECT DISTINCT

func (*ModelDBView) SetHaving

func (v *ModelDBView) SetHaving(having string) *ModelDBView

SetHaving sets the HAVING clause

func (*ModelDBView) SetOrder

func (v *ModelDBView) SetOrder(order int) *ModelDBView

SetOrder sets the view Order (for global view creation ordering)

func (*ModelDBView) SetWhere

func (v *ModelDBView) SetWhere(where string) *ModelDBView

SetWhere sets the WHERE clause

type ModelDBViewColumn

type ModelDBViewColumn struct {
	SourceTable *ModelDBEntity // Which table this column comes from (nil = from main table)
	SourceField *ModelDBField  // The field reference (nil if using Expression)
	Expression  string         // Raw SQL expression like "COUNT(*)", "SUM(amount)", etc.
	Alias       string         // AS alias_name (required if Expression is used)
}

DBViewColumn represents a column in the SELECT clause

type ModelDBViewRef

type ModelDBViewRef struct {
	Schema *ModelDBSchema // Schema pointer (e.g., PartnerManagementSchema)
	Name   string         // View/table name (e.g., "v_field_executor")
	Alias  string         // Optional alias for use in queries (e.g., "vfe")
}

DBViewRef represents a reference to a view or table by name (for use in FROM/JOIN) Use this when you need to reference a view or table that is not defined as ModelDBTable

func NewModelDBViewRef

func NewModelDBViewRef(schema *ModelDBSchema, name, alias string) *ModelDBViewRef

NewDBViewRef creates a new view reference using schema pointer and name string Use this when the view/table is not defined as a Go variable

func NewModelDBViewRefFromTable

func NewModelDBViewRefFromTable(table *ModelDBTable, alias string) *ModelDBViewRef

NewDBViewRefFromTable creates a view reference from an existing ModelDBTable Use this when referencing a table that is defined as *ModelDBTable in Go

func NewModelDBViewRefFromView

func NewModelDBViewRefFromView(view *ModelDBView, alias string) *ModelDBViewRef

NewDBViewRefFromView creates a view reference from an existing ModelDBView Use this when referencing a view that is defined as *ModelDBView in Go

func (*ModelDBViewRef) FullName

func (v *ModelDBViewRef) FullName() string

FullName returns schema.name

func (*ModelDBViewRef) RefName

func (v *ModelDBViewRef) RefName() string

RefName returns the alias if set, otherwise the full name (for use in SELECT/JOIN ON)

Jump to

Keyboard shortcuts

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