1
0
mirror of https://github.com/ManyakRus/crud_generator.git synced 2024-12-22 00:36:41 +02:00
crud_generator/vendor/github.com/jimsmart/schema/dialect_mssql.go

134 lines
2.8 KiB
Go
Raw Normal View History

2023-10-24 17:03:04 +02:00
package schema
import (
"database/sql"
)
const mssqlAllColumns = `SELECT * FROM %s WHERE 1=0`
// TODO(js) Should we be filtering out system tables, like we currently do?
// See https://stackoverflow.com/questions/8774928/how-to-exclude-system-table-when-querying-sys-tables
const mssqlTableNamesWithSchema = `
SELECT
schema_name(t.schema_id),
t.name
FROM
sys.tables t
INNER JOIN
sys.schemas s
ON s.schema_id = t.schema_id
LEFT JOIN
sys.extended_properties ep
ON ep.major_id = t.[object_id]
WHERE
t.is_ms_shipped = 0 AND
(ep.class_desc IS NULL OR (ep.class_desc <> 'OBJECT_OR_COLUMN' AND
ep.[name] <> 'microsoft_database_tools_support'))
ORDER BY
schema_name(t.schema_id),
t.name
`
const mssqlViewNamesWithSchema = `
SELECT
schema_name(t.schema_id),
t.name
FROM
sys.views t
INNER JOIN
sys.schemas s
ON s.schema_id = t.schema_id
LEFT JOIN
sys.extended_properties ep
ON ep.major_id = t.[object_id]
WHERE
t.is_ms_shipped = 0 AND
(ep.class_desc IS NULL OR (ep.class_desc <> 'OBJECT_OR_COLUMN' AND
ep.[name] <> 'microsoft_database_tools_support'))
ORDER BY
schema_name(t.schema_id),
t.name
`
const mssqlPrimaryKey = `
SELECT
tc.name
FROM
sys.schemas s
INNER JOIN
sys.tables t
ON s.schema_id = t.schema_id
INNER JOIN
sys.indexes i
ON t.object_id = i.object_id
INNER JOIN
sys.index_columns ic
ON i.object_id = ic.object_id AND
i.index_id = ic.index_id
INNER JOIN
sys.columns tc
ON ic.object_id = tc.object_id AND
ic.column_id = tc.column_id
WHERE
i.is_primary_key = 1 AND
s.schema_id = SCHEMA_ID() AND
t.name = ?
ORDER BY
ic.key_ordinal
`
const mssqlPrimaryKeyWithSchema = `
SELECT
tc.name
FROM
sys.schemas s
INNER JOIN
sys.tables t
ON s.schema_id = t.schema_id
INNER JOIN
sys.indexes i
ON t.object_id = i.object_id
INNER JOIN
sys.index_columns ic
ON i.object_id = ic.object_id AND
i.index_id = ic.index_id
INNER JOIN
sys.columns tc
ON ic.object_id = tc.object_id AND
ic.column_id = tc.column_id
WHERE
i.is_primary_key = 1 AND
s.schema_id = SCHEMA_ID(?) AND
t.name = ?
ORDER BY
ic.key_ordinal
`
type mssqlDialect struct{}
func (mssqlDialect) escapeIdent(ident string) string {
// [tablename]
return escapeWithBrackets(ident)
}
func (d mssqlDialect) ColumnTypes(db *sql.DB, schema, name string) ([]*sql.ColumnType, error) {
return fetchColumnTypes(db, mssqlAllColumns, schema, name, d.escapeIdent)
}
func (mssqlDialect) PrimaryKey(db *sql.DB, schema, name string) ([]string, error) {
if schema == "" {
return fetchNames(db, mssqlPrimaryKey, "", name)
}
return fetchNames(db, mssqlPrimaryKeyWithSchema, schema, name)
}
func (mssqlDialect) TableNames(db *sql.DB) ([][2]string, error) {
return fetchObjectNames(db, mssqlTableNamesWithSchema)
}
func (mssqlDialect) ViewNames(db *sql.DB) ([][2]string, error) {
return fetchObjectNames(db, mssqlViewNamesWithSchema)
}