Add DBVersion

This commit is contained in:
Lunny Xiao 2020-06-24 21:20:55 +08:00
parent 0907b7a7fd
commit 77a4ff63c5
9 changed files with 104 additions and 9 deletions

View File

@ -44,6 +44,7 @@ type Dialect interface {
URI() *URI URI() *URI
SQLType(*schemas.Column) string SQLType(*schemas.Column) string
FormatBytes(b []byte) string FormatBytes(b []byte) string
Version(ctx context.Context, queryer core.Queryer) (string, error)
IsReserved(string) bool IsReserved(string) bool
Quoter() schemas.Quoter Quoter() schemas.Quoter

View File

@ -253,6 +253,24 @@ func (db *mssql) SetParams(params map[string]string) {
} }
} }
func (db *mssql) Version(ctx context.Context, queryer core.Queryer) (string, error) {
rows, err := queryer.QueryContext(ctx, "SELECT @@VERSION")
if err != nil {
return "", err
}
defer rows.Close()
var version string
if !rows.Next() {
return "", errors.New("Unknow version")
}
if err := rows.Scan(&version); err != nil {
return "", err
}
return version, nil
}
func (db *mssql) SQLType(c *schemas.Column) string { func (db *mssql) SQLType(c *schemas.Column) string {
var res string var res string
switch t := c.SQLType.Name; t { switch t := c.SQLType.Name; t {

View File

@ -188,6 +188,24 @@ func (db *mysql) Init(uri *URI) error {
return db.Base.Init(db, uri) return db.Base.Init(db, uri)
} }
func (db *mysql) Version(ctx context.Context, queryer core.Queryer) (string, error) {
rows, err := queryer.QueryContext(ctx, "SELECT VERSION()")
if err != nil {
return "", err
}
defer rows.Close()
var version string
if !rows.Next() {
return "", errors.New("Unknow version")
}
if err := rows.Scan(&version); err != nil {
return "", err
}
return version, nil
}
func (db *mysql) SetParams(params map[string]string) { func (db *mysql) SetParams(params map[string]string) {
rowFormat, ok := params["rowFormat"] rowFormat, ok := params["rowFormat"]
if ok { if ok {

View File

@ -515,6 +515,24 @@ func (db *oracle) Init(uri *URI) error {
return db.Base.Init(db, uri) return db.Base.Init(db, uri)
} }
func (db *oracle) Version(ctx context.Context, queryer core.Queryer) (string, error) {
rows, err := queryer.QueryContext(ctx, "select * from v$version where banner like 'Oracle%'")
if err != nil {
return "", err
}
defer rows.Close()
var version string
if !rows.Next() {
return "", errors.New("Unknow version")
}
if err := rows.Scan(&version); err != nil {
return "", err
}
return version, nil
}
func (db *oracle) SQLType(c *schemas.Column) string { func (db *oracle) SQLType(c *schemas.Column) string {
var res string var res string
switch t := c.SQLType.Name; t { switch t := c.SQLType.Name; t {

View File

@ -788,6 +788,24 @@ func (db *postgres) Init(uri *URI) error {
return db.Base.Init(db, uri) return db.Base.Init(db, uri)
} }
func (db *postgres) Version(ctx context.Context, queryer core.Queryer) (string, error) {
rows, err := queryer.QueryContext(ctx, "SELECT version()")
if err != nil {
return "", err
}
defer rows.Close()
var version string
if !rows.Next() {
return "", errors.New("Unknow version")
}
if err := rows.Scan(&version); err != nil {
return "", err
}
return version, nil
}
func (db *postgres) getSchema() string { func (db *postgres) getSchema() string {
if db.uri.Schema != "" { if db.uri.Schema != "" {
return db.uri.Schema return db.uri.Schema

View File

@ -160,6 +160,24 @@ func (db *sqlite3) Init(uri *URI) error {
return db.Base.Init(db, uri) return db.Base.Init(db, uri)
} }
func (db *sqlite3) Version(ctx context.Context, queryer core.Queryer) (string, error) {
rows, err := queryer.QueryContext(ctx, "SELECT sqlite_version()")
if err != nil {
return "", err
}
defer rows.Close()
var version string
if !rows.Next() {
return "", errors.New("Unknow version")
}
if err := rows.Scan(&version); err != nil {
return "", err
}
return version, nil
}
func (db *sqlite3) SetQuotePolicy(quotePolicy QuotePolicy) { func (db *sqlite3) SetQuotePolicy(quotePolicy QuotePolicy) {
switch quotePolicy { switch quotePolicy {
case QuotePolicyNone: case QuotePolicyNone:

View File

@ -925,15 +925,9 @@ func (engine *Engine) Having(conditions string) *Session {
return session.Having(conditions) return session.Having(conditions)
} }
// Table table struct // DBVersion returns the database version
type Table struct { func (engine *Engine) DBVersion() (string, error) {
*schemas.Table return engine.dialect.Version(engine.defaultContext, engine.db)
Name string
}
// IsValid if table is valid
func (t *Table) IsValid() bool {
return t.Table != nil && len(t.Name) > 0
} }
// TableInfo get table info according to bean's content // TableInfo get table info according to bean's content

View File

@ -200,3 +200,12 @@ func TestImport(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.NoError(t, sess.Commit()) assert.NoError(t, sess.Commit())
} }
func TestDBVersion(t *testing.T) {
assert.NoError(t, PrepareEngine())
version, err := testEngine.DBVersion()
assert.NoError(t, err)
fmt.Println(testEngine.Dialect().URI().DBType, "version", version)
}

View File

@ -79,6 +79,7 @@ type EngineInterface interface {
Before(func(interface{})) *Session Before(func(interface{})) *Session
Charset(charset string) *Session Charset(charset string) *Session
DBVersion() (string, error)
ClearCache(...interface{}) error ClearCache(...interface{}) error
Context(context.Context) *Session Context(context.Context) *Session
CreateTables(...interface{}) error CreateTables(...interface{}) error