Преглед на файлове

Merge pull request #12 from giter/master

对于oracle_dialect的一些修正;
xormplus преди 8 години
родител
ревизия
00a5832d01
променени са 3 файла, в които са добавени 86 реда и са изтрити 12 реда
  1. 66 0
      dialect_oracle.go
  2. 15 7
      session_schema.go
  3. 5 5
      statement.go

+ 66 - 0
dialect_oracle.go

@@ -5,8 +5,11 @@
 package xorm
 
 import (
+	"crypto/md5"
+	"encoding/base64"
 	"errors"
 	"fmt"
+	"io"
 	"regexp"
 	"strconv"
 	"strings"
@@ -850,6 +853,69 @@ func (db *oracle) GetIndexes(tableName string) (map[string]*core.Index, error) {
 	return indexes, nil
 }
 
+func oracle_hash(str string) string {
+
+	if len(str) > 26 {
+		h := md5.New()
+		io.WriteString(h, str)
+		return base64.StdEncoding.EncodeToString(h.Sum(nil))
+	}
+
+	return str
+}
+
+func oracle_index_name(index *core.Index, tableName string) string {
+
+	if !strings.HasPrefix(index.Name, "UQE_") &&
+		!strings.HasPrefix(index.Name, "IDX_") {
+
+		name := oracle_hash(fmt.Sprintf("%v_%v", tableName, index.Name))
+
+		if index.Type == core.UniqueType {
+			return fmt.Sprintf("UQE_%v", name)
+		}
+
+		return fmt.Sprintf("IDX_%v", name)
+	}
+
+	return index.Name
+}
+
+func (db *oracle) CreateIndexSql(tableName string, index *core.Index) string {
+
+	quote := db.Quote
+	var unique string
+	var idxName string
+
+	if index.Type == core.UniqueType {
+		unique = " UNIQUE"
+	}
+
+	idxName = oracle_index_name(index, tableName)
+
+	return fmt.Sprintf("CREATE%s INDEX %v ON %v (%v)", unique,
+		quote(idxName), quote(tableName),
+		quote(strings.Join(index.Cols, quote(","))))
+}
+
+func (db *oracle) DropIndexSql(tableName string, index *core.Index) string {
+
+	if strings.HasPrefix(index.Name, "SYS_") {
+		return ""
+	}
+
+	quote := db.Quote
+	var name string
+
+	if index.IsRegular {
+		name = oracle_index_name(index, tableName)
+	} else {
+		name = index.Name
+	}
+
+	return fmt.Sprintf("DROP INDEX %v", quote(name))
+}
+
 func (db *oracle) Filters() []core.Filter {
 	return []core.Filter{&core.QuoteFilter{}, &core.SeqFilter{Prefix: ":", Start: 1}, &core.IdFilter{}}
 }

+ 15 - 7
session_schema.go

@@ -371,12 +371,16 @@ func (session *Session) Sync2(beans ...interface{}) error {
 
 				if oriIndex != nil {
 					if oriIndex.Type != index.Type {
+
 						sql := engine.dialect.DropIndexSql(tbName, oriIndex)
-						_, err = session.exec(sql)
-						if err != nil {
-							return err
+
+						if sql != "" {
+							_, err = session.exec(sql)
+							if err != nil {
+								return err
+							}
+							oriIndex = nil
 						}
-						oriIndex = nil
 					}
 				}
 
@@ -387,10 +391,14 @@ func (session *Session) Sync2(beans ...interface{}) error {
 
 			for name2, index2 := range oriTable.Indexes {
 				if _, ok := foundIndexNames[name2]; !ok {
+
 					sql := engine.dialect.DropIndexSql(tbName, index2)
-					_, err = session.exec(sql)
-					if err != nil {
-						return err
+
+					if sql != "" {
+						_, err = session.exec(sql)
+						if err != nil {
+							return err
+						}
 					}
 				}
 			}

+ 5 - 5
statement.go

@@ -859,12 +859,12 @@ func (statement *Statement) genCreateTableSQL() string {
 func (statement *Statement) genIndexSQL() []string {
 	var sqls []string
 	tbName := statement.TableName()
-	quote := statement.Engine.Quote
-	for idxName, index := range statement.RefTable.Indexes {
+	for _, index := range statement.RefTable.Indexes {
 		if index.Type == core.IndexType {
-			sql := fmt.Sprintf("CREATE INDEX %v ON %v (%v);", quote(indexName(tbName, idxName)),
-				quote(tbName), quote(strings.Join(index.Cols, quote(","))))
-			sqls = append(sqls, sql)
+			sql := statement.Engine.dialect.CreateIndexSql(tbName, index)
+			if sql != "" {
+				sqls = append(sqls, sql)
+			}
 		}
 	}
 	return sqls