From 044198f373ea96ccbbfc439a7e8041115b706041 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 13 Mar 2015 15:20:24 +0800 Subject: [PATCH] oracle drop table fixed --- oracle_dialect.go | 8 ++++++++ session.go | 50 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/oracle_dialect.go b/oracle_dialect.go index 5caa0b27..be71c288 100644 --- a/oracle_dialect.go +++ b/oracle_dialect.go @@ -565,10 +565,18 @@ func (db *oracle) SupportCharset() bool { return false } +func (db *oracle) SupportDropIfExists() bool { + return false +} + func (db *oracle) IndexOnTable() bool { return false } +func (db *oracle) DropTableSql(tableName string) string { + return fmt.Sprintf("DROP TABLE `%s`", tableName) +} + func (b *oracle) CreateTableSql(table *core.Table, tableName, storeEngine, charset string) string { var sql string sql = "CREATE TABLE " diff --git a/session.go b/session.go index f5dc9b89..04cd96bd 100644 --- a/session.go +++ b/session.go @@ -563,7 +563,7 @@ func (session *Session) DropIndexes(bean interface{}) error { } // DropTable drop a table and all indexes of the table -func (session *Session) DropTable(bean interface{}) error { +/*func (session *Session) DropTable(bean interface{}) error { defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -583,6 +583,30 @@ func (session *Session) DropTable(bean interface{}) error { sqlStr := session.Engine.Dialect().DropTableSql(session.Statement.TableName()) _, err := session.exec(sqlStr) return err +}*/ + +func (session *Session) DropTable(beanOrTableName interface{}) error { + tableName, err := session.Engine.tableName(beanOrTableName) + if err != nil { + return err + } + + var needDrop = true + if !session.Engine.dialect.SupportDropIfExists() { + sqlStr, args := session.Engine.dialect.TableCheckSql(tableName) + results, err := session.query(sqlStr, args...) + if err != nil { + return err + } + needDrop = len(results) > 0 + } + + if needDrop { + sqlStr := session.Engine.Dialect().DropTableSql(tableName) + _, err = session.exec(sqlStr) + return err + } + return nil } func (statement *Statement) JoinColumns(cols []*core.Column) string { @@ -1367,16 +1391,21 @@ func (session *Session) isColumnExist(tableName string, col *core.Column) (bool, //return len(results) > 0, err }*/ -func (session *Session) IsTableExist(beanOrTableName interface{}) (bool, error) { +func (engine *Engine) tableName(beanOrTableName interface{}) (string, error) { v := rValue(beanOrTableName) - var tableName string if v.Type().Kind() == reflect.String { - tableName = beanOrTableName.(string) + return beanOrTableName.(string), nil } else if v.Type().Kind() == reflect.Struct { - table := session.Engine.autoMapType(v) - tableName = table.Name - } else { - return false, errors.New("bean should be a struct or struct's point") + table := engine.autoMapType(v) + return table.Name, nil + } + return "", errors.New("bean should be a struct or struct's point") +} + +func (session *Session) IsTableExist(beanOrTableName interface{}) (bool, error) { + tableName, err := session.Engine.tableName(beanOrTableName) + if err != nil { + return false, err } return session.isTableExist(tableName) @@ -1507,9 +1536,8 @@ func (session *Session) dropAll() error { for _, table := range session.Engine.Tables { session.Statement.Init() session.Statement.RefTable = table - err := session.Engine.Dialect().MustDropTable(session.Statement.TableName()) - //sqlStr := session.Statement.genDropSQL() - //_, err := session.exec(sqlStr) + sqlStr := session.Engine.Dialect().DropTableSql(session.Statement.TableName()) + _, err := session.exec(sqlStr) if err != nil { return err }