Add README and fix some lints #2079
|
@ -0,0 +1,24 @@
|
||||||
|
linters:
|
||||||
|
enable:
|
||||||
|
- gosimple
|
||||||
|
- deadcode
|
||||||
|
- typecheck
|
||||||
|
- govet
|
||||||
|
- errcheck
|
||||||
|
- staticcheck
|
||||||
|
- unused
|
||||||
|
- structcheck
|
||||||
|
- varcheck
|
||||||
|
- dupl
|
||||||
|
#- gocyclo # The cyclomatic complexety of a lot of functions is too high, we should refactor those another time.
|
||||||
|
- gofmt
|
||||||
|
- misspell
|
||||||
|
- gocritic
|
||||||
|
- bidichk
|
||||||
|
- ineffassign
|
||||||
|
enable-all: false
|
||||||
|
disable-all: true
|
||||||
|
fast: false
|
||||||
|
|
||||||
|
run:
|
||||||
|
timeout: 3m
|
22
Makefile
22
Makefile
|
@ -98,7 +98,7 @@ help:
|
||||||
@echo " - build creates the entire project"
|
@echo " - build creates the entire project"
|
||||||
@echo " - clean delete integration files and build files but not css and js files"
|
@echo " - clean delete integration files and build files but not css and js files"
|
||||||
@echo " - fmt format the code"
|
@echo " - fmt format the code"
|
||||||
@echo " - lint run code linter revive"
|
@echo " - lint run code linter"
|
||||||
@echo " - misspell check if a word is written wrong"
|
@echo " - misspell check if a word is written wrong"
|
||||||
@echo " - test run default unit test"
|
@echo " - test run default unit test"
|
||||||
@echo " - test-cockroach run integration tests for cockroach"
|
@echo " - test-cockroach run integration tests for cockroach"
|
||||||
|
@ -111,7 +111,25 @@ help:
|
||||||
@echo " - vet examines Go source code and reports suspicious constructs"
|
@echo " - vet examines Go source code and reports suspicious constructs"
|
||||||
|
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint: revive
|
lint: golangci-lint
|
||||||
|
|
||||||
|
.PHONY: golangci-lint
|
||||||
|
golangci-lint: golangci-lint-check
|
||||||
|
golangci-lint run --timeout 10m
|
||||||
|
|
||||||
|
.PHONY: golangci-lint-check
|
||||||
|
golangci-lint-check:
|
||||||
|
$(eval GOLANGCI_LINT_VERSION := $(shell printf "%03d%03d%03d" $(shell golangci-lint --version | grep -Eo '[0-9]+\.[0-9.]+' | tr '.' ' ');))
|
||||||
|
$(eval MIN_GOLANGCI_LINT_VER_FMT := $(shell printf "%g.%g.%g" $(shell echo $(MIN_GOLANGCI_LINT_VERSION) | grep -o ...)))
|
||||||
|
@hash golangci-lint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
|
||||||
|
echo "Downloading golangci-lint v${MIN_GOLANGCI_LINT_VER_FMT}"; \
|
||||||
|
export BINARY="golangci-lint"; \
|
||||||
|
curl -sfL "https://raw.githubusercontent.com/golangci/golangci-lint/v${MIN_GOLANGCI_LINT_VER_FMT}/install.sh" | sh -s -- -b $(GOPATH)/bin v$(MIN_GOLANGCI_LINT_VER_FMT); \
|
||||||
|
elif [ "$(GOLANGCI_LINT_VERSION)" -lt "$(MIN_GOLANGCI_LINT_VERSION)" ]; then \
|
||||||
|
echo "Downloading newer version of golangci-lint v${MIN_GOLANGCI_LINT_VER_FMT}"; \
|
||||||
|
export BINARY="golangci-lint"; \
|
||||||
|
curl -sfL "https://raw.githubusercontent.com/golangci/golangci-lint/v${MIN_GOLANGCI_LINT_VER_FMT}/install.sh" | sh -s -- -b $(GOPATH)/bin v$(MIN_GOLANGCI_LINT_VER_FMT); \
|
||||||
|
fi
|
||||||
|
|
||||||
.PHONY: revive
|
.PHONY: revive
|
||||||
revive:
|
revive:
|
||||||
|
|
18
README.md
18
README.md
|
@ -141,6 +141,24 @@ affected, err := engine.Insert(&users)
|
||||||
affected, err := engine.Insert(&user1, &users)
|
affected, err := engine.Insert(&user1, &users)
|
||||||
// INSERT INTO struct1 () values ()
|
// INSERT INTO struct1 () values ()
|
||||||
// INSERT INTO struct2 () values (),(),()
|
// INSERT INTO struct2 () values (),(),()
|
||||||
|
|
||||||
|
affected, err := engine.Table("user").Insert(map[string]interface{}{
|
||||||
|
"name": "lunny",
|
||||||
|
"age": 18,
|
||||||
|
})
|
||||||
|
// INSERT INTO user (name, age) values (?,?)
|
||||||
|
|
||||||
|
affected, err := engine.Table("user").Insert([]map[string]interface{}{
|
||||||
|
{
|
||||||
|
"name": "lunny",
|
||||||
|
"age": 18,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lunny2",
|
||||||
|
"age": 19,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
// INSERT INTO user (name, age) values (?,?),(?,?)
|
||||||
```
|
```
|
||||||
|
|
||||||
* `Get` query one record from database
|
* `Get` query one record from database
|
||||||
|
|
18
README_CN.md
18
README_CN.md
|
@ -138,6 +138,24 @@ affected, err := engine.Insert(&users)
|
||||||
affected, err := engine.Insert(&user1, &users)
|
affected, err := engine.Insert(&user1, &users)
|
||||||
// INSERT INTO struct1 () values ()
|
// INSERT INTO struct1 () values ()
|
||||||
// INSERT INTO struct2 () values (),(),()
|
// INSERT INTO struct2 () values (),(),()
|
||||||
|
|
||||||
|
affected, err := engine.Table("user").Insert(map[string]interface{}{
|
||||||
|
"name": "lunny",
|
||||||
|
"age": 18,
|
||||||
|
})
|
||||||
|
// INSERT INTO user (name, age) values (?,?)
|
||||||
|
|
||||||
|
affected, err := engine.Table("user").Insert([]map[string]interface{}{
|
||||||
|
{
|
||||||
|
"name": "lunny",
|
||||||
|
"age": 18,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lunny2",
|
||||||
|
"age": 19,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
// INSERT INTO user (name, age) values (?,?),(?,?)
|
||||||
```
|
```
|
||||||
|
|
||||||
* `Get` 查询单条记录
|
* `Get` 查询单条记录
|
||||||
|
|
|
@ -16,19 +16,19 @@ import (
|
||||||
// Md5 return md5 hash string
|
// Md5 return md5 hash string
|
||||||
func Md5(str string) string {
|
func Md5(str string) string {
|
||||||
m := md5.New()
|
m := md5.New()
|
||||||
io.WriteString(m, str)
|
_, _ = io.WriteString(m, str)
|
||||||
return fmt.Sprintf("%x", m.Sum(nil))
|
return fmt.Sprintf("%x", m.Sum(nil))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode Encode data
|
// Encode Encode data
|
||||||
func Encode(data interface{}) ([]byte, error) {
|
func Encode(data interface{}) ([]byte, error) {
|
||||||
//return JsonEncode(data)
|
// return JsonEncode(data)
|
||||||
return GobEncode(data)
|
return GobEncode(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode decode data
|
// Decode decode data
|
||||||
func Decode(data []byte, to interface{}) error {
|
func Decode(data []byte, to interface{}) error {
|
||||||
//return JsonDecode(data, to)
|
// return JsonDecode(data, to)
|
||||||
return GobDecode(data, to)
|
return GobDecode(data, to)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ func (m *LRUCacher) GC() {
|
||||||
var removedNum int
|
var removedNum int
|
||||||
for e := m.idList.Front(); e != nil; {
|
for e := m.idList.Front(); e != nil; {
|
||||||
if removedNum <= CacheGcMaxRemoved &&
|
if removedNum <= CacheGcMaxRemoved &&
|
||||||
time.Now().Sub(e.Value.(*idNode).lastVisit) > m.Expired {
|
time.Since(e.Value.(*idNode).lastVisit) > m.Expired {
|
||||||
removedNum++
|
removedNum++
|
||||||
next := e.Next()
|
next := e.Next()
|
||||||
node := e.Value.(*idNode)
|
node := e.Value.(*idNode)
|
||||||
|
@ -70,7 +70,7 @@ func (m *LRUCacher) GC() {
|
||||||
removedNum = 0
|
removedNum = 0
|
||||||
for e := m.sqlList.Front(); e != nil; {
|
for e := m.sqlList.Front(); e != nil; {
|
||||||
if removedNum <= CacheGcMaxRemoved &&
|
if removedNum <= CacheGcMaxRemoved &&
|
||||||
time.Now().Sub(e.Value.(*sqlNode).lastVisit) > m.Expired {
|
time.Since(e.Value.(*sqlNode).lastVisit) > m.Expired {
|
||||||
removedNum++
|
removedNum++
|
||||||
next := e.Next()
|
next := e.Next()
|
||||||
node := e.Value.(*sqlNode)
|
node := e.Value.(*sqlNode)
|
||||||
|
@ -96,7 +96,7 @@ func (m *LRUCacher) GetIds(tableName, sql string) interface{} {
|
||||||
} else {
|
} else {
|
||||||
lastTime := el.Value.(*sqlNode).lastVisit
|
lastTime := el.Value.(*sqlNode).lastVisit
|
||||||
// if expired, remove the node and return nil
|
// if expired, remove the node and return nil
|
||||||
if time.Now().Sub(lastTime) > m.Expired {
|
if time.Since(lastTime) > m.Expired {
|
||||||
m.delIds(tableName, sql)
|
m.delIds(tableName, sql)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -122,7 +122,7 @@ func (m *LRUCacher) GetBean(tableName string, id string) interface{} {
|
||||||
if el, ok := m.idIndex[tableName][id]; ok {
|
if el, ok := m.idIndex[tableName][id]; ok {
|
||||||
lastTime := el.Value.(*idNode).lastVisit
|
lastTime := el.Value.(*idNode).lastVisit
|
||||||
// if expired, remove the node and return nil
|
// if expired, remove the node and return nil
|
||||||
if time.Now().Sub(lastTime) > m.Expired {
|
if time.Since(lastTime) > m.Expired {
|
||||||
m.delBean(tableName, id)
|
m.delBean(tableName, id)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -145,7 +145,7 @@ func (m *LRUCacher) clearIds(tableName string) {
|
||||||
if tis, ok := m.sqlIndex[tableName]; ok {
|
if tis, ok := m.sqlIndex[tableName]; ok {
|
||||||
for sql, v := range tis {
|
for sql, v := range tis {
|
||||||
m.sqlList.Remove(v)
|
m.sqlList.Remove(v)
|
||||||
m.store.Del(sql)
|
_ = m.store.Del(sql)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.sqlIndex[tableName] = make(map[string]*list.Element)
|
m.sqlIndex[tableName] = make(map[string]*list.Element)
|
||||||
|
@ -163,7 +163,7 @@ func (m *LRUCacher) clearBeans(tableName string) {
|
||||||
for id, v := range tis {
|
for id, v := range tis {
|
||||||
m.idList.Remove(v)
|
m.idList.Remove(v)
|
||||||
tid := genID(tableName, id)
|
tid := genID(tableName, id)
|
||||||
m.store.Del(tid)
|
_ = m.store.Del(tid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.idIndex[tableName] = make(map[string]*list.Element)
|
m.idIndex[tableName] = make(map[string]*list.Element)
|
||||||
|
@ -188,7 +188,7 @@ func (m *LRUCacher) PutIds(tableName, sql string, ids interface{}) {
|
||||||
} else {
|
} else {
|
||||||
el.Value.(*sqlNode).lastVisit = time.Now()
|
el.Value.(*sqlNode).lastVisit = time.Now()
|
||||||
}
|
}
|
||||||
m.store.Put(sql, ids)
|
_ = m.store.Put(sql, ids)
|
||||||
if m.sqlList.Len() > m.MaxElementSize {
|
if m.sqlList.Len() > m.MaxElementSize {
|
||||||
e := m.sqlList.Front()
|
e := m.sqlList.Front()
|
||||||
node := e.Value.(*sqlNode)
|
node := e.Value.(*sqlNode)
|
||||||
|
@ -210,7 +210,7 @@ func (m *LRUCacher) PutBean(tableName string, id string, obj interface{}) {
|
||||||
el.Value.(*idNode).lastVisit = time.Now()
|
el.Value.(*idNode).lastVisit = time.Now()
|
||||||
}
|
}
|
||||||
|
|
||||||
m.store.Put(genID(tableName, id), obj)
|
_ = m.store.Put(genID(tableName, id), obj)
|
||||||
if m.idList.Len() > m.MaxElementSize {
|
if m.idList.Len() > m.MaxElementSize {
|
||||||
e := m.idList.Front()
|
e := m.idList.Front()
|
||||||
node := e.Value.(*idNode)
|
node := e.Value.(*idNode)
|
||||||
|
@ -226,7 +226,7 @@ func (m *LRUCacher) delIds(tableName, sql string) {
|
||||||
m.sqlList.Remove(el)
|
m.sqlList.Remove(el)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.store.Del(sql)
|
_ = m.store.Del(sql)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DelIds deletes ids
|
// DelIds deletes ids
|
||||||
|
@ -243,7 +243,7 @@ func (m *LRUCacher) delBean(tableName string, id string) {
|
||||||
m.idList.Remove(el)
|
m.idList.Remove(el)
|
||||||
m.clearIds(tableName)
|
m.clearIds(tableName)
|
||||||
}
|
}
|
||||||
m.store.Del(tid)
|
_ = m.store.Del(tid)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DelBean deletes beans in some table
|
// DelBean deletes beans in some table
|
||||||
|
@ -265,10 +265,6 @@ type sqlNode struct {
|
||||||
lastVisit time.Time
|
lastVisit time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
func genSQLKey(sql string, args interface{}) string {
|
|
||||||
return fmt.Sprintf("%s-%v", sql, args)
|
|
||||||
}
|
|
||||||
|
|
||||||
func genID(prefix string, id string) string {
|
func genID(prefix string, id string) string {
|
||||||
return fmt.Sprintf("%s-%s", prefix, id)
|
return fmt.Sprintf("%s-%s", prefix, id)
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ func (c *ContextHook) End(ctx context.Context, result sql.Result, err error) {
|
||||||
c.Ctx = ctx
|
c.Ctx = ctx
|
||||||
c.Result = result
|
c.Result = result
|
||||||
c.Err = err
|
c.Err = err
|
||||||
c.ExecuteTime = time.Now().Sub(c.start)
|
c.ExecuteTime = time.Since(c.start)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hook represents a hook behaviour
|
// Hook represents a hook behaviour
|
||||||
|
|
|
@ -136,7 +136,7 @@ func (db *DB) reflectNew(typ reflect.Type) reflect.Value {
|
||||||
cs = &cacheStruct{reflect.MakeSlice(reflect.SliceOf(typ), DefaultCacheSize, DefaultCacheSize), 0}
|
cs = &cacheStruct{reflect.MakeSlice(reflect.SliceOf(typ), DefaultCacheSize, DefaultCacheSize), 0}
|
||||||
db.reflectCache[typ] = cs
|
db.reflectCache[typ] = cs
|
||||||
} else {
|
} else {
|
||||||
cs.idx = cs.idx + 1
|
cs.idx++
|
||||||
}
|
}
|
||||||
return cs.value.Index(cs.idx).Addr()
|
return cs.value.Index(cs.idx).Addr()
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,7 +96,7 @@ func BenchmarkOriQuery(b *testing.B) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
//fmt.Println(Id, Name, Title, Age, Alias, NickName)
|
// fmt.Println(Id, Name, Title, Age, Alias, NickName)
|
||||||
}
|
}
|
||||||
rows.Close()
|
rows.Close()
|
||||||
}
|
}
|
||||||
|
@ -245,13 +245,13 @@ func BenchmarkSliceInterfaceQuery(b *testing.B) {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
b.Log(slice)
|
b.Log(slice)
|
||||||
switch slice[1].(type) {
|
switch st := slice[1].(type) {
|
||||||
case *string:
|
case *string:
|
||||||
if *slice[1].(*string) != "xlw" {
|
if *st != "xlw" {
|
||||||
b.Error(errors.New("name should be xlw"))
|
b.Error(errors.New("name should be xlw"))
|
||||||
}
|
}
|
||||||
case []byte:
|
case []byte:
|
||||||
if string(slice[1].([]byte)) != "xlw" {
|
if string(st) != "xlw" {
|
||||||
b.Error(errors.New("name should be xlw"))
|
b.Error(errors.New("name should be xlw"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -399,14 +399,14 @@ func BenchmarkMapInterfaceQuery(b *testing.B) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Error(err)
|
b.Error(err)
|
||||||
}
|
}
|
||||||
switch m["name"].(type) {
|
switch t := m["name"].(type) {
|
||||||
case string:
|
case string:
|
||||||
if m["name"].(string) != "xlw" {
|
if t != "xlw" {
|
||||||
b.Log(m)
|
b.Log(m)
|
||||||
b.Error(errors.New("name should be xlw"))
|
b.Error(errors.New("name should be xlw"))
|
||||||
}
|
}
|
||||||
case []byte:
|
case []byte:
|
||||||
if string(m["name"].([]byte)) != "xlw" {
|
if string(t) != "xlw" {
|
||||||
b.Log(m)
|
b.Log(m)
|
||||||
b.Error(errors.New("name should be xlw"))
|
b.Error(errors.New("name should be xlw"))
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,7 @@ func (rs *Rows) ScanStructByIndex(dest ...interface{}) error {
|
||||||
for _, vvv := range vvvs {
|
for _, vvv := range vvvs {
|
||||||
for j := 0; j < vvv.NumField(); j++ {
|
for j := 0; j < vvv.NumField(); j++ {
|
||||||
newDest[i] = vvv.Field(j).Addr().Interface()
|
newDest[i] = vvv.Field(j).Addr().Interface()
|
||||||
i = i + 1
|
i++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -670,9 +670,15 @@ func (db *dameng) CreateTableSQL(ctx context.Context, queryer core.Queryer, tabl
|
||||||
|
|
||||||
quoter := db.Quoter()
|
quoter := db.Quoter()
|
||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
b.WriteString("CREATE TABLE ")
|
if _, err := b.WriteString("CREATE TABLE "); err != nil {
|
||||||
quoter.QuoteTo(&b, tableName)
|
return "", false, err
|
||||||
b.WriteString(" (")
|
}
|
||||||
|
if err := quoter.QuoteTo(&b, tableName); err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
if _, err := b.WriteString(" ("); err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
|
||||||
pkList := table.PrimaryKeys
|
pkList := table.PrimaryKeys
|
||||||
|
|
||||||
|
@ -687,21 +693,35 @@ func (db *dameng) CreateTableSQL(ctx context.Context, queryer core.Queryer, tabl
|
||||||
}
|
}
|
||||||
|
|
||||||
s, _ := ColumnString(db, col, false)
|
s, _ := ColumnString(db, col, false)
|
||||||
b.WriteString(s)
|
if _, err := b.WriteString(s); err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
if i != len(table.ColumnsSeq())-1 {
|
if i != len(table.ColumnsSeq())-1 {
|
||||||
b.WriteString(", ")
|
if _, err := b.WriteString(", "); err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(pkList) > 0 {
|
if len(pkList) > 0 {
|
||||||
if len(table.ColumnsSeq()) > 0 {
|
if len(table.ColumnsSeq()) > 0 {
|
||||||
b.WriteString(", ")
|
if _, err := b.WriteString(", "); err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if _, err := b.WriteString(fmt.Sprintf("CONSTRAINT PK_%s PRIMARY KEY (", tableName)); err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
if err := quoter.JoinWrite(&b, pkList, ","); err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
if _, err := b.WriteString(")"); err != nil {
|
||||||
|
return "", false, err
|
||||||
}
|
}
|
||||||
b.WriteString(fmt.Sprintf("CONSTRAINT PK_%s PRIMARY KEY (", tableName))
|
|
||||||
quoter.JoinWrite(&b, pkList, ",")
|
|
||||||
b.WriteString(")")
|
|
||||||
}
|
}
|
||||||
b.WriteString(")")
|
if _, err := b.WriteString(")"); err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
|
|
||||||
return b.String(), false, nil
|
return b.String(), false, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,11 +38,13 @@ func (uri *URI) SetSchema(schema string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// enumerates all autoincr mode
|
||||||
const (
|
const (
|
||||||
IncrAutoincrMode = iota
|
IncrAutoincrMode = iota
|
||||||
SequenceAutoincrMode
|
SequenceAutoincrMode
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// DialectFeatures represents a dialect parameters
|
||||||
type DialectFeatures struct {
|
type DialectFeatures struct {
|
||||||
AutoincrMode int // 0 autoincrement column, 1 sequence
|
AutoincrMode int // 0 autoincrement column, 1 sequence
|
||||||
}
|
}
|
||||||
|
@ -126,7 +128,9 @@ func (db *Base) CreateTableSQL(ctx context.Context, queryer core.Queryer, table
|
||||||
quoter := db.dialect.Quoter()
|
quoter := db.dialect.Quoter()
|
||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
b.WriteString("CREATE TABLE IF NOT EXISTS ")
|
b.WriteString("CREATE TABLE IF NOT EXISTS ")
|
||||||
quoter.QuoteTo(&b, tableName)
|
if err := quoter.QuoteTo(&b, tableName); err != nil {
|
||||||
|
return "", false, err
|
||||||
|
}
|
||||||
b.WriteString(" (")
|
b.WriteString(" (")
|
||||||
|
|
||||||
for i, colName := range table.ColumnsSeq() {
|
for i, colName := range table.ColumnsSeq() {
|
||||||
|
|
|
@ -6,7 +6,6 @@ package dialects
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -172,16 +171,7 @@ var (
|
||||||
|
|
||||||
type mysql struct {
|
type mysql struct {
|
||||||
Base
|
Base
|
||||||
net string
|
rowFormat string
|
||||||
addr string
|
|
||||||
params map[string]string
|
|
||||||
loc *time.Location
|
|
||||||
timeout time.Duration
|
|
||||||
tls *tls.Config
|
|
||||||
allowAllFiles bool
|
|
||||||
allowOldPasswords bool
|
|
||||||
clientFoundRows bool
|
|
||||||
rowFormat string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *mysql) Init(uri *URI) error {
|
func (db *mysql) Init(uri *URI) error {
|
||||||
|
@ -497,15 +487,15 @@ func (db *mysql) GetColumns(queryer core.Queryer, ctx context.Context, tableName
|
||||||
if _, ok := schemas.SqlTypes[colType]; ok {
|
if _, ok := schemas.SqlTypes[colType]; ok {
|
||||||
col.SQLType = schemas.SQLType{Name: colType, DefaultLength: len1, DefaultLength2: len2}
|
col.SQLType = schemas.SQLType{Name: colType, DefaultLength: len1, DefaultLength2: len2}
|
||||||
} else {
|
} else {
|
||||||
return nil, nil, fmt.Errorf("Unknown colType %v", colType)
|
return nil, nil, fmt.Errorf("unknown colType %v", colType)
|
||||||
}
|
}
|
||||||
|
|
||||||
if colKey == "PRI" {
|
if colKey == "PRI" {
|
||||||
col.IsPrimaryKey = true
|
col.IsPrimaryKey = true
|
||||||
}
|
}
|
||||||
if colKey == "UNI" {
|
// if colKey == "UNI" {
|
||||||
// col.is
|
// col.is
|
||||||
}
|
// }
|
||||||
|
|
||||||
if extra == "auto_increment" {
|
if extra == "auto_increment" {
|
||||||
col.IsAutoIncrement = true
|
col.IsAutoIncrement = true
|
||||||
|
@ -785,7 +775,7 @@ func (p *mymysqlDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
||||||
// Parse protocol part of URI
|
// Parse protocol part of URI
|
||||||
p := strings.SplitN(pd[0], ":", 2)
|
p := strings.SplitN(pd[0], ":", 2)
|
||||||
if len(p) != 2 {
|
if len(p) != 2 {
|
||||||
return nil, errors.New("Wrong protocol part of URI")
|
return nil, errors.New("wrong protocol part of URI")
|
||||||
}
|
}
|
||||||
uri.Proto = p[0]
|
uri.Proto = p[0]
|
||||||
options := strings.Split(p[1], ",")
|
options := strings.Split(p[1], ",")
|
||||||
|
@ -808,7 +798,7 @@ func (p *mymysqlDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
||||||
}
|
}
|
||||||
uri.Timeout = to
|
uri.Timeout = to
|
||||||
default:
|
default:
|
||||||
return nil, errors.New("Unknown option: " + k)
|
return nil, errors.New("unknown option: " + k)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Remove protocol part
|
// Remove protocol part
|
||||||
|
|
|
@ -1206,9 +1206,7 @@ WHERE n.nspname= s.table_schema AND c.relkind = 'r'::char AND c.relname = $1%s A
|
||||||
col.Default = "'" + col.Default + "'"
|
col.Default = "'" + col.Default + "'"
|
||||||
}
|
}
|
||||||
} else if col.SQLType.IsTime() {
|
} else if col.SQLType.IsTime() {
|
||||||
if strings.HasSuffix(col.Default, "::timestamp without time zone") {
|
col.Default = strings.TrimSuffix(col.Default, "::timestamp without time zone")
|
||||||
col.Default = strings.TrimSuffix(col.Default, "::timestamp without time zone")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cols[col.Name] = col
|
cols[col.Name] = col
|
||||||
|
@ -1269,7 +1267,7 @@ func (db *postgres) GetIndexes(queryer core.Queryer, ctx context.Context, tableN
|
||||||
s := "SELECT indexname, indexdef FROM pg_indexes WHERE tablename=$1"
|
s := "SELECT indexname, indexdef FROM pg_indexes WHERE tablename=$1"
|
||||||
if len(db.getSchema()) != 0 {
|
if len(db.getSchema()) != 0 {
|
||||||
args = append(args, db.getSchema())
|
args = append(args, db.getSchema())
|
||||||
s = s + " AND schemaname=$2"
|
s += " AND schemaname=$2"
|
||||||
}
|
}
|
||||||
|
|
||||||
rows, err := queryer.QueryContext(ctx, s, args...)
|
rows, err := queryer.QueryContext(ctx, s, args...)
|
||||||
|
@ -1337,13 +1335,13 @@ func (db *postgres) CreateTableSQL(ctx context.Context, queryer core.Queryer, ta
|
||||||
return "", ok, err
|
return "", ok, err
|
||||||
}
|
}
|
||||||
|
|
||||||
commentSql := "; "
|
commentSQL := "; "
|
||||||
if table.Comment != "" {
|
if table.Comment != "" {
|
||||||
// support schema.table -> "schema"."table"
|
// support schema.table -> "schema"."table"
|
||||||
commentSql += fmt.Sprintf("COMMENT ON TABLE %s IS '%s'", quoter.Quote(tableName), table.Comment)
|
commentSQL += fmt.Sprintf("COMMENT ON TABLE %s IS '%s'", quoter.Quote(tableName), table.Comment)
|
||||||
}
|
}
|
||||||
|
|
||||||
return createTableSQL + commentSql, true, nil
|
return createTableSQL + commentSQL, true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *postgres) Filters() []Filter {
|
func (db *postgres) Filters() []Filter {
|
||||||
|
|
|
@ -17,8 +17,7 @@ import (
|
||||||
func TableNameWithSchema(dialect Dialect, tableName string) string {
|
func TableNameWithSchema(dialect Dialect, tableName string) string {
|
||||||
// Add schema name as prefix of table name.
|
// Add schema name as prefix of table name.
|
||||||
// Only for postgres database.
|
// Only for postgres database.
|
||||||
if dialect.URI().Schema != "" &&
|
if dialect.URI().Schema != "" && !strings.Contains(tableName, ".") {
|
||||||
strings.Index(tableName, ".") == -1 {
|
|
||||||
return fmt.Sprintf("%s.%s", dialect.URI().Schema, tableName)
|
return fmt.Sprintf("%s.%s", dialect.URI().Schema, tableName)
|
||||||
}
|
}
|
||||||
return tableName
|
return tableName
|
||||||
|
@ -27,20 +26,18 @@ func TableNameWithSchema(dialect Dialect, tableName string) string {
|
||||||
// TableNameNoSchema returns table name with given tableName
|
// TableNameNoSchema returns table name with given tableName
|
||||||
func TableNameNoSchema(dialect Dialect, mapper names.Mapper, tableName interface{}) string {
|
func TableNameNoSchema(dialect Dialect, mapper names.Mapper, tableName interface{}) string {
|
||||||
quote := dialect.Quoter().Quote
|
quote := dialect.Quoter().Quote
|
||||||
switch tableName.(type) {
|
switch tt := tableName.(type) {
|
||||||
case []string:
|
case []string:
|
||||||
t := tableName.([]string)
|
if len(tt) > 1 {
|
||||||
if len(t) > 1 {
|
return fmt.Sprintf("%v AS %v", quote(tt[0]), quote(tt[1]))
|
||||||
return fmt.Sprintf("%v AS %v", quote(t[0]), quote(t[1]))
|
} else if len(tt) == 1 {
|
||||||
} else if len(t) == 1 {
|
return quote(tt[0])
|
||||||
return quote(t[0])
|
|
||||||
}
|
}
|
||||||
case []interface{}:
|
case []interface{}:
|
||||||
t := tableName.([]interface{})
|
l := len(tt)
|
||||||
l := len(t)
|
|
||||||
var table string
|
var table string
|
||||||
if l > 0 {
|
if l > 0 {
|
||||||
f := t[0]
|
f := tt[0]
|
||||||
switch f.(type) {
|
switch f.(type) {
|
||||||
case string:
|
case string:
|
||||||
table = f.(string)
|
table = f.(string)
|
||||||
|
@ -57,7 +54,7 @@ func TableNameNoSchema(dialect Dialect, mapper names.Mapper, tableName interface
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if l > 1 {
|
if l > 1 {
|
||||||
return fmt.Sprintf("%v AS %v", quote(table), quote(fmt.Sprintf("%v", t[1])))
|
return fmt.Sprintf("%v AS %v", quote(table), quote(fmt.Sprintf("%v", tt[1])))
|
||||||
} else if l == 1 {
|
} else if l == 1 {
|
||||||
return quote(table)
|
return quote(table)
|
||||||
}
|
}
|
||||||
|
|
10
engine.go
10
engine.go
|
@ -467,7 +467,9 @@ func (engine *Engine) dumpTables(ctx context.Context, tables []*schemas.Table, w
|
||||||
DBName: uri.DBName,
|
DBName: uri.DBName,
|
||||||
Schema: uri.Schema,
|
Schema: uri.Schema,
|
||||||
}
|
}
|
||||||
dstDialect.Init(&destURI)
|
if err := dstDialect.Init(&destURI); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cacherMgr := caches.NewManager()
|
cacherMgr := caches.NewManager()
|
||||||
dstTableCache := tags.NewParser("xorm", dstDialect, engine.GetTableMapper(), engine.GetColumnMapper(), cacherMgr)
|
dstTableCache := tags.NewParser("xorm", dstDialect, engine.GetTableMapper(), engine.GetColumnMapper(), cacherMgr)
|
||||||
|
@ -588,7 +590,7 @@ func (engine *Engine) dumpTables(ctx context.Context, tables []*schemas.Table, w
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if sess.engine.dialect.URI().DBType == schemas.DAMENG && stp.IsTime() && len(s.String) == 25 {
|
} else if sess.engine.dialect.URI().DBType == schemas.DAMENG && stp.IsTime() && len(s.String) == 25 {
|
||||||
r := strings.Replace(s.String[:19], "T", " ", -1)
|
r := strings.ReplaceAll(s.String[:19], "T", " ")
|
||||||
if _, err = io.WriteString(w, "'"+r+"'"); err != nil {
|
if _, err = io.WriteString(w, "'"+r+"'"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -946,7 +948,7 @@ func (engine *Engine) CreateTables(beans ...interface{}) error {
|
||||||
for _, bean := range beans {
|
for _, bean := range beans {
|
||||||
err = session.createTable(bean)
|
err = session.createTable(bean)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.Rollback()
|
_ = session.Rollback()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -966,7 +968,7 @@ func (engine *Engine) DropTables(beans ...interface{}) error {
|
||||||
for _, bean := range beans {
|
for _, bean := range beans {
|
||||||
err = session.dropTable(bean)
|
err = session.dropTable(bean)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.Rollback()
|
_ = session.Rollback()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,12 +58,13 @@ func TestAutoTransaction(t *testing.T) {
|
||||||
engine := testEngine.(*xorm.Engine)
|
engine := testEngine.(*xorm.Engine)
|
||||||
|
|
||||||
// will success
|
// will success
|
||||||
engine.Transaction(func(session *xorm.Session) (interface{}, error) {
|
_, err := engine.Transaction(func(session *xorm.Session) (interface{}, error) {
|
||||||
_, err := session.Insert(TestTx{Msg: "hi"})
|
_, err := session.Insert(TestTx{Msg: "hi"})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
})
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
has, err := engine.Exist(&TestTx{Msg: "hi"})
|
has, err := engine.Exist(&TestTx{Msg: "hi"})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
@ -149,13 +150,14 @@ func TestDumpTables(t *testing.T) {
|
||||||
|
|
||||||
assertSync(t, new(TestDumpTableStruct))
|
assertSync(t, new(TestDumpTableStruct))
|
||||||
|
|
||||||
testEngine.Insert([]TestDumpTableStruct{
|
_, err := testEngine.Insert([]TestDumpTableStruct{
|
||||||
{Name: "1", IsMan: true},
|
{Name: "1", IsMan: true},
|
||||||
{Name: "2\n"},
|
{Name: "2\n"},
|
||||||
{Name: "3;"},
|
{Name: "3;"},
|
||||||
{Name: "4\n;\n''"},
|
{Name: "4\n;\n''"},
|
||||||
{Name: "5'\n"},
|
{Name: "5'\n"},
|
||||||
})
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
fp := fmt.Sprintf("%v-table.sql", testEngine.Dialect().URI().DBType)
|
fp := fmt.Sprintf("%v-table.sql", testEngine.Dialect().URI().DBType)
|
||||||
os.Remove(fp)
|
os.Remove(fp)
|
||||||
|
|
|
@ -104,7 +104,7 @@ func (p *ProcessorsStruct) BeforeDelete() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ProcessorsStruct) BeforeSet(col string, cell xorm.Cell) {
|
func (p *ProcessorsStruct) BeforeSet(col string, cell xorm.Cell) {
|
||||||
p.BeforeSetFlag = p.BeforeSetFlag + 1
|
p.BeforeSetFlag++
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ProcessorsStruct) AfterInsert() {
|
func (p *ProcessorsStruct) AfterInsert() {
|
||||||
|
@ -120,7 +120,7 @@ func (p *ProcessorsStruct) AfterDelete() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ProcessorsStruct) AfterSet(col string, cell xorm.Cell) {
|
func (p *ProcessorsStruct) AfterSet(col string, cell xorm.Cell) {
|
||||||
p.AfterSetFlag = p.AfterSetFlag + 1
|
p.AfterSetFlag++
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestProcessors(t *testing.T) {
|
func TestProcessors(t *testing.T) {
|
||||||
|
|
|
@ -101,7 +101,7 @@ func callbackLooper(datas interface{}, step int, actionFunc func(interface{}) er
|
||||||
if err = actionFunc(tempInterface); err != nil {
|
if err = actionFunc(tempInterface); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
processedLen = processedLen - step
|
processedLen -= step
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,7 @@ func TestInt16Id(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans))
|
assert.EqualValues(t, 1, len(beans))
|
||||||
|
|
||||||
beans2 := make(map[int16]Int16Id, 0)
|
beans2 := make(map[int16]Int16Id)
|
||||||
err = testEngine.Find(&beans2)
|
err = testEngine.Find(&beans2)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans2))
|
assert.EqualValues(t, 1, len(beans2))
|
||||||
|
@ -154,7 +154,7 @@ func TestInt32Id(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans))
|
assert.EqualValues(t, 1, len(beans))
|
||||||
|
|
||||||
beans2 := make(map[int32]Int32Id, 0)
|
beans2 := make(map[int32]Int32Id)
|
||||||
err = testEngine.Find(&beans2)
|
err = testEngine.Find(&beans2)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans2))
|
assert.EqualValues(t, 1, len(beans2))
|
||||||
|
@ -205,7 +205,7 @@ func TestUintId(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 3, len(beans))
|
assert.EqualValues(t, 3, len(beans))
|
||||||
|
|
||||||
beans2 := make(map[uint]UintId, 0)
|
beans2 := make(map[uint]UintId)
|
||||||
err = testEngine.Find(&beans2)
|
err = testEngine.Find(&beans2)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 3, len(beans2))
|
assert.EqualValues(t, 3, len(beans2))
|
||||||
|
@ -239,7 +239,7 @@ func TestUint16Id(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans))
|
assert.EqualValues(t, 1, len(beans))
|
||||||
|
|
||||||
beans2 := make(map[uint16]Uint16Id, 0)
|
beans2 := make(map[uint16]Uint16Id)
|
||||||
err = testEngine.Find(&beans2)
|
err = testEngine.Find(&beans2)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans2))
|
assert.EqualValues(t, 1, len(beans2))
|
||||||
|
@ -273,7 +273,7 @@ func TestUint32Id(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans))
|
assert.EqualValues(t, 1, len(beans))
|
||||||
|
|
||||||
beans2 := make(map[uint32]Uint32Id, 0)
|
beans2 := make(map[uint32]Uint32Id)
|
||||||
err = testEngine.Find(&beans2)
|
err = testEngine.Find(&beans2)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans2))
|
assert.EqualValues(t, 1, len(beans2))
|
||||||
|
@ -310,7 +310,7 @@ func TestUint64Id(t *testing.T) {
|
||||||
assert.EqualValues(t, 1, len(beans))
|
assert.EqualValues(t, 1, len(beans))
|
||||||
assert.EqualValues(t, *bean, beans[0])
|
assert.EqualValues(t, *bean, beans[0])
|
||||||
|
|
||||||
beans2 := make(map[uint64]Uint64Id, 0)
|
beans2 := make(map[uint64]Uint64Id)
|
||||||
err = testEngine.Find(&beans2)
|
err = testEngine.Find(&beans2)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans2))
|
assert.EqualValues(t, 1, len(beans2))
|
||||||
|
@ -533,7 +533,7 @@ func TestMyIntId(t *testing.T) {
|
||||||
assert.EqualValues(t, 1, len(beans))
|
assert.EqualValues(t, 1, len(beans))
|
||||||
assert.EqualValues(t, *bean, beans[0])
|
assert.EqualValues(t, *bean, beans[0])
|
||||||
|
|
||||||
beans2 := make(map[ID]MyIntPK, 0)
|
beans2 := make(map[ID]MyIntPK)
|
||||||
err = testEngine.Find(&beans2)
|
err = testEngine.Find(&beans2)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans2))
|
assert.EqualValues(t, 1, len(beans2))
|
||||||
|
@ -570,7 +570,7 @@ func TestMyStringId(t *testing.T) {
|
||||||
assert.EqualValues(t, 1, len(beans))
|
assert.EqualValues(t, 1, len(beans))
|
||||||
assert.EqualValues(t, *bean, beans[0])
|
assert.EqualValues(t, *bean, beans[0])
|
||||||
|
|
||||||
beans2 := make(map[StrID]MyStringPK, 0)
|
beans2 := make(map[StrID]MyStringPK)
|
||||||
err = testEngine.Find(&beans2)
|
err = testEngine.Find(&beans2)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, 1, len(beans2))
|
assert.EqualValues(t, 1, len(beans2))
|
||||||
|
|
|
@ -328,7 +328,7 @@ func TestIsTableEmpty(t *testing.T) {
|
||||||
Created time.Time `xorm:"created"`
|
Created time.Time `xorm:"created"`
|
||||||
ILike int
|
ILike int
|
||||||
PageView int
|
PageView int
|
||||||
From_url string
|
From_url string // nolint
|
||||||
Pre_url string `xorm:"unique"` //pre view image's url
|
Pre_url string `xorm:"unique"` //pre view image's url
|
||||||
Uid int64
|
Uid int64
|
||||||
}
|
}
|
||||||
|
|
|
@ -231,14 +231,12 @@ func TestForUpdate(t *testing.T) {
|
||||||
f := new(ForUpdate)
|
f := new(ForUpdate)
|
||||||
f.Name = "updated by session1"
|
f.Name = "updated by session1"
|
||||||
session1.Where("`id` = ?", 1)
|
session1.Where("`id` = ?", 1)
|
||||||
session1.Update(f)
|
_, err = session1.Update(f)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
// release lock
|
// release lock
|
||||||
err = session1.Commit()
|
err = session1.Commit()
|
||||||
if err != nil {
|
assert.NoError(t, err)
|
||||||
t.Error(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
@ -253,7 +251,7 @@ func TestWithIn(t *testing.T) {
|
||||||
assert.NoError(t, PrepareEngine())
|
assert.NoError(t, PrepareEngine())
|
||||||
assert.NoError(t, testEngine.Sync(new(temp3)))
|
assert.NoError(t, testEngine.Sync(new(temp3)))
|
||||||
|
|
||||||
testEngine.Insert(&[]temp3{
|
_, err := testEngine.Insert(&[]temp3{
|
||||||
{
|
{
|
||||||
Name: "user1",
|
Name: "user1",
|
||||||
},
|
},
|
||||||
|
@ -264,6 +262,7 @@ func TestWithIn(t *testing.T) {
|
||||||
Name: "user1",
|
Name: "user1",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
cnt, err := testEngine.In("Id", 1, 2, 3, 4).Update(&temp3{Name: "aa"}, &temp3{Name: "user1"})
|
cnt, err := testEngine.In("Id", 1, 2, 3, 4).Update(&temp3{Name: "aa"}, &temp3{Name: "user1"})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
@ -318,6 +317,7 @@ func TestUpdate1(t *testing.T) {
|
||||||
_, err := testEngine.Insert(&Userinfo{
|
_, err := testEngine.Insert(&Userinfo{
|
||||||
Username: "user1",
|
Username: "user1",
|
||||||
})
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
var ori Userinfo
|
var ori Userinfo
|
||||||
has, err := testEngine.Get(&ori)
|
has, err := testEngine.Get(&ori)
|
||||||
|
@ -925,6 +925,7 @@ func TestDeletedUpdate(t *testing.T) {
|
||||||
|
|
||||||
var s1 DeletedUpdatedStruct
|
var s1 DeletedUpdatedStruct
|
||||||
has, err := testEngine.ID(s.Id).Get(&s1)
|
has, err := testEngine.ID(s.Id).Get(&s1)
|
||||||
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, true, has)
|
assert.EqualValues(t, true, has)
|
||||||
|
|
||||||
cnt, err = testEngine.ID(s.Id).Delete(&DeletedUpdatedStruct{})
|
cnt, err = testEngine.ID(s.Id).Delete(&DeletedUpdatedStruct{})
|
||||||
|
@ -941,6 +942,7 @@ func TestDeletedUpdate(t *testing.T) {
|
||||||
|
|
||||||
var s2 DeletedUpdatedStruct
|
var s2 DeletedUpdatedStruct
|
||||||
has, err = testEngine.ID(s.Id).Get(&s2)
|
has, err = testEngine.ID(s.Id).Get(&s2)
|
||||||
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, true, has)
|
assert.EqualValues(t, true, has)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1202,7 +1202,7 @@ func TestTagTime(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, has)
|
assert.True(t, has)
|
||||||
assert.EqualValues(t, s.Created.UTC().Format("2006-01-02 15:04:05"),
|
assert.EqualValues(t, s.Created.UTC().Format("2006-01-02 15:04:05"),
|
||||||
strings.Replace(strings.Replace(tm, "T", " ", -1), "Z", "", -1))
|
strings.ReplaceAll(strings.ReplaceAll(tm, "T", " "), "Z", ""))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTagAutoIncr(t *testing.T) {
|
func TestTagAutoIncr(t *testing.T) {
|
||||||
|
@ -1287,7 +1287,7 @@ func TestVersion1(t *testing.T) {
|
||||||
assert.EqualValues(t, newVer.Ver, 2)
|
assert.EqualValues(t, newVer.Ver, 2)
|
||||||
|
|
||||||
newVer = new(VersionS)
|
newVer = new(VersionS)
|
||||||
has, err = testEngine.ID(ver.Id).Get(newVer)
|
_, err = testEngine.ID(ver.Id).Get(newVer)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, newVer.Ver, 2)
|
assert.EqualValues(t, newVer.Ver, 2)
|
||||||
}
|
}
|
||||||
|
@ -1345,7 +1345,7 @@ func TestVersion3(t *testing.T) {
|
||||||
assert.EqualValues(t, newVer.Ver, 2)
|
assert.EqualValues(t, newVer.Ver, 2)
|
||||||
|
|
||||||
newVer = new(VersionUintS)
|
newVer = new(VersionUintS)
|
||||||
has, err = testEngine.ID(ver.Id).Get(newVer)
|
_, err = testEngine.ID(ver.Id).Get(newVer)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, newVer.Ver, 2)
|
assert.EqualValues(t, newVer.Ver, 2)
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ func createEngine(dbType, connStr string) error {
|
||||||
if !*cluster {
|
if !*cluster {
|
||||||
switch schemas.DBType(strings.ToLower(dbType)) {
|
switch schemas.DBType(strings.ToLower(dbType)) {
|
||||||
case schemas.MSSQL:
|
case schemas.MSSQL:
|
||||||
db, err := sql.Open(dbType, strings.Replace(connStr, "xorm_test", "master", -1))
|
db, err := sql.Open(dbType, strings.ReplaceAll(connStr, "xorm_test", "master"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ func createEngine(dbType, connStr string) error {
|
||||||
db.Close()
|
db.Close()
|
||||||
*ignoreSelectUpdate = true
|
*ignoreSelectUpdate = true
|
||||||
case schemas.POSTGRES:
|
case schemas.POSTGRES:
|
||||||
db, err := sql.Open(dbType, strings.Replace(connStr, "xorm_test", "postgres", -1))
|
db, err := sql.Open(dbType, strings.ReplaceAll(connStr, "xorm_test", "postgres"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ func createEngine(dbType, connStr string) error {
|
||||||
db.Close()
|
db.Close()
|
||||||
*ignoreSelectUpdate = true
|
*ignoreSelectUpdate = true
|
||||||
case schemas.MYSQL:
|
case schemas.MYSQL:
|
||||||
db, err := sql.Open(dbType, strings.Replace(connStr, "xorm_test", "mysql", -1))
|
db, err := sql.Open(dbType, strings.ReplaceAll(connStr, "xorm_test", "mysql"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,9 @@ func (statement *Statement) GenSumSQL(bean interface{}, columns ...string) (stri
|
||||||
return statement.GenRawSQL(), statement.RawParams, nil
|
return statement.GenRawSQL(), statement.RawParams, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
statement.SetRefBean(bean)
|
if err := statement.SetRefBean(bean); err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
var sumStrs = make([]string, 0, len(columns))
|
var sumStrs = make([]string, 0, len(columns))
|
||||||
for _, colName := range columns {
|
for _, colName := range columns {
|
||||||
|
@ -111,7 +113,9 @@ func (statement *Statement) GenGetSQL(bean interface{}) (string, []interface{},
|
||||||
v := rValue(bean)
|
v := rValue(bean)
|
||||||
isStruct = v.Kind() == reflect.Struct
|
isStruct = v.Kind() == reflect.Struct
|
||||||
if isStruct {
|
if isStruct {
|
||||||
statement.SetRefBean(bean)
|
if err := statement.SetRefBean(bean); err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,7 +172,9 @@ func (statement *Statement) GenCountSQL(beans ...interface{}) (string, []interfa
|
||||||
var condArgs []interface{}
|
var condArgs []interface{}
|
||||||
var err error
|
var err error
|
||||||
if len(beans) > 0 {
|
if len(beans) > 0 {
|
||||||
statement.SetRefBean(beans[0])
|
if err := statement.SetRefBean(beans[0]); err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
if err := statement.mergeConds(beans[0]); err != nil {
|
if err := statement.mergeConds(beans[0]); err != nil {
|
||||||
return "", nil, err
|
return "", nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -473,7 +473,7 @@ func (statement *Statement) Desc(colNames ...string) *Statement {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
fmt.Fprint(&buf, ", ")
|
fmt.Fprint(&buf, ", ")
|
||||||
}
|
}
|
||||||
statement.dialect.Quoter().QuoteTo(&buf, col)
|
_ = statement.dialect.Quoter().QuoteTo(&buf, col)
|
||||||
fmt.Fprint(&buf, " DESC")
|
fmt.Fprint(&buf, " DESC")
|
||||||
}
|
}
|
||||||
statement.OrderStr = buf.String()
|
statement.OrderStr = buf.String()
|
||||||
|
@ -490,7 +490,7 @@ func (statement *Statement) Asc(colNames ...string) *Statement {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
fmt.Fprint(&buf, ", ")
|
fmt.Fprint(&buf, ", ")
|
||||||
}
|
}
|
||||||
statement.dialect.Quoter().QuoteTo(&buf, col)
|
_ = statement.dialect.Quoter().QuoteTo(&buf, col)
|
||||||
fmt.Fprint(&buf, " ASC")
|
fmt.Fprint(&buf, " ASC")
|
||||||
}
|
}
|
||||||
statement.OrderStr = buf.String()
|
statement.OrderStr = buf.String()
|
||||||
|
@ -558,7 +558,7 @@ func (statement *Statement) Join(joinOP string, tablename interface{}, condition
|
||||||
tbName := dialects.FullTableName(statement.dialect, statement.tagParser.GetTableMapper(), tablename, true)
|
tbName := dialects.FullTableName(statement.dialect, statement.tagParser.GetTableMapper(), tablename, true)
|
||||||
if !utils.IsSubQuery(tbName) {
|
if !utils.IsSubQuery(tbName) {
|
||||||
var buf strings.Builder
|
var buf strings.Builder
|
||||||
statement.dialect.Quoter().QuoteTo(&buf, tbName)
|
_ = statement.dialect.Quoter().QuoteTo(&buf, tbName)
|
||||||
tbName = buf.String()
|
tbName = buf.String()
|
||||||
} else {
|
} else {
|
||||||
tbName = statement.ReplaceQuote(tbName)
|
tbName = statement.ReplaceQuote(tbName)
|
||||||
|
@ -571,15 +571,6 @@ func (statement *Statement) Join(joinOP string, tablename interface{}, condition
|
||||||
return statement
|
return statement
|
||||||
}
|
}
|
||||||
|
|
||||||
// tbNameNoSchema get some table's table name
|
|
||||||
func (statement *Statement) tbNameNoSchema(table *schemas.Table) string {
|
|
||||||
if len(statement.AltTableName) > 0 {
|
|
||||||
return statement.AltTableName
|
|
||||||
}
|
|
||||||
|
|
||||||
return table.Name
|
|
||||||
}
|
|
||||||
|
|
||||||
// GroupBy generate "Group By keys" statement
|
// GroupBy generate "Group By keys" statement
|
||||||
func (statement *Statement) GroupBy(keys string) *Statement {
|
func (statement *Statement) GroupBy(keys string) *Statement {
|
||||||
statement.GroupByStr = statement.ReplaceQuote(keys)
|
statement.GroupByStr = statement.ReplaceQuote(keys)
|
||||||
|
@ -857,9 +848,6 @@ func (statement *Statement) buildConds2(table *schemas.Table, bean interface{},
|
||||||
|
|
||||||
fieldValuePtr, err := col.ValueOf(bean)
|
fieldValuePtr, err := col.ValueOf(bean)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !strings.Contains(err.Error(), "is not valid") {
|
|
||||||
//engine.logger.Warn(err)
|
|
||||||
}
|
|
||||||
continue
|
continue
|
||||||
} else if fieldValuePtr == nil {
|
} else if fieldValuePtr == nil {
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
package statements
|
package statements
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -37,6 +38,7 @@ func TestMain(m *testing.M) {
|
||||||
panic("tags parser is nil")
|
panic("tags parser is nil")
|
||||||
}
|
}
|
||||||
m.Run()
|
m.Run()
|
||||||
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
var colStrTests = []struct {
|
var colStrTests = []struct {
|
||||||
|
|
|
@ -21,6 +21,7 @@ func SliceEq(left, right []string) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IndexSlice search c in slice s and return the index, return -1 if s don't contain c
|
||||||
func IndexSlice(s []string, c string) int {
|
func IndexSlice(s []string, c string) int {
|
||||||
for i, ss := range s {
|
for i, ss := range s {
|
||||||
if c == ss {
|
if c == ss {
|
||||||
|
|
|
@ -130,56 +130,56 @@ func NewSimpleLogger3(out io.Writer, prefix string, flag int, l LogLevel) *Simpl
|
||||||
// Error implement ILogger
|
// Error implement ILogger
|
||||||
func (s *SimpleLogger) Error(v ...interface{}) {
|
func (s *SimpleLogger) Error(v ...interface{}) {
|
||||||
if s.level <= LOG_ERR {
|
if s.level <= LOG_ERR {
|
||||||
s.ERR.Output(2, fmt.Sprintln(v...))
|
_ = s.ERR.Output(2, fmt.Sprintln(v...))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Errorf implement ILogger
|
// Errorf implement ILogger
|
||||||
func (s *SimpleLogger) Errorf(format string, v ...interface{}) {
|
func (s *SimpleLogger) Errorf(format string, v ...interface{}) {
|
||||||
if s.level <= LOG_ERR {
|
if s.level <= LOG_ERR {
|
||||||
s.ERR.Output(2, fmt.Sprintf(format, v...))
|
_ = s.ERR.Output(2, fmt.Sprintf(format, v...))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debug implement ILogger
|
// Debug implement ILogger
|
||||||
func (s *SimpleLogger) Debug(v ...interface{}) {
|
func (s *SimpleLogger) Debug(v ...interface{}) {
|
||||||
if s.level <= LOG_DEBUG {
|
if s.level <= LOG_DEBUG {
|
||||||
s.DEBUG.Output(2, fmt.Sprintln(v...))
|
_ = s.DEBUG.Output(2, fmt.Sprintln(v...))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debugf implement ILogger
|
// Debugf implement ILogger
|
||||||
func (s *SimpleLogger) Debugf(format string, v ...interface{}) {
|
func (s *SimpleLogger) Debugf(format string, v ...interface{}) {
|
||||||
if s.level <= LOG_DEBUG {
|
if s.level <= LOG_DEBUG {
|
||||||
s.DEBUG.Output(2, fmt.Sprintf(format, v...))
|
_ = s.DEBUG.Output(2, fmt.Sprintf(format, v...))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Info implement ILogger
|
// Info implement ILogger
|
||||||
func (s *SimpleLogger) Info(v ...interface{}) {
|
func (s *SimpleLogger) Info(v ...interface{}) {
|
||||||
if s.level <= LOG_INFO {
|
if s.level <= LOG_INFO {
|
||||||
s.INFO.Output(2, fmt.Sprintln(v...))
|
_ = s.INFO.Output(2, fmt.Sprintln(v...))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Infof implement ILogger
|
// Infof implement ILogger
|
||||||
func (s *SimpleLogger) Infof(format string, v ...interface{}) {
|
func (s *SimpleLogger) Infof(format string, v ...interface{}) {
|
||||||
if s.level <= LOG_INFO {
|
if s.level <= LOG_INFO {
|
||||||
s.INFO.Output(2, fmt.Sprintf(format, v...))
|
_ = s.INFO.Output(2, fmt.Sprintf(format, v...))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warn implement ILogger
|
// Warn implement ILogger
|
||||||
func (s *SimpleLogger) Warn(v ...interface{}) {
|
func (s *SimpleLogger) Warn(v ...interface{}) {
|
||||||
if s.level <= LOG_WARNING {
|
if s.level <= LOG_WARNING {
|
||||||
s.WARN.Output(2, fmt.Sprintln(v...))
|
_ = s.WARN.Output(2, fmt.Sprintln(v...))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warnf implement ILogger
|
// Warnf implement ILogger
|
||||||
func (s *SimpleLogger) Warnf(format string, v ...interface{}) {
|
func (s *SimpleLogger) Warnf(format string, v ...interface{}) {
|
||||||
if s.level <= LOG_WARNING {
|
if s.level <= LOG_WARNING {
|
||||||
s.WARN.Output(2, fmt.Sprintf(format, v...))
|
_ = s.WARN.Output(2, fmt.Sprintf(format, v...))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build !windows && !nacl && !plan9
|
||||||
// +build !windows,!nacl,!plan9
|
// +build !windows,!nacl,!plan9
|
||||||
|
|
||||||
package log
|
package log
|
||||||
|
@ -26,42 +27,42 @@ func NewSyslogLogger(w *syslog.Writer) *SyslogLogger {
|
||||||
|
|
||||||
// Debug log content as Debug
|
// Debug log content as Debug
|
||||||
func (s *SyslogLogger) Debug(v ...interface{}) {
|
func (s *SyslogLogger) Debug(v ...interface{}) {
|
||||||
s.w.Debug(fmt.Sprint(v...))
|
_ = s.w.Debug(fmt.Sprint(v...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debugf log content as Debug and format
|
// Debugf log content as Debug and format
|
||||||
func (s *SyslogLogger) Debugf(format string, v ...interface{}) {
|
func (s *SyslogLogger) Debugf(format string, v ...interface{}) {
|
||||||
s.w.Debug(fmt.Sprintf(format, v...))
|
_ = s.w.Debug(fmt.Sprintf(format, v...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error log content as Error
|
// Error log content as Error
|
||||||
func (s *SyslogLogger) Error(v ...interface{}) {
|
func (s *SyslogLogger) Error(v ...interface{}) {
|
||||||
s.w.Err(fmt.Sprint(v...))
|
_ = s.w.Err(fmt.Sprint(v...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Errorf log content as Errorf and format
|
// Errorf log content as Errorf and format
|
||||||
func (s *SyslogLogger) Errorf(format string, v ...interface{}) {
|
func (s *SyslogLogger) Errorf(format string, v ...interface{}) {
|
||||||
s.w.Err(fmt.Sprintf(format, v...))
|
_ = s.w.Err(fmt.Sprintf(format, v...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Info log content as Info
|
// Info log content as Info
|
||||||
func (s *SyslogLogger) Info(v ...interface{}) {
|
func (s *SyslogLogger) Info(v ...interface{}) {
|
||||||
s.w.Info(fmt.Sprint(v...))
|
_ = s.w.Info(fmt.Sprint(v...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Infof log content as Infof and format
|
// Infof log content as Infof and format
|
||||||
func (s *SyslogLogger) Infof(format string, v ...interface{}) {
|
func (s *SyslogLogger) Infof(format string, v ...interface{}) {
|
||||||
s.w.Info(fmt.Sprintf(format, v...))
|
_ = s.w.Info(fmt.Sprintf(format, v...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warn log content as Warn
|
// Warn log content as Warn
|
||||||
func (s *SyslogLogger) Warn(v ...interface{}) {
|
func (s *SyslogLogger) Warn(v ...interface{}) {
|
||||||
s.w.Warning(fmt.Sprint(v...))
|
_ = s.w.Warning(fmt.Sprint(v...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warnf log content as Warnf and format
|
// Warnf log content as Warnf and format
|
||||||
func (s *SyslogLogger) Warnf(format string, v ...interface{}) {
|
func (s *SyslogLogger) Warnf(format string, v ...interface{}) {
|
||||||
s.w.Warning(fmt.Sprintf(format, v...))
|
_ = s.w.Warning(fmt.Sprintf(format, v...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Level shows log level
|
// Level shows log level
|
||||||
|
|
|
@ -203,7 +203,7 @@ func (m *Migrate) migrationDidRun(mig *Migration) (bool, error) {
|
||||||
func (m *Migrate) isFirstRun() bool {
|
func (m *Migrate) isFirstRun() bool {
|
||||||
row := m.db.DB().QueryRow(fmt.Sprintf("SELECT COUNT(*) FROM %s", m.options.TableName))
|
row := m.db.DB().QueryRow(fmt.Sprintf("SELECT COUNT(*) FROM %s", m.options.TableName))
|
||||||
var count int
|
var count int
|
||||||
row.Scan(&count)
|
_ = row.Scan(&count)
|
||||||
return count == 0
|
return count == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,6 +142,6 @@ func TestMissingID(t *testing.T) {
|
||||||
|
|
||||||
func tableCount(db *xorm.Engine, tableName string) (count int) {
|
func tableCount(db *xorm.Engine, tableName string) (count int) {
|
||||||
row := db.DB().QueryRow(fmt.Sprintf("SELECT COUNT(*) FROM %s", tableName))
|
row := db.DB().QueryRow(fmt.Sprintf("SELECT COUNT(*) FROM %s", tableName))
|
||||||
row.Scan(&count)
|
_ = row.Scan(&count)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
2
rows.go
2
rows.go
|
@ -40,7 +40,7 @@ func newRows(session *Session, bean interface{}) (*Rows, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(session.statement.TableName()) <= 0 {
|
if len(session.statement.TableName()) == 0 {
|
||||||
return nil, ErrTableNotFound
|
return nil, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
6
scan.go
6
scan.go
|
@ -235,6 +235,7 @@ func (engine *Engine) row2mapInterface(rows *core.Rows, types []*sql.ColumnType,
|
||||||
return resultsMap, nil
|
return resultsMap, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScanInterfaceMap scan result from *core.Rows and return a map
|
||||||
func (engine *Engine) ScanInterfaceMap(rows *core.Rows) (map[string]interface{}, error) {
|
func (engine *Engine) ScanInterfaceMap(rows *core.Rows) (map[string]interface{}, error) {
|
||||||
fields, err := rows.Columns()
|
fields, err := rows.Columns()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -248,6 +249,7 @@ func (engine *Engine) ScanInterfaceMap(rows *core.Rows) (map[string]interface{},
|
||||||
return engine.row2mapInterface(rows, types, fields)
|
return engine.row2mapInterface(rows, types, fields)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScanInterfaceMaps scan results from *core.Rows and return a slice of map
|
||||||
func (engine *Engine) ScanInterfaceMaps(rows *core.Rows) (resultsSlice []map[string]interface{}, err error) {
|
func (engine *Engine) ScanInterfaceMaps(rows *core.Rows) (resultsSlice []map[string]interface{}, err error) {
|
||||||
fields, err := rows.Columns()
|
fields, err := rows.Columns()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -309,6 +311,7 @@ func (engine *Engine) row2mapStr(rows *core.Rows, types []*sql.ColumnType, field
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScanStringMap scan results from *core.Rows and return a map
|
||||||
func (engine *Engine) ScanStringMap(rows *core.Rows) (map[string]string, error) {
|
func (engine *Engine) ScanStringMap(rows *core.Rows) (map[string]string, error) {
|
||||||
fields, err := rows.Columns()
|
fields, err := rows.Columns()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -321,6 +324,7 @@ func (engine *Engine) ScanStringMap(rows *core.Rows) (map[string]string, error)
|
||||||
return engine.row2mapStr(rows, types, fields)
|
return engine.row2mapStr(rows, types, fields)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScanStringMaps scan results from *core.Rows and return a slice of map
|
||||||
func (engine *Engine) ScanStringMaps(rows *core.Rows) (resultsSlice []map[string]string, err error) {
|
func (engine *Engine) ScanStringMaps(rows *core.Rows) (resultsSlice []map[string]string, err error) {
|
||||||
fields, err := rows.Columns()
|
fields, err := rows.Columns()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -395,6 +399,7 @@ func (engine *Engine) row2sliceStr(rows *core.Rows, types []*sql.ColumnType, fie
|
||||||
return results, nil
|
return results, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScanStringSlice scan results from *core.Rows and return a slice of one row
|
||||||
func (engine *Engine) ScanStringSlice(rows *core.Rows) ([]string, error) {
|
func (engine *Engine) ScanStringSlice(rows *core.Rows) ([]string, error) {
|
||||||
fields, err := rows.Columns()
|
fields, err := rows.Columns()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -408,6 +413,7 @@ func (engine *Engine) ScanStringSlice(rows *core.Rows) ([]string, error) {
|
||||||
return engine.row2sliceStr(rows, types, fields)
|
return engine.row2sliceStr(rows, types, fields)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScanStringSlices scan results from *core.Rows and return a slice of all rows
|
||||||
func (engine *Engine) ScanStringSlices(rows *core.Rows) (resultsSlice [][]string, err error) {
|
func (engine *Engine) ScanStringSlices(rows *core.Rows) (resultsSlice [][]string, err error) {
|
||||||
fields, err := rows.Columns()
|
fields, err := rows.Columns()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -32,7 +32,7 @@ func NewIndex(name string, indexType int) *Index {
|
||||||
func (index *Index) XName(tableName string) string {
|
func (index *Index) XName(tableName string) string {
|
||||||
if !strings.HasPrefix(index.Name, "UQE_") &&
|
if !strings.HasPrefix(index.Name, "UQE_") &&
|
||||||
!strings.HasPrefix(index.Name, "IDX_") {
|
!strings.HasPrefix(index.Name, "IDX_") {
|
||||||
tableParts := strings.Split(strings.Replace(tableName, `"`, "", -1), ".")
|
tableParts := strings.Split(strings.ReplaceAll(tableName, `"`, ""), ".")
|
||||||
tableName = tableParts[len(tableParts)-1]
|
tableName = tableParts[len(tableParts)-1]
|
||||||
if index.Type == UniqueType {
|
if index.Type == UniqueType {
|
||||||
return fmt.Sprintf("UQE_%v_%v", tableName, index.Name)
|
return fmt.Sprintf("UQE_%v_%v", tableName, index.Name)
|
||||||
|
|
|
@ -37,7 +37,7 @@ func (q Quoter) IsEmpty() bool {
|
||||||
// Quote quote a string
|
// Quote quote a string
|
||||||
func (q Quoter) Quote(s string) string {
|
func (q Quoter) Quote(s string) string {
|
||||||
var buf strings.Builder
|
var buf strings.Builder
|
||||||
q.QuoteTo(&buf, s)
|
_ = q.QuoteTo(&buf, s)
|
||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ func (q Quoter) Trim(s string) string {
|
||||||
// Join joins a slice with quoters
|
// Join joins a slice with quoters
|
||||||
func (q Quoter) Join(a []string, sep string) string {
|
func (q Quoter) Join(a []string, sep string) string {
|
||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
q.JoinWrite(&b, a, sep)
|
_ = q.JoinWrite(&b, a, sep)
|
||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +86,9 @@ func (q Quoter) JoinWrite(b *strings.Builder, a []string, sep string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
q.QuoteTo(b, strings.TrimSpace(s))
|
if err := q.QuoteTo(b, strings.TrimSpace(s)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -121,7 +123,7 @@ func findStart(value string, start int) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value[k] == 'A' || value[k] == 'a') && (value[k+1] == 'S' || value[k+1] == 's') {
|
if (value[k] == 'A' || value[k] == 'a') && (value[k+1] == 'S' || value[k+1] == 's') {
|
||||||
k = k + 2
|
k += 2
|
||||||
}
|
}
|
||||||
|
|
||||||
for j := k; j < len(value); j++ {
|
for j := k; j < len(value); j++ {
|
||||||
|
|
|
@ -45,7 +45,8 @@ func TestAlwaysQuoteTo(t *testing.T) {
|
||||||
for _, v := range kases {
|
for _, v := range kases {
|
||||||
t.Run(v.value, func(t *testing.T) {
|
t.Run(v.value, func(t *testing.T) {
|
||||||
buf := &strings.Builder{}
|
buf := &strings.Builder{}
|
||||||
quoter.QuoteTo(buf, v.value)
|
err := quoter.QuoteTo(buf, v.value)
|
||||||
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, v.expected, buf.String())
|
assert.EqualValues(t, v.expected, buf.String())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -54,10 +55,7 @@ func TestAlwaysQuoteTo(t *testing.T) {
|
||||||
func TestReversedQuoteTo(t *testing.T) {
|
func TestReversedQuoteTo(t *testing.T) {
|
||||||
var (
|
var (
|
||||||
quoter = Quoter{'[', ']', func(s string) bool {
|
quoter = Quoter{'[', ']', func(s string) bool {
|
||||||
if s == "mytable" {
|
return s == "mytable"
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}}
|
}}
|
||||||
kases = []struct {
|
kases = []struct {
|
||||||
expected string
|
expected string
|
||||||
|
@ -118,7 +116,8 @@ func TestNoQuoteTo(t *testing.T) {
|
||||||
for _, v := range kases {
|
for _, v := range kases {
|
||||||
t.Run(v.value, func(t *testing.T) {
|
t.Run(v.value, func(t *testing.T) {
|
||||||
buf := &strings.Builder{}
|
buf := &strings.Builder{}
|
||||||
quoter.QuoteTo(buf, v.value)
|
err := quoter.QuoteTo(buf, v.value)
|
||||||
|
assert.NoError(t, err)
|
||||||
assert.EqualValues(t, v.expected, buf.String())
|
assert.EqualValues(t, v.expected, buf.String())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -704,7 +704,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
|
||||||
if idx, ok = tempMap[lKey]; !ok {
|
if idx, ok = tempMap[lKey]; !ok {
|
||||||
idx = 0
|
idx = 0
|
||||||
} else {
|
} else {
|
||||||
idx = idx + 1
|
idx++
|
||||||
}
|
}
|
||||||
tempMap[lKey] = idx
|
tempMap[lKey] = idx
|
||||||
|
|
||||||
|
|
|
@ -232,7 +232,7 @@ func (session *Session) Delete(beans ...interface{}) (int64, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if cacher := session.engine.GetCacher(tableNameNoQuote); cacher != nil && session.statement.UseCache {
|
if cacher := session.engine.GetCacher(tableNameNoQuote); cacher != nil && session.statement.UseCache {
|
||||||
session.cacheDelete(table, tableNameNoQuote, deleteSQL, argsForCache...)
|
_ = session.cacheDelete(table, tableNameNoQuote, deleteSQL, argsForCache...)
|
||||||
}
|
}
|
||||||
|
|
||||||
session.statement.RefTable = table
|
session.statement.RefTable = table
|
||||||
|
|
|
@ -71,7 +71,11 @@ func (session *Session) FindAndCount(rowsSlicePtr interface{}, condiBean ...inte
|
||||||
}
|
}
|
||||||
|
|
||||||
// session has stored the conditions so we use `unscoped` to avoid duplicated condition.
|
// session has stored the conditions so we use `unscoped` to avoid duplicated condition.
|
||||||
return session.Unscoped().Count(reflect.New(sliceElementType).Interface())
|
if sliceElementType.Kind() == reflect.Struct {
|
||||||
|
return session.Unscoped().Count(reflect.New(sliceElementType).Interface())
|
||||||
|
}
|
||||||
|
|
||||||
|
return session.Unscoped().Count()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) error {
|
func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) error {
|
||||||
|
@ -152,7 +156,6 @@ func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{})
|
||||||
if err != ErrCacheFailed {
|
if err != ErrCacheFailed {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = nil // !nashtsai! reset err to nil for ErrCacheFailed
|
|
||||||
session.engine.logger.Warnf("Cache Find Failed")
|
session.engine.logger.Warnf("Cache Find Failed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ package xorm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"database/sql/driver"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
@ -79,7 +78,7 @@ func (session *Session) get(beans ...interface{}) (bool, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if session.statement.RawSQL == "" {
|
if session.statement.RawSQL == "" {
|
||||||
if len(session.statement.TableName()) <= 0 {
|
if len(session.statement.TableName()) == 0 {
|
||||||
return false, ErrTableNotFound
|
return false, ErrTableNotFound
|
||||||
}
|
}
|
||||||
session.statement.Limit(1)
|
session.statement.Limit(1)
|
||||||
|
@ -130,14 +129,6 @@ func (session *Session) get(beans ...interface{}) (bool, error) {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
|
||||||
valuerTypePlaceHolder driver.Valuer
|
|
||||||
valuerType = reflect.TypeOf(&valuerTypePlaceHolder).Elem()
|
|
||||||
|
|
||||||
conversionTypePlaceHolder convert.Conversion
|
|
||||||
conversionType = reflect.TypeOf(&conversionTypePlaceHolder).Elem()
|
|
||||||
)
|
|
||||||
|
|
||||||
func isScannableStruct(bean interface{}, typeLen int) bool {
|
func isScannableStruct(bean interface{}, typeLen int) bool {
|
||||||
switch bean.(type) {
|
switch bean.(type) {
|
||||||
case *time.Time:
|
case *time.Time:
|
||||||
|
|
|
@ -80,7 +80,7 @@ func (session *Session) insertMultipleStruct(rowsSlicePtr interface{}) (int64, e
|
||||||
}
|
}
|
||||||
|
|
||||||
tableName := session.statement.TableName()
|
tableName := session.statement.TableName()
|
||||||
if len(tableName) <= 0 {
|
if len(tableName) == 0 {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +90,6 @@ func (session *Session) insertMultipleStruct(rowsSlicePtr interface{}) (int64, e
|
||||||
colNames []string
|
colNames []string
|
||||||
colMultiPlaces []string
|
colMultiPlaces []string
|
||||||
args []interface{}
|
args []interface{}
|
||||||
cols []*schemas.Column
|
|
||||||
)
|
)
|
||||||
|
|
||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
|
@ -172,7 +171,6 @@ func (session *Session) insertMultipleStruct(rowsSlicePtr interface{}) (int64, e
|
||||||
|
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
colNames = append(colNames, col.Name)
|
colNames = append(colNames, col.Name)
|
||||||
cols = append(cols, col)
|
|
||||||
}
|
}
|
||||||
colPlaces = append(colPlaces, "?")
|
colPlaces = append(colPlaces, "?")
|
||||||
}
|
}
|
||||||
|
@ -203,7 +201,7 @@ func (session *Session) insertMultipleStruct(rowsSlicePtr interface{}) (int64, e
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
session.cacheInsert(tableName)
|
_ = session.cacheInsert(tableName)
|
||||||
|
|
||||||
lenAfterClosures := len(session.afterClosures)
|
lenAfterClosures := len(session.afterClosures)
|
||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
|
@ -257,7 +255,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) {
|
||||||
if err := session.statement.SetRefBean(bean); err != nil {
|
if err := session.statement.SetRefBean(bean); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
if len(session.statement.TableName()) <= 0 {
|
if len(session.statement.TableName()) == 0 {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,7 +358,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) {
|
||||||
|
|
||||||
defer handleAfterInsertProcessorFunc(bean)
|
defer handleAfterInsertProcessorFunc(bean)
|
||||||
|
|
||||||
session.cacheInsert(tableName)
|
_ = session.cacheInsert(tableName)
|
||||||
|
|
||||||
if table.Version != "" && session.statement.CheckVersion {
|
if table.Version != "" && session.statement.CheckVersion {
|
||||||
verValue, err := table.VersionColumn().ValueOf(bean)
|
verValue, err := table.VersionColumn().ValueOf(bean)
|
||||||
|
@ -390,7 +388,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) {
|
||||||
|
|
||||||
defer handleAfterInsertProcessorFunc(bean)
|
defer handleAfterInsertProcessorFunc(bean)
|
||||||
|
|
||||||
session.cacheInsert(tableName)
|
_ = session.cacheInsert(tableName)
|
||||||
|
|
||||||
if table.Version != "" && session.statement.CheckVersion {
|
if table.Version != "" && session.statement.CheckVersion {
|
||||||
verValue, err := table.VersionColumn().ValueOf(bean)
|
verValue, err := table.VersionColumn().ValueOf(bean)
|
||||||
|
@ -430,6 +428,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) {
|
||||||
// InsertOne insert only one struct into database as a record.
|
// InsertOne insert only one struct into database as a record.
|
||||||
// The in parameter bean must a struct or a point to struct. The return
|
// The in parameter bean must a struct or a point to struct. The return
|
||||||
// parameter is inserted and error
|
// parameter is inserted and error
|
||||||
|
// Deprecated: Please use Insert directly
|
||||||
func (session *Session) InsertOne(bean interface{}) (int64, error) {
|
func (session *Session) InsertOne(bean interface{}) (int64, error) {
|
||||||
if session.isAutoClose {
|
if session.isAutoClose {
|
||||||
defer session.Close()
|
defer session.Close()
|
||||||
|
@ -537,7 +536,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err
|
||||||
}
|
}
|
||||||
|
|
||||||
tableName := session.statement.TableName()
|
tableName := session.statement.TableName()
|
||||||
if len(tableName) <= 0 {
|
if len(tableName) == 0 {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -559,12 +558,12 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) insertMultipleMapInterface(maps []map[string]interface{}) (int64, error) {
|
func (session *Session) insertMultipleMapInterface(maps []map[string]interface{}) (int64, error) {
|
||||||
if len(maps) <= 0 {
|
if len(maps) == 0 {
|
||||||
return 0, ErrNoElementsOnSlice
|
return 0, ErrNoElementsOnSlice
|
||||||
}
|
}
|
||||||
|
|
||||||
tableName := session.statement.TableName()
|
tableName := session.statement.TableName()
|
||||||
if len(tableName) <= 0 {
|
if len(tableName) == 0 {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -595,7 +594,7 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
tableName := session.statement.TableName()
|
tableName := session.statement.TableName()
|
||||||
if len(tableName) <= 0 {
|
if len(tableName) == 0 {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -618,12 +617,12 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) insertMultipleMapString(maps []map[string]string) (int64, error) {
|
func (session *Session) insertMultipleMapString(maps []map[string]string) (int64, error) {
|
||||||
if len(maps) <= 0 {
|
if len(maps) == 0 {
|
||||||
return 0, ErrNoElementsOnSlice
|
return 0, ErrNoElementsOnSlice
|
||||||
}
|
}
|
||||||
|
|
||||||
tableName := session.statement.TableName()
|
tableName := session.statement.TableName()
|
||||||
if len(tableName) <= 0 {
|
if len(tableName) == 0 {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -650,7 +649,7 @@ func (session *Session) insertMultipleMapString(maps []map[string]string) (int64
|
||||||
|
|
||||||
func (session *Session) insertMap(columns []string, args []interface{}) (int64, error) {
|
func (session *Session) insertMap(columns []string, args []interface{}) (int64, error) {
|
||||||
tableName := session.statement.TableName()
|
tableName := session.statement.TableName()
|
||||||
if len(tableName) <= 0 {
|
if len(tableName) == 0 {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -677,7 +676,7 @@ func (session *Session) insertMap(columns []string, args []interface{}) (int64,
|
||||||
|
|
||||||
func (session *Session) insertMultipleMap(columns []string, argss [][]interface{}) (int64, error) {
|
func (session *Session) insertMultipleMap(columns []string, argss [][]interface{}) (int64, error) {
|
||||||
tableName := session.statement.TableName()
|
tableName := session.statement.TableName()
|
||||||
if len(tableName) <= 0 {
|
if len(tableName) == 0 {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
start = start + slice.Elem().Len()
|
start += slice.Elem().Len()
|
||||||
if pLimitN != nil && start+bufferSize > *pLimitN {
|
if pLimitN != nil && start+bufferSize > *pLimitN {
|
||||||
bufferSize = *pLimitN - start
|
bufferSize = *pLimitN - start
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,24 +223,6 @@ func (session *Session) isTableEmpty(tableName string) (bool, error) {
|
||||||
return total == 0, nil
|
return total == 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// find if index is exist according cols
|
|
||||||
func (session *Session) isIndexExist2(tableName string, cols []string, unique bool) (bool, error) {
|
|
||||||
indexes, err := session.engine.dialect.GetIndexes(session.getQueryer(), session.ctx, tableName)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, index := range indexes {
|
|
||||||
if utils.SliceEq(index.Cols, cols) {
|
|
||||||
if unique {
|
|
||||||
return index.Type == schemas.UniqueType, nil
|
|
||||||
}
|
|
||||||
return index.Type == schemas.IndexType, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (session *Session) addColumn(colName string) error {
|
func (session *Session) addColumn(colName string) error {
|
||||||
col := session.statement.RefTable.GetColumn(colName)
|
col := session.statement.RefTable.GetColumn(colName)
|
||||||
sql := session.engine.dialect.AddColumnSQL(session.statement.TableName(), col)
|
sql := session.engine.dialect.AddColumnSQL(session.statement.TableName(), col)
|
||||||
|
|
|
@ -75,7 +75,7 @@ func (session *Session) Commit() error {
|
||||||
}
|
}
|
||||||
cleanUpFunc := func(slices *map[interface{}]*[]func(interface{})) {
|
cleanUpFunc := func(slices *map[interface{}]*[]func(interface{})) {
|
||||||
if len(*slices) > 0 {
|
if len(*slices) > 0 {
|
||||||
*slices = make(map[interface{}]*[]func(interface{}), 0)
|
*slices = make(map[interface{}]*[]func(interface{}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cleanUpFunc(&session.afterInsertBeans)
|
cleanUpFunc(&session.afterInsertBeans)
|
||||||
|
|
|
@ -22,6 +22,7 @@ var (
|
||||||
ErrNoColumnsTobeUpdated = errors.New("no columns found to be updated")
|
ErrNoColumnsTobeUpdated = errors.New("no columns found to be updated")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//revive:disable
|
||||||
func (session *Session) cacheUpdate(table *schemas.Table, tableName, sqlStr string, args ...interface{}) error {
|
func (session *Session) cacheUpdate(table *schemas.Table, tableName, sqlStr string, args ...interface{}) error {
|
||||||
if table == nil ||
|
if table == nil ||
|
||||||
session.tx != nil {
|
session.tx != nil {
|
||||||
|
@ -39,7 +40,7 @@ func (session *Session) cacheUpdate(table *schemas.Table, tableName, sqlStr stri
|
||||||
|
|
||||||
var nStart int
|
var nStart int
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
if strings.Index(sqlStr, "?") > -1 {
|
if strings.Contains(sqlStr, "?") {
|
||||||
nStart = strings.Count(oldhead, "?")
|
nStart = strings.Count(oldhead, "?")
|
||||||
} else {
|
} else {
|
||||||
// only for pq, TODO: if any other databse?
|
// only for pq, TODO: if any other databse?
|
||||||
|
@ -182,7 +183,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(session.statement.TableName()) <= 0 {
|
if len(session.statement.TableName()) == 0 {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,7 +343,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(colNames) <= 0 {
|
if len(colNames) == 0 {
|
||||||
return 0, ErrNoColumnsTobeUpdated
|
return 0, ErrNoColumnsTobeUpdated
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,7 +357,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
|
||||||
}
|
}
|
||||||
|
|
||||||
if st.OrderStr != "" {
|
if st.OrderStr != "" {
|
||||||
condSQL = condSQL + fmt.Sprintf(" ORDER BY %v", st.OrderStr)
|
condSQL += fmt.Sprintf(" ORDER BY %v", st.OrderStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
var tableName = session.statement.TableName()
|
var tableName = session.statement.TableName()
|
||||||
|
@ -366,7 +367,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
|
||||||
limitValue := *st.LimitN
|
limitValue := *st.LimitN
|
||||||
switch session.engine.dialect.URI().DBType {
|
switch session.engine.dialect.URI().DBType {
|
||||||
case schemas.MYSQL:
|
case schemas.MYSQL:
|
||||||
condSQL = condSQL + fmt.Sprintf(" LIMIT %d", limitValue)
|
condSQL += fmt.Sprintf(" LIMIT %d", limitValue)
|
||||||
case schemas.SQLITE:
|
case schemas.SQLITE:
|
||||||
tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", limitValue)
|
tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", limitValue)
|
||||||
cond = cond.And(builder.Expr(fmt.Sprintf("rowid IN (SELECT rowid FROM %v %v)",
|
cond = cond.And(builder.Expr(fmt.Sprintf("rowid IN (SELECT rowid FROM %v %v)",
|
||||||
|
|
Loading…
Reference in New Issue
Block a user