From 34e79e0d636a6fa0ebe56f7124413a30ba9bda2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=95=86=E8=AE=AF=E5=9C=A8=E7=BA=BF?= Date: Sun, 24 Aug 2014 21:15:16 +0800 Subject: [PATCH 1/5] fix bugs https://github.com/go-xorm/cmd/issues/3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 商讯在线 --- engine.go | 4 +++- mssql_dialect.go | 2 +- mysql_dialect.go | 6 +++--- oracle_dialect.go | 2 +- postgres_dialect.go | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/engine.go b/engine.go index 51d750aa..045cef53 100644 --- a/engine.go +++ b/engine.go @@ -373,12 +373,14 @@ func (engine *Engine) DumpAll(w io.Writer) error { } else if col.SQLType.IsText() || col.SQLType.IsTime() { var v = fmt.Sprintf("%s", d) temp += ", '" + strings.Replace(v, "'", "''", -1) + "'" - } else if col.SQLType.IsBlob() /**/ { + } else if col.SQLType.IsBlob() { if reflect.TypeOf(d).Kind() == reflect.Slice { temp += fmt.Sprintf(", %s", engine.dialect.FormatBytes(d.([]byte))) } else if reflect.TypeOf(d).Kind() == reflect.String { temp += fmt.Sprintf(", '%s'", d.(string)) } + } else if col.SQLType.IsNumeric() { + temp += fmt.Sprintf(", %s", string(d.([]byte))) } else { s := fmt.Sprintf("%v", d) if strings.Contains(s, ":") || strings.Contains(s, "-") { diff --git a/mssql_dialect.go b/mssql_dialect.go index 5cd2f52b..eee50795 100644 --- a/mssql_dialect.go +++ b/mssql_dialect.go @@ -168,7 +168,7 @@ where a.object_id=object_id('` + tableName + `')` } } - if col.SQLType.IsText() { + if col.SQLType.IsText() || col.SQLType.IsTime() { if col.Default != "" { col.Default = "'" + col.Default + "'" } else { diff --git a/mysql_dialect.go b/mysql_dialect.go index 479e6347..6bebf5af 100644 --- a/mysql_dialect.go +++ b/mysql_dialect.go @@ -60,7 +60,7 @@ func (db *mysql) SqlType(c *core.Column) string { for v, _ := range c.EnumOptions { opts += fmt.Sprintf(",'%v'", v) } - res += strings.TrimLeft(opts,",") + res += strings.TrimLeft(opts, ",") res += ")" case core.Set: //mysql set res = core.Set @@ -69,7 +69,7 @@ func (db *mysql) SqlType(c *core.Column) string { for v, _ := range c.SetOptions { opts += fmt.Sprintf(",'%v'", v) } - res += strings.TrimLeft(opts,",") + res += strings.TrimLeft(opts, ",") res += ")" default: res = t @@ -223,7 +223,7 @@ func (db *mysql) GetColumns(tableName string) ([]string, map[string]*core.Column col.IsAutoIncrement = true } - if col.SQLType.IsText() { + if col.SQLType.IsText() || col.SQLType.IsTime() { if col.Default != "" { col.Default = "'" + col.Default + "'" } else { diff --git a/oracle_dialect.go b/oracle_dialect.go index e23ab297..57da2c50 100644 --- a/oracle_dialect.go +++ b/oracle_dialect.go @@ -158,7 +158,7 @@ func (db *oracle) GetColumns(tableName string) ([]string, map[string]*core.Colum col.Length = dataLen - if col.SQLType.IsText() { + if col.SQLType.IsText() || col.SQLType.IsTime() { if col.Default != "" { col.Default = "'" + col.Default + "'" } else { diff --git a/postgres_dialect.go b/postgres_dialect.go index 61d4f1e2..6819323e 100644 --- a/postgres_dialect.go +++ b/postgres_dialect.go @@ -220,7 +220,7 @@ WHERE c.relkind = 'r'::char AND c.relname = $1 AND f.attnum > 0 ORDER BY f.attnu col.Length = maxLen - if col.SQLType.IsText() { + if col.SQLType.IsText() || col.SQLType.IsTime() { if col.Default != "" { col.Default = "'" + col.Default + "'" } else { From 0fa2433cf9e2f9c306adec8ec1881faa686489bd Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 28 Aug 2014 22:48:01 +0800 Subject: [PATCH 2/5] improved Sync2 method --- engine.go | 13 ++++++++----- mysql_dialect.go | 9 +++++++-- postgres_dialect.go | 5 +++-- session.go | 3 +-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/engine.go b/engine.go index 51d750aa..cdb2b541 100644 --- a/engine.go +++ b/engine.go @@ -1116,19 +1116,22 @@ func (engine *Engine) Sync2(beans ...interface{}) error { } if oriCol != nil { - if col.SQLType.Name != oriCol.SQLType.Name { - if col.SQLType.Name == core.Text && - oriCol.SQLType.Name == core.Varchar { + expectedType := engine.dialect.SqlType(col) + //curType := oriCol.SQLType.Name + curType := engine.dialect.SqlType(oriCol) + if expectedType != curType { + if expectedType == core.Text && + curType == core.Varchar { // currently only support mysql if engine.dialect.DBType() == core.MYSQL { _, err = engine.Exec(engine.dialect.ModifyColumnSql(table.Name, col)) } else { engine.LogWarnf("Table %s Column %s db type is %s, struct type is %s\n", - table.Name, col.Name, oriCol.SQLType.Name, col.SQLType.Name) + table.Name, col.Name, curType, expectedType) } } else { engine.LogWarnf("Table %s Column %s db type is %s, struct type is %s", - table.Name, col.Name, oriCol.SQLType.Name, col.SQLType.Name) + table.Name, col.Name, curType, expectedType) } } if col.Default != oriCol.Default { diff --git a/mysql_dialect.go b/mysql_dialect.go index 479e6347..b7fdb01b 100644 --- a/mysql_dialect.go +++ b/mysql_dialect.go @@ -60,7 +60,7 @@ func (db *mysql) SqlType(c *core.Column) string { for v, _ := range c.EnumOptions { opts += fmt.Sprintf(",'%v'", v) } - res += strings.TrimLeft(opts,",") + res += strings.TrimLeft(opts, ",") res += ")" case core.Set: //mysql set res = core.Set @@ -69,7 +69,7 @@ func (db *mysql) SqlType(c *core.Column) string { for v, _ := range c.SetOptions { opts += fmt.Sprintf(",'%v'", v) } - res += strings.TrimLeft(opts,",") + res += strings.TrimLeft(opts, ",") res += ")" default: res = t @@ -78,6 +78,11 @@ func (db *mysql) SqlType(c *core.Column) string { var hasLen1 bool = (c.Length > 0) var hasLen2 bool = (c.Length2 > 0) + if res == core.BigInt && !hasLen1 && !hasLen2 { + c.Length = 20 + hasLen1 = true + } + if hasLen2 { res += "(" + strconv.Itoa(c.Length) + "," + strconv.Itoa(c.Length2) + ")" } else if hasLen1 { diff --git a/postgres_dialect.go b/postgres_dialect.go index 61d4f1e2..eec9989b 100644 --- a/postgres_dialect.go +++ b/postgres_dialect.go @@ -177,7 +177,8 @@ WHERE c.relkind = 'r'::char AND c.relname = $1 AND f.attnum > 0 ORDER BY f.attnu if err != nil { return nil, nil, err } - //fmt.Println(args,colName, isNullable, dataType,maxLenStr, colDefault, numPrecision, numRadix,isPK ,isUnique) + + //fmt.Println(args, colName, isNullable, dataType, maxLenStr, colDefault, numPrecision, numRadix, isPK, isUnique) var maxLen int if maxLenStr != nil { maxLen, err = strconv.Atoi(*maxLenStr) @@ -220,7 +221,7 @@ WHERE c.relkind = 'r'::char AND c.relname = $1 AND f.attnum > 0 ORDER BY f.attnu col.Length = maxLen - if col.SQLType.IsText() { + if col.SQLType.IsText() || col.SQLType.IsTime() { if col.Default != "" { col.Default = "'" + col.Default + "'" } else { diff --git a/session.go b/session.go index 009a758a..5d127c74 100644 --- a/session.go +++ b/session.go @@ -996,9 +996,8 @@ func (session *Session) Get(bean interface{}) (bool, error) { err = session.row2Bean(rawRows, fields, len(fields), bean) } return true, err - } else { - return false, nil } + return false, nil } // Count counts the records. bean's non-empty fields From 8fb9bd8d36ce5a47d691f5211433f30d6c8331e9 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 28 Aug 2014 23:04:28 +0800 Subject: [PATCH 3/5] bug fixed for postgres dialect --- postgres_dialect.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/postgres_dialect.go b/postgres_dialect.go index eec9989b..fcdd1fd1 100644 --- a/postgres_dialect.go +++ b/postgres_dialect.go @@ -197,6 +197,10 @@ WHERE c.relkind = 'r'::char AND c.relname = $1 AND f.attnum > 0 ORDER BY f.attnu } } + if colDefault != nil && strings.HasPrefix(*colDefault, "nextval(") { + col.IsAutoIncrement = true + } + col.Nullable = (isNullable == "YES") switch dataType { From fef024b600e0f0429c83e3e2908c0ec51c9d4b84 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 28 Aug 2014 23:13:04 +0800 Subject: [PATCH 4/5] bug fixed for sqlite3 dialect --- sqlite3_dialect.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sqlite3_dialect.go b/sqlite3_dialect.go index ddf6a5f2..e8d6cf2c 100644 --- a/sqlite3_dialect.go +++ b/sqlite3_dialect.go @@ -84,6 +84,21 @@ func (db *sqlite3) TableCheckSql(tableName string) (string, []interface{}) { return "SELECT name FROM sqlite_master WHERE type='table' and name = ?", args } +func (db *sqlite3) DropIndexSql(tableName string, index *core.Index) string { + quote := db.Quote + //var unique string + var idxName string = index.Name + if !strings.HasPrefix(idxName, "UQE_") && + !strings.HasPrefix(idxName, "IDX_") { + if index.Type == core.UniqueType { + idxName = fmt.Sprintf("UQE_%v_%v", tableName, index.Name) + } else { + idxName = fmt.Sprintf("IDX_%v_%v", tableName, index.Name) + } + } + return fmt.Sprintf("DROP INDEX %v", quote(idxName)) +} + /*func (db *sqlite3) ColumnCheckSql(tableName, colName string) (string, []interface{}) { args := []interface{}{tableName} sql := "SELECT name FROM sqlite_master WHERE type='table' and name = ? and ((sql like '%`" + colName + "`%') or (sql like '%[" + colName + "]%'))" From 05d01bf16592731f963d058bd11e260010e37399 Mon Sep 17 00:00:00 2001 From: Nash Tsai Date: Thu, 28 Aug 2014 23:13:41 +0800 Subject: [PATCH 5/5] add TODO comments --- session.go | 1 + 1 file changed, 1 insertion(+) diff --git a/session.go b/session.go index 009a758a..91037457 100644 --- a/session.go +++ b/session.go @@ -651,6 +651,7 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf if v, ok := data[session.Statement.RefTable.PrimaryKeys[0]]; !ok { return false, ErrCacheFailed } else { + // TODO https://github.com/go-xorm/xorm/issues/144, PK may not always be int64 id, err = strconv.ParseInt(string(v), 10, 64) if err != nil { return false, err