package tdb import ( "bytes" "errors" "fmt" "git.keganmyers.com/terribleplan/tdb/stringy" ) var nullishValues [][]byte = [][]byte{ []byte(stringy.LiteralUintToString(uint64(0))), []byte(stringy.LiteralIntToString(int64(0))), []byte(""), []byte("nil"), []byte(""), } type notNullConstraint struct { table *table field dbField } func newNotNullConstraint(table *table, field dbField) (constraintish, error) { if table == nil { return nil, errors.New("[constraint.notnull] unable to create not-null without table") } return ¬NullConstraint{ table: table, field: field, }, nil } func (c *notNullConstraint) validateRaw(tx *Tx, foreignKey []byte) error { for _, nullishValue := range nullishValues { if bytes.Equal(nullishValue, foreignKey) { c.table.debugLogf("[constraint.notnull.validateRaw] violation: '%s'.'%s' is null-ish value '%s'", c.table.name, c.field.Name, nullishValue) return fmt.Errorf("[constraint.notnull.validateRaw] violation: '%s'.'%s' is null-ish value '%s'", c.table.name, c.field.Name, nullishValue) } } return nil } func (c *notNullConstraint) validate(tx *Tx, pv dbPtrValue) error { c.table.debugLogf("[constraint.notnull.validate] validating not-null for '%s'.'%s'", c.table.name, c.field.Name) if pv.dangerous_Field(c.field).IsZero() { c.table.debugLogf("[constraint.notnull.validate] violation: '%s'.'%s' is zero value", c.table.name, c.field.Name) return fmt.Errorf("[constraint.notnull.validate] violation: '%s'.'%s' is zero value", c.table.name, c.field.Name) } return nil }