From 6570d21d07f259b110f87baa4369cce5a6b4349d Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 13:01:01 +0200 Subject: [PATCH 01/17] Added test environment for m$sql --- .drone.yml | 23 +++++++++++++++++++++++ Makefile | 19 ++++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/.drone.yml b/.drone.yml index 6ab40a39d32e5..3a0f5f2469214 100644 --- a/.drone.yml +++ b/.drone.yml @@ -172,6 +172,20 @@ pipeline: when: event: [ push, tag, pull_request ] + test-mssql: + image: golang:1.10 + pull: true + group: test + environment: + TAGS: bindata + TEST_LDAP: "1" + commands: + - curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash + - apt-get install -y git-lfs + - make test-mssql + when: + event: [ push, tag, pull_request ] + generate-coverage: image: golang:1.10 pull: true @@ -342,6 +356,15 @@ services: when: event: [ push, tag, pull_request ] + mssql: + image: microsoft/mssql-server-linux:latest + environment: + - ACCEPT_EULA=Y + - SA_PASSWORD=M$wantsaSecurePassword + - MSSQL_PID=Standard + when: + event: [ push, tag, pull_request ] + ldap: image: gitea/test-openldap:latest when: diff --git a/Makefile b/Makefile index c052ebbb080ab..84fa016e4c2c8 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,10 @@ TEST_PGSQL_HOST ?= pgsql:5432 TEST_PGSQL_DBNAME ?= testgitea TEST_PGSQL_USERNAME ?= postgres TEST_PGSQL_PASSWORD ?= postgres +TEST_MSSQL_HOST ?= mssql:1433 +TEST_MSSQL_DBNAME ?= testgitea +TEST_MSSQL_USERNAME ?= sa +TEST_MSSQL_PASSWORD ?= M$wantsaSecurePassword ifeq ($(OS), Windows_NT) EXECUTABLE := gitea.exe @@ -65,9 +69,9 @@ clean: $(GO) clean -i ./... rm -rf $(EXECUTABLE) $(DIST) $(BINDATA) \ integrations*.test \ - integrations/gitea-integration-pgsql/ integrations/gitea-integration-mysql/ integrations/gitea-integration-sqlite/ \ - integrations/indexers-mysql/ integrations/indexers-pgsql integrations/indexers-sqlite \ - integrations/mysql.ini integrations/pgsql.ini + integrations/gitea-integration-pgsql/ integrations/gitea-integration-mysql/ integrations/gitea-integration-sqlite/ integrations/gitea-integration-mssql/ \ + integrations/indexers-mysql/ integrations/indexers-pgsql integrations/indexers-sqlite integrations/indexers-mssql \ + integrations/mysql.ini integrations/pgsql.ini integrations/mssql.ini .PHONY: fmt fmt: @@ -192,6 +196,11 @@ generate-ini: -e 's|{{TEST_PGSQL_USERNAME}}|${TEST_PGSQL_USERNAME}|g' \ -e 's|{{TEST_PGSQL_PASSWORD}}|${TEST_PGSQL_PASSWORD}|g' \ integrations/pgsql.ini.tmpl > integrations/pgsql.ini + sed -e 's|{{TEST_MSSQL_HOST}}|${TEST_MSSQL_HOST}|g' \ + -e 's|{{TEST_MSSQL_DBNAME}}|${TEST_MSSQL_DBNAME}|g' \ + -e 's|{{TEST_MSSQL_USERNAME}}|${TEST_MSSQL_USERNAME}|g' \ + -e 's|{{TEST_MSSQL_PASSWORD}}|${TEST_MSSQL_PASSWORD}|g' \ + integrations/mssql.ini.tmpl > integrations/mssql.ini .PHONY: test-mysql test-mysql: integrations.test generate-ini @@ -201,6 +210,10 @@ test-mysql: integrations.test generate-ini test-pgsql: integrations.test generate-ini GITEA_ROOT=${CURDIR} GITEA_CONF=integrations/pgsql.ini ./integrations.test +.PHONY: test-mssql +test-mssql: integrations.test generate-ini + GITEA_ROOT=${CURDIR} GITEA_CONF=integrations/mssql.ini ./integrations.test + .PHONY: bench-sqlite bench-sqlite: integrations.sqlite.test GITEA_ROOT=${CURDIR} GITEA_CONF=integrations/sqlite.ini ./integrations.sqlite.test -test.cpuprofile=cpu.out -test.run DontRunTests -test.bench . From d365cd6bfe84c5ff5ab7e01625df97622db9a2a0 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 13:19:40 +0200 Subject: [PATCH 02/17] Added template for test environment for m$sql --- .gitignore | 3 ++ integrations/mssql.ini.tmpl | 72 +++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 integrations/mssql.ini.tmpl diff --git a/.gitignore b/.gitignore index 9a5f01bb94c43..941ec41e045f1 100644 --- a/.gitignore +++ b/.gitignore @@ -53,11 +53,14 @@ coverage.all /integrations/gitea-integration-mysql /integrations/gitea-integration-pgsql /integrations/gitea-integration-sqlite +/integrations/gitea-integration-mssql /integrations/indexers-mysql /integrations/indexers-pgsql /integrations/indexers-sqlite +/integrations/indexers-mssql /integrations/mysql.ini /integrations/pgsql.ini +/integrations/mssql.ini /node_modules diff --git a/integrations/mssql.ini.tmpl b/integrations/mssql.ini.tmpl new file mode 100644 index 0000000000000..08f7e9ca3738e --- /dev/null +++ b/integrations/mssql.ini.tmpl @@ -0,0 +1,72 @@ +APP_NAME = Gitea: Git with a cup of tea +RUN_MODE = prod + +[database] +DB_TYPE = mssql +HOST = {{TEST_MSSQL_HOST}} +NAME = {{TEST_MSSQL_DBNAME}} +USER = {{TEST_MSSQL_USERNAME}} +PASSWD = {{TEST_MSSQL_PASSWORD}} +SSL_MODE = disable + +[indexer] +ISSUE_INDEXER_PATH = integrations/indexers-mssql/issues.bleve +REPO_INDEXER_ENABLED = true +REPO_INDEXER_PATH = integrations/indexers-mssql/repos.bleve + +[repository] +ROOT = integrations/gitea-integration-mssql/gitea-repositories + +[repository.local] +LOCAL_COPY_PATH = tmp/local-repo-mssql +LOCAL_WIKI_PATH = tmp/local-wiki-mssql + +[server] +SSH_DOMAIN = localhost +HTTP_PORT = 3003 +ROOT_URL = http://localhost:3003/ +DISABLE_SSH = false +SSH_LISTEN_HOST = localhost +SSH_PORT = 2201 +START_SSH_SERVER = true +LFS_START_SERVER = true +LFS_CONTENT_PATH = data/lfs-mssql +OFFLINE_MODE = false +LFS_JWT_SECRET = Tv_MjmZuHqpIY6GFl12ebgkRAMt4RlWt0v4EHKSXO0w +APP_DATA_PATH = integrations/gitea-integration-mssql/data + +[mailer] +ENABLED = false + +[service] +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = false +DISABLE_REGISTRATION = false +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false +DEFAULT_KEEP_EMAIL_PRIVATE = false +DEFAULT_ALLOW_CREATE_ORGANIZATION = true +NO_REPLY_ADDRESS = noreply.example.org + +[picture] +DISABLE_GRAVATAR = false +ENABLE_FEDERATED_AVATAR = false + +[session] +PROVIDER = file +PROVIDER_CONFIG = data/sessions-mssql + +[log] +MODE = console,file +ROOT_PATH = mssql-log + +[log.console] +LEVEL = Warn + +[log.file] +LEVEL = Debug + +[security] +INSTALL_LOCK = true +SECRET_KEY = 9pCviYTWSb +INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTU1NTE2MTh9.hhSVGOANkaKk3vfCd2jDOIww4pUk0xtg9JRde5UogyQ From 2aa2f1988def804011d6e06e6d507a02597412ff Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 13:27:56 +0200 Subject: [PATCH 03/17] Fix password --- .drone.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 3a0f5f2469214..dceedb47d5db4 100644 --- a/.drone.yml +++ b/.drone.yml @@ -360,7 +360,7 @@ services: image: microsoft/mssql-server-linux:latest environment: - ACCEPT_EULA=Y - - SA_PASSWORD=M$wantsaSecurePassword + - SA_PASSWORD=M$wantsaSecurePassword1 - MSSQL_PID=Standard when: event: [ push, tag, pull_request ] diff --git a/Makefile b/Makefile index 84fa016e4c2c8..595fdeaed544b 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ TEST_PGSQL_PASSWORD ?= postgres TEST_MSSQL_HOST ?= mssql:1433 TEST_MSSQL_DBNAME ?= testgitea TEST_MSSQL_USERNAME ?= sa -TEST_MSSQL_PASSWORD ?= M$wantsaSecurePassword +TEST_MSSQL_PASSWORD ?= M$wantsaSecurePassword1 ifeq ($(OS), Windows_NT) EXECUTABLE := gitea.exe From 38e8b9c4d312f13e41108ea3a92f8d9212974c74 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 14:30:00 +0200 Subject: [PATCH 04/17] Fix password (again) --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index dceedb47d5db4..f2727ad34d5f6 100644 --- a/.drone.yml +++ b/.drone.yml @@ -360,7 +360,7 @@ services: image: microsoft/mssql-server-linux:latest environment: - ACCEPT_EULA=Y - - SA_PASSWORD=M$wantsaSecurePassword1 + - SA_PASSWORD='M$wantsaSecurePassword1' - MSSQL_PID=Standard when: event: [ push, tag, pull_request ] From 6e3e4587153569273f9068186e4bc4f4cf23080d Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 14:55:36 +0200 Subject: [PATCH 05/17] Fix password (again again) --- .drone.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index f2727ad34d5f6..1a2eb36a37ec1 100644 --- a/.drone.yml +++ b/.drone.yml @@ -360,7 +360,7 @@ services: image: microsoft/mssql-server-linux:latest environment: - ACCEPT_EULA=Y - - SA_PASSWORD='M$wantsaSecurePassword1' + - SA_PASSWORD=MwantsaSecurePassword1 - MSSQL_PID=Standard when: event: [ push, tag, pull_request ] diff --git a/Makefile b/Makefile index 595fdeaed544b..2c90634453ada 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ TEST_PGSQL_PASSWORD ?= postgres TEST_MSSQL_HOST ?= mssql:1433 TEST_MSSQL_DBNAME ?= testgitea TEST_MSSQL_USERNAME ?= sa -TEST_MSSQL_PASSWORD ?= M$wantsaSecurePassword1 +TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1 ifeq ($(OS), Windows_NT) EXECUTABLE := gitea.exe From f03fc160ba0ddaa50f3a4f327e0334d6ad81dbc5 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 16:24:39 +0200 Subject: [PATCH 06/17] Fix db --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2c90634453ada..1b0773970f6a8 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ TEST_PGSQL_DBNAME ?= testgitea TEST_PGSQL_USERNAME ?= postgres TEST_PGSQL_PASSWORD ?= postgres TEST_MSSQL_HOST ?= mssql:1433 -TEST_MSSQL_DBNAME ?= testgitea +TEST_MSSQL_DBNAME ?= master TEST_MSSQL_USERNAME ?= sa TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1 From 002b30056fe569fbfc84dccabc4afde8036c01ba Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 16:30:09 +0200 Subject: [PATCH 07/17] Ci trigger (Looking at you drone....) --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 1b0773970f6a8..04cf4c7c6caec 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,7 @@ TEST_MSSQL_DBNAME ?= master TEST_MSSQL_USERNAME ?= sa TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1 + ifeq ($(OS), Windows_NT) EXECUTABLE := gitea.exe else From fa731e2bcee4173e96f10ec8a3f2651390f49978 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 16:30:26 +0200 Subject: [PATCH 08/17] Ci trigger (Looking at you drone....) --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 04cf4c7c6caec..1b0773970f6a8 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,6 @@ TEST_MSSQL_DBNAME ?= master TEST_MSSQL_USERNAME ?= sa TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1 - ifeq ($(OS), Windows_NT) EXECUTABLE := gitea.exe else From 8b2e67ec9a121b35cd290bf2eb15ef8a5c9c0709 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 16:31:12 +0200 Subject: [PATCH 09/17] Ci trigger (Looking at you drone....) --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 1b0773970f6a8..4cf766b26d70f 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,7 @@ TEST_PGSQL_DBNAME ?= testgitea TEST_PGSQL_USERNAME ?= postgres TEST_PGSQL_PASSWORD ?= postgres TEST_MSSQL_HOST ?= mssql:1433 + TEST_MSSQL_DBNAME ?= master TEST_MSSQL_USERNAME ?= sa TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1 From f5069eb574f8c713821b21ee9c5c28d026e17ac9 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 16:31:18 +0200 Subject: [PATCH 10/17] Ci trigger (Looking at you drone....) --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 4cf766b26d70f..1b0773970f6a8 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,6 @@ TEST_PGSQL_DBNAME ?= testgitea TEST_PGSQL_USERNAME ?= postgres TEST_PGSQL_PASSWORD ?= postgres TEST_MSSQL_HOST ?= mssql:1433 - TEST_MSSQL_DBNAME ?= master TEST_MSSQL_USERNAME ?= sa TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1 From 3fc4bb3bb07d465321334777004f44c8c1b95809 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Thu, 5 Jul 2018 16:55:27 +0200 Subject: [PATCH 11/17] Create master database for mssql integration tests Signed-off-by: Jonas Franz --- integrations/integration_test.go | 13 +++++++++++++ models/models.go | 5 +++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/integrations/integration_test.go b/integrations/integration_test.go index 664290cc9da32..847bcd9ea430e 100644 --- a/integrations/integration_test.go +++ b/integrations/integration_test.go @@ -130,6 +130,19 @@ func initIntegrationTest() { if _, err = db.Exec("CREATE DATABASE testgitea"); err != nil { log.Fatalf("db.Exec: %v", err) } + case setting.UseMSSQL: + host, port := models.ParseMSSQLHostPort(models.DbCfg.Host) + db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", + host, port, models.DbCfg.Name, models.DbCfg.User, models.DbCfg.Passwd)) + defer db.Close() + if err != nil { + log.Fatalf("sql.Open: %v", err) + } + // FIXME: what happens if the database already exists? ¯\_(ツ)_/¯ + if _, err := db.Exec("CREATE DATABASE master"); err != nil { + log.Fatalf("db.Exec: %v", err) + } + } routers.GlobalInit() } diff --git a/models/models.go b/models/models.go index 5743f1862db94..329750609d75d 100644 --- a/models/models.go +++ b/models/models.go @@ -197,7 +197,8 @@ func getPostgreSQLConnectionString(DBHost, DBUser, DBPasswd, DBName, DBParam, DB return } -func parseMSSQLHostPort(info string) (string, string) { +// ParseMSSQLHostPort splits the host into host and port +func ParseMSSQLHostPort(info string) (string, string) { host, port := "127.0.0.1", "1433" if strings.Contains(info, ":") { host = strings.Split(info, ":")[0] @@ -229,7 +230,7 @@ func getEngine() (*xorm.Engine, error) { case "postgres": connStr = getPostgreSQLConnectionString(DbCfg.Host, DbCfg.User, DbCfg.Passwd, DbCfg.Name, Param, DbCfg.SSLMode) case "mssql": - host, port := parseMSSQLHostPort(DbCfg.Host) + host, port := ParseMSSQLHostPort(DbCfg.Host) connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, DbCfg.Name, DbCfg.User, DbCfg.Passwd) case "sqlite3": if !EnableSQLite3 { From 1c7c44fa0583c3ef5f886d88d5efbdea90be3e91 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Thu, 5 Jul 2018 17:34:24 +0200 Subject: [PATCH 12/17] Create database only if master do not exist Signed-off-by: Jonas Franz --- integrations/integration_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/integrations/integration_test.go b/integrations/integration_test.go index 847bcd9ea430e..086d39114e94c 100644 --- a/integrations/integration_test.go +++ b/integrations/integration_test.go @@ -138,8 +138,7 @@ func initIntegrationTest() { if err != nil { log.Fatalf("sql.Open: %v", err) } - // FIXME: what happens if the database already exists? ¯\_(ツ)_/¯ - if _, err := db.Exec("CREATE DATABASE master"); err != nil { + if _, err := db.Exec("If(db_id(N'master') IS NULL) BEGIN CREATE DATABASE master; END;"); err != nil { log.Fatalf("db.Exec: %v", err) } From 729a5127235d8c80715cbea5c83c959c155b344d Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Thu, 5 Jul 2018 17:49:57 +0200 Subject: [PATCH 13/17] Fix mssql integration tests by using custom database "gitea" Signed-off-by: Jonas Franz --- Makefile | 2 +- integrations/integration_test.go | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 1b0773970f6a8..6eeaa7087ab2b 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ TEST_PGSQL_DBNAME ?= testgitea TEST_PGSQL_USERNAME ?= postgres TEST_PGSQL_PASSWORD ?= postgres TEST_MSSQL_HOST ?= mssql:1433 -TEST_MSSQL_DBNAME ?= master +TEST_MSSQL_DBNAME ?= gitea TEST_MSSQL_USERNAME ?= sa TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1 diff --git a/integrations/integration_test.go b/integrations/integration_test.go index 086d39114e94c..9e778fa35f913 100644 --- a/integrations/integration_test.go +++ b/integrations/integration_test.go @@ -47,6 +47,8 @@ func TestMain(m *testing.M) { helper = &testfixtures.PostgreSQL{} } else if setting.UseSQLite3 { helper = &testfixtures.SQLite{} + } else if setting.UseMSSQL { + helper = &testfixtures.SQLServer{} } else { fmt.Println("Unsupported RDBMS for integration tests") os.Exit(1) @@ -133,12 +135,12 @@ func initIntegrationTest() { case setting.UseMSSQL: host, port := models.ParseMSSQLHostPort(models.DbCfg.Host) db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", - host, port, models.DbCfg.Name, models.DbCfg.User, models.DbCfg.Passwd)) + host, port, "master", models.DbCfg.User, models.DbCfg.Passwd)) defer db.Close() if err != nil { log.Fatalf("sql.Open: %v", err) } - if _, err := db.Exec("If(db_id(N'master') IS NULL) BEGIN CREATE DATABASE master; END;"); err != nil { + if _, err := db.Exec("If(db_id(N'gitea') IS NULL) BEGIN CREATE DATABASE gitea; END;"); err != nil { log.Fatalf("db.Exec: %v", err) } From ed8008d7e423f07c6918706bff1fee073158ae67 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 7 Jul 2018 00:09:49 +0200 Subject: [PATCH 14/17] Moved defer --- integrations/integration_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/integrations/integration_test.go b/integrations/integration_test.go index 9e778fa35f913..554df0a70f236 100644 --- a/integrations/integration_test.go +++ b/integrations/integration_test.go @@ -136,14 +136,13 @@ func initIntegrationTest() { host, port := models.ParseMSSQLHostPort(models.DbCfg.Host) db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, "master", models.DbCfg.User, models.DbCfg.Passwd)) - defer db.Close() if err != nil { log.Fatalf("sql.Open: %v", err) } if _, err := db.Exec("If(db_id(N'gitea') IS NULL) BEGIN CREATE DATABASE gitea; END;"); err != nil { log.Fatalf("db.Exec: %v", err) } - + defer db.Close() } routers.GlobalInit() } From b2196d84a29eb642bf1f30c420af39d88a24026f Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 11 Dec 2018 16:20:16 +0100 Subject: [PATCH 15/17] bump xorm --- Gopkg.lock | 4 +- Gopkg.toml | 2 +- .../github.com/go-xorm/xorm/dialect_mssql.go | 2 +- .../github.com/go-xorm/xorm/dialect_mysql.go | 5 +- .../go-xorm/xorm/dialect_sqlite3.go | 6 +- vendor/github.com/go-xorm/xorm/engine.go | 17 +++- .../github.com/go-xorm/xorm/engine_group.go | 10 +++ .../github.com/go-xorm/xorm/engine_maxlife.go | 22 ----- vendor/github.com/go-xorm/xorm/interface.go | 9 ++- vendor/github.com/go-xorm/xorm/session.go | 15 ++++ .../github.com/go-xorm/xorm/session_delete.go | 2 +- .../github.com/go-xorm/xorm/session_find.go | 6 +- vendor/github.com/go-xorm/xorm/session_get.go | 29 ++++++- .../github.com/go-xorm/xorm/session_insert.go | 6 +- .../github.com/go-xorm/xorm/session_query.go | 80 ++++++++++++++++--- vendor/github.com/go-xorm/xorm/session_raw.go | 26 +++++- .../github.com/go-xorm/xorm/session_update.go | 6 +- vendor/github.com/go-xorm/xorm/statement.go | 6 +- vendor/github.com/go-xorm/xorm/xorm.go | 2 + 19 files changed, 196 insertions(+), 59 deletions(-) delete mode 100644 vendor/github.com/go-xorm/xorm/engine_maxlife.go diff --git a/Gopkg.lock b/Gopkg.lock index 640c62b8aa12e..7d463f50a3de5 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -406,11 +406,11 @@ version = "v0.6.0" [[projects]] - digest = "1:22a1ac7f654095f6817076eb975368bab5481e42554d0121ea37e28a86a3f83d" + digest = "1:931a62a1aacc37a5e4c309a111642ec4da47b4dc453cd4ba5481b12eedb04a5d" name = "github.com/go-xorm/xorm" packages = ["."] pruneopts = "NUT" - revision = "ad69f7d8f0861a29438154bb0a20b60501298480" + revision = "401f4ee8ff8cbc40a4754cb12192fbe4f02f3979" [[projects]] branch = "master" diff --git a/Gopkg.toml b/Gopkg.toml index 2633d8b1dd1c2..86aa2a4150c1c 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -39,7 +39,7 @@ ignored = ["google.golang.org/appengine*"] [[override]] name = "github.com/go-xorm/xorm" #version = "0.6.5" - revision = "ad69f7d8f0861a29438154bb0a20b60501298480" + revision = "401f4ee8ff8cbc40a4754cb12192fbe4f02f3979" [[override]] name = "github.com/go-sql-driver/mysql" diff --git a/vendor/github.com/go-xorm/xorm/dialect_mssql.go b/vendor/github.com/go-xorm/xorm/dialect_mssql.go index 6d2291dc1da0f..fb1247094c7e9 100644 --- a/vendor/github.com/go-xorm/xorm/dialect_mssql.go +++ b/vendor/github.com/go-xorm/xorm/dialect_mssql.go @@ -218,7 +218,7 @@ func (db *mssql) SqlType(c *core.Column) string { res = core.Bit if strings.EqualFold(c.Default, "true") { c.Default = "1" - } else { + } else if strings.EqualFold(c.Default, "false") { c.Default = "0" } case core.Serial: diff --git a/vendor/github.com/go-xorm/xorm/dialect_mysql.go b/vendor/github.com/go-xorm/xorm/dialect_mysql.go index f2b4ff7a786b1..9f5ae3b2e50d1 100644 --- a/vendor/github.com/go-xorm/xorm/dialect_mysql.go +++ b/vendor/github.com/go-xorm/xorm/dialect_mysql.go @@ -551,9 +551,12 @@ func (db *mysql) CreateTableSql(table *core.Table, tableName, storeEngine, chars if len(charset) == 0 { charset = db.URI().Charset - } else if len(charset) > 0 { + } + if len(charset) != 0 { sql += " DEFAULT CHARSET " + charset } + + if db.rowFormat != "" { sql += " ROW_FORMAT=" + db.rowFormat diff --git a/vendor/github.com/go-xorm/xorm/dialect_sqlite3.go b/vendor/github.com/go-xorm/xorm/dialect_sqlite3.go index a55b1615e7155..e129481466e2f 100644 --- a/vendor/github.com/go-xorm/xorm/dialect_sqlite3.go +++ b/vendor/github.com/go-xorm/xorm/dialect_sqlite3.go @@ -233,7 +233,7 @@ func (db *sqlite3) TableCheckSql(tableName string) (string, []interface{}) { } func (db *sqlite3) DropIndexSql(tableName string, index *core.Index) string { - //var unique string + // var unique string quote := db.Quote idxName := index.Name @@ -452,5 +452,9 @@ type sqlite3Driver struct { } func (p *sqlite3Driver) Parse(driverName, dataSourceName string) (*core.Uri, error) { + if strings.Contains(dataSourceName, "?") { + dataSourceName = dataSourceName[:strings.Index(dataSourceName, "?")] + } + return &core.Uri{DbType: core.SQLITE, DbName: dataSourceName}, nil } diff --git a/vendor/github.com/go-xorm/xorm/engine.go b/vendor/github.com/go-xorm/xorm/engine.go index 846889c364377..89a96d9fdb5ea 100644 --- a/vendor/github.com/go-xorm/xorm/engine.go +++ b/vendor/github.com/go-xorm/xorm/engine.go @@ -177,6 +177,14 @@ func (engine *Engine) QuoteStr() string { return engine.dialect.QuoteStr() } +func (engine *Engine) quoteColumns(columnStr string) string { + columns := strings.Split(columnStr, ",") + for i := 0; i < len(columns); i++ { + columns[i] = engine.Quote(strings.TrimSpace(columns[i])) + } + return strings.Join(columns, ",") +} + // Quote Use QuoteStr quote the string sql func (engine *Engine) Quote(value string) string { value = strings.TrimSpace(value) @@ -237,6 +245,11 @@ func (engine *Engine) AutoIncrStr() string { return engine.dialect.AutoIncrStr() } +// SetConnMaxLifetime sets the maximum amount of time a connection may be reused. +func (engine *Engine) SetConnMaxLifetime(d time.Duration) { + engine.db.SetConnMaxLifetime(d) +} + // SetMaxOpenConns is only available for go 1.2+ func (engine *Engine) SetMaxOpenConns(conns int) { engine.db.SetMaxOpenConns(conns) @@ -1333,10 +1346,10 @@ func (engine *Engine) DropIndexes(bean interface{}) error { } // Exec raw sql -func (engine *Engine) Exec(sql string, args ...interface{}) (sql.Result, error) { +func (engine *Engine) Exec(sqlorArgs ...interface{}) (sql.Result, error) { session := engine.NewSession() defer session.Close() - return session.Exec(sql, args...) + return session.Exec(sqlorArgs...) } // Query a raw sql and return records as []map[string][]byte diff --git a/vendor/github.com/go-xorm/xorm/engine_group.go b/vendor/github.com/go-xorm/xorm/engine_group.go index 1de425f372c5a..5eee3e6183312 100644 --- a/vendor/github.com/go-xorm/xorm/engine_group.go +++ b/vendor/github.com/go-xorm/xorm/engine_group.go @@ -5,6 +5,8 @@ package xorm import ( + "time" + "github.com/go-xorm/core" ) @@ -99,6 +101,14 @@ func (eg *EngineGroup) SetColumnMapper(mapper core.IMapper) { } } +// SetConnMaxLifetime sets the maximum amount of time a connection may be reused. +func (eg *EngineGroup) SetConnMaxLifetime(d time.Duration) { + eg.Engine.SetConnMaxLifetime(d) + for i := 0; i < len(eg.slaves); i++ { + eg.slaves[i].SetConnMaxLifetime(d) + } +} + // SetDefaultCacher set the default cacher func (eg *EngineGroup) SetDefaultCacher(cacher core.Cacher) { eg.Engine.SetDefaultCacher(cacher) diff --git a/vendor/github.com/go-xorm/xorm/engine_maxlife.go b/vendor/github.com/go-xorm/xorm/engine_maxlife.go deleted file mode 100644 index 22666c5f44cfa..0000000000000 --- a/vendor/github.com/go-xorm/xorm/engine_maxlife.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2017 The Xorm Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.6 - -package xorm - -import "time" - -// SetConnMaxLifetime sets the maximum amount of time a connection may be reused. -func (engine *Engine) SetConnMaxLifetime(d time.Duration) { - engine.db.SetConnMaxLifetime(d) -} - -// SetConnMaxLifetime sets the maximum amount of time a connection may be reused. -func (eg *EngineGroup) SetConnMaxLifetime(d time.Duration) { - eg.Engine.SetConnMaxLifetime(d) - for i := 0; i < len(eg.slaves); i++ { - eg.slaves[i].SetConnMaxLifetime(d) - } -} diff --git a/vendor/github.com/go-xorm/xorm/interface.go b/vendor/github.com/go-xorm/xorm/interface.go index 0bc12ba00662d..33d2078e44e74 100644 --- a/vendor/github.com/go-xorm/xorm/interface.go +++ b/vendor/github.com/go-xorm/xorm/interface.go @@ -27,7 +27,7 @@ type Interface interface { Delete(interface{}) (int64, error) Distinct(columns ...string) *Session DropIndexes(bean interface{}) error - Exec(string, ...interface{}) (sql.Result, error) + Exec(sqlOrAgrs ...interface{}) (sql.Result, error) Exist(bean ...interface{}) (bool, error) Find(interface{}, ...interface{}) error FindAndCount(interface{}, ...interface{}) (int64, error) @@ -72,6 +72,7 @@ type EngineInterface interface { Before(func(interface{})) *Session Charset(charset string) *Session + ClearCache(...interface{}) error CreateTables(...interface{}) error DBMetas() ([]*core.Table, error) Dialect() core.Dialect @@ -83,16 +84,22 @@ type EngineInterface interface { GetTableMapper() core.IMapper GetTZDatabase() *time.Location GetTZLocation() *time.Location + MapCacher(interface{}, core.Cacher) error NewSession() *Session NoAutoTime() *Session Quote(string) string SetCacher(string, core.Cacher) + SetConnMaxLifetime(time.Duration) SetDefaultCacher(core.Cacher) + SetLogger(logger core.ILogger) SetLogLevel(core.LogLevel) SetMapper(core.IMapper) + SetMaxOpenConns(int) + SetMaxIdleConns(int) SetSchema(string) SetTZDatabase(tz *time.Location) SetTZLocation(tz *time.Location) + ShowExecTime(...bool) ShowSQL(show ...bool) Sync(...interface{}) error Sync2(...interface{}) error diff --git a/vendor/github.com/go-xorm/xorm/session.go b/vendor/github.com/go-xorm/xorm/session.go index 3775eb0116c9e..e3437b9181439 100644 --- a/vendor/github.com/go-xorm/xorm/session.go +++ b/vendor/github.com/go-xorm/xorm/session.go @@ -102,6 +102,12 @@ func (session *Session) Close() { } } +// ContextCache enable context cache or not +func (session *Session) ContextCache(context ContextCache) *Session { + session.statement.context = context + return session +} + // IsClosed returns if session is closed func (session *Session) IsClosed() bool { return session.db == nil @@ -839,3 +845,12 @@ func (session *Session) Unscoped() *Session { session.statement.Unscoped() return session } + +func (session *Session) incrVersionFieldValue(fieldValue *reflect.Value) { + switch fieldValue.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + fieldValue.SetInt(fieldValue.Int() + 1) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + fieldValue.SetUint(fieldValue.Uint() + 1) + } +} diff --git a/vendor/github.com/go-xorm/xorm/session_delete.go b/vendor/github.com/go-xorm/xorm/session_delete.go index d9cf3ea93738b..dcce543a3a1e3 100644 --- a/vendor/github.com/go-xorm/xorm/session_delete.go +++ b/vendor/github.com/go-xorm/xorm/session_delete.go @@ -199,7 +199,7 @@ func (session *Session) Delete(bean interface{}) (int64, error) { }) } - if cacher := session.engine.getCacher(tableName); cacher != nil && session.statement.UseCache { + if cacher := session.engine.getCacher(tableNameNoQuote); cacher != nil && session.statement.UseCache { session.cacheDelete(table, tableNameNoQuote, deleteSQL, argsForCache...) } diff --git a/vendor/github.com/go-xorm/xorm/session_find.go b/vendor/github.com/go-xorm/xorm/session_find.go index 46bbf26c98d84..a5b4f7934208d 100644 --- a/vendor/github.com/go-xorm/xorm/session_find.go +++ b/vendor/github.com/go-xorm/xorm/session_find.go @@ -135,7 +135,7 @@ func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) if session.statement.JoinStr == "" { if columnStr == "" { if session.statement.GroupByStr != "" { - columnStr = session.statement.Engine.Quote(strings.Replace(session.statement.GroupByStr, ",", session.engine.Quote(","), -1)) + columnStr = session.engine.quoteColumns(session.statement.GroupByStr) } else { columnStr = session.statement.genColumnStr() } @@ -143,7 +143,7 @@ func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) } else { if columnStr == "" { if session.statement.GroupByStr != "" { - columnStr = session.statement.Engine.Quote(strings.Replace(session.statement.GroupByStr, ",", session.engine.Quote(","), -1)) + columnStr = session.engine.quoteColumns(session.statement.GroupByStr) } else { columnStr = "*" } @@ -176,7 +176,7 @@ func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) } if session.canCache() { - if cacher := session.engine.getCacher(table.Name); cacher != nil && + if cacher := session.engine.getCacher(session.statement.TableName()); cacher != nil && !session.statement.IsDistinct && !session.statement.unscoped { err = session.cacheFind(sliceElementType, sqlStr, rowsSlicePtr, args...) diff --git a/vendor/github.com/go-xorm/xorm/session_get.go b/vendor/github.com/go-xorm/xorm/session_get.go index 3b2c9493c264e..1cea31c5f89be 100644 --- a/vendor/github.com/go-xorm/xorm/session_get.go +++ b/vendor/github.com/go-xorm/xorm/session_get.go @@ -7,6 +7,7 @@ package xorm import ( "database/sql" "errors" + "fmt" "reflect" "strconv" @@ -57,7 +58,7 @@ func (session *Session) get(bean interface{}) (bool, error) { table := session.statement.RefTable if session.canCache() && beanValue.Elem().Kind() == reflect.Struct { - if cacher := session.engine.getCacher(table.Name); cacher != nil && + if cacher := session.engine.getCacher(session.statement.TableName()); cacher != nil && !session.statement.unscoped { has, err := session.cacheGet(bean, sqlStr, args...) if err != ErrCacheFailed { @@ -66,7 +67,28 @@ func (session *Session) get(bean interface{}) (bool, error) { } } - return session.nocacheGet(beanValue.Elem().Kind(), table, bean, sqlStr, args...) + context := session.statement.context + if context != nil { + res := context.Get(fmt.Sprintf("%v-%v", sqlStr, args)) + if res != nil { + structValue := reflect.Indirect(reflect.ValueOf(bean)) + structValue.Set(reflect.Indirect(reflect.ValueOf(res))) + session.lastSQL = "" + session.lastSQLArgs = nil + return true, nil + } + } + + has, err := session.nocacheGet(beanValue.Elem().Kind(), table, bean, sqlStr, args...) + if err != nil || !has { + return has, err + } + + if context != nil { + context.Put(fmt.Sprintf("%v-%v", sqlStr, args), bean) + } + + return true, nil } func (session *Session) nocacheGet(beanKind reflect.Kind, table *core.Table, bean interface{}, sqlStr string, args ...interface{}) (bool, error) { @@ -77,6 +99,9 @@ func (session *Session) nocacheGet(beanKind reflect.Kind, table *core.Table, bea defer rows.Close() if !rows.Next() { + if rows.Err() != nil { + return false, rows.Err() + } return false, nil } diff --git a/vendor/github.com/go-xorm/xorm/session_insert.go b/vendor/github.com/go-xorm/xorm/session_insert.go index 2ea58fdaf9595..e673e87425278 100644 --- a/vendor/github.com/go-xorm/xorm/session_insert.go +++ b/vendor/github.com/go-xorm/xorm/session_insert.go @@ -397,7 +397,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { if err != nil { session.engine.logger.Error(err) } else if verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(1) + session.incrVersionFieldValue(verValue) } } @@ -440,7 +440,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { if err != nil { session.engine.logger.Error(err) } else if verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(1) + session.incrVersionFieldValue(verValue) } } @@ -481,7 +481,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { if err != nil { session.engine.logger.Error(err) } else if verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(1) + session.incrVersionFieldValue(verValue) } } diff --git a/vendor/github.com/go-xorm/xorm/session_query.go b/vendor/github.com/go-xorm/xorm/session_query.go index 5c9aeb3916ce2..6d597cc4592f8 100644 --- a/vendor/github.com/go-xorm/xorm/session_query.go +++ b/vendor/github.com/go-xorm/xorm/session_query.go @@ -17,17 +17,7 @@ import ( func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interface{}, error) { if len(sqlorArgs) > 0 { - switch sqlorArgs[0].(type) { - case string: - return sqlorArgs[0].(string), sqlorArgs[1:], nil - case *builder.Builder: - return sqlorArgs[0].(*builder.Builder).ToSQL() - case builder.Builder: - bd := sqlorArgs[0].(builder.Builder) - return bd.ToSQL() - default: - return "", nil, ErrUnSupportedType - } + return convertSQLOrArgs(sqlorArgs...) } if session.statement.RawSQL != "" { @@ -45,7 +35,7 @@ func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interfa if session.statement.JoinStr == "" { if columnStr == "" { if session.statement.GroupByStr != "" { - columnStr = session.statement.Engine.Quote(strings.Replace(session.statement.GroupByStr, ",", session.engine.Quote(","), -1)) + columnStr = session.engine.quoteColumns(session.statement.GroupByStr) } else { columnStr = session.statement.genColumnStr() } @@ -53,7 +43,7 @@ func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interfa } else { if columnStr == "" { if session.statement.GroupByStr != "" { - columnStr = session.statement.Engine.Quote(strings.Replace(session.statement.GroupByStr, ",", session.engine.Quote(","), -1)) + columnStr = session.engine.quoteColumns(session.statement.GroupByStr) } else { columnStr = "*" } @@ -176,6 +166,34 @@ func row2mapStr(rows *core.Rows, fields []string) (resultsMap map[string]string, return result, nil } +func row2sliceStr(rows *core.Rows, fields []string) (results []string, err error) { + result := make([]string, 0, len(fields)) + scanResultContainers := make([]interface{}, len(fields)) + for i := 0; i < len(fields); i++ { + var scanResultContainer interface{} + scanResultContainers[i] = &scanResultContainer + } + if err := rows.Scan(scanResultContainers...); err != nil { + return nil, err + } + + for i := 0; i < len(fields); i++ { + rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[i])) + // if row is null then as empty string + if rawValue.Interface() == nil { + result = append(result, "") + continue + } + + if data, err := value2String(&rawValue); err == nil { + result = append(result, data) + } else { + return nil, err + } + } + return result, nil +} + func rows2Strings(rows *core.Rows) (resultsSlice []map[string]string, err error) { fields, err := rows.Columns() if err != nil { @@ -192,6 +210,22 @@ func rows2Strings(rows *core.Rows) (resultsSlice []map[string]string, err error) return resultsSlice, nil } +func rows2SliceString(rows *core.Rows) (resultsSlice [][]string, err error) { + fields, err := rows.Columns() + if err != nil { + return nil, err + } + for rows.Next() { + record, err := row2sliceStr(rows, fields) + if err != nil { + return nil, err + } + resultsSlice = append(resultsSlice, record) + } + + return resultsSlice, nil +} + // QueryString runs a raw sql and return records as []map[string]string func (session *Session) QueryString(sqlorArgs ...interface{}) ([]map[string]string, error) { if session.isAutoClose { @@ -212,6 +246,26 @@ func (session *Session) QueryString(sqlorArgs ...interface{}) ([]map[string]stri return rows2Strings(rows) } +// QuerySliceString runs a raw sql and return records as [][]string +func (session *Session) QuerySliceString(sqlorArgs ...interface{}) ([][]string, error) { + if session.isAutoClose { + defer session.Close() + } + + sqlStr, args, err := session.genQuerySQL(sqlorArgs...) + if err != nil { + return nil, err + } + + rows, err := session.queryRows(sqlStr, args...) + if err != nil { + return nil, err + } + defer rows.Close() + + return rows2SliceString(rows) +} + func row2mapInterface(rows *core.Rows, fields []string) (resultsMap map[string]interface{}, err error) { resultsMap = make(map[string]interface{}, len(fields)) scanResultContainers := make([]interface{}, len(fields)) diff --git a/vendor/github.com/go-xorm/xorm/session_raw.go b/vendor/github.com/go-xorm/xorm/session_raw.go index 69bf9b3c6bf2b..47823d6706322 100644 --- a/vendor/github.com/go-xorm/xorm/session_raw.go +++ b/vendor/github.com/go-xorm/xorm/session_raw.go @@ -9,6 +9,7 @@ import ( "reflect" "time" + "github.com/go-xorm/builder" "github.com/go-xorm/core" ) @@ -193,11 +194,34 @@ func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, er return session.DB().Exec(sqlStr, args...) } +func convertSQLOrArgs(sqlorArgs ...interface{}) (string, []interface{}, error) { + switch sqlorArgs[0].(type) { + case string: + return sqlorArgs[0].(string), sqlorArgs[1:], nil + case *builder.Builder: + return sqlorArgs[0].(*builder.Builder).ToSQL() + case builder.Builder: + bd := sqlorArgs[0].(builder.Builder) + return bd.ToSQL() + } + + return "", nil, ErrUnSupportedType +} + // Exec raw sql -func (session *Session) Exec(sqlStr string, args ...interface{}) (sql.Result, error) { +func (session *Session) Exec(sqlorArgs ...interface{}) (sql.Result, error) { if session.isAutoClose { defer session.Close() } + if len(sqlorArgs) == 0 { + return nil, ErrUnSupportedType + } + + sqlStr, args, err := convertSQLOrArgs(sqlorArgs...) + if err != nil { + return nil, err + } + return session.exec(sqlStr, args...) } diff --git a/vendor/github.com/go-xorm/xorm/session_update.go b/vendor/github.com/go-xorm/xorm/session_update.go index 84c7e7fecfffa..37b34ff3dd0ba 100644 --- a/vendor/github.com/go-xorm/xorm/session_update.go +++ b/vendor/github.com/go-xorm/xorm/session_update.go @@ -116,7 +116,7 @@ func (session *Session) cacheUpdate(table *core.Table, tableName, sqlStr string, } else { session.engine.logger.Debug("[cacheUpdate] set bean field", bean, colName, fieldValue.Interface()) if col.IsVersion && session.statement.checkVersion { - fieldValue.SetInt(fieldValue.Int() + 1) + session.incrVersionFieldValue(fieldValue) } else { fieldValue.Set(reflect.ValueOf(args[idx])) } @@ -357,7 +357,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 return 0, err } else if doIncVer { if verValue != nil && verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(verValue.Int() + 1) + session.incrVersionFieldValue(verValue) } } @@ -443,7 +443,7 @@ func (session *Session) genUpdateColumns(bean interface{}) ([]string, []interfac } } - if col.IsDeleted || col.IsCreated { + if (col.IsDeleted && !session.statement.unscoped) || col.IsCreated { continue } diff --git a/vendor/github.com/go-xorm/xorm/statement.go b/vendor/github.com/go-xorm/xorm/statement.go index 7856936f5cb32..a7f7010ad2b27 100644 --- a/vendor/github.com/go-xorm/xorm/statement.go +++ b/vendor/github.com/go-xorm/xorm/statement.go @@ -59,6 +59,7 @@ type Statement struct { exprColumns map[string]exprParam cond builder.Cond bufferSize int + context ContextCache } // Init reset all the statement's fields @@ -99,6 +100,7 @@ func (statement *Statement) Init() { statement.exprColumns = make(map[string]exprParam) statement.cond = builder.NewCond() statement.bufferSize = 0 + statement.context = nil } // NoAutoCondition if you do not want convert bean's field as query condition, then use this function @@ -933,7 +935,7 @@ func (statement *Statement) genGetSQL(bean interface{}) (string, []interface{}, if len(statement.JoinStr) == 0 { if len(columnStr) == 0 { if len(statement.GroupByStr) > 0 { - columnStr = statement.Engine.Quote(strings.Replace(statement.GroupByStr, ",", statement.Engine.Quote(","), -1)) + columnStr = statement.Engine.quoteColumns(statement.GroupByStr) } else { columnStr = statement.genColumnStr() } @@ -941,7 +943,7 @@ func (statement *Statement) genGetSQL(bean interface{}) (string, []interface{}, } else { if len(columnStr) == 0 { if len(statement.GroupByStr) > 0 { - columnStr = statement.Engine.Quote(strings.Replace(statement.GroupByStr, ",", statement.Engine.Quote(","), -1)) + columnStr = statement.Engine.quoteColumns(statement.GroupByStr) } } } diff --git a/vendor/github.com/go-xorm/xorm/xorm.go b/vendor/github.com/go-xorm/xorm/xorm.go index 141c4897d5384..739de8d4292cf 100644 --- a/vendor/github.com/go-xorm/xorm/xorm.go +++ b/vendor/github.com/go-xorm/xorm/xorm.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build go1.8 + package xorm import ( From d6ad629dfb67a77c313944306e09ff7b86c2e21a Mon Sep 17 00:00:00 2001 From: konrad Date: Tue, 11 Dec 2018 21:24:53 +0100 Subject: [PATCH 16/17] updated xorm --- Gopkg.toml | 1 - models/models.go | 2 -- .../github.com/go-xorm/xorm/context_cache.go | 30 +++++++++++++++++++ vendor/github.com/go-xorm/xorm/transaction.go | 26 ++++++++++++++++ 4 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 vendor/github.com/go-xorm/xorm/context_cache.go create mode 100644 vendor/github.com/go-xorm/xorm/transaction.go diff --git a/Gopkg.toml b/Gopkg.toml index 86aa2a4150c1c..f0d2e27b819b7 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -38,7 +38,6 @@ ignored = ["google.golang.org/appengine*"] [[override]] name = "github.com/go-xorm/xorm" - #version = "0.6.5" revision = "401f4ee8ff8cbc40a4754cb12192fbe4f02f3979" [[override]] diff --git a/models/models.go b/models/models.go index ec76f46f53020..5c16f8c2ab2d5 100644 --- a/models/models.go +++ b/models/models.go @@ -6,7 +6,6 @@ package models import ( - "database/sql" "errors" "fmt" "net/url" @@ -36,7 +35,6 @@ type Engine interface { Count(...interface{}) (int64, error) Decr(column string, arg ...interface{}) *xorm.Session Delete(interface{}) (int64, error) - Exec(string, ...interface{}) (sql.Result, error) Find(interface{}, ...interface{}) error Get(interface{}) (bool, error) ID(interface{}) *xorm.Session diff --git a/vendor/github.com/go-xorm/xorm/context_cache.go b/vendor/github.com/go-xorm/xorm/context_cache.go new file mode 100644 index 0000000000000..1bc22884968dc --- /dev/null +++ b/vendor/github.com/go-xorm/xorm/context_cache.go @@ -0,0 +1,30 @@ +// Copyright 2018 The Xorm Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xorm + +// ContextCache is the interface that operates the cache data. +type ContextCache interface { + // Put puts value into cache with key. + Put(key string, val interface{}) + // Get gets cached value by given key. + Get(key string) interface{} +} + +type memoryContextCache map[string]interface{} + +// NewMemoryContextCache return memoryContextCache +func NewMemoryContextCache() memoryContextCache { + return make(map[string]interface{}) +} + +// Put puts value into cache with key. +func (m memoryContextCache) Put(key string, val interface{}) { + m[key] = val +} + +// Get gets cached value by given key. +func (m memoryContextCache) Get(key string) interface{} { + return m[key] +} diff --git a/vendor/github.com/go-xorm/xorm/transaction.go b/vendor/github.com/go-xorm/xorm/transaction.go new file mode 100644 index 0000000000000..4104103fd539c --- /dev/null +++ b/vendor/github.com/go-xorm/xorm/transaction.go @@ -0,0 +1,26 @@ +// Copyright 2018 The Xorm Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xorm + +// Transaction Execute sql wrapped in a transaction(abbr as tx), tx will automatic commit if no errors occurred +func (engine *Engine) Transaction(f func(*Session) (interface{}, error)) (interface{}, error) { + session := engine.NewSession() + defer session.Close() + + if err := session.Begin(); err != nil { + return nil, err + } + + result, err := f(session) + if err != nil { + return nil, err + } + + if err := session.Commit(); err != nil { + return nil, err + } + + return result, nil +} From 6f5200c404d22e867ef31c86976e81d592e515ed Mon Sep 17 00:00:00 2001 From: konrad Date: Tue, 11 Dec 2018 21:29:37 +0100 Subject: [PATCH 17/17] Fixed build --- models/models.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/models/models.go b/models/models.go index 5c16f8c2ab2d5..daef7c07e820e 100644 --- a/models/models.go +++ b/models/models.go @@ -6,6 +6,7 @@ package models import ( + "database/sql" "errors" "fmt" "net/url" @@ -35,6 +36,7 @@ type Engine interface { Count(...interface{}) (int64, error) Decr(column string, arg ...interface{}) *xorm.Session Delete(interface{}) (int64, error) + Exec(...interface{}) (sql.Result, error) Find(interface{}, ...interface{}) error Get(interface{}) (bool, error) ID(interface{}) *xorm.Session