oci8 support

This commit is contained in:
Lunny Xiao 2015-03-12 17:21:02 +08:00
parent 4d5681caf8
commit 479deaff02
2 changed files with 30 additions and 17 deletions

View File

@ -571,7 +571,7 @@ func (db *oracle) IndexOnTable() bool {
func (b *oracle) CreateTableSql(table *core.Table, tableName, storeEngine, charset string) string { func (b *oracle) CreateTableSql(table *core.Table, tableName, storeEngine, charset string) string {
var sql string var sql string
sql = "CREATE TABLE IF NOT EXISTS " sql = "CREATE TABLE "
if tableName == "" { if tableName == "" {
tableName = table.Name tableName = table.Name
} }
@ -609,18 +609,17 @@ func (b *oracle) CreateTableSql(table *core.Table, tableName, storeEngine, chars
sql += " DEFAULT CHARSET " + charset sql += " DEFAULT CHARSET " + charset
} }
} }
sql += ";"
return sql return sql
} }
func (db *oracle) IndexCheckSql(tableName, idxName string) (string, []interface{}) { func (db *oracle) IndexCheckSql(tableName, idxName string) (string, []interface{}) {
args := []interface{}{strings.ToUpper(tableName), strings.ToUpper(idxName)} args := []interface{}{tableName, idxName}
return `SELECT INDEX_NAME FROM USER_INDEXES ` + return `SELECT INDEX_NAME FROM USER_INDEXES ` +
`WHERE TABLE_NAME = ? AND INDEX_NAME = ?`, args `WHERE TABLE_NAME = :1 AND INDEX_NAME = :2`, args
} }
func (db *oracle) TableCheckSql(tableName string) (string, []interface{}) { func (db *oracle) TableCheckSql(tableName string) (string, []interface{}) {
args := []interface{}{strings.ToUpper(tableName)} args := []interface{}{tableName}
return `SELECT table_name FROM user_tables WHERE table_name = :1`, args return `SELECT table_name FROM user_tables WHERE table_name = :1`, args
} }
@ -640,7 +639,7 @@ func (db *oracle) MustDropTable(tableName string) error {
return nil return nil
} }
sql = "Drop Table \"" + tableName + "\";" sql = "Drop Table \"" + tableName + "\""
if db.Logger != nil { if db.Logger != nil {
db.Logger.Info("[sql]", sql) db.Logger.Info("[sql]", sql)
} }
@ -655,9 +654,9 @@ func (db *oracle) MustDropTable(tableName string) error {
}*/ }*/
func (db *oracle) IsColumnExist(tableName string, col *core.Column) (bool, error) { func (db *oracle) IsColumnExist(tableName string, col *core.Column) (bool, error) {
args := []interface{}{strings.ToUpper(tableName), strings.ToUpper(col.Name)} args := []interface{}{tableName, col.Name}
query := "SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = ?" + query := "SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = :1" +
" AND column_name = ?" " AND column_name = :2"
rows, err := db.DB().Query(query, args...) rows, err := db.DB().Query(query, args...)
if db.Logger != nil { if db.Logger != nil {
db.Logger.Info("[sql]", query, args) db.Logger.Info("[sql]", query, args)
@ -674,7 +673,7 @@ func (db *oracle) IsColumnExist(tableName string, col *core.Column) (bool, error
} }
func (db *oracle) GetColumns(tableName string) ([]string, map[string]*core.Column, error) { func (db *oracle) GetColumns(tableName string) ([]string, map[string]*core.Column, error) {
args := []interface{}{strings.ToUpper(tableName)} args := []interface{}{tableName}
s := "SELECT column_name,data_default,data_type,data_length,data_precision,data_scale," + s := "SELECT column_name,data_default,data_type,data_length,data_precision,data_scale," +
"nullable FROM USER_TAB_COLUMNS WHERE table_name = :1" "nullable FROM USER_TAB_COLUMNS WHERE table_name = :1"
@ -716,13 +715,27 @@ func (db *oracle) GetColumns(tableName string) ([]string, map[string]*core.Colum
var ignore bool var ignore bool
switch *dataType { var dt string
var len1, len2 int
dts := strings.Split(*dataType, "(")
dt = dts[0]
if len(dts) > 1 {
lens := strings.Split(dts[1][:len(dts[1])-1], ",")
if len(lens) > 1 {
len1, _ = strconv.Atoi(lens[0])
len2, _ = strconv.Atoi(lens[1])
} else {
len1, _ = strconv.Atoi(lens[0])
}
}
switch dt {
case "VARCHAR2": case "VARCHAR2":
col.SQLType = core.SQLType{core.Varchar, 0, 0} col.SQLType = core.SQLType{core.Varchar, len1, len2}
case "TIMESTAMP WITH TIME ZONE": case "TIMESTAMP WITH TIME ZONE":
col.SQLType = core.SQLType{core.TimeStampz, 0, 0} col.SQLType = core.SQLType{core.TimeStampz, 0, 0}
case "NUMBER": case "NUMBER":
col.SQLType = core.SQLType{core.Double, 0, 0} col.SQLType = core.SQLType{core.Double, len1, len2}
case "LONG", "LONG RAW": case "LONG", "LONG RAW":
col.SQLType = core.SQLType{core.Text, 0, 0} col.SQLType = core.SQLType{core.Text, 0, 0}
case "RAW": case "RAW":
@ -732,15 +745,15 @@ func (db *oracle) GetColumns(tableName string) ([]string, map[string]*core.Colum
case "AQ$_SUBSCRIBERS": case "AQ$_SUBSCRIBERS":
ignore = true ignore = true
default: default:
col.SQLType = core.SQLType{strings.ToUpper(*dataType), 0, 0} col.SQLType = core.SQLType{strings.ToUpper(dt), len1, len2}
} }
//fmt.Println(tableName, ":", col.Name)
if ignore { if ignore {
continue continue
} }
if _, ok := core.SqlTypes[col.SQLType.Name]; !ok { if _, ok := core.SqlTypes[col.SQLType.Name]; !ok {
return nil, nil, errors.New(fmt.Sprintf("unkonw colType %v", *dataType)) return nil, nil, errors.New(fmt.Sprintf("unkonw colType %v %v", *dataType, col.SQLType))
} }
col.Length = dataLen col.Length = dataLen

View File

@ -1185,7 +1185,7 @@ func (statement *Statement) genCountSql(bean interface{}) (string, []interface{}
id = "" id = ""
} }
statement.attachInSql() statement.attachInSql()
return statement.genSelectSql(fmt.Sprintf("count(%v) AS %v", id, statement.Engine.Quote("total"))), append(statement.Params, statement.BeanArgs...) return statement.genSelectSql(fmt.Sprintf("count(%v)", id)), append(statement.Params, statement.BeanArgs...)
} }
func (statement *Statement) genSelectSql(columnStr string) (a string) { func (statement *Statement) genSelectSql(columnStr string) (a string) {