Upgrade xorm to v1.1.1 (#16339)
This commit is contained in:
		
							parent
							
								
									32fd11395b
								
							
						
					
					
						commit
						760af187ba
					
				
					 39 changed files with 989 additions and 1201 deletions
				
			
		
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							|  | @ -139,7 +139,7 @@ require ( | ||||||
| 	mvdan.cc/xurls/v2 v2.2.0 | 	mvdan.cc/xurls/v2 v2.2.0 | ||||||
| 	strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 | 	strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 | ||||||
| 	xorm.io/builder v0.3.9 | 	xorm.io/builder v0.3.9 | ||||||
| 	xorm.io/xorm v1.1.0 | 	xorm.io/xorm v1.1.1 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1 | replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1 | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							|  | @ -1615,5 +1615,5 @@ xorm.io/builder v0.3.8/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= | ||||||
| xorm.io/builder v0.3.9 h1:Sd65/LdWyO7LR8+Cbd+e7mm3sK/7U9k0jS3999IDHMc= | xorm.io/builder v0.3.9 h1:Sd65/LdWyO7LR8+Cbd+e7mm3sK/7U9k0jS3999IDHMc= | ||||||
| xorm.io/builder v0.3.9/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= | xorm.io/builder v0.3.9/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= | ||||||
| xorm.io/xorm v1.0.6/go.mod h1:uF9EtbhODq5kNWxMbnBEj8hRRZnlcNSz2t2N7HW/+A4= | xorm.io/xorm v1.0.6/go.mod h1:uF9EtbhODq5kNWxMbnBEj8hRRZnlcNSz2t2N7HW/+A4= | ||||||
| xorm.io/xorm v1.1.0 h1:mkEsQXLauZajiOld2cB2PkFcUZKePepPgs1bC1dw8RA= | xorm.io/xorm v1.1.1 h1:cc1yot5rhoBucfk2lgZPZPEuI/9QsVvHuQpjI0wmcf8= | ||||||
| xorm.io/xorm v1.1.0/go.mod h1:EDzNHMuCVZNszkIRSLL2nI0zX+nQE8RstAVranlSfqI= | xorm.io/xorm v1.1.1/go.mod h1:Cb0DKYTHbyECMaSfgRnIZp5aiUgQozxcJJ0vzcLGJSg= | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							|  | @ -1037,7 +1037,7 @@ strk.kbt.io/projects/go/libravatar | ||||||
| # xorm.io/builder v0.3.9 | # xorm.io/builder v0.3.9 | ||||||
| ## explicit | ## explicit | ||||||
| xorm.io/builder | xorm.io/builder | ||||||
| # xorm.io/xorm v1.1.0 | # xorm.io/xorm v1.1.1 | ||||||
| ## explicit | ## explicit | ||||||
| xorm.io/xorm | xorm.io/xorm | ||||||
| xorm.io/xorm/caches | xorm.io/xorm/caches | ||||||
|  |  | ||||||
							
								
								
									
										628
									
								
								vendor/xorm.io/xorm/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										628
									
								
								vendor/xorm.io/xorm/.drone.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,190 +1,65 @@ | ||||||
| --- |  | ||||||
| kind: pipeline |  | ||||||
| name: testing |  | ||||||
| steps: |  | ||||||
| - name: restore-cache |  | ||||||
|   image: meltwater/drone-cache |  | ||||||
|   pull: always |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     restore: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: test-vet |  | ||||||
|   image: golang:1.15 |  | ||||||
|   environment: |  | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|   commands: |  | ||||||
|     - make vet |  | ||||||
|     - make fmt-check |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
|   when: |  | ||||||
|     event: |  | ||||||
|     - push |  | ||||||
|     - pull_request |  | ||||||
| 
 |  | ||||||
| - name: rebuild-cache |  | ||||||
|   image: meltwater/drone-cache |  | ||||||
|   pull: true |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     rebuild: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| volumes: |  | ||||||
|   - name: cache |  | ||||||
|     temp: {} |  | ||||||
| 
 |  | ||||||
| --- |  | ||||||
| kind: pipeline |  | ||||||
| name: test-sqlite |  | ||||||
| depends_on: |  | ||||||
|   - testing |  | ||||||
| steps: |  | ||||||
| - name: restore-cache |  | ||||||
|   image: meltwater/drone-cache:dev |  | ||||||
|   pull: always |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     restore: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: test-sqlite3 |  | ||||||
|   image: golang:1.15 |  | ||||||
|   environment: |  | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|   commands: |  | ||||||
|   - make test-sqlite3 |  | ||||||
|   - TEST_CACHE_ENABLE=true make test-sqlite3 |  | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-sqlite3 |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: test-sqlite |  | ||||||
|   image: golang:1.15 |  | ||||||
|   environment: |  | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|   commands: |  | ||||||
|   - make test-sqlite |  | ||||||
|   - TEST_CACHE_ENABLE=true make test-sqlite |  | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-sqlite |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: rebuild-cache |  | ||||||
|   image: meltwater/drone-cache:dev |  | ||||||
|   pull: true |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     rebuild: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| volumes: |  | ||||||
|   - name: cache |  | ||||||
|     temp: {} |  | ||||||
| 
 |  | ||||||
| --- | --- | ||||||
| kind: pipeline | kind: pipeline | ||||||
| name: test-mysql | name: test-mysql | ||||||
| depends_on: | environment: | ||||||
|   - testing |   GO111MODULE: "on" | ||||||
|  |   GOPROXY: "https://goproxy.io" | ||||||
|  |   CGO_ENABLED: 1 | ||||||
|  | trigger: | ||||||
|  |   ref: | ||||||
|  |   - refs/heads/master | ||||||
|  |   - refs/pull/*/head | ||||||
| steps: | steps: | ||||||
| - name: restore-cache | - name: test-vet | ||||||
|   image: meltwater/drone-cache |   image: golang:1.15 | ||||||
|   pull: always |   pull: always | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     restore: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |   volumes: | ||||||
|   - name: cache |   - name: cache | ||||||
|     path: /go |     path: /go/pkg/mod | ||||||
| 
 |   commands: | ||||||
|  |     - make vet | ||||||
|  | - name: test-sqlite3 | ||||||
|  |   image: golang:1.15 | ||||||
|  |   volumes: | ||||||
|  |   - name: cache | ||||||
|  |     path: /go/pkg/mod | ||||||
|  |   depends_on: | ||||||
|  |   - test-vet | ||||||
|  |   commands: | ||||||
|  |     - make fmt-check | ||||||
|  |     - make test | ||||||
|  |     - make test-sqlite3 | ||||||
|  |     - TEST_CACHE_ENABLE=true make test-sqlite3 | ||||||
|  |     - TEST_QUOTE_POLICY=reserved make test-sqlite3 | ||||||
|  |     - make test-sqlite | ||||||
|  |     - TEST_CACHE_ENABLE=true make test-sqlite | ||||||
|  |     - TEST_QUOTE_POLICY=reserved make test-sqlite | ||||||
| - name: test-mysql | - name: test-mysql | ||||||
|   image: golang:1.15 |   image: golang:1.15 | ||||||
|  |   pull: never | ||||||
|  |   volumes: | ||||||
|  |   - name: cache | ||||||
|  |     path: /go/pkg/mod | ||||||
|  |   depends_on: | ||||||
|  |   - test-vet | ||||||
|   environment: |   environment: | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|     TEST_MYSQL_HOST: mysql |     TEST_MYSQL_HOST: mysql | ||||||
|     TEST_MYSQL_CHARSET: utf8 |     TEST_MYSQL_CHARSET: utf8 | ||||||
|     TEST_MYSQL_DBNAME: xorm_test |     TEST_MYSQL_DBNAME: xorm_test | ||||||
|     TEST_MYSQL_USERNAME: root |     TEST_MYSQL_USERNAME: root | ||||||
|     TEST_MYSQL_PASSWORD: |     TEST_MYSQL_PASSWORD: | ||||||
|   commands: |   commands: | ||||||
|   - make test |  | ||||||
|   - make test-mysql |  | ||||||
|   - TEST_CACHE_ENABLE=true make test-mysql |   - TEST_CACHE_ENABLE=true make test-mysql | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-mysql |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
|    |    | ||||||
| - name: test-mysql-utf8mb4 | - name: test-mysql-utf8mb4 | ||||||
|   image: golang:1.15 |   image: golang:1.15 | ||||||
|  |   pull: never | ||||||
|  |   volumes: | ||||||
|  |   - name: cache | ||||||
|  |     path: /go/pkg/mod | ||||||
|   depends_on: |   depends_on: | ||||||
|   - test-mysql |   - test-mysql | ||||||
|   environment: |   environment: | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|     TEST_MYSQL_HOST: mysql |     TEST_MYSQL_HOST: mysql | ||||||
|     TEST_MYSQL_CHARSET: utf8mb4 |     TEST_MYSQL_CHARSET: utf8mb4 | ||||||
|     TEST_MYSQL_DBNAME: xorm_test |     TEST_MYSQL_DBNAME: xorm_test | ||||||
|  | @ -192,62 +67,15 @@ steps: | ||||||
|     TEST_MYSQL_PASSWORD: |     TEST_MYSQL_PASSWORD: | ||||||
|   commands: |   commands: | ||||||
|   - make test-mysql |   - make test-mysql | ||||||
|   - TEST_CACHE_ENABLE=true make test-mysql |  | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-mysql |   - TEST_QUOTE_POLICY=reserved make test-mysql | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: test-mymysql |  | ||||||
|   pull: default |  | ||||||
|   image: golang:1.15 |  | ||||||
|   depends_on: |  | ||||||
|     - test-mysql-utf8mb4 |  | ||||||
|   environment: |  | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|     TEST_MYSQL_HOST: mysql:3306 |  | ||||||
|     TEST_MYSQL_DBNAME: xorm_test |  | ||||||
|     TEST_MYSQL_USERNAME: root |  | ||||||
|     TEST_MYSQL_PASSWORD: |  | ||||||
|   commands: |  | ||||||
|   - make test-mymysql |  | ||||||
|   - TEST_CACHE_ENABLE=true make test-mymysql |  | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-mymysql |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: rebuild-cache |  | ||||||
|   image: meltwater/drone-cache |  | ||||||
|   depends_on: |  | ||||||
|   - test-mysql |  | ||||||
|   - test-mysql-utf8mb4 |  | ||||||
|   - test-mymysql |  | ||||||
|   pull: true |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     rebuild: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 | 
 | ||||||
| volumes: | volumes: | ||||||
|   - name: cache | - name: cache | ||||||
|     temp: {} |   host: | ||||||
|  |     path: /tmp/cache | ||||||
| 
 | 
 | ||||||
| services: | services: | ||||||
| - name: mysql | - name: mysql | ||||||
|   pull: default |  | ||||||
|   image: mysql:5.7 |   image: mysql:5.7 | ||||||
|   environment: |   environment: | ||||||
|     MYSQL_ALLOW_EMPTY_PASSWORD: yes |     MYSQL_ALLOW_EMPTY_PASSWORD: yes | ||||||
|  | @ -258,32 +86,18 @@ kind: pipeline | ||||||
| name: test-mysql8 | name: test-mysql8 | ||||||
| depends_on: | depends_on: | ||||||
|   - test-mysql |   - test-mysql | ||||||
|   - test-sqlite | trigger: | ||||||
|  |   ref: | ||||||
|  |   - refs/heads/master | ||||||
|  |   - refs/pull/*/head | ||||||
| steps: | steps: | ||||||
| - name: restore-cache |  | ||||||
|   image: meltwater/drone-cache |  | ||||||
|   pull: always |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     restore: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: test-mysql8 | - name: test-mysql8 | ||||||
|   image: golang:1.15 |   image: golang:1.15 | ||||||
|  |   pull: never | ||||||
|  |   volumes: | ||||||
|  |   - name: cache | ||||||
|  |     path: /go/pkg/mod | ||||||
|   environment: |   environment: | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|     TEST_MYSQL_HOST: mysql8 |     TEST_MYSQL_HOST: mysql8 | ||||||
|     TEST_MYSQL_CHARSET: utf8mb4 |     TEST_MYSQL_CHARSET: utf8mb4 | ||||||
|     TEST_MYSQL_DBNAME: xorm_test |     TEST_MYSQL_DBNAME: xorm_test | ||||||
|  | @ -293,35 +107,14 @@ steps: | ||||||
|   - make test-mysql |   - make test-mysql | ||||||
|   - TEST_CACHE_ENABLE=true make test-mysql |   - TEST_CACHE_ENABLE=true make test-mysql | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-mysql |   - TEST_QUOTE_POLICY=reserved make test-mysql | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: rebuild-cache |  | ||||||
|   image: meltwater/drone-cache:dev |  | ||||||
|   pull: true |  | ||||||
|   depends_on: |  | ||||||
|   - test-mysql8 |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     rebuild: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 | 
 | ||||||
| volumes: | volumes: | ||||||
|   - name: cache | - name: cache | ||||||
|     temp: {} |   host: | ||||||
|  |     path: /tmp/cache | ||||||
| 
 | 
 | ||||||
| services: | services: | ||||||
| - name: mysql8 | - name: mysql8 | ||||||
|   pull: default |  | ||||||
|   image: mysql:8.0 |   image: mysql:8.0 | ||||||
|   environment: |   environment: | ||||||
|     MYSQL_ALLOW_EMPTY_PASSWORD: yes |     MYSQL_ALLOW_EMPTY_PASSWORD: yes | ||||||
|  | @ -332,31 +125,18 @@ kind: pipeline | ||||||
| name: test-mariadb | name: test-mariadb | ||||||
| depends_on: | depends_on: | ||||||
|   - test-mysql8 |   - test-mysql8 | ||||||
|  | trigger: | ||||||
|  |   ref: | ||||||
|  |   - refs/heads/master | ||||||
|  |   - refs/pull/*/head | ||||||
| steps: | steps: | ||||||
| - name: restore-cache |  | ||||||
|   image: meltwater/drone-cache |  | ||||||
|   pull: always |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     restore: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: test-mariadb | - name: test-mariadb | ||||||
|   image: golang:1.15 |   image: golang:1.15 | ||||||
|  |   pull: never | ||||||
|  |   volumes: | ||||||
|  |   - name: cache | ||||||
|  |     path: /go/pkg/mod | ||||||
|   environment: |   environment: | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|     TEST_MYSQL_HOST: mariadb |     TEST_MYSQL_HOST: mariadb | ||||||
|     TEST_MYSQL_CHARSET: utf8mb4 |     TEST_MYSQL_CHARSET: utf8mb4 | ||||||
|     TEST_MYSQL_DBNAME: xorm_test |     TEST_MYSQL_DBNAME: xorm_test | ||||||
|  | @ -366,35 +146,14 @@ steps: | ||||||
|   - make test-mysql |   - make test-mysql | ||||||
|   - TEST_CACHE_ENABLE=true make test-mysql |   - TEST_CACHE_ENABLE=true make test-mysql | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-mysql |   - TEST_QUOTE_POLICY=reserved make test-mysql | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: rebuild-cache |  | ||||||
|   image: meltwater/drone-cache:dev |  | ||||||
|   depends_on: |  | ||||||
|   - test-mariadb |  | ||||||
|   pull: true |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     rebuild: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 | 
 | ||||||
| volumes: | volumes: | ||||||
|   - name: cache | - name: cache | ||||||
|     temp: {} |   host: | ||||||
|  |     path: /tmp/cache | ||||||
| 
 | 
 | ||||||
| services: | services: | ||||||
| - name: mariadb | - name: mariadb | ||||||
|   pull: default |  | ||||||
|   image: mariadb:10.4 |   image: mariadb:10.4 | ||||||
|   environment: |   environment: | ||||||
|     MYSQL_ALLOW_EMPTY_PASSWORD: yes |     MYSQL_ALLOW_EMPTY_PASSWORD: yes | ||||||
|  | @ -405,32 +164,18 @@ kind: pipeline | ||||||
| name: test-postgres | name: test-postgres | ||||||
| depends_on: | depends_on: | ||||||
|   - test-mariadb |   - test-mariadb | ||||||
|  | trigger: | ||||||
|  |   ref: | ||||||
|  |   - refs/heads/master | ||||||
|  |   - refs/pull/*/head | ||||||
| steps: | steps: | ||||||
| - name: restore-cache | - name: test-postgres | ||||||
|   image: meltwater/drone-cache |   pull: never | ||||||
|   pull: always |   image: golang:1.15 | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     restore: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |   volumes: | ||||||
|   - name: cache |   - name: cache | ||||||
|     path: /go |     path: /go/pkg/mod | ||||||
| 
 |  | ||||||
| - name: test-postgres |  | ||||||
|   pull: default |  | ||||||
|   image: golang:1.15 |  | ||||||
|   environment: |   environment: | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|     TEST_PGSQL_HOST: pgsql |     TEST_PGSQL_HOST: pgsql | ||||||
|     TEST_PGSQL_DBNAME: xorm_test |     TEST_PGSQL_DBNAME: xorm_test | ||||||
|     TEST_PGSQL_USERNAME: postgres |     TEST_PGSQL_USERNAME: postgres | ||||||
|  | @ -438,60 +183,31 @@ steps: | ||||||
|   commands: |   commands: | ||||||
|   - make test-postgres |   - make test-postgres | ||||||
|   - TEST_CACHE_ENABLE=true make test-postgres |   - TEST_CACHE_ENABLE=true make test-postgres | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-postgres |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 | 
 | ||||||
| - name: test-postgres-schema | - name: test-postgres-schema | ||||||
|   pull: default |   pull: never | ||||||
|   image: golang:1.15 |   image: golang:1.15 | ||||||
|  |   volumes: | ||||||
|  |   - name: cache | ||||||
|  |     path: /go/pkg/mod | ||||||
|   depends_on: |   depends_on: | ||||||
|   - test-postgres |   - test-postgres | ||||||
|   environment: |   environment: | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|     TEST_PGSQL_HOST: pgsql |     TEST_PGSQL_HOST: pgsql | ||||||
|     TEST_PGSQL_SCHEMA: xorm |     TEST_PGSQL_SCHEMA: xorm | ||||||
|     TEST_PGSQL_DBNAME: xorm_test |     TEST_PGSQL_DBNAME: xorm_test | ||||||
|     TEST_PGSQL_USERNAME: postgres |     TEST_PGSQL_USERNAME: postgres | ||||||
|     TEST_PGSQL_PASSWORD: postgres |     TEST_PGSQL_PASSWORD: postgres | ||||||
|   commands: |   commands: | ||||||
|   - make test-postgres |  | ||||||
|   - TEST_CACHE_ENABLE=true make test-postgres |  | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-postgres |   - TEST_QUOTE_POLICY=reserved make test-postgres | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: rebuild-cache |  | ||||||
|   image: meltwater/drone-cache:dev |  | ||||||
|   pull: true |  | ||||||
|   depends_on: |  | ||||||
|   - test-postgres-schema |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     rebuild: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 | 
 | ||||||
| volumes: | volumes: | ||||||
|   - name: cache | - name: cache | ||||||
|     temp: {} |   host: | ||||||
|  |     path: /tmp/cache | ||||||
| 
 | 
 | ||||||
| services: | services: | ||||||
| - name: pgsql | - name: pgsql | ||||||
|   pull: default |  | ||||||
|   image: postgres:9.5 |   image: postgres:9.5 | ||||||
|   environment: |   environment: | ||||||
|     POSTGRES_DB: xorm_test |     POSTGRES_DB: xorm_test | ||||||
|  | @ -503,32 +219,18 @@ kind: pipeline | ||||||
| name: test-mssql | name: test-mssql | ||||||
| depends_on: | depends_on: | ||||||
|   - test-postgres |   - test-postgres | ||||||
|  | trigger: | ||||||
|  |   ref: | ||||||
|  |   - refs/heads/master | ||||||
|  |   - refs/pull/*/head | ||||||
| steps: | steps: | ||||||
| - name: restore-cache | - name: test-mssql | ||||||
|   image: meltwater/drone-cache |   pull: never | ||||||
|   pull: always |   image: golang:1.15 | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     restore: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |   volumes: | ||||||
|   - name: cache |   - name: cache | ||||||
|     path: /go |     path: /go/pkg/mod | ||||||
| 
 |  | ||||||
| - name: test-mssql |  | ||||||
|   pull: default |  | ||||||
|   image: golang:1.15 |  | ||||||
|   environment: |   environment: | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|     TEST_MSSQL_HOST: mssql |     TEST_MSSQL_HOST: mssql | ||||||
|     TEST_MSSQL_DBNAME: xorm_test |     TEST_MSSQL_DBNAME: xorm_test | ||||||
|     TEST_MSSQL_USERNAME: sa |     TEST_MSSQL_USERNAME: sa | ||||||
|  | @ -538,70 +240,38 @@ steps: | ||||||
|   - TEST_CACHE_ENABLE=true make test-mssql |   - TEST_CACHE_ENABLE=true make test-mssql | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-mssql |   - TEST_QUOTE_POLICY=reserved make test-mssql | ||||||
|   - TEST_MSSQL_DEFAULT_VARCHAR=NVARCHAR TEST_MSSQL_DEFAULT_CHAR=NCHAR make test-mssql |   - TEST_MSSQL_DEFAULT_VARCHAR=NVARCHAR TEST_MSSQL_DEFAULT_CHAR=NCHAR make test-mssql | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: rebuild-cache |  | ||||||
|   image: meltwater/drone-cache:dev |  | ||||||
|   pull: true |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     rebuild: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 | 
 | ||||||
| volumes: | volumes: | ||||||
|   - name: cache | - name: cache | ||||||
|     temp: {} |   host: | ||||||
|  |     path: /tmp/cache | ||||||
| 
 | 
 | ||||||
| services: | services: | ||||||
| - name: mssql | - name: mssql | ||||||
|   pull: default |   pull: always | ||||||
|   image: microsoft/mssql-server-linux:latest |   image: mcr.microsoft.com/mssql/server:latest | ||||||
|   environment: |   environment: | ||||||
|     ACCEPT_EULA: Y |     ACCEPT_EULA: Y | ||||||
|     SA_PASSWORD: yourStrong(!)Password |     SA_PASSWORD: yourStrong(!)Password | ||||||
|     MSSQL_PID: Developer |     MSSQL_PID: Standard | ||||||
| 
 | 
 | ||||||
| --- | --- | ||||||
| kind: pipeline | kind: pipeline | ||||||
| name: test-tidb | name: test-tidb | ||||||
| depends_on: | depends_on: | ||||||
|   - test-mssql |   - test-mssql | ||||||
|  | trigger: | ||||||
|  |   ref: | ||||||
|  |   - refs/heads/master | ||||||
|  |   - refs/pull/*/head | ||||||
| steps: | steps: | ||||||
| - name: restore-cache | - name: test-tidb | ||||||
|   image: meltwater/drone-cache |   pull: never | ||||||
|   pull: always |   image: golang:1.15 | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     restore: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |   volumes: | ||||||
|   - name: cache |   - name: cache | ||||||
|     path: /go |     path: /go/pkg/mod | ||||||
| 
 |  | ||||||
| - name: test-tidb |  | ||||||
|   pull: default |  | ||||||
|   image: golang:1.15 |  | ||||||
|   environment: |   environment: | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|     TEST_TIDB_HOST: "tidb:4000" |     TEST_TIDB_HOST: "tidb:4000" | ||||||
|     TEST_TIDB_DBNAME: xorm_test |     TEST_TIDB_DBNAME: xorm_test | ||||||
|     TEST_TIDB_USERNAME: root |     TEST_TIDB_USERNAME: root | ||||||
|  | @ -610,33 +280,14 @@ steps: | ||||||
|   - make test-tidb |   - make test-tidb | ||||||
|   - TEST_CACHE_ENABLE=true make test-tidb |   - TEST_CACHE_ENABLE=true make test-tidb | ||||||
|   - TEST_QUOTE_POLICY=reserved make test-tidb |   - TEST_QUOTE_POLICY=reserved make test-tidb | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: rebuild-cache |  | ||||||
|   image: meltwater/drone-cache:dev |  | ||||||
|   pull: true |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     rebuild: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 | 
 | ||||||
| volumes: | volumes: | ||||||
|   - name: cache | - name: cache | ||||||
|     temp: {} |   host: | ||||||
|  |     path: /tmp/cache | ||||||
| 
 | 
 | ||||||
| services: | services: | ||||||
| - name: tidb | - name: tidb | ||||||
|   pull: default |  | ||||||
|   image: pingcap/tidb:v3.0.3 |   image: pingcap/tidb:v3.0.3 | ||||||
| 
 | 
 | ||||||
| --- | --- | ||||||
|  | @ -644,32 +295,18 @@ kind: pipeline | ||||||
| name: test-cockroach | name: test-cockroach | ||||||
| depends_on: | depends_on: | ||||||
|   - test-tidb |   - test-tidb | ||||||
|  | trigger: | ||||||
|  |   ref: | ||||||
|  |   - refs/heads/master | ||||||
|  |   - refs/pull/*/head | ||||||
| steps: | steps: | ||||||
| - name: restore-cache | - name: test-cockroach | ||||||
|   image: meltwater/drone-cache |   pull: never | ||||||
|   pull: always |   image: golang:1.15 | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     restore: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |   volumes: | ||||||
|   - name: cache |   - name: cache | ||||||
|     path: /go |     path: /go/pkg/mod | ||||||
| 
 |  | ||||||
| - name: test-cockroach |  | ||||||
|   pull: default |  | ||||||
|   image: golang:1.15 |  | ||||||
|   environment: |   environment: | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|     CGO_ENABLED: 1 |  | ||||||
|     GOMODCACHE: '/drone/src/pkg.mod' |  | ||||||
|     GOCACHE: '/drone/src/pkg.build' |  | ||||||
|     TEST_COCKROACH_HOST: "cockroach:26257" |     TEST_COCKROACH_HOST: "cockroach:26257" | ||||||
|     TEST_COCKROACH_DBNAME: xorm_test |     TEST_COCKROACH_DBNAME: xorm_test | ||||||
|     TEST_COCKROACH_USERNAME: root |     TEST_COCKROACH_USERNAME: root | ||||||
|  | @ -678,33 +315,14 @@ steps: | ||||||
|   - sleep 10 |   - sleep 10 | ||||||
|   - make test-cockroach |   - make test-cockroach | ||||||
|   - TEST_CACHE_ENABLE=true make test-cockroach |   - TEST_CACHE_ENABLE=true make test-cockroach | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 |  | ||||||
| - name: rebuild-cache |  | ||||||
|   image: meltwater/drone-cache:dev |  | ||||||
|   pull: true |  | ||||||
|   settings: |  | ||||||
|     backend: "filesystem" |  | ||||||
|     rebuild: true |  | ||||||
|     cache_key: '{{ .Repo.Name }}_{{ checksum "go.mod" }}_{{ checksum "go.sum" }}_{{ arch }}_{{ os }}' |  | ||||||
|     archive_format: "gzip" |  | ||||||
|     filesystem_cache_root: "/go" |  | ||||||
|     mount: |  | ||||||
|       - pkg.mod |  | ||||||
|       - pkg.build |  | ||||||
|   volumes: |  | ||||||
|   - name: cache |  | ||||||
|     path: /go |  | ||||||
| 
 | 
 | ||||||
| volumes: | volumes: | ||||||
|   - name: cache | - name: cache | ||||||
|     temp: {} |   host: | ||||||
|  |     path: /tmp/cache | ||||||
| 
 | 
 | ||||||
| services: | services: | ||||||
| - name: cockroach | - name: cockroach | ||||||
|   pull: default |  | ||||||
|   image: cockroachdb/cockroach:v19.2.4 |   image: cockroachdb/cockroach:v19.2.4 | ||||||
|   commands: |   commands: | ||||||
|   - /cockroach/cockroach start --insecure |   - /cockroach/cockroach start --insecure | ||||||
|  | @ -713,8 +331,6 @@ services: | ||||||
| kind: pipeline | kind: pipeline | ||||||
| name: merge_coverage | name: merge_coverage | ||||||
| depends_on: | depends_on: | ||||||
|   - testing |  | ||||||
|   - test-sqlite |  | ||||||
|   - test-mysql |   - test-mysql | ||||||
|   - test-mysql8 |   - test-mysql8 | ||||||
|   - test-mariadb |   - test-mariadb | ||||||
|  | @ -722,18 +338,12 @@ depends_on: | ||||||
|   - test-mssql |   - test-mssql | ||||||
|   - test-tidb |   - test-tidb | ||||||
|   - test-cockroach |   - test-cockroach | ||||||
|  | trigger: | ||||||
|  |   ref: | ||||||
|  |   - refs/heads/master | ||||||
|  |   - refs/pull/*/head | ||||||
| steps: | steps: | ||||||
| - name: merge_coverage | - name: merge_coverage | ||||||
|   pull: default |  | ||||||
|   image: golang:1.15 |   image: golang:1.15 | ||||||
|   environment: |  | ||||||
|     GO111MODULE: "on" |  | ||||||
|     GOPROXY: "https://goproxy.io" |  | ||||||
|   commands: |   commands: | ||||||
|   - make coverage |   - make coverage | ||||||
|   when: |  | ||||||
|     branch: |  | ||||||
|       - master |  | ||||||
|     event: |  | ||||||
|       - push |  | ||||||
|       - pull_request |  | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								vendor/xorm.io/xorm/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/xorm.io/xorm/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -36,4 +36,5 @@ test.db.sql | ||||||
| *coverage.out | *coverage.out | ||||||
| test.db | test.db | ||||||
| integrations/*.sql | integrations/*.sql | ||||||
| integrations/test_sqlite* | integrations/test_sqlite* | ||||||
|  | cover.out | ||||||
							
								
								
									
										14
									
								
								vendor/xorm.io/xorm/.revive.toml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/xorm.io/xorm/.revive.toml
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -8,20 +8,22 @@ warningCode = 1 | ||||||
| [rule.context-as-argument] | [rule.context-as-argument] | ||||||
| [rule.context-keys-type] | [rule.context-keys-type] | ||||||
| [rule.dot-imports] | [rule.dot-imports] | ||||||
|  | [rule.empty-lines] | ||||||
|  | [rule.errorf] | ||||||
| [rule.error-return] | [rule.error-return] | ||||||
| [rule.error-strings] | [rule.error-strings] | ||||||
| [rule.error-naming] | [rule.error-naming] | ||||||
| [rule.exported] | [rule.exported] | ||||||
| [rule.if-return] | [rule.if-return] | ||||||
| [rule.increment-decrement] | [rule.increment-decrement] | ||||||
| [rule.var-naming] | [rule.indent-error-flow] | ||||||
|   arguments = [["ID", "UID", "UUID", "URL", "JSON"], []] |  | ||||||
| [rule.var-declaration] |  | ||||||
| [rule.package-comments] | [rule.package-comments] | ||||||
| [rule.range] | [rule.range] | ||||||
| [rule.receiver-naming] | [rule.receiver-naming] | ||||||
|  | [rule.struct-tag] | ||||||
| [rule.time-naming] | [rule.time-naming] | ||||||
| [rule.unexported-return] | [rule.unexported-return] | ||||||
| [rule.indent-error-flow] | [rule.unnecessary-stmt] | ||||||
| [rule.errorf] | [rule.var-declaration] | ||||||
| [rule.struct-tag] | [rule.var-naming] | ||||||
|  |   arguments = [["ID", "UID", "UUID", "URL", "JSON"], []] | ||||||
							
								
								
									
										30
									
								
								vendor/xorm.io/xorm/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								vendor/xorm.io/xorm/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -3,6 +3,36 @@ | ||||||
| This changelog goes through all the changes that have been made in each release | This changelog goes through all the changes that have been made in each release | ||||||
| without substantial changes to our git log. | without substantial changes to our git log. | ||||||
| 
 | 
 | ||||||
|  | ## [1.1.1](https://gitea.com/xorm/xorm/releases/tag/1.1.1) - 2021-07-03 | ||||||
|  | 
 | ||||||
|  | * BUGFIXES | ||||||
|  |   * Ignore comments when deciding when to replace question marks. #1954 (#1955) | ||||||
|  |   * Fix bug didn't reset statement on update (#1939) | ||||||
|  |   * Fix create table with struct missing columns (#1938) | ||||||
|  |   * Fix #929 (#1936) | ||||||
|  |   * Fix exist (#1921) | ||||||
|  | * ENHANCEMENTS | ||||||
|  |   * Improve get field value of bean (#1961) | ||||||
|  |   * refactor splitTag function (#1960) | ||||||
|  |   * Fix #1663 (#1952) | ||||||
|  |   * fix pg GetColumns missing comment (#1949) | ||||||
|  |   * Support build flag jsoniter to replace default json (#1916) | ||||||
|  |   * refactor exprParam (#1825) | ||||||
|  |   * Add DBVersion (#1723) | ||||||
|  | * TESTING | ||||||
|  |   * Add test to confirm #1247 resolved (#1951) | ||||||
|  |   * Add test for dump table with default value (#1950) | ||||||
|  |   * Test for #1486 (#1942) | ||||||
|  |   * Add sync tests to confirm #539 is gone (#1937) | ||||||
|  |   * test for unsigned int32 (#1923) | ||||||
|  |   * Add tests for array store (#1922) | ||||||
|  | * BUILD | ||||||
|  |   * Remove mymysql from ci (#1928) | ||||||
|  | * MISC | ||||||
|  |   * fix lint (#1953) | ||||||
|  |   * Compitable with cockroach (#1930) | ||||||
|  |   * Replace goracle  with godror (#1914) | ||||||
|  | 
 | ||||||
| ## [1.1.0](https://gitea.com/xorm/xorm/releases/tag/1.1.0) - 2021-05-14 | ## [1.1.0](https://gitea.com/xorm/xorm/releases/tag/1.1.0) - 2021-05-14 | ||||||
| 
 | 
 | ||||||
| * FEATURES | * FEATURES | ||||||
|  |  | ||||||
							
								
								
									
										56
									
								
								vendor/xorm.io/xorm/convert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										56
									
								
								vendor/xorm.io/xorm/convert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -175,7 +175,10 @@ func convertAssign(dest, src interface{}) error { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	dpv := reflect.ValueOf(dest) | 	return convertAssignV(reflect.ValueOf(dest), src) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func convertAssignV(dpv reflect.Value, src interface{}) error { | ||||||
| 	if dpv.Kind() != reflect.Ptr { | 	if dpv.Kind() != reflect.Ptr { | ||||||
| 		return errors.New("destination not a pointer") | 		return errors.New("destination not a pointer") | ||||||
| 	} | 	} | ||||||
|  | @ -183,9 +186,7 @@ func convertAssign(dest, src interface{}) error { | ||||||
| 		return errNilPtr | 		return errNilPtr | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if !sv.IsValid() { | 	var sv = reflect.ValueOf(src) | ||||||
| 		sv = reflect.ValueOf(src) |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	dv := reflect.Indirect(dpv) | 	dv := reflect.Indirect(dpv) | ||||||
| 	if sv.IsValid() && sv.Type().AssignableTo(dv.Type()) { | 	if sv.IsValid() && sv.Type().AssignableTo(dv.Type()) { | ||||||
|  | @ -244,7 +245,7 @@ func convertAssign(dest, src interface{}) error { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return fmt.Errorf("unsupported Scan, storing driver.Value type %T into type %T", src, dest) | 	return fmt.Errorf("unsupported Scan, storing driver.Value type %T into type %T", src, dpv.Interface()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func asKind(vv reflect.Value, tp reflect.Type) (interface{}, error) { | func asKind(vv reflect.Value, tp reflect.Type) (interface{}, error) { | ||||||
|  | @ -375,48 +376,3 @@ func str2PK(s string, tp reflect.Type) (interface{}, error) { | ||||||
| 	} | 	} | ||||||
| 	return v.Interface(), nil | 	return v.Interface(), nil | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func int64ToIntValue(id int64, tp reflect.Type) reflect.Value { |  | ||||||
| 	var v interface{} |  | ||||||
| 	kind := tp.Kind() |  | ||||||
| 
 |  | ||||||
| 	if kind == reflect.Ptr { |  | ||||||
| 		kind = tp.Elem().Kind() |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	switch kind { |  | ||||||
| 	case reflect.Int16: |  | ||||||
| 		temp := int16(id) |  | ||||||
| 		v = &temp |  | ||||||
| 	case reflect.Int32: |  | ||||||
| 		temp := int32(id) |  | ||||||
| 		v = &temp |  | ||||||
| 	case reflect.Int: |  | ||||||
| 		temp := int(id) |  | ||||||
| 		v = &temp |  | ||||||
| 	case reflect.Int64: |  | ||||||
| 		temp := id |  | ||||||
| 		v = &temp |  | ||||||
| 	case reflect.Uint16: |  | ||||||
| 		temp := uint16(id) |  | ||||||
| 		v = &temp |  | ||||||
| 	case reflect.Uint32: |  | ||||||
| 		temp := uint32(id) |  | ||||||
| 		v = &temp |  | ||||||
| 	case reflect.Uint64: |  | ||||||
| 		temp := uint64(id) |  | ||||||
| 		v = &temp |  | ||||||
| 	case reflect.Uint: |  | ||||||
| 		temp := uint(id) |  | ||||||
| 		v = &temp |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if tp.Kind() == reflect.Ptr { |  | ||||||
| 		return reflect.ValueOf(v).Convert(tp) |  | ||||||
| 	} |  | ||||||
| 	return reflect.ValueOf(v).Elem().Convert(tp) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func int64ToInt(id int64, tp reflect.Type) interface{} { |  | ||||||
| 	return int64ToIntValue(id, tp).Interface() |  | ||||||
| } |  | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								vendor/xorm.io/xorm/dialects/dialect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/xorm.io/xorm/dialects/dialect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -44,6 +44,7 @@ type Dialect interface { | ||||||
| 	URI() *URI | 	URI() *URI | ||||||
| 	SQLType(*schemas.Column) string | 	SQLType(*schemas.Column) string | ||||||
| 	FormatBytes(b []byte) string | 	FormatBytes(b []byte) string | ||||||
|  | 	Version(ctx context.Context, queryer core.Queryer) (*schemas.Version, error) | ||||||
| 
 | 
 | ||||||
| 	IsReserved(string) bool | 	IsReserved(string) bool | ||||||
| 	Quoter() schemas.Quoter | 	Quoter() schemas.Quoter | ||||||
|  | @ -217,7 +218,7 @@ func regDrvsNDialects() bool { | ||||||
| 		"sqlite3":  {"sqlite3", func() Driver { return &sqlite3Driver{} }, func() Dialect { return &sqlite3{} }}, | 		"sqlite3":  {"sqlite3", func() Driver { return &sqlite3Driver{} }, func() Dialect { return &sqlite3{} }}, | ||||||
| 		"sqlite":   {"sqlite3", func() Driver { return &sqlite3Driver{} }, func() Dialect { return &sqlite3{} }}, | 		"sqlite":   {"sqlite3", func() Driver { return &sqlite3Driver{} }, func() Dialect { return &sqlite3{} }}, | ||||||
| 		"oci8":     {"oracle", func() Driver { return &oci8Driver{} }, func() Dialect { return &oracle{} }}, | 		"oci8":     {"oracle", func() Driver { return &oci8Driver{} }, func() Dialect { return &oracle{} }}, | ||||||
| 		"goracle":  {"oracle", func() Driver { return &goracleDriver{} }, func() Dialect { return &oracle{} }}, | 		"godror":   {"oracle", func() Driver { return &godrorDriver{} }, func() Dialect { return &oracle{} }}, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for driverName, v := range providedDrvsNDialects { | 	for driverName, v := range providedDrvsNDialects { | ||||||
|  |  | ||||||
							
								
								
									
										36
									
								
								vendor/xorm.io/xorm/dialects/filter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								vendor/xorm.io/xorm/dialects/filter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -23,13 +23,45 @@ type SeqFilter struct { | ||||||
| func convertQuestionMark(sql, prefix string, start int) string { | func convertQuestionMark(sql, prefix string, start int) string { | ||||||
| 	var buf strings.Builder | 	var buf strings.Builder | ||||||
| 	var beginSingleQuote bool | 	var beginSingleQuote bool | ||||||
|  | 	var isLineComment bool | ||||||
|  | 	var isComment bool | ||||||
|  | 	var isMaybeLineComment bool | ||||||
|  | 	var isMaybeComment bool | ||||||
|  | 	var isMaybeCommentEnd bool | ||||||
| 	var index = start | 	var index = start | ||||||
| 	for _, c := range sql { | 	for _, c := range sql { | ||||||
| 		if !beginSingleQuote && c == '?' { | 		if !beginSingleQuote && !isLineComment && !isComment && c == '?' { | ||||||
| 			buf.WriteString(fmt.Sprintf("%s%v", prefix, index)) | 			buf.WriteString(fmt.Sprintf("%s%v", prefix, index)) | ||||||
| 			index++ | 			index++ | ||||||
| 		} else { | 		} else { | ||||||
| 			if c == '\'' { | 			if isMaybeLineComment { | ||||||
|  | 				if c == '-' { | ||||||
|  | 					isLineComment = true | ||||||
|  | 				} | ||||||
|  | 				isMaybeLineComment = false | ||||||
|  | 			} else if isMaybeComment { | ||||||
|  | 				if c == '*' { | ||||||
|  | 					isComment = true | ||||||
|  | 				} | ||||||
|  | 				isMaybeComment = false | ||||||
|  | 			} else if isMaybeCommentEnd { | ||||||
|  | 				if c == '/' { | ||||||
|  | 					isComment = false | ||||||
|  | 				} | ||||||
|  | 				isMaybeCommentEnd = false | ||||||
|  | 			} else if isLineComment { | ||||||
|  | 				if c == '\n' { | ||||||
|  | 					isLineComment = false | ||||||
|  | 				} | ||||||
|  | 			} else if isComment { | ||||||
|  | 				if c == '*' { | ||||||
|  | 					isMaybeCommentEnd = true | ||||||
|  | 				} | ||||||
|  | 			} else if !beginSingleQuote && c == '-' { | ||||||
|  | 				isMaybeLineComment = true | ||||||
|  | 			} else if !beginSingleQuote && c == '/' { | ||||||
|  | 				isMaybeComment = true | ||||||
|  | 			} else if c == '\'' { | ||||||
| 				beginSingleQuote = !beginSingleQuote | 				beginSingleQuote = !beginSingleQuote | ||||||
| 			} | 			} | ||||||
| 			buf.WriteRune(c) | 			buf.WriteRune(c) | ||||||
|  |  | ||||||
							
								
								
									
										29
									
								
								vendor/xorm.io/xorm/dialects/mssql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/xorm.io/xorm/dialects/mssql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -253,6 +253,31 @@ func (db *mssql) SetParams(params map[string]string) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (db *mssql) Version(ctx context.Context, queryer core.Queryer) (*schemas.Version, error) { | ||||||
|  | 	rows, err := queryer.QueryContext(ctx, | ||||||
|  | 		"SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel') AS ProductLevel, SERVERPROPERTY ('edition') AS ProductEdition") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer rows.Close() | ||||||
|  | 
 | ||||||
|  | 	var version, level, edition string | ||||||
|  | 	if !rows.Next() { | ||||||
|  | 		return nil, errors.New("unknow version") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := rows.Scan(&version, &level, &edition); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// MSSQL: Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) - 14.0.3048.4 (X64) Nov 30 2018 12:57:58 Copyright (C) 2017 Microsoft Corporation Developer Edition (64-bit) on Linux (Ubuntu 16.04.5 LTS)
 | ||||||
|  | 	return &schemas.Version{ | ||||||
|  | 		Number:  version, | ||||||
|  | 		Level:   level, | ||||||
|  | 		Edition: edition, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (db *mssql) SQLType(c *schemas.Column) string { | func (db *mssql) SQLType(c *schemas.Column) string { | ||||||
| 	var res string | 	var res string | ||||||
| 	switch t := c.SQLType.Name; t { | 	switch t := c.SQLType.Name; t { | ||||||
|  | @ -284,7 +309,7 @@ func (db *mssql) SQLType(c *schemas.Column) string { | ||||||
| 	case schemas.TimeStampz: | 	case schemas.TimeStampz: | ||||||
| 		res = "DATETIMEOFFSET" | 		res = "DATETIMEOFFSET" | ||||||
| 		c.Length = 7 | 		c.Length = 7 | ||||||
| 	case schemas.MediumInt, schemas.UnsignedInt: | 	case schemas.MediumInt: | ||||||
| 		res = schemas.Int | 		res = schemas.Int | ||||||
| 	case schemas.Text, schemas.MediumText, schemas.TinyText, schemas.LongText, schemas.Json: | 	case schemas.Text, schemas.MediumText, schemas.TinyText, schemas.LongText, schemas.Json: | ||||||
| 		res = db.defaultVarchar + "(MAX)" | 		res = db.defaultVarchar + "(MAX)" | ||||||
|  | @ -296,7 +321,7 @@ func (db *mssql) SQLType(c *schemas.Column) string { | ||||||
| 	case schemas.TinyInt: | 	case schemas.TinyInt: | ||||||
| 		res = schemas.TinyInt | 		res = schemas.TinyInt | ||||||
| 		c.Length = 0 | 		c.Length = 0 | ||||||
| 	case schemas.BigInt, schemas.UnsignedBigInt: | 	case schemas.BigInt, schemas.UnsignedBigInt, schemas.UnsignedInt: | ||||||
| 		res = schemas.BigInt | 		res = schemas.BigInt | ||||||
| 		c.Length = 0 | 		c.Length = 0 | ||||||
| 	case schemas.NVarchar: | 	case schemas.NVarchar: | ||||||
|  |  | ||||||
							
								
								
									
										37
									
								
								vendor/xorm.io/xorm/dialects/mysql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/xorm.io/xorm/dialects/mysql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -188,6 +188,43 @@ func (db *mysql) Init(uri *URI) error { | ||||||
| 	return db.Base.Init(db, uri) | 	return db.Base.Init(db, uri) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (db *mysql) Version(ctx context.Context, queryer core.Queryer) (*schemas.Version, error) { | ||||||
|  | 	rows, err := queryer.QueryContext(ctx, "SELECT @@VERSION") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer rows.Close() | ||||||
|  | 
 | ||||||
|  | 	var version string | ||||||
|  | 	if !rows.Next() { | ||||||
|  | 		return nil, errors.New("Unknow version") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := rows.Scan(&version); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	fields := strings.Split(version, "-") | ||||||
|  | 	if len(fields) == 3 && fields[1] == "TiDB" { | ||||||
|  | 		// 5.7.25-TiDB-v3.0.3
 | ||||||
|  | 		return &schemas.Version{ | ||||||
|  | 			Number:  strings.TrimPrefix(fields[2], "v"), | ||||||
|  | 			Level:   fields[0], | ||||||
|  | 			Edition: fields[1], | ||||||
|  | 		}, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var edition string | ||||||
|  | 	if len(fields) == 2 { | ||||||
|  | 		edition = fields[1] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return &schemas.Version{ | ||||||
|  | 		Number:  fields[0], | ||||||
|  | 		Edition: edition, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (db *mysql) SetParams(params map[string]string) { | func (db *mysql) SetParams(params map[string]string) { | ||||||
| 	rowFormat, ok := params["rowFormat"] | 	rowFormat, ok := params["rowFormat"] | ||||||
| 	if ok { | 	if ok { | ||||||
|  |  | ||||||
							
								
								
									
										24
									
								
								vendor/xorm.io/xorm/dialects/oracle.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/xorm.io/xorm/dialects/oracle.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -515,6 +515,26 @@ func (db *oracle) Init(uri *URI) error { | ||||||
| 	return db.Base.Init(db, uri) | 	return db.Base.Init(db, uri) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (db *oracle) Version(ctx context.Context, queryer core.Queryer) (*schemas.Version, error) { | ||||||
|  | 	rows, err := queryer.QueryContext(ctx, "select * from v$version where banner like 'Oracle%'") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer rows.Close() | ||||||
|  | 
 | ||||||
|  | 	var version string | ||||||
|  | 	if !rows.Next() { | ||||||
|  | 		return nil, errors.New("unknow version") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := rows.Scan(&version); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &schemas.Version{ | ||||||
|  | 		Number: version, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (db *oracle) SQLType(c *schemas.Column) string { | func (db *oracle) SQLType(c *schemas.Column) string { | ||||||
| 	var res string | 	var res string | ||||||
| 	switch t := c.SQLType.Name; t { | 	switch t := c.SQLType.Name; t { | ||||||
|  | @ -802,10 +822,10 @@ func (db *oracle) Filters() []Filter { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type goracleDriver struct { | type godrorDriver struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (cfg *goracleDriver) Parse(driverName, dataSourceName string) (*URI, error) { | func (cfg *godrorDriver) Parse(driverName, dataSourceName string) (*URI, error) { | ||||||
| 	db := &URI{DBType: schemas.ORACLE} | 	db := &URI{DBType: schemas.ORACLE} | ||||||
| 	dsnPattern := regexp.MustCompile( | 	dsnPattern := regexp.MustCompile( | ||||||
| 		`^(?:(?P<user>.*?)(?::(?P<passwd>.*))?@)?` + // [user[:password]@]
 | 		`^(?:(?P<user>.*?)(?::(?P<passwd>.*))?@)?` + // [user[:password]@]
 | ||||||
|  |  | ||||||
							
								
								
									
										58
									
								
								vendor/xorm.io/xorm/dialects/postgres.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										58
									
								
								vendor/xorm.io/xorm/dialects/postgres.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -788,6 +788,42 @@ func (db *postgres) Init(uri *URI) error { | ||||||
| 	return db.Base.Init(db, uri) | 	return db.Base.Init(db, uri) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (db *postgres) Version(ctx context.Context, queryer core.Queryer) (*schemas.Version, error) { | ||||||
|  | 	rows, err := queryer.QueryContext(ctx, "SELECT version()") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer rows.Close() | ||||||
|  | 
 | ||||||
|  | 	var version string | ||||||
|  | 	if !rows.Next() { | ||||||
|  | 		return nil, errors.New("Unknow version") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := rows.Scan(&version); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Postgres: 9.5.22 on x86_64-pc-linux-gnu (Debian 9.5.22-1.pgdg90+1), compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit
 | ||||||
|  | 	// CockroachDB CCL v19.2.4 (x86_64-unknown-linux-gnu, built
 | ||||||
|  | 	if strings.HasPrefix(version, "CockroachDB") { | ||||||
|  | 		versions := strings.Split(strings.TrimPrefix(version, "CockroachDB CCL "), " ") | ||||||
|  | 		return &schemas.Version{ | ||||||
|  | 			Number:  strings.TrimPrefix(versions[0], "v"), | ||||||
|  | 			Edition: "CockroachDB", | ||||||
|  | 		}, nil | ||||||
|  | 	} else if strings.HasPrefix(version, "PostgreSQL") { | ||||||
|  | 		versions := strings.Split(strings.TrimPrefix(version, "PostgreSQL "), " on ") | ||||||
|  | 		return &schemas.Version{ | ||||||
|  | 			Number:  versions[0], | ||||||
|  | 			Level:   versions[1], | ||||||
|  | 			Edition: "PostgreSQL", | ||||||
|  | 		}, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil, errors.New("unknow database version") | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (db *postgres) getSchema() string { | func (db *postgres) getSchema() string { | ||||||
| 	if db.uri.Schema != "" { | 	if db.uri.Schema != "" { | ||||||
| 		return db.uri.Schema | 		return db.uri.Schema | ||||||
|  | @ -838,12 +874,12 @@ func (db *postgres) SQLType(c *schemas.Column) string { | ||||||
| 	case schemas.Bit: | 	case schemas.Bit: | ||||||
| 		res = schemas.Boolean | 		res = schemas.Boolean | ||||||
| 		return res | 		return res | ||||||
| 	case schemas.MediumInt, schemas.Int, schemas.Integer, schemas.UnsignedInt: | 	case schemas.MediumInt, schemas.Int, schemas.Integer: | ||||||
| 		if c.IsAutoIncrement { | 		if c.IsAutoIncrement { | ||||||
| 			return schemas.Serial | 			return schemas.Serial | ||||||
| 		} | 		} | ||||||
| 		return schemas.Integer | 		return schemas.Integer | ||||||
| 	case schemas.BigInt, schemas.UnsignedBigInt: | 	case schemas.BigInt, schemas.UnsignedBigInt, schemas.UnsignedInt: | ||||||
| 		if c.IsAutoIncrement { | 		if c.IsAutoIncrement { | ||||||
| 			return schemas.BigSerial | 			return schemas.BigSerial | ||||||
| 		} | 		} | ||||||
|  | @ -1008,12 +1044,13 @@ func (db *postgres) IsColumnExist(queryer core.Queryer, ctx context.Context, tab | ||||||
| 
 | 
 | ||||||
| func (db *postgres) GetColumns(queryer core.Queryer, ctx context.Context, tableName string) ([]string, map[string]*schemas.Column, error) { | func (db *postgres) GetColumns(queryer core.Queryer, ctx context.Context, tableName string) ([]string, map[string]*schemas.Column, error) { | ||||||
| 	args := []interface{}{tableName} | 	args := []interface{}{tableName} | ||||||
| 	s := `SELECT column_name, column_default, is_nullable, data_type, character_maximum_length, | 	s := `SELECT column_name, column_default, is_nullable, data_type, character_maximum_length, description, | ||||||
|     CASE WHEN p.contype = 'p' THEN true ELSE false END AS primarykey, |     CASE WHEN p.contype = 'p' THEN true ELSE false END AS primarykey, | ||||||
|     CASE WHEN p.contype = 'u' THEN true ELSE false END AS uniquekey |     CASE WHEN p.contype = 'u' THEN true ELSE false END AS uniquekey | ||||||
| FROM pg_attribute f | FROM pg_attribute f | ||||||
|     JOIN pg_class c ON c.oid = f.attrelid JOIN pg_type t ON t.oid = f.atttypid |     JOIN pg_class c ON c.oid = f.attrelid JOIN pg_type t ON t.oid = f.atttypid | ||||||
|     LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum |     LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum | ||||||
|  |     LEFT JOIN pg_description de ON f.attrelid=de.objoid AND f.attnum=de.objsubid | ||||||
|     LEFT JOIN pg_namespace n ON n.oid = c.relnamespace |     LEFT JOIN pg_namespace n ON n.oid = c.relnamespace | ||||||
|     LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey) |     LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey) | ||||||
|     LEFT JOIN pg_class AS g ON p.confrelid = g.oid |     LEFT JOIN pg_class AS g ON p.confrelid = g.oid | ||||||
|  | @ -1042,9 +1079,9 @@ WHERE n.nspname= s.table_schema AND c.relkind = 'r'::char AND c.relname = $1%s A | ||||||
| 		col.Indexes = make(map[string]int) | 		col.Indexes = make(map[string]int) | ||||||
| 
 | 
 | ||||||
| 		var colName, isNullable, dataType string | 		var colName, isNullable, dataType string | ||||||
| 		var maxLenStr, colDefault *string | 		var maxLenStr, colDefault, description *string | ||||||
| 		var isPK, isUnique bool | 		var isPK, isUnique bool | ||||||
| 		err = rows.Scan(&colName, &colDefault, &isNullable, &dataType, &maxLenStr, &isPK, &isUnique) | 		err = rows.Scan(&colName, &colDefault, &isNullable, &dataType, &maxLenStr, &description, &isPK, &isUnique) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, nil, err | 			return nil, nil, err | ||||||
| 		} | 		} | ||||||
|  | @ -1090,6 +1127,10 @@ WHERE n.nspname= s.table_schema AND c.relkind = 'r'::char AND c.relname = $1%s A | ||||||
| 			col.DefaultIsEmpty = true | 			col.DefaultIsEmpty = true | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if description != nil { | ||||||
|  | 			col.Comment = *description | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		if isPK { | 		if isPK { | ||||||
| 			col.IsPrimaryKey = true | 			col.IsPrimaryKey = true | ||||||
| 		} | 		} | ||||||
|  | @ -1221,7 +1262,8 @@ func (db *postgres) GetIndexes(queryer core.Queryer, ctx context.Context, tableN | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		indexName = strings.Trim(indexName, `" `) | 		indexName = strings.Trim(indexName, `" `) | ||||||
| 		if strings.HasSuffix(indexName, "_pkey") { | 		// ignore primary index
 | ||||||
|  | 		if strings.HasSuffix(indexName, "_pkey") || strings.EqualFold(indexName, "primary") { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		if strings.HasPrefix(indexdef, "CREATE UNIQUE INDEX") { | 		if strings.HasPrefix(indexdef, "CREATE UNIQUE INDEX") { | ||||||
|  | @ -1241,7 +1283,9 @@ func (db *postgres) GetIndexes(queryer core.Queryer, ctx context.Context, tableN | ||||||
| 
 | 
 | ||||||
| 		index := &schemas.Index{Name: indexName, Type: indexType, Cols: make([]string, 0)} | 		index := &schemas.Index{Name: indexName, Type: indexType, Cols: make([]string, 0)} | ||||||
| 		for _, colName := range colNames { | 		for _, colName := range colNames { | ||||||
| 			index.Cols = append(index.Cols, strings.TrimSpace(strings.Replace(colName, `"`, "", -1))) | 			col := strings.TrimSpace(strings.Replace(colName, `"`, "", -1)) | ||||||
|  | 			fields := strings.Split(col, " ") | ||||||
|  | 			index.Cols = append(index.Cols, fields[0]) | ||||||
| 		} | 		} | ||||||
| 		index.IsRegular = isRegular | 		index.IsRegular = isRegular | ||||||
| 		indexes[index.Name] = index | 		indexes[index.Name] = index | ||||||
|  |  | ||||||
							
								
								
									
										21
									
								
								vendor/xorm.io/xorm/dialects/sqlite3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/xorm.io/xorm/dialects/sqlite3.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -160,6 +160,27 @@ func (db *sqlite3) Init(uri *URI) error { | ||||||
| 	return db.Base.Init(db, uri) | 	return db.Base.Init(db, uri) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (db *sqlite3) Version(ctx context.Context, queryer core.Queryer) (*schemas.Version, error) { | ||||||
|  | 	rows, err := queryer.QueryContext(ctx, "SELECT sqlite_version()") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer rows.Close() | ||||||
|  | 
 | ||||||
|  | 	var version string | ||||||
|  | 	if !rows.Next() { | ||||||
|  | 		return nil, errors.New("Unknow version") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := rows.Scan(&version); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &schemas.Version{ | ||||||
|  | 		Number:  version, | ||||||
|  | 		Edition: "sqlite", | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (db *sqlite3) SetQuotePolicy(quotePolicy QuotePolicy) { | func (db *sqlite3) SetQuotePolicy(quotePolicy QuotePolicy) { | ||||||
| 	switch quotePolicy { | 	switch quotePolicy { | ||||||
| 	case QuotePolicyNone: | 	case QuotePolicyNone: | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								vendor/xorm.io/xorm/engine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								vendor/xorm.io/xorm/engine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -444,7 +444,7 @@ func (engine *Engine) DumpTables(tables []*schemas.Table, w io.Writer, tp ...sch | ||||||
| 	return engine.dumpTables(tables, w, tp...) | 	return engine.dumpTables(tables, w, tp...) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func formatColumnValue(dstDialect dialects.Dialect, d interface{}, col *schemas.Column) string { | func formatColumnValue(dbLocation *time.Location, dstDialect dialects.Dialect, d interface{}, col *schemas.Column) string { | ||||||
| 	if d == nil { | 	if d == nil { | ||||||
| 		return "NULL" | 		return "NULL" | ||||||
| 	} | 	} | ||||||
|  | @ -473,10 +473,8 @@ func formatColumnValue(dstDialect dialects.Dialect, d interface{}, col *schemas. | ||||||
| 
 | 
 | ||||||
| 		return "'" + strings.Replace(v, "'", "''", -1) + "'" | 		return "'" + strings.Replace(v, "'", "''", -1) + "'" | ||||||
| 	} else if col.SQLType.IsTime() { | 	} else if col.SQLType.IsTime() { | ||||||
| 		if dstDialect.URI().DBType == schemas.MSSQL && col.SQLType.Name == schemas.DateTime { | 		if t, ok := d.(time.Time); ok { | ||||||
| 			if t, ok := d.(time.Time); ok { | 			return "'" + t.In(dbLocation).Format("2006-01-02 15:04:05") + "'" | ||||||
| 				return "'" + t.UTC().Format("2006-01-02 15:04:05") + "'" |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 		var v = fmt.Sprintf("%s", d) | 		var v = fmt.Sprintf("%s", d) | ||||||
| 		if strings.HasSuffix(v, " +0000 UTC") { | 		if strings.HasSuffix(v, " +0000 UTC") { | ||||||
|  | @ -652,12 +650,8 @@ func (engine *Engine) dumpTables(tables []*schemas.Table, w io.Writer, tp ...sch | ||||||
| 						return errors.New("unknown column error") | 						return errors.New("unknown column error") | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					fields := strings.Split(col.FieldName, ".") | 					field := dataStruct.FieldByIndex(col.FieldIndex) | ||||||
| 					field := dataStruct | 					temp += "," + formatColumnValue(engine.DatabaseTZ, dstDialect, field.Interface(), col) | ||||||
| 					for _, fieldName := range fields { |  | ||||||
| 						field = field.FieldByName(fieldName) |  | ||||||
| 					} |  | ||||||
| 					temp += "," + formatColumnValue(dstDialect, field.Interface(), col) |  | ||||||
| 				} | 				} | ||||||
| 				_, err = io.WriteString(w, temp[1:]+");\n") | 				_, err = io.WriteString(w, temp[1:]+");\n") | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
|  | @ -684,7 +678,7 @@ func (engine *Engine) dumpTables(tables []*schemas.Table, w io.Writer, tp ...sch | ||||||
| 						return errors.New("unknow column error") | 						return errors.New("unknow column error") | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					temp += "," + formatColumnValue(dstDialect, d, col) | 					temp += "," + formatColumnValue(engine.DatabaseTZ, dstDialect, d, col) | ||||||
| 				} | 				} | ||||||
| 				_, err = io.WriteString(w, temp[1:]+");\n") | 				_, err = io.WriteString(w, temp[1:]+");\n") | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
|  | @ -925,15 +919,9 @@ func (engine *Engine) Having(conditions string) *Session { | ||||||
| 	return session.Having(conditions) | 	return session.Having(conditions) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Table table struct
 | // DBVersion returns the database version
 | ||||||
| type Table struct { | func (engine *Engine) DBVersion() (*schemas.Version, error) { | ||||||
| 	*schemas.Table | 	return engine.dialect.Version(engine.defaultContext, engine.db) | ||||||
| 	Name string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsValid if table is valid
 |  | ||||||
| func (t *Table) IsValid() bool { |  | ||||||
| 	return t.Table != nil && len(t.Name) > 0 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // TableInfo get table info according to bean's content
 | // TableInfo get table info according to bean's content
 | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								vendor/xorm.io/xorm/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/xorm.io/xorm/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -5,6 +5,7 @@ go 1.13 | ||||||
| require ( | require ( | ||||||
| 	github.com/denisenkom/go-mssqldb v0.9.0 | 	github.com/denisenkom/go-mssqldb v0.9.0 | ||||||
| 	github.com/go-sql-driver/mysql v1.5.0 | 	github.com/go-sql-driver/mysql v1.5.0 | ||||||
|  | 	github.com/json-iterator/go v1.1.11 | ||||||
| 	github.com/lib/pq v1.7.0 | 	github.com/lib/pq v1.7.0 | ||||||
| 	github.com/mattn/go-sqlite3 v1.14.6 | 	github.com/mattn/go-sqlite3 v1.14.6 | ||||||
| 	github.com/stretchr/testify v1.4.0 | 	github.com/stretchr/testify v1.4.0 | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								vendor/xorm.io/xorm/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/xorm.io/xorm/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,7 +1,8 @@ | ||||||
| gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= | gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= | ||||||
| gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= | gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= | ||||||
| github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= |  | ||||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||||
|  | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
| github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D0yGjAk= | github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D0yGjAk= | ||||||
| github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= | github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= | ||||||
| github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= | github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= | ||||||
|  | @ -18,8 +19,11 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pO | ||||||
| github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||||
| github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo= | github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo= | ||||||
| github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||||
|  | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||||
| github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= | github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= | ||||||
| github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | ||||||
|  | github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= | ||||||
|  | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= | ||||||
| github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= | github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= | ||||||
| github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= | github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= | ||||||
| github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY= | github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY= | ||||||
|  | @ -28,6 +32,10 @@ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHX | ||||||
| github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | ||||||
| github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= | github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= | ||||||
| github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= | github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= | ||||||
|  | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= | ||||||
|  | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||||
|  | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= | ||||||
|  | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | ||||||
| github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||||
| github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= | github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= | ||||||
| github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								vendor/xorm.io/xorm/interface.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/xorm.io/xorm/interface.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -83,6 +83,7 @@ type EngineInterface interface { | ||||||
| 	Context(context.Context) *Session | 	Context(context.Context) *Session | ||||||
| 	CreateTables(...interface{}) error | 	CreateTables(...interface{}) error | ||||||
| 	DBMetas() ([]*schemas.Table, error) | 	DBMetas() ([]*schemas.Table, error) | ||||||
|  | 	DBVersion() (*schemas.Version, error) | ||||||
| 	Dialect() dialects.Dialect | 	Dialect() dialects.Dialect | ||||||
| 	DriverName() string | 	DriverName() string | ||||||
| 	DropTables(...interface{}) error | 	DropTables(...interface{}) error | ||||||
|  |  | ||||||
							
								
								
									
										28
									
								
								vendor/xorm.io/xorm/internal/json/jsoniter.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/xorm.io/xorm/internal/json/jsoniter.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | ||||||
|  | // Copyright 2021 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 jsoniter
 | ||||||
|  | 
 | ||||||
|  | package json | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	jsoniter "github.com/json-iterator/go" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	DefaultJSONHandler = JSONiter{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // JSONiter implements JSONInterface via jsoniter
 | ||||||
|  | type JSONiter struct{} | ||||||
|  | 
 | ||||||
|  | // Marshal implements JSONInterface
 | ||||||
|  | func (JSONiter) Marshal(v interface{}) ([]byte, error) { | ||||||
|  | 	return jsoniter.Marshal(v) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Unmarshal implements JSONInterface
 | ||||||
|  | func (JSONiter) Unmarshal(data []byte, v interface{}) error { | ||||||
|  | 	return jsoniter.Unmarshal(data, v) | ||||||
|  | } | ||||||
							
								
								
									
										94
									
								
								vendor/xorm.io/xorm/internal/statements/expr.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								vendor/xorm.io/xorm/internal/statements/expr.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,94 @@ | ||||||
|  | // Copyright 2019 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 statements | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
|  | 	"xorm.io/builder" | ||||||
|  | 	"xorm.io/xorm/schemas" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // ErrUnsupportedExprType represents an error with unsupported express type
 | ||||||
|  | type ErrUnsupportedExprType struct { | ||||||
|  | 	tp string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (err ErrUnsupportedExprType) Error() string { | ||||||
|  | 	return fmt.Sprintf("Unsupported expression type: %v", err.tp) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Expr represents an SQL express
 | ||||||
|  | type Expr struct { | ||||||
|  | 	ColName string | ||||||
|  | 	Arg     interface{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteArgs writes args to the writer
 | ||||||
|  | func (expr *Expr) WriteArgs(w *builder.BytesWriter) error { | ||||||
|  | 	switch arg := expr.Arg.(type) { | ||||||
|  | 	case *builder.Builder: | ||||||
|  | 		if _, err := w.WriteString("("); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		if err := arg.WriteTo(w); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		if _, err := w.WriteString(")"); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	case string: | ||||||
|  | 		if arg == "" { | ||||||
|  | 			arg = "''" | ||||||
|  | 		} | ||||||
|  | 		if _, err := w.WriteString(fmt.Sprintf("%v", arg)); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	default: | ||||||
|  | 		if _, err := w.WriteString("?"); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		w.Append(arg) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type exprParams []Expr | ||||||
|  | 
 | ||||||
|  | func (exprs exprParams) ColNames() []string { | ||||||
|  | 	var cols = make([]string, 0, len(exprs)) | ||||||
|  | 	for _, expr := range exprs { | ||||||
|  | 		cols = append(cols, expr.ColName) | ||||||
|  | 	} | ||||||
|  | 	return cols | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (exprs *exprParams) Add(name string, arg interface{}) { | ||||||
|  | 	*exprs = append(*exprs, Expr{name, arg}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (exprs exprParams) IsColExist(colName string) bool { | ||||||
|  | 	for _, expr := range exprs { | ||||||
|  | 		if strings.EqualFold(schemas.CommonQuoter.Trim(expr.ColName), schemas.CommonQuoter.Trim(colName)) { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (exprs exprParams) WriteArgs(w *builder.BytesWriter) error { | ||||||
|  | 	for i, expr := range exprs { | ||||||
|  | 		if err := expr.WriteArgs(w); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		if i != len(exprs)-1 { | ||||||
|  | 			if _, err := w.WriteString(","); err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										127
									
								
								vendor/xorm.io/xorm/internal/statements/expr_param.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										127
									
								
								vendor/xorm.io/xorm/internal/statements/expr_param.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,127 +0,0 @@ | ||||||
| // Copyright 2019 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 statements |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"strings" |  | ||||||
| 
 |  | ||||||
| 	"xorm.io/builder" |  | ||||||
| 	"xorm.io/xorm/schemas" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // ErrUnsupportedExprType represents an error with unsupported express type
 |  | ||||||
| type ErrUnsupportedExprType struct { |  | ||||||
| 	tp string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (err ErrUnsupportedExprType) Error() string { |  | ||||||
| 	return fmt.Sprintf("Unsupported expression type: %v", err.tp) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type exprParam struct { |  | ||||||
| 	colName string |  | ||||||
| 	arg     interface{} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type exprParams struct { |  | ||||||
| 	ColNames []string |  | ||||||
| 	Args     []interface{} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (exprs *exprParams) Len() int { |  | ||||||
| 	return len(exprs.ColNames) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (exprs *exprParams) addParam(colName string, arg interface{}) { |  | ||||||
| 	exprs.ColNames = append(exprs.ColNames, colName) |  | ||||||
| 	exprs.Args = append(exprs.Args, arg) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (exprs *exprParams) IsColExist(colName string) bool { |  | ||||||
| 	for _, name := range exprs.ColNames { |  | ||||||
| 		if strings.EqualFold(schemas.CommonQuoter.Trim(name), schemas.CommonQuoter.Trim(colName)) { |  | ||||||
| 			return true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (exprs *exprParams) getByName(colName string) (exprParam, bool) { |  | ||||||
| 	for i, name := range exprs.ColNames { |  | ||||||
| 		if strings.EqualFold(name, colName) { |  | ||||||
| 			return exprParam{name, exprs.Args[i]}, true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return exprParam{}, false |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (exprs *exprParams) WriteArgs(w *builder.BytesWriter) error { |  | ||||||
| 	for i, expr := range exprs.Args { |  | ||||||
| 		switch arg := expr.(type) { |  | ||||||
| 		case *builder.Builder: |  | ||||||
| 			if _, err := w.WriteString("("); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			if err := arg.WriteTo(w); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			if _, err := w.WriteString(")"); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 		case string: |  | ||||||
| 			if arg == "" { |  | ||||||
| 				arg = "''" |  | ||||||
| 			} |  | ||||||
| 			if _, err := w.WriteString(fmt.Sprintf("%v", arg)); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 		default: |  | ||||||
| 			if _, err := w.WriteString("?"); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			w.Append(arg) |  | ||||||
| 		} |  | ||||||
| 		if i != len(exprs.Args)-1 { |  | ||||||
| 			if _, err := w.WriteString(","); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (exprs *exprParams) writeNameArgs(w *builder.BytesWriter) error { |  | ||||||
| 	for i, colName := range exprs.ColNames { |  | ||||||
| 		if _, err := w.WriteString(colName); err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		if _, err := w.WriteString("="); err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		switch arg := exprs.Args[i].(type) { |  | ||||||
| 		case *builder.Builder: |  | ||||||
| 			if _, err := w.WriteString("("); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			if err := arg.WriteTo(w); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			if _, err := w.WriteString("("); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 		default: |  | ||||||
| 			w.Append(exprs.Args[i]) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if i+1 != len(exprs.ColNames) { |  | ||||||
| 			if _, err := w.WriteString(","); err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
							
								
								
									
										14
									
								
								vendor/xorm.io/xorm/internal/statements/insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/xorm.io/xorm/internal/statements/insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -17,7 +17,7 @@ func (statement *Statement) writeInsertOutput(buf *strings.Builder, table *schem | ||||||
| 		if _, err := buf.WriteString(" OUTPUT Inserted."); err != nil { | 		if _, err := buf.WriteString(" OUTPUT Inserted."); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		if _, err := buf.WriteString(table.AutoIncrement); err != nil { | 		if err := statement.dialect.Quoter().QuoteTo(buf, table.AutoIncrement); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -59,7 +59,7 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) | ||||||
| 			return "", nil, err | 			return "", nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if err := statement.dialect.Quoter().JoinWrite(buf.Builder, append(colNames, exprs.ColNames...), ","); err != nil { | 		if err := statement.dialect.Quoter().JoinWrite(buf.Builder, append(colNames, exprs.ColNames()...), ","); err != nil { | ||||||
| 			return "", nil, err | 			return "", nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -79,7 +79,7 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) | ||||||
| 				return "", nil, err | 				return "", nil, err | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if len(exprs.Args) > 0 { | 			if len(exprs) > 0 { | ||||||
| 				if _, err := buf.WriteString(","); err != nil { | 				if _, err := buf.WriteString(","); err != nil { | ||||||
| 					return "", nil, err | 					return "", nil, err | ||||||
| 				} | 				} | ||||||
|  | @ -112,7 +112,7 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) | ||||||
| 				return "", nil, err | 				return "", nil, err | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if len(exprs.Args) > 0 { | 			if len(exprs) > 0 { | ||||||
| 				if _, err := buf.WriteString(","); err != nil { | 				if _, err := buf.WriteString(","); err != nil { | ||||||
| 					return "", nil, err | 					return "", nil, err | ||||||
| 				} | 				} | ||||||
|  | @ -152,7 +152,7 @@ func (statement *Statement) GenInsertMapSQL(columns []string, args []interface{} | ||||||
| 		return "", nil, err | 		return "", nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := statement.dialect.Quoter().JoinWrite(buf.Builder, append(columns, exprs.ColNames...), ","); err != nil { | 	if err := statement.dialect.Quoter().JoinWrite(buf.Builder, append(columns, exprs.ColNames()...), ","); err != nil { | ||||||
| 		return "", nil, err | 		return "", nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -166,7 +166,7 @@ func (statement *Statement) GenInsertMapSQL(columns []string, args []interface{} | ||||||
| 			return "", nil, err | 			return "", nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if len(exprs.Args) > 0 { | 		if len(exprs) > 0 { | ||||||
| 			if _, err := buf.WriteString(","); err != nil { | 			if _, err := buf.WriteString(","); err != nil { | ||||||
| 				return "", nil, err | 				return "", nil, err | ||||||
| 			} | 			} | ||||||
|  | @ -190,7 +190,7 @@ func (statement *Statement) GenInsertMapSQL(columns []string, args []interface{} | ||||||
| 			return "", nil, err | 			return "", nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if len(exprs.Args) > 0 { | 		if len(exprs) > 0 { | ||||||
| 			if _, err := buf.WriteString(","); err != nil { | 			if _, err := buf.WriteString(","); err != nil { | ||||||
| 				return "", nil, err | 				return "", nil, err | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
							
								
								
									
										61
									
								
								vendor/xorm.io/xorm/internal/statements/query.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										61
									
								
								vendor/xorm.io/xorm/internal/statements/query.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -106,10 +106,13 @@ func (statement *Statement) GenSumSQL(bean interface{}, columns ...string) (stri | ||||||
| 
 | 
 | ||||||
| // GenGetSQL generates Get SQL
 | // GenGetSQL generates Get SQL
 | ||||||
| func (statement *Statement) GenGetSQL(bean interface{}) (string, []interface{}, error) { | func (statement *Statement) GenGetSQL(bean interface{}) (string, []interface{}, error) { | ||||||
| 	v := rValue(bean) | 	var isStruct bool | ||||||
| 	isStruct := v.Kind() == reflect.Struct | 	if bean != nil { | ||||||
| 	if isStruct { | 		v := rValue(bean) | ||||||
| 		statement.SetRefBean(bean) | 		isStruct = v.Kind() == reflect.Struct | ||||||
|  | 		if isStruct { | ||||||
|  | 			statement.SetRefBean(bean) | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var columnStr = statement.ColumnStr() | 	var columnStr = statement.ColumnStr() | ||||||
|  | @ -181,11 +184,22 @@ func (statement *Statement) GenCountSQL(beans ...interface{}) (string, []interfa | ||||||
| 			selectSQL = "count(*)" | 			selectSQL = "count(*)" | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	sqlStr, condArgs, err := statement.genSelectSQL(selectSQL, false, false) | 	var subQuerySelect string | ||||||
|  | 	if statement.GroupByStr != "" { | ||||||
|  | 		subQuerySelect = statement.GroupByStr | ||||||
|  | 	} else { | ||||||
|  | 		subQuerySelect = selectSQL | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	sqlStr, condArgs, err := statement.genSelectSQL(subQuerySelect, false, false) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", nil, err | 		return "", nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if statement.GroupByStr != "" { | ||||||
|  | 		sqlStr = fmt.Sprintf("SELECT %s FROM (%s) sub", selectSQL, sqlStr) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return sqlStr, append(statement.joinArgs, condArgs...), nil | 	return sqlStr, append(statement.joinArgs, condArgs...), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -329,12 +343,25 @@ func (statement *Statement) GenExistSQL(bean ...interface{}) (string, []interfac | ||||||
| 	var args []interface{} | 	var args []interface{} | ||||||
| 	var joinStr string | 	var joinStr string | ||||||
| 	var err error | 	var err error | ||||||
| 	if len(bean) == 0 { | 	var b interface{} | ||||||
| 		tableName := statement.TableName() | 	if len(bean) > 0 { | ||||||
| 		if len(tableName) <= 0 { | 		b = bean[0] | ||||||
| 			return "", nil, ErrTableNotFound | 		beanValue := reflect.ValueOf(bean[0]) | ||||||
|  | 		if beanValue.Kind() != reflect.Ptr { | ||||||
|  | 			return "", nil, errors.New("needs a pointer") | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if beanValue.Elem().Kind() == reflect.Struct { | ||||||
|  | 			if err := statement.SetRefBean(bean[0]); err != nil { | ||||||
|  | 				return "", nil, err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	tableName := statement.TableName() | ||||||
|  | 	if len(tableName) <= 0 { | ||||||
|  | 		return "", nil, ErrTableNotFound | ||||||
|  | 	} | ||||||
|  | 	if statement.RefTable == nil { | ||||||
| 		tableName = statement.quote(tableName) | 		tableName = statement.quote(tableName) | ||||||
| 		if len(statement.JoinStr) > 0 { | 		if len(statement.JoinStr) > 0 { | ||||||
| 			joinStr = statement.JoinStr | 			joinStr = statement.JoinStr | ||||||
|  | @ -365,22 +392,8 @@ func (statement *Statement) GenExistSQL(bean ...interface{}) (string, []interfac | ||||||
| 			args = []interface{}{} | 			args = []interface{}{} | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		beanValue := reflect.ValueOf(bean[0]) |  | ||||||
| 		if beanValue.Kind() != reflect.Ptr { |  | ||||||
| 			return "", nil, errors.New("needs a pointer") |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if beanValue.Elem().Kind() == reflect.Struct { |  | ||||||
| 			if err := statement.SetRefBean(bean[0]); err != nil { |  | ||||||
| 				return "", nil, err |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if len(statement.TableName()) <= 0 { |  | ||||||
| 			return "", nil, ErrTableNotFound |  | ||||||
| 		} |  | ||||||
| 		statement.Limit(1) | 		statement.Limit(1) | ||||||
| 		sqlStr, args, err = statement.GenGetSQL(bean[0]) | 		sqlStr, args, err = statement.GenGetSQL(b) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return "", nil, err | 			return "", nil, err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
							
								
								
									
										46
									
								
								vendor/xorm.io/xorm/internal/statements/statement.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/xorm.io/xorm/internal/statements/statement.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -208,20 +208,18 @@ func (statement *Statement) quote(s string) string { | ||||||
| 
 | 
 | ||||||
| // And add Where & and statement
 | // And add Where & and statement
 | ||||||
| func (statement *Statement) And(query interface{}, args ...interface{}) *Statement { | func (statement *Statement) And(query interface{}, args ...interface{}) *Statement { | ||||||
| 	switch query.(type) { | 	switch qr := query.(type) { | ||||||
| 	case string: | 	case string: | ||||||
| 		cond := builder.Expr(query.(string), args...) | 		cond := builder.Expr(qr, args...) | ||||||
| 		statement.cond = statement.cond.And(cond) | 		statement.cond = statement.cond.And(cond) | ||||||
| 	case map[string]interface{}: | 	case map[string]interface{}: | ||||||
| 		queryMap := query.(map[string]interface{}) | 		cond := make(builder.Eq) | ||||||
| 		newMap := make(map[string]interface{}) | 		for k, v := range qr { | ||||||
| 		for k, v := range queryMap { | 			cond[statement.quote(k)] = v | ||||||
| 			newMap[statement.quote(k)] = v |  | ||||||
| 		} | 		} | ||||||
| 		statement.cond = statement.cond.And(builder.Eq(newMap)) |  | ||||||
| 	case builder.Cond: |  | ||||||
| 		cond := query.(builder.Cond) |  | ||||||
| 		statement.cond = statement.cond.And(cond) | 		statement.cond = statement.cond.And(cond) | ||||||
|  | 	case builder.Cond: | ||||||
|  | 		statement.cond = statement.cond.And(qr) | ||||||
| 		for _, v := range args { | 		for _, v := range args { | ||||||
| 			if vv, ok := v.(builder.Cond); ok { | 			if vv, ok := v.(builder.Cond); ok { | ||||||
| 				statement.cond = statement.cond.And(vv) | 				statement.cond = statement.cond.And(vv) | ||||||
|  | @ -236,23 +234,25 @@ func (statement *Statement) And(query interface{}, args ...interface{}) *Stateme | ||||||
| 
 | 
 | ||||||
| // Or add Where & Or statement
 | // Or add Where & Or statement
 | ||||||
| func (statement *Statement) Or(query interface{}, args ...interface{}) *Statement { | func (statement *Statement) Or(query interface{}, args ...interface{}) *Statement { | ||||||
| 	switch query.(type) { | 	switch qr := query.(type) { | ||||||
| 	case string: | 	case string: | ||||||
| 		cond := builder.Expr(query.(string), args...) | 		cond := builder.Expr(qr, args...) | ||||||
| 		statement.cond = statement.cond.Or(cond) | 		statement.cond = statement.cond.Or(cond) | ||||||
| 	case map[string]interface{}: | 	case map[string]interface{}: | ||||||
| 		cond := builder.Eq(query.(map[string]interface{})) | 		cond := make(builder.Eq) | ||||||
|  | 		for k, v := range qr { | ||||||
|  | 			cond[statement.quote(k)] = v | ||||||
|  | 		} | ||||||
| 		statement.cond = statement.cond.Or(cond) | 		statement.cond = statement.cond.Or(cond) | ||||||
| 	case builder.Cond: | 	case builder.Cond: | ||||||
| 		cond := query.(builder.Cond) | 		statement.cond = statement.cond.Or(qr) | ||||||
| 		statement.cond = statement.cond.Or(cond) |  | ||||||
| 		for _, v := range args { | 		for _, v := range args { | ||||||
| 			if vv, ok := v.(builder.Cond); ok { | 			if vv, ok := v.(builder.Cond); ok { | ||||||
| 				statement.cond = statement.cond.Or(vv) | 				statement.cond = statement.cond.Or(vv) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	default: | 	default: | ||||||
| 		// TODO: not support condition type
 | 		statement.LastError = ErrConditionType | ||||||
| 	} | 	} | ||||||
| 	return statement | 	return statement | ||||||
| } | } | ||||||
|  | @ -324,9 +324,9 @@ func (statement *Statement) TableName() string { | ||||||
| // Incr Generate  "Update ... Set column = column + arg" statement
 | // Incr Generate  "Update ... Set column = column + arg" statement
 | ||||||
| func (statement *Statement) Incr(column string, arg ...interface{}) *Statement { | func (statement *Statement) Incr(column string, arg ...interface{}) *Statement { | ||||||
| 	if len(arg) > 0 { | 	if len(arg) > 0 { | ||||||
| 		statement.IncrColumns.addParam(column, arg[0]) | 		statement.IncrColumns.Add(column, arg[0]) | ||||||
| 	} else { | 	} else { | ||||||
| 		statement.IncrColumns.addParam(column, 1) | 		statement.IncrColumns.Add(column, 1) | ||||||
| 	} | 	} | ||||||
| 	return statement | 	return statement | ||||||
| } | } | ||||||
|  | @ -334,9 +334,9 @@ func (statement *Statement) Incr(column string, arg ...interface{}) *Statement { | ||||||
| // Decr Generate  "Update ... Set column = column - arg" statement
 | // Decr Generate  "Update ... Set column = column - arg" statement
 | ||||||
| func (statement *Statement) Decr(column string, arg ...interface{}) *Statement { | func (statement *Statement) Decr(column string, arg ...interface{}) *Statement { | ||||||
| 	if len(arg) > 0 { | 	if len(arg) > 0 { | ||||||
| 		statement.DecrColumns.addParam(column, arg[0]) | 		statement.DecrColumns.Add(column, arg[0]) | ||||||
| 	} else { | 	} else { | ||||||
| 		statement.DecrColumns.addParam(column, 1) | 		statement.DecrColumns.Add(column, 1) | ||||||
| 	} | 	} | ||||||
| 	return statement | 	return statement | ||||||
| } | } | ||||||
|  | @ -344,9 +344,9 @@ func (statement *Statement) Decr(column string, arg ...interface{}) *Statement { | ||||||
| // SetExpr Generate  "Update ... Set column = {expression}" statement
 | // SetExpr Generate  "Update ... Set column = {expression}" statement
 | ||||||
| func (statement *Statement) SetExpr(column string, expression interface{}) *Statement { | func (statement *Statement) SetExpr(column string, expression interface{}) *Statement { | ||||||
| 	if e, ok := expression.(string); ok { | 	if e, ok := expression.(string); ok { | ||||||
| 		statement.ExprColumns.addParam(column, statement.dialect.Quoter().Replace(e)) | 		statement.ExprColumns.Add(column, statement.dialect.Quoter().Replace(e)) | ||||||
| 	} else { | 	} else { | ||||||
| 		statement.ExprColumns.addParam(column, expression) | 		statement.ExprColumns.Add(column, expression) | ||||||
| 	} | 	} | ||||||
| 	return statement | 	return statement | ||||||
| } | } | ||||||
|  | @ -734,6 +734,8 @@ func (statement *Statement) buildConds2(table *schemas.Table, bean interface{}, | ||||||
| 				//engine.logger.Warn(err)
 | 				//engine.logger.Warn(err)
 | ||||||
| 			} | 			} | ||||||
| 			continue | 			continue | ||||||
|  | 		} else if fieldValuePtr == nil { | ||||||
|  | 			continue | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if col.IsDeleted && !unscoped { // tag "deleted" is enabled
 | 		if col.IsDeleted && !unscoped { // tag "deleted" is enabled
 | ||||||
|  | @ -976,7 +978,7 @@ func (statement *Statement) joinColumns(cols []*schemas.Column, includeTableName | ||||||
| 
 | 
 | ||||||
| // CondDeleted returns the conditions whether a record is soft deleted.
 | // CondDeleted returns the conditions whether a record is soft deleted.
 | ||||||
| func (statement *Statement) CondDeleted(col *schemas.Column) builder.Cond { | func (statement *Statement) CondDeleted(col *schemas.Column) builder.Cond { | ||||||
| 	var colName = col.Name | 	var colName = statement.quote(col.Name) | ||||||
| 	if statement.JoinStr != "" { | 	if statement.JoinStr != "" { | ||||||
| 		var prefix string | 		var prefix string | ||||||
| 		if statement.TableAlias != "" { | 		if statement.TableAlias != "" { | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								vendor/xorm.io/xorm/internal/statements/update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/xorm.io/xorm/internal/statements/update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -88,6 +88,9 @@ func (statement *Statement) BuildUpdates(tableValue reflect.Value, | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, nil, err | 			return nil, nil, err | ||||||
| 		} | 		} | ||||||
|  | 		if fieldValuePtr == nil { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		fieldValue := *fieldValuePtr | 		fieldValue := *fieldValuePtr | ||||||
| 		fieldType := reflect.TypeOf(fieldValue.Interface()) | 		fieldType := reflect.TypeOf(fieldValue.Interface()) | ||||||
|  |  | ||||||
							
								
								
									
										9
									
								
								vendor/xorm.io/xorm/log/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/xorm.io/xorm/log/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -132,7 +132,6 @@ 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...)) | ||||||
| 	} | 	} | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Errorf implement ILogger
 | // Errorf implement ILogger
 | ||||||
|  | @ -140,7 +139,6 @@ 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...)) | ||||||
| 	} | 	} | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Debug implement ILogger
 | // Debug implement ILogger
 | ||||||
|  | @ -148,7 +146,6 @@ 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...)) | ||||||
| 	} | 	} | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Debugf implement ILogger
 | // Debugf implement ILogger
 | ||||||
|  | @ -156,7 +153,6 @@ 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...)) | ||||||
| 	} | 	} | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Info implement ILogger
 | // Info implement ILogger
 | ||||||
|  | @ -164,7 +160,6 @@ 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...)) | ||||||
| 	} | 	} | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Infof implement ILogger
 | // Infof implement ILogger
 | ||||||
|  | @ -172,7 +167,6 @@ 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...)) | ||||||
| 	} | 	} | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Warn implement ILogger
 | // Warn implement ILogger
 | ||||||
|  | @ -180,7 +174,6 @@ 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...)) | ||||||
| 	} | 	} | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Warnf implement ILogger
 | // Warnf implement ILogger
 | ||||||
|  | @ -188,7 +181,6 @@ 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...)) | ||||||
| 	} | 	} | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Level implement ILogger
 | // Level implement ILogger
 | ||||||
|  | @ -199,7 +191,6 @@ func (s *SimpleLogger) Level() LogLevel { | ||||||
| // SetLevel implement ILogger
 | // SetLevel implement ILogger
 | ||||||
| func (s *SimpleLogger) SetLevel(l LogLevel) { | func (s *SimpleLogger) SetLevel(l LogLevel) { | ||||||
| 	s.level = l | 	s.level = l | ||||||
| 	return |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ShowSQL implement ILogger
 | // ShowSQL implement ILogger
 | ||||||
|  |  | ||||||
							
								
								
									
										67
									
								
								vendor/xorm.io/xorm/scan.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								vendor/xorm.io/xorm/scan.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,67 @@ | ||||||
|  | // Copyright 2021 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 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"database/sql" | ||||||
|  | 
 | ||||||
|  | 	"xorm.io/xorm/core" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func (engine *Engine) row2mapStr(rows *core.Rows, types []*sql.ColumnType, fields []string) (map[string]string, error) { | ||||||
|  | 	var scanResults = make([]interface{}, len(fields)) | ||||||
|  | 	for i := 0; i < len(fields); i++ { | ||||||
|  | 		var s sql.NullString | ||||||
|  | 		scanResults[i] = &s | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := rows.Scan(scanResults...); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	result := make(map[string]string, len(fields)) | ||||||
|  | 	for ii, key := range fields { | ||||||
|  | 		s := scanResults[ii].(*sql.NullString) | ||||||
|  | 		result[key] = s.String | ||||||
|  | 	} | ||||||
|  | 	return result, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (engine *Engine) row2mapBytes(rows *core.Rows, types []*sql.ColumnType, fields []string) (map[string][]byte, error) { | ||||||
|  | 	var scanResults = make([]interface{}, len(fields)) | ||||||
|  | 	for i := 0; i < len(fields); i++ { | ||||||
|  | 		var s sql.NullString | ||||||
|  | 		scanResults[i] = &s | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := rows.Scan(scanResults...); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	result := make(map[string][]byte, len(fields)) | ||||||
|  | 	for ii, key := range fields { | ||||||
|  | 		s := scanResults[ii].(*sql.NullString) | ||||||
|  | 		result[key] = []byte(s.String) | ||||||
|  | 	} | ||||||
|  | 	return result, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (engine *Engine) row2sliceStr(rows *core.Rows, types []*sql.ColumnType, fields []string) ([]string, error) { | ||||||
|  | 	results := make([]string, 0, len(fields)) | ||||||
|  | 	var scanResults = make([]interface{}, len(fields)) | ||||||
|  | 	for i := 0; i < len(fields); i++ { | ||||||
|  | 		var s sql.NullString | ||||||
|  | 		scanResults[i] = &s | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := rows.Scan(scanResults...); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for i := 0; i < len(fields); i++ { | ||||||
|  | 		results = append(results, scanResults[i].(*sql.NullString).String) | ||||||
|  | 	} | ||||||
|  | 	return results, nil | ||||||
|  | } | ||||||
							
								
								
									
										45
									
								
								vendor/xorm.io/xorm/schemas/column.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								vendor/xorm.io/xorm/schemas/column.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -6,10 +6,8 @@ package schemas | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" |  | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" |  | ||||||
| 	"time" | 	"time" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -24,7 +22,8 @@ const ( | ||||||
| type Column struct { | type Column struct { | ||||||
| 	Name            string | 	Name            string | ||||||
| 	TableName       string | 	TableName       string | ||||||
| 	FieldName       string // Avaiable only when parsed from a struct
 | 	FieldName       string // Available only when parsed from a struct
 | ||||||
|  | 	FieldIndex      []int  // Available only when parsed from a struct
 | ||||||
| 	SQLType         SQLType | 	SQLType         SQLType | ||||||
| 	IsJSON          bool | 	IsJSON          bool | ||||||
| 	Length          int | 	Length          int | ||||||
|  | @ -83,41 +82,17 @@ func (col *Column) ValueOf(bean interface{}) (*reflect.Value, error) { | ||||||
| 
 | 
 | ||||||
| // ValueOfV returns column's filed of struct's value accept reflevt value
 | // ValueOfV returns column's filed of struct's value accept reflevt value
 | ||||||
| func (col *Column) ValueOfV(dataStruct *reflect.Value) (*reflect.Value, error) { | func (col *Column) ValueOfV(dataStruct *reflect.Value) (*reflect.Value, error) { | ||||||
| 	var fieldValue reflect.Value | 	var v = *dataStruct | ||||||
| 	fieldPath := strings.Split(col.FieldName, ".") | 	for _, i := range col.FieldIndex { | ||||||
| 
 | 		if v.Kind() == reflect.Ptr { | ||||||
| 	if dataStruct.Type().Kind() == reflect.Map { | 			if v.IsNil() { | ||||||
| 		keyValue := reflect.ValueOf(fieldPath[len(fieldPath)-1]) | 				v.Set(reflect.New(v.Type().Elem())) | ||||||
| 		fieldValue = dataStruct.MapIndex(keyValue) |  | ||||||
| 		return &fieldValue, nil |  | ||||||
| 	} else if dataStruct.Type().Kind() == reflect.Interface { |  | ||||||
| 		structValue := reflect.ValueOf(dataStruct.Interface()) |  | ||||||
| 		dataStruct = &structValue |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	level := len(fieldPath) |  | ||||||
| 	fieldValue = dataStruct.FieldByName(fieldPath[0]) |  | ||||||
| 	for i := 0; i < level-1; i++ { |  | ||||||
| 		if !fieldValue.IsValid() { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		if fieldValue.Kind() == reflect.Struct { |  | ||||||
| 			fieldValue = fieldValue.FieldByName(fieldPath[i+1]) |  | ||||||
| 		} else if fieldValue.Kind() == reflect.Ptr { |  | ||||||
| 			if fieldValue.IsNil() { |  | ||||||
| 				fieldValue.Set(reflect.New(fieldValue.Type().Elem())) |  | ||||||
| 			} | 			} | ||||||
| 			fieldValue = fieldValue.Elem().FieldByName(fieldPath[i+1]) | 			v = v.Elem() | ||||||
| 		} else { |  | ||||||
| 			return nil, fmt.Errorf("field %v is not valid", col.FieldName) |  | ||||||
| 		} | 		} | ||||||
|  | 		v = v.FieldByIndex([]int{i}) | ||||||
| 	} | 	} | ||||||
| 
 | 	return &v, nil | ||||||
| 	if !fieldValue.IsValid() { |  | ||||||
| 		return nil, fmt.Errorf("field %v is not valid", col.FieldName) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return &fieldValue, nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ConvertID converts id content to suitable type according column type
 | // ConvertID converts id content to suitable type according column type
 | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								vendor/xorm.io/xorm/schemas/table.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/xorm.io/xorm/schemas/table.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -5,7 +5,6 @@ | ||||||
| package schemas | package schemas | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" |  | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | @ -159,24 +158,8 @@ func (table *Table) IDOfV(rv reflect.Value) (PK, error) { | ||||||
| 	for i, col := range table.PKColumns() { | 	for i, col := range table.PKColumns() { | ||||||
| 		var err error | 		var err error | ||||||
| 
 | 
 | ||||||
| 		fieldName := col.FieldName | 		pkField := v.FieldByIndex(col.FieldIndex) | ||||||
| 		for { |  | ||||||
| 			parts := strings.SplitN(fieldName, ".", 2) |  | ||||||
| 			if len(parts) == 1 { |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 
 | 
 | ||||||
| 			v = v.FieldByName(parts[0]) |  | ||||||
| 			if v.Kind() == reflect.Ptr { |  | ||||||
| 				v = v.Elem() |  | ||||||
| 			} |  | ||||||
| 			if v.Kind() != reflect.Struct { |  | ||||||
| 				return nil, fmt.Errorf("Unsupported read value of column %s from field %s", col.Name, col.FieldName) |  | ||||||
| 			} |  | ||||||
| 			fieldName = parts[1] |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		pkField := v.FieldByName(fieldName) |  | ||||||
| 		switch pkField.Kind() { | 		switch pkField.Kind() { | ||||||
| 		case reflect.String: | 		case reflect.String: | ||||||
| 			pk[i], err = col.ConvertID(pkField.String()) | 			pk[i], err = col.ConvertID(pkField.String()) | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								vendor/xorm.io/xorm/schemas/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/xorm.io/xorm/schemas/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | // Copyright 2021 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 schemas | ||||||
|  | 
 | ||||||
|  | // Version represents a database version
 | ||||||
|  | type Version struct { | ||||||
|  | 	Number  string // the version number which could be compared
 | ||||||
|  | 	Level   string | ||||||
|  | 	Edition string | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								vendor/xorm.io/xorm/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/xorm.io/xorm/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -375,6 +375,9 @@ func (session *Session) getField(dataStruct *reflect.Value, key string, table *s | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	if fieldValue == nil { | ||||||
|  | 		return nil, ErrFieldIsNotValid{key, table.Name} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if !fieldValue.IsValid() || !fieldValue.CanSet() { | 	if !fieldValue.IsValid() || !fieldValue.CanSet() { | ||||||
| 		return nil, ErrFieldIsNotValid{key, table.Name} | 		return nil, ErrFieldIsNotValid{key, table.Name} | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								vendor/xorm.io/xorm/session_convert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/xorm.io/xorm/session_convert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -35,27 +35,20 @@ func (session *Session) str2Time(col *schemas.Column, data string) (outTime time | ||||||
| 		sd, err := strconv.ParseInt(sdata, 10, 64) | 		sd, err := strconv.ParseInt(sdata, 10, 64) | ||||||
| 		if err == nil { | 		if err == nil { | ||||||
| 			x = time.Unix(sd, 0) | 			x = time.Unix(sd, 0) | ||||||
| 			//session.engine.logger.Debugf("time(0) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata)
 |  | ||||||
| 		} else { |  | ||||||
| 			//session.engine.logger.Debugf("time(0) err key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata)
 |  | ||||||
| 		} | 		} | ||||||
| 	} else if len(sdata) > 19 && strings.Contains(sdata, "-") { | 	} else if len(sdata) > 19 && strings.Contains(sdata, "-") { | ||||||
| 		x, err = time.ParseInLocation(time.RFC3339Nano, sdata, parseLoc) | 		x, err = time.ParseInLocation(time.RFC3339Nano, sdata, parseLoc) | ||||||
| 		session.engine.logger.Debugf("time(1) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata) | 		session.engine.logger.Debugf("time(1) key[%v]: %+v | sdata: [%v]\n", col.Name, x, sdata) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			x, err = time.ParseInLocation("2006-01-02 15:04:05.999999999", sdata, parseLoc) | 			x, err = time.ParseInLocation("2006-01-02 15:04:05.999999999", sdata, parseLoc) | ||||||
| 			//session.engine.logger.Debugf("time(2) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata)
 |  | ||||||
| 		} | 		} | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			x, err = time.ParseInLocation("2006-01-02 15:04:05.9999999 Z07:00", sdata, parseLoc) | 			x, err = time.ParseInLocation("2006-01-02 15:04:05.9999999 Z07:00", sdata, parseLoc) | ||||||
| 			//session.engine.logger.Debugf("time(3) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata)
 |  | ||||||
| 		} | 		} | ||||||
| 	} else if len(sdata) == 19 && strings.Contains(sdata, "-") { | 	} else if len(sdata) == 19 && strings.Contains(sdata, "-") { | ||||||
| 		x, err = time.ParseInLocation("2006-01-02 15:04:05", sdata, parseLoc) | 		x, err = time.ParseInLocation("2006-01-02 15:04:05", sdata, parseLoc) | ||||||
| 		//session.engine.logger.Debugf("time(4) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata)
 |  | ||||||
| 	} else if len(sdata) == 10 && sdata[4] == '-' && sdata[7] == '-' { | 	} else if len(sdata) == 10 && sdata[4] == '-' && sdata[7] == '-' { | ||||||
| 		x, err = time.ParseInLocation("2006-01-02", sdata, parseLoc) | 		x, err = time.ParseInLocation("2006-01-02", sdata, parseLoc) | ||||||
| 		//session.engine.logger.Debugf("time(5) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata)
 |  | ||||||
| 	} else if col.SQLType.Name == schemas.Time { | 	} else if col.SQLType.Name == schemas.Time { | ||||||
| 		if strings.Contains(sdata, " ") { | 		if strings.Contains(sdata, " ") { | ||||||
| 			ssd := strings.Split(sdata, " ") | 			ssd := strings.Split(sdata, " ") | ||||||
|  | @ -69,7 +62,6 @@ func (session *Session) str2Time(col *schemas.Column, data string) (outTime time | ||||||
| 
 | 
 | ||||||
| 		st := fmt.Sprintf("2006-01-02 %v", sdata) | 		st := fmt.Sprintf("2006-01-02 %v", sdata) | ||||||
| 		x, err = time.ParseInLocation("2006-01-02 15:04:05", st, parseLoc) | 		x, err = time.ParseInLocation("2006-01-02 15:04:05", st, parseLoc) | ||||||
| 		//session.engine.logger.Debugf("time(6) key[%v]: %+v | sdata: [%v]\n", col.FieldName, x, sdata)
 |  | ||||||
| 	} else { | 	} else { | ||||||
| 		outErr = fmt.Errorf("unsupported time format %v", sdata) | 		outErr = fmt.Errorf("unsupported time format %v", sdata) | ||||||
| 		return | 		return | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								vendor/xorm.io/xorm/session_insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/xorm.io/xorm/session_insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -11,6 +11,7 @@ import ( | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"xorm.io/xorm/internal/utils" | 	"xorm.io/xorm/internal/utils" | ||||||
| 	"xorm.io/xorm/schemas" | 	"xorm.io/xorm/schemas" | ||||||
|  | @ -374,9 +375,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | ||||||
| 			return 1, nil | 			return 1, nil | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		aiValue.Set(int64ToIntValue(id, aiValue.Type())) | 		return 1, convertAssignV(aiValue.Addr(), id) | ||||||
| 
 |  | ||||||
| 		return 1, nil |  | ||||||
| 	} else if len(table.AutoIncrement) > 0 && (session.engine.dialect.URI().DBType == schemas.POSTGRES || | 	} else if len(table.AutoIncrement) > 0 && (session.engine.dialect.URI().DBType == schemas.POSTGRES || | ||||||
| 		session.engine.dialect.URI().DBType == schemas.MSSQL) { | 		session.engine.dialect.URI().DBType == schemas.MSSQL) { | ||||||
| 		res, err := session.queryBytes(sqlStr, args...) | 		res, err := session.queryBytes(sqlStr, args...) | ||||||
|  | @ -416,9 +415,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | ||||||
| 			return 1, nil | 			return 1, nil | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		aiValue.Set(int64ToIntValue(id, aiValue.Type())) | 		return 1, convertAssignV(aiValue.Addr(), id) | ||||||
| 
 |  | ||||||
| 		return 1, nil |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	res, err := session.exec(sqlStr, args...) | 	res, err := session.exec(sqlStr, args...) | ||||||
|  | @ -458,7 +455,9 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | ||||||
| 		return res.RowsAffected() | 		return res.RowsAffected() | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	aiValue.Set(int64ToIntValue(id, aiValue.Type())) | 	if err := convertAssignV(aiValue.Addr(), id); err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	return res.RowsAffected() | 	return res.RowsAffected() | ||||||
| } | } | ||||||
|  | @ -499,6 +498,16 @@ func (session *Session) genInsertColumns(bean interface{}) ([]string, []interfac | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if col.IsDeleted { | 		if col.IsDeleted { | ||||||
|  | 			colNames = append(colNames, col.Name) | ||||||
|  | 			if !col.Nullable { | ||||||
|  | 				if col.SQLType.IsNumeric() { | ||||||
|  | 					args = append(args, 0) | ||||||
|  | 				} else { | ||||||
|  | 					args = append(args, time.Time{}.Format("2006-01-02 15:04:05")) | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				args = append(args, nil) | ||||||
|  | 			} | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										78
									
								
								vendor/xorm.io/xorm/session_query.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								vendor/xorm.io/xorm/session_query.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -75,69 +75,18 @@ func value2String(rawValue *reflect.Value) (str string, err error) { | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func row2mapStr(rows *core.Rows, fields []string) (resultsMap map[string]string, err error) { | func (session *Session) rows2Strings(rows *core.Rows) (resultsSlice []map[string]string, err error) { | ||||||
| 	result := make(map[string]string) |  | ||||||
| 	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 ii, key := range fields { |  | ||||||
| 		rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii])) |  | ||||||
| 		// if row is null then as empty string
 |  | ||||||
| 		if rawValue.Interface() == nil { |  | ||||||
| 			result[key] = "" |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if data, err := value2String(&rawValue); err == nil { |  | ||||||
| 			result[key] = data |  | ||||||
| 		} else { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	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() | 	fields, err := rows.Columns() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	types, err := rows.ColumnTypes() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for rows.Next() { | 	for rows.Next() { | ||||||
| 		result, err := row2mapStr(rows, fields) | 		result, err := session.engine.row2mapStr(rows, types, fields) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
|  | @ -147,13 +96,18 @@ func rows2Strings(rows *core.Rows) (resultsSlice []map[string]string, err error) | ||||||
| 	return resultsSlice, nil | 	return resultsSlice, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func rows2SliceString(rows *core.Rows) (resultsSlice [][]string, err error) { | func (session *Session) rows2SliceString(rows *core.Rows) (resultsSlice [][]string, err error) { | ||||||
| 	fields, err := rows.Columns() | 	fields, err := rows.Columns() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	types, err := rows.ColumnTypes() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for rows.Next() { | 	for rows.Next() { | ||||||
| 		record, err := row2sliceStr(rows, fields) | 		record, err := session.engine.row2sliceStr(rows, types, fields) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
|  | @ -180,7 +134,7 @@ func (session *Session) QueryString(sqlOrArgs ...interface{}) ([]map[string]stri | ||||||
| 	} | 	} | ||||||
| 	defer rows.Close() | 	defer rows.Close() | ||||||
| 
 | 
 | ||||||
| 	return rows2Strings(rows) | 	return session.rows2Strings(rows) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // QuerySliceString runs a raw sql and return records as [][]string
 | // QuerySliceString runs a raw sql and return records as [][]string
 | ||||||
|  | @ -200,7 +154,7 @@ func (session *Session) QuerySliceString(sqlOrArgs ...interface{}) ([][]string, | ||||||
| 	} | 	} | ||||||
| 	defer rows.Close() | 	defer rows.Close() | ||||||
| 
 | 
 | ||||||
| 	return rows2SliceString(rows) | 	return session.rows2SliceString(rows) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func row2mapInterface(rows *core.Rows, fields []string) (resultsMap map[string]interface{}, err error) { | func row2mapInterface(rows *core.Rows, fields []string) (resultsMap map[string]interface{}, err error) { | ||||||
|  |  | ||||||
							
								
								
									
										38
									
								
								vendor/xorm.io/xorm/session_raw.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/xorm.io/xorm/session_raw.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -79,41 +79,17 @@ func value2Bytes(rawValue *reflect.Value) ([]byte, error) { | ||||||
| 	return []byte(str), nil | 	return []byte(str), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func row2map(rows *core.Rows, fields []string) (resultsMap map[string][]byte, err error) { | func (session *Session) rows2maps(rows *core.Rows) (resultsSlice []map[string][]byte, err error) { | ||||||
| 	result := make(map[string][]byte) |  | ||||||
| 	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 ii, key := range fields { |  | ||||||
| 		rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii])) |  | ||||||
| 		//if row is null then ignore
 |  | ||||||
| 		if rawValue.Interface() == nil { |  | ||||||
| 			result[key] = []byte{} |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if data, err := value2Bytes(&rawValue); err == nil { |  | ||||||
| 			result[key] = data |  | ||||||
| 		} else { |  | ||||||
| 			return nil, err // !nashtsai! REVIEW, should return err or just error log?
 |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return result, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func rows2maps(rows *core.Rows) (resultsSlice []map[string][]byte, err error) { |  | ||||||
| 	fields, err := rows.Columns() | 	fields, err := rows.Columns() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	types, err := rows.ColumnTypes() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
| 	for rows.Next() { | 	for rows.Next() { | ||||||
| 		result, err := row2map(rows, fields) | 		result, err := session.engine.row2mapBytes(rows, types, fields) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
|  | @ -130,7 +106,7 @@ func (session *Session) queryBytes(sqlStr string, args ...interface{}) ([]map[st | ||||||
| 	} | 	} | ||||||
| 	defer rows.Close() | 	defer rows.Close() | ||||||
| 
 | 
 | ||||||
| 	return rows2maps(rows) | 	return session.rows2maps(rows) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, error) { | func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, error) { | ||||||
|  |  | ||||||
							
								
								
									
										47
									
								
								vendor/xorm.io/xorm/session_update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								vendor/xorm.io/xorm/session_update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -17,6 +17,11 @@ import ( | ||||||
| 	"xorm.io/xorm/schemas" | 	"xorm.io/xorm/schemas" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | // enumerated all errors
 | ||||||
|  | var ( | ||||||
|  | 	ErrNoColumnsTobeUpdated = errors.New("no columns found to be updated") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| 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 { | ||||||
|  | @ -144,6 +149,8 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	defer session.resetStatement() | ||||||
|  | 
 | ||||||
| 	if session.statement.LastError != nil { | 	if session.statement.LastError != nil { | ||||||
| 		return 0, session.statement.LastError | 		return 0, session.statement.LastError | ||||||
| 	} | 	} | ||||||
|  | @ -224,35 +231,35 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | ||||||
| 
 | 
 | ||||||
| 	// for update action to like "column = column + ?"
 | 	// for update action to like "column = column + ?"
 | ||||||
| 	incColumns := session.statement.IncrColumns | 	incColumns := session.statement.IncrColumns | ||||||
| 	for i, colName := range incColumns.ColNames { | 	for _, expr := range incColumns { | ||||||
| 		colNames = append(colNames, session.engine.Quote(colName)+" = "+session.engine.Quote(colName)+" + ?") | 		colNames = append(colNames, session.engine.Quote(expr.ColName)+" = "+session.engine.Quote(expr.ColName)+" + ?") | ||||||
| 		args = append(args, incColumns.Args[i]) | 		args = append(args, expr.Arg) | ||||||
| 	} | 	} | ||||||
| 	// for update action to like "column = column - ?"
 | 	// for update action to like "column = column - ?"
 | ||||||
| 	decColumns := session.statement.DecrColumns | 	decColumns := session.statement.DecrColumns | ||||||
| 	for i, colName := range decColumns.ColNames { | 	for _, expr := range decColumns { | ||||||
| 		colNames = append(colNames, session.engine.Quote(colName)+" = "+session.engine.Quote(colName)+" - ?") | 		colNames = append(colNames, session.engine.Quote(expr.ColName)+" = "+session.engine.Quote(expr.ColName)+" - ?") | ||||||
| 		args = append(args, decColumns.Args[i]) | 		args = append(args, expr.Arg) | ||||||
| 	} | 	} | ||||||
| 	// for update action to like "column = expression"
 | 	// for update action to like "column = expression"
 | ||||||
| 	exprColumns := session.statement.ExprColumns | 	exprColumns := session.statement.ExprColumns | ||||||
| 	for i, colName := range exprColumns.ColNames { | 	for _, expr := range exprColumns { | ||||||
| 		switch tp := exprColumns.Args[i].(type) { | 		switch tp := expr.Arg.(type) { | ||||||
| 		case string: | 		case string: | ||||||
| 			if len(tp) == 0 { | 			if len(tp) == 0 { | ||||||
| 				tp = "''" | 				tp = "''" | ||||||
| 			} | 			} | ||||||
| 			colNames = append(colNames, session.engine.Quote(colName)+"="+tp) | 			colNames = append(colNames, session.engine.Quote(expr.ColName)+"="+tp) | ||||||
| 		case *builder.Builder: | 		case *builder.Builder: | ||||||
| 			subQuery, subArgs, err := session.statement.GenCondSQL(tp) | 			subQuery, subArgs, err := session.statement.GenCondSQL(tp) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return 0, err | 				return 0, err | ||||||
| 			} | 			} | ||||||
| 			colNames = append(colNames, session.engine.Quote(colName)+"=("+subQuery+")") | 			colNames = append(colNames, session.engine.Quote(expr.ColName)+"=("+subQuery+")") | ||||||
| 			args = append(args, subArgs...) | 			args = append(args, subArgs...) | ||||||
| 		default: | 		default: | ||||||
| 			colNames = append(colNames, session.engine.Quote(colName)+"=?") | 			colNames = append(colNames, session.engine.Quote(expr.ColName)+"=?") | ||||||
| 			args = append(args, exprColumns.Args[i]) | 			args = append(args, expr.Arg) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -273,15 +280,12 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | ||||||
| 					k = ct.Elem().Kind() | 					k = ct.Elem().Kind() | ||||||
| 				} | 				} | ||||||
| 				if k == reflect.Struct { | 				if k == reflect.Struct { | ||||||
| 					var refTable = session.statement.RefTable | 					condTable, err := session.engine.TableInfo(condiBean[0]) | ||||||
| 					if refTable == nil { | 					if err != nil { | ||||||
| 						refTable, err = session.engine.TableInfo(condiBean[0]) | 						return 0, err | ||||||
| 						if err != nil { |  | ||||||
| 							return 0, err |  | ||||||
| 						} |  | ||||||
| 					} | 					} | ||||||
| 					var err error | 
 | ||||||
| 					autoCond, err = session.statement.BuildConds(refTable, condiBean[0], true, true, false, true, false) | 					autoCond, err = session.statement.BuildConds(condTable, condiBean[0], true, true, false, true, false) | ||||||
| 					if err != nil { | 					if err != nil { | ||||||
| 						return 0, err | 						return 0, err | ||||||
| 					} | 					} | ||||||
|  | @ -329,7 +333,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if len(colNames) <= 0 { | 	if len(colNames) <= 0 { | ||||||
| 		return 0, errors.New("No content found to be updated") | 		return 0, ErrNoColumnsTobeUpdated | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	condSQL, condArgs, err = session.statement.GenCondSQL(cond) | 	condSQL, condArgs, err = session.statement.GenCondSQL(cond) | ||||||
|  | @ -450,7 +454,6 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | ||||||
| 				// FIXME: if bean is a map type, it will panic because map cannot be as map key
 | 				// FIXME: if bean is a map type, it will panic because map cannot be as map key
 | ||||||
| 				session.afterUpdateBeans[bean] = &afterClosures | 				session.afterUpdateBeans[bean] = &afterClosures | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 		} else { | 		} else { | ||||||
| 			if _, ok := interface{}(bean).(AfterUpdateProcessor); ok { | 			if _, ok := interface{}(bean).(AfterUpdateProcessor); ok { | ||||||
| 				session.afterUpdateBeans[bean] = nil | 				session.afterUpdateBeans[bean] = nil | ||||||
|  |  | ||||||
							
								
								
									
										328
									
								
								vendor/xorm.io/xorm/tags/parser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										328
									
								
								vendor/xorm.io/xorm/tags/parser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -7,11 +7,11 @@ package tags | ||||||
| import ( | import ( | ||||||
| 	"encoding/gob" | 	"encoding/gob" | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" |  | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
|  | 	"unicode" | ||||||
| 
 | 
 | ||||||
| 	"xorm.io/xorm/caches" | 	"xorm.io/xorm/caches" | ||||||
| 	"xorm.io/xorm/convert" | 	"xorm.io/xorm/convert" | ||||||
|  | @ -22,7 +22,7 @@ import ( | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	// ErrUnsupportedType represents an unsupported type error
 | 	// ErrUnsupportedType represents an unsupported type error
 | ||||||
| 	ErrUnsupportedType = errors.New("Unsupported type") | 	ErrUnsupportedType = errors.New("unsupported type") | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Parser represents a parser for xorm tag
 | // Parser represents a parser for xorm tag
 | ||||||
|  | @ -124,6 +124,147 @@ func addIndex(indexName string, table *schemas.Table, col *schemas.Column, index | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | var ErrIgnoreField = errors.New("field will be ignored") | ||||||
|  | 
 | ||||||
|  | func (parser *Parser) parseFieldWithNoTag(fieldIndex int, field reflect.StructField, fieldValue reflect.Value) (*schemas.Column, error) { | ||||||
|  | 	var sqlType schemas.SQLType | ||||||
|  | 	if fieldValue.CanAddr() { | ||||||
|  | 		if _, ok := fieldValue.Addr().Interface().(convert.Conversion); ok { | ||||||
|  | 			sqlType = schemas.SQLType{Name: schemas.Text} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if _, ok := fieldValue.Interface().(convert.Conversion); ok { | ||||||
|  | 		sqlType = schemas.SQLType{Name: schemas.Text} | ||||||
|  | 	} else { | ||||||
|  | 		sqlType = schemas.Type2SQLType(field.Type) | ||||||
|  | 	} | ||||||
|  | 	col := schemas.NewColumn(parser.columnMapper.Obj2Table(field.Name), | ||||||
|  | 		field.Name, sqlType, sqlType.DefaultLength, | ||||||
|  | 		sqlType.DefaultLength2, true) | ||||||
|  | 	col.FieldIndex = []int{fieldIndex} | ||||||
|  | 
 | ||||||
|  | 	if field.Type.Kind() == reflect.Int64 && (strings.ToUpper(col.FieldName) == "ID" || strings.HasSuffix(strings.ToUpper(col.FieldName), ".ID")) { | ||||||
|  | 		col.IsAutoIncrement = true | ||||||
|  | 		col.IsPrimaryKey = true | ||||||
|  | 		col.Nullable = false | ||||||
|  | 	} | ||||||
|  | 	return col, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (parser *Parser) parseFieldWithTags(table *schemas.Table, fieldIndex int, field reflect.StructField, fieldValue reflect.Value, tags []tag) (*schemas.Column, error) { | ||||||
|  | 	var col = &schemas.Column{ | ||||||
|  | 		FieldName:       field.Name, | ||||||
|  | 		FieldIndex:      []int{fieldIndex}, | ||||||
|  | 		Nullable:        true, | ||||||
|  | 		IsPrimaryKey:    false, | ||||||
|  | 		IsAutoIncrement: false, | ||||||
|  | 		MapType:         schemas.TWOSIDES, | ||||||
|  | 		Indexes:         make(map[string]int), | ||||||
|  | 		DefaultIsEmpty:  true, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var ctx = Context{ | ||||||
|  | 		table:      table, | ||||||
|  | 		col:        col, | ||||||
|  | 		fieldValue: fieldValue, | ||||||
|  | 		indexNames: make(map[string]int), | ||||||
|  | 		parser:     parser, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for j, tag := range tags { | ||||||
|  | 		if ctx.ignoreNext { | ||||||
|  | 			ctx.ignoreNext = false | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		ctx.tag = tag | ||||||
|  | 		ctx.tagUname = strings.ToUpper(tag.name) | ||||||
|  | 
 | ||||||
|  | 		if j > 0 { | ||||||
|  | 			ctx.preTag = strings.ToUpper(tags[j-1].name) | ||||||
|  | 		} | ||||||
|  | 		if j < len(tags)-1 { | ||||||
|  | 			ctx.nextTag = tags[j+1].name | ||||||
|  | 		} else { | ||||||
|  | 			ctx.nextTag = "" | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if h, ok := parser.handlers[ctx.tagUname]; ok { | ||||||
|  | 			if err := h(&ctx); err != nil { | ||||||
|  | 				return nil, err | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			if strings.HasPrefix(ctx.tag.name, "'") && strings.HasSuffix(ctx.tag.name, "'") { | ||||||
|  | 				col.Name = ctx.tag.name[1 : len(ctx.tag.name)-1] | ||||||
|  | 			} else { | ||||||
|  | 				col.Name = ctx.tag.name | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if ctx.hasCacheTag { | ||||||
|  | 			if parser.cacherMgr.GetDefaultCacher() != nil { | ||||||
|  | 				parser.cacherMgr.SetCacher(table.Name, parser.cacherMgr.GetDefaultCacher()) | ||||||
|  | 			} else { | ||||||
|  | 				parser.cacherMgr.SetCacher(table.Name, caches.NewLRUCacher2(caches.NewMemoryStore(), time.Hour, 10000)) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if ctx.hasNoCacheTag { | ||||||
|  | 			parser.cacherMgr.SetCacher(table.Name, nil) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if col.SQLType.Name == "" { | ||||||
|  | 		col.SQLType = schemas.Type2SQLType(field.Type) | ||||||
|  | 	} | ||||||
|  | 	parser.dialect.SQLType(col) | ||||||
|  | 	if col.Length == 0 { | ||||||
|  | 		col.Length = col.SQLType.DefaultLength | ||||||
|  | 	} | ||||||
|  | 	if col.Length2 == 0 { | ||||||
|  | 		col.Length2 = col.SQLType.DefaultLength2 | ||||||
|  | 	} | ||||||
|  | 	if col.Name == "" { | ||||||
|  | 		col.Name = parser.columnMapper.Obj2Table(field.Name) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if ctx.isUnique { | ||||||
|  | 		ctx.indexNames[col.Name] = schemas.UniqueType | ||||||
|  | 	} else if ctx.isIndex { | ||||||
|  | 		ctx.indexNames[col.Name] = schemas.IndexType | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for indexName, indexType := range ctx.indexNames { | ||||||
|  | 		addIndex(indexName, table, col, indexType) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return col, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (parser *Parser) parseField(table *schemas.Table, fieldIndex int, field reflect.StructField, fieldValue reflect.Value) (*schemas.Column, error) { | ||||||
|  | 	var ( | ||||||
|  | 		tag       = field.Tag | ||||||
|  | 		ormTagStr = strings.TrimSpace(tag.Get(parser.identifier)) | ||||||
|  | 	) | ||||||
|  | 	if ormTagStr == "-" { | ||||||
|  | 		return nil, ErrIgnoreField | ||||||
|  | 	} | ||||||
|  | 	if ormTagStr == "" { | ||||||
|  | 		return parser.parseFieldWithNoTag(fieldIndex, field, fieldValue) | ||||||
|  | 	} | ||||||
|  | 	tags, err := splitTag(ormTagStr) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return parser.parseFieldWithTags(table, fieldIndex, field, fieldValue, tags) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func isNotTitle(n string) bool { | ||||||
|  | 	for _, c := range n { | ||||||
|  | 		return unicode.IsLower(c) | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Parse parses a struct as a table information
 | // Parse parses a struct as a table information
 | ||||||
| func (parser *Parser) Parse(v reflect.Value) (*schemas.Table, error) { | func (parser *Parser) Parse(v reflect.Value) (*schemas.Table, error) { | ||||||
| 	t := v.Type() | 	t := v.Type() | ||||||
|  | @ -139,185 +280,26 @@ func (parser *Parser) Parse(v reflect.Value) (*schemas.Table, error) { | ||||||
| 	table.Type = t | 	table.Type = t | ||||||
| 	table.Name = names.GetTableName(parser.tableMapper, v) | 	table.Name = names.GetTableName(parser.tableMapper, v) | ||||||
| 
 | 
 | ||||||
| 	var idFieldColName string |  | ||||||
| 	var hasCacheTag, hasNoCacheTag bool |  | ||||||
| 
 |  | ||||||
| 	for i := 0; i < t.NumField(); i++ { | 	for i := 0; i < t.NumField(); i++ { | ||||||
| 		tag := t.Field(i).Tag | 		var field = t.Field(i) | ||||||
| 
 | 		if isNotTitle(field.Name) { | ||||||
| 		ormTagStr := tag.Get(parser.identifier) |  | ||||||
| 		var col *schemas.Column |  | ||||||
| 		fieldValue := v.Field(i) |  | ||||||
| 		fieldType := fieldValue.Type() |  | ||||||
| 
 |  | ||||||
| 		if ormTagStr != "" { |  | ||||||
| 			col = &schemas.Column{ |  | ||||||
| 				FieldName:       t.Field(i).Name, |  | ||||||
| 				Nullable:        true, |  | ||||||
| 				IsPrimaryKey:    false, |  | ||||||
| 				IsAutoIncrement: false, |  | ||||||
| 				MapType:         schemas.TWOSIDES, |  | ||||||
| 				Indexes:         make(map[string]int), |  | ||||||
| 				DefaultIsEmpty:  true, |  | ||||||
| 			} |  | ||||||
| 			tags := splitTag(ormTagStr) |  | ||||||
| 
 |  | ||||||
| 			if len(tags) > 0 { |  | ||||||
| 				if tags[0] == "-" { |  | ||||||
| 					continue |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				var ctx = Context{ |  | ||||||
| 					table:      table, |  | ||||||
| 					col:        col, |  | ||||||
| 					fieldValue: fieldValue, |  | ||||||
| 					indexNames: make(map[string]int), |  | ||||||
| 					parser:     parser, |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				if strings.HasPrefix(strings.ToUpper(tags[0]), "EXTENDS") { |  | ||||||
| 					pStart := strings.Index(tags[0], "(") |  | ||||||
| 					if pStart > -1 && strings.HasSuffix(tags[0], ")") { |  | ||||||
| 						var tagPrefix = strings.TrimFunc(tags[0][pStart+1:len(tags[0])-1], func(r rune) bool { |  | ||||||
| 							return r == '\'' || r == '"' |  | ||||||
| 						}) |  | ||||||
| 
 |  | ||||||
| 						ctx.params = []string{tagPrefix} |  | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 					if err := ExtendsTagHandler(&ctx); err != nil { |  | ||||||
| 						return nil, err |  | ||||||
| 					} |  | ||||||
| 					continue |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				for j, key := range tags { |  | ||||||
| 					if ctx.ignoreNext { |  | ||||||
| 						ctx.ignoreNext = false |  | ||||||
| 						continue |  | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 					k := strings.ToUpper(key) |  | ||||||
| 					ctx.tagName = k |  | ||||||
| 					ctx.params = []string{} |  | ||||||
| 
 |  | ||||||
| 					pStart := strings.Index(k, "(") |  | ||||||
| 					if pStart == 0 { |  | ||||||
| 						return nil, errors.New("( could not be the first character") |  | ||||||
| 					} |  | ||||||
| 					if pStart > -1 { |  | ||||||
| 						if !strings.HasSuffix(k, ")") { |  | ||||||
| 							return nil, fmt.Errorf("field %s tag %s cannot match ) character", col.FieldName, key) |  | ||||||
| 						} |  | ||||||
| 
 |  | ||||||
| 						ctx.tagName = k[:pStart] |  | ||||||
| 						ctx.params = strings.Split(key[pStart+1:len(k)-1], ",") |  | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 					if j > 0 { |  | ||||||
| 						ctx.preTag = strings.ToUpper(tags[j-1]) |  | ||||||
| 					} |  | ||||||
| 					if j < len(tags)-1 { |  | ||||||
| 						ctx.nextTag = tags[j+1] |  | ||||||
| 					} else { |  | ||||||
| 						ctx.nextTag = "" |  | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 					if h, ok := parser.handlers[ctx.tagName]; ok { |  | ||||||
| 						if err := h(&ctx); err != nil { |  | ||||||
| 							return nil, err |  | ||||||
| 						} |  | ||||||
| 					} else { |  | ||||||
| 						if strings.HasPrefix(key, "'") && strings.HasSuffix(key, "'") { |  | ||||||
| 							col.Name = key[1 : len(key)-1] |  | ||||||
| 						} else { |  | ||||||
| 							col.Name = key |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 					if ctx.hasCacheTag { |  | ||||||
| 						hasCacheTag = true |  | ||||||
| 					} |  | ||||||
| 					if ctx.hasNoCacheTag { |  | ||||||
| 						hasNoCacheTag = true |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				if col.SQLType.Name == "" { |  | ||||||
| 					col.SQLType = schemas.Type2SQLType(fieldType) |  | ||||||
| 				} |  | ||||||
| 				parser.dialect.SQLType(col) |  | ||||||
| 				if col.Length == 0 { |  | ||||||
| 					col.Length = col.SQLType.DefaultLength |  | ||||||
| 				} |  | ||||||
| 				if col.Length2 == 0 { |  | ||||||
| 					col.Length2 = col.SQLType.DefaultLength2 |  | ||||||
| 				} |  | ||||||
| 				if col.Name == "" { |  | ||||||
| 					col.Name = parser.columnMapper.Obj2Table(t.Field(i).Name) |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				if ctx.isUnique { |  | ||||||
| 					ctx.indexNames[col.Name] = schemas.UniqueType |  | ||||||
| 				} else if ctx.isIndex { |  | ||||||
| 					ctx.indexNames[col.Name] = schemas.IndexType |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				for indexName, indexType := range ctx.indexNames { |  | ||||||
| 					addIndex(indexName, table, col, indexType) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} else if fieldValue.CanSet() { |  | ||||||
| 			var sqlType schemas.SQLType |  | ||||||
| 			if fieldValue.CanAddr() { |  | ||||||
| 				if _, ok := fieldValue.Addr().Interface().(convert.Conversion); ok { |  | ||||||
| 					sqlType = schemas.SQLType{Name: schemas.Text} |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			if _, ok := fieldValue.Interface().(convert.Conversion); ok { |  | ||||||
| 				sqlType = schemas.SQLType{Name: schemas.Text} |  | ||||||
| 			} else { |  | ||||||
| 				sqlType = schemas.Type2SQLType(fieldType) |  | ||||||
| 			} |  | ||||||
| 			col = schemas.NewColumn(parser.columnMapper.Obj2Table(t.Field(i).Name), |  | ||||||
| 				t.Field(i).Name, sqlType, sqlType.DefaultLength, |  | ||||||
| 				sqlType.DefaultLength2, true) |  | ||||||
| 
 |  | ||||||
| 			if fieldType.Kind() == reflect.Int64 && (strings.ToUpper(col.FieldName) == "ID" || strings.HasSuffix(strings.ToUpper(col.FieldName), ".ID")) { |  | ||||||
| 				idFieldColName = col.Name |  | ||||||
| 			} |  | ||||||
| 		} else { |  | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		if col.IsAutoIncrement { | 
 | ||||||
| 			col.Nullable = false | 		col, err := parser.parseField(table, i, field, v.Field(i)) | ||||||
|  | 		if err == ErrIgnoreField { | ||||||
|  | 			continue | ||||||
|  | 		} else if err != nil { | ||||||
|  | 			return nil, err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		table.AddColumn(col) | 		table.AddColumn(col) | ||||||
| 
 |  | ||||||
| 	} // end for
 | 	} // end for
 | ||||||
| 
 | 
 | ||||||
| 	if idFieldColName != "" && len(table.PrimaryKeys) == 0 { | 	deletedColumn := table.DeletedColumn() | ||||||
| 		col := table.GetColumn(idFieldColName) | 	// check columns
 | ||||||
| 		col.IsPrimaryKey = true | 	if deletedColumn != nil { | ||||||
| 		col.IsAutoIncrement = true | 		deletedColumn.Nullable = true | ||||||
| 		col.Nullable = false |  | ||||||
| 		table.PrimaryKeys = append(table.PrimaryKeys, col.Name) |  | ||||||
| 		table.AutoIncrement = col.Name |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if hasCacheTag { |  | ||||||
| 		if parser.cacherMgr.GetDefaultCacher() != nil { // !nash! use engine's cacher if provided
 |  | ||||||
| 			//engine.logger.Info("enable cache on table:", table.Name)
 |  | ||||||
| 			parser.cacherMgr.SetCacher(table.Name, parser.cacherMgr.GetDefaultCacher()) |  | ||||||
| 		} else { |  | ||||||
| 			//engine.logger.Info("enable LRU cache on table:", table.Name)
 |  | ||||||
| 			parser.cacherMgr.SetCacher(table.Name, caches.NewLRUCacher2(caches.NewMemoryStore(), time.Hour, 10000)) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if hasNoCacheTag { |  | ||||||
| 		//engine.logger.Info("disable cache on table:", table.Name)
 |  | ||||||
| 		parser.cacherMgr.SetCacher(table.Name, nil) |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return table, nil | 	return table, nil | ||||||
|  |  | ||||||
							
								
								
									
										149
									
								
								vendor/xorm.io/xorm/tags/tag.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										149
									
								
								vendor/xorm.io/xorm/tags/tag.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -14,30 +14,74 @@ import ( | ||||||
| 	"xorm.io/xorm/schemas" | 	"xorm.io/xorm/schemas" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func splitTag(tag string) (tags []string) { | type tag struct { | ||||||
| 	tag = strings.TrimSpace(tag) | 	name   string | ||||||
| 	var hasQuote = false | 	params []string | ||||||
| 	var lastIdx = 0 | } | ||||||
| 	for i, t := range tag { | 
 | ||||||
| 		if t == '\'' { | func splitTag(tagStr string) ([]tag, error) { | ||||||
| 			hasQuote = !hasQuote | 	tagStr = strings.TrimSpace(tagStr) | ||||||
| 		} else if t == ' ' { | 	var ( | ||||||
| 			if lastIdx < i && !hasQuote { | 		inQuote    bool | ||||||
| 				tags = append(tags, strings.TrimSpace(tag[lastIdx:i])) | 		inBigQuote bool | ||||||
| 				lastIdx = i + 1 | 		lastIdx    int | ||||||
|  | 		curTag     tag | ||||||
|  | 		paramStart int | ||||||
|  | 		tags       []tag | ||||||
|  | 	) | ||||||
|  | 	for i, t := range tagStr { | ||||||
|  | 		switch t { | ||||||
|  | 		case '\'': | ||||||
|  | 			inQuote = !inQuote | ||||||
|  | 		case ' ': | ||||||
|  | 			if !inQuote && !inBigQuote { | ||||||
|  | 				if lastIdx < i { | ||||||
|  | 					if curTag.name == "" { | ||||||
|  | 						curTag.name = tagStr[lastIdx:i] | ||||||
|  | 					} | ||||||
|  | 					tags = append(tags, curTag) | ||||||
|  | 					lastIdx = i + 1 | ||||||
|  | 					curTag = tag{} | ||||||
|  | 				} else if lastIdx == i { | ||||||
|  | 					lastIdx = i + 1 | ||||||
|  | 				} | ||||||
|  | 			} else if inBigQuote && !inQuote { | ||||||
|  | 				paramStart = i + 1 | ||||||
|  | 			} | ||||||
|  | 		case ',': | ||||||
|  | 			if !inQuote && !inBigQuote { | ||||||
|  | 				return nil, fmt.Errorf("comma[%d] of %s should be in quote or big quote", i, tagStr) | ||||||
|  | 			} | ||||||
|  | 			if !inQuote && inBigQuote { | ||||||
|  | 				curTag.params = append(curTag.params, strings.TrimSpace(tagStr[paramStart:i])) | ||||||
|  | 				paramStart = i + 1 | ||||||
|  | 			} | ||||||
|  | 		case '(': | ||||||
|  | 			inBigQuote = true | ||||||
|  | 			if !inQuote { | ||||||
|  | 				curTag.name = tagStr[lastIdx:i] | ||||||
|  | 				paramStart = i + 1 | ||||||
|  | 			} | ||||||
|  | 		case ')': | ||||||
|  | 			inBigQuote = false | ||||||
|  | 			if !inQuote { | ||||||
|  | 				curTag.params = append(curTag.params, tagStr[paramStart:i]) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if lastIdx < len(tag) { | 	if lastIdx < len(tagStr) { | ||||||
| 		tags = append(tags, strings.TrimSpace(tag[lastIdx:])) | 		if curTag.name == "" { | ||||||
|  | 			curTag.name = tagStr[lastIdx:] | ||||||
|  | 		} | ||||||
|  | 		tags = append(tags, curTag) | ||||||
| 	} | 	} | ||||||
| 	return | 	return tags, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Context represents a context for xorm tag parse.
 | // Context represents a context for xorm tag parse.
 | ||||||
| type Context struct { | type Context struct { | ||||||
| 	tagName         string | 	tag | ||||||
| 	params          []string | 	tagUname        string | ||||||
| 	preTag, nextTag string | 	preTag, nextTag string | ||||||
| 	table           *schemas.Table | 	table           *schemas.Table | ||||||
| 	col             *schemas.Column | 	col             *schemas.Column | ||||||
|  | @ -76,6 +120,7 @@ var ( | ||||||
| 		"CACHE":    CacheTagHandler, | 		"CACHE":    CacheTagHandler, | ||||||
| 		"NOCACHE":  NoCacheTagHandler, | 		"NOCACHE":  NoCacheTagHandler, | ||||||
| 		"COMMENT":  CommentTagHandler, | 		"COMMENT":  CommentTagHandler, | ||||||
|  | 		"EXTENDS":  ExtendsTagHandler, | ||||||
| 	} | 	} | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -124,6 +169,7 @@ func NotNullTagHandler(ctx *Context) error { | ||||||
| // AutoIncrTagHandler describes autoincr tag handler
 | // AutoIncrTagHandler describes autoincr tag handler
 | ||||||
| func AutoIncrTagHandler(ctx *Context) error { | func AutoIncrTagHandler(ctx *Context) error { | ||||||
| 	ctx.col.IsAutoIncrement = true | 	ctx.col.IsAutoIncrement = true | ||||||
|  | 	ctx.col.Nullable = false | ||||||
| 	/* | 	/* | ||||||
| 		if len(ctx.params) > 0 { | 		if len(ctx.params) > 0 { | ||||||
| 			autoStartInt, err := strconv.Atoi(ctx.params[0]) | 			autoStartInt, err := strconv.Atoi(ctx.params[0]) | ||||||
|  | @ -192,6 +238,7 @@ func UpdatedTagHandler(ctx *Context) error { | ||||||
| // DeletedTagHandler describes deleted tag handler
 | // DeletedTagHandler describes deleted tag handler
 | ||||||
| func DeletedTagHandler(ctx *Context) error { | func DeletedTagHandler(ctx *Context) error { | ||||||
| 	ctx.col.IsDeleted = true | 	ctx.col.IsDeleted = true | ||||||
|  | 	ctx.col.Nullable = true | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -225,41 +272,44 @@ func CommentTagHandler(ctx *Context) error { | ||||||
| 
 | 
 | ||||||
| // SQLTypeTagHandler describes SQL Type tag handler
 | // SQLTypeTagHandler describes SQL Type tag handler
 | ||||||
| func SQLTypeTagHandler(ctx *Context) error { | func SQLTypeTagHandler(ctx *Context) error { | ||||||
| 	ctx.col.SQLType = schemas.SQLType{Name: ctx.tagName} | 	ctx.col.SQLType = schemas.SQLType{Name: ctx.tagUname} | ||||||
| 	if strings.EqualFold(ctx.tagName, "JSON") { | 	if ctx.tagUname == "JSON" { | ||||||
| 		ctx.col.IsJSON = true | 		ctx.col.IsJSON = true | ||||||
| 	} | 	} | ||||||
| 	if len(ctx.params) > 0 { | 	if len(ctx.params) == 0 { | ||||||
| 		if ctx.tagName == schemas.Enum { | 		return nil | ||||||
| 			ctx.col.EnumOptions = make(map[string]int) | 	} | ||||||
| 			for k, v := range ctx.params { | 
 | ||||||
| 				v = strings.TrimSpace(v) | 	switch ctx.tagUname { | ||||||
| 				v = strings.Trim(v, "'") | 	case schemas.Enum: | ||||||
| 				ctx.col.EnumOptions[v] = k | 		ctx.col.EnumOptions = make(map[string]int) | ||||||
|  | 		for k, v := range ctx.params { | ||||||
|  | 			v = strings.TrimSpace(v) | ||||||
|  | 			v = strings.Trim(v, "'") | ||||||
|  | 			ctx.col.EnumOptions[v] = k | ||||||
|  | 		} | ||||||
|  | 	case schemas.Set: | ||||||
|  | 		ctx.col.SetOptions = make(map[string]int) | ||||||
|  | 		for k, v := range ctx.params { | ||||||
|  | 			v = strings.TrimSpace(v) | ||||||
|  | 			v = strings.Trim(v, "'") | ||||||
|  | 			ctx.col.SetOptions[v] = k | ||||||
|  | 		} | ||||||
|  | 	default: | ||||||
|  | 		var err error | ||||||
|  | 		if len(ctx.params) == 2 { | ||||||
|  | 			ctx.col.Length, err = strconv.Atoi(ctx.params[0]) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
| 			} | 			} | ||||||
| 		} else if ctx.tagName == schemas.Set { | 			ctx.col.Length2, err = strconv.Atoi(ctx.params[1]) | ||||||
| 			ctx.col.SetOptions = make(map[string]int) | 			if err != nil { | ||||||
| 			for k, v := range ctx.params { | 				return err | ||||||
| 				v = strings.TrimSpace(v) |  | ||||||
| 				v = strings.Trim(v, "'") |  | ||||||
| 				ctx.col.SetOptions[v] = k |  | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else if len(ctx.params) == 1 { | ||||||
| 			var err error | 			ctx.col.Length, err = strconv.Atoi(ctx.params[0]) | ||||||
| 			if len(ctx.params) == 2 { | 			if err != nil { | ||||||
| 				ctx.col.Length, err = strconv.Atoi(ctx.params[0]) | 				return err | ||||||
| 				if err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 				ctx.col.Length2, err = strconv.Atoi(ctx.params[1]) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 			} else if len(ctx.params) == 1 { |  | ||||||
| 				ctx.col.Length, err = strconv.Atoi(ctx.params[0]) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -289,11 +339,12 @@ func ExtendsTagHandler(ctx *Context) error { | ||||||
| 		} | 		} | ||||||
| 		for _, col := range parentTable.Columns() { | 		for _, col := range parentTable.Columns() { | ||||||
| 			col.FieldName = fmt.Sprintf("%v.%v", ctx.col.FieldName, col.FieldName) | 			col.FieldName = fmt.Sprintf("%v.%v", ctx.col.FieldName, col.FieldName) | ||||||
|  | 			col.FieldIndex = append(ctx.col.FieldIndex, col.FieldIndex...) | ||||||
| 
 | 
 | ||||||
| 			var tagPrefix = ctx.col.FieldName | 			var tagPrefix = ctx.col.FieldName | ||||||
| 			if len(ctx.params) > 0 { | 			if len(ctx.params) > 0 { | ||||||
| 				col.Nullable = isPtr | 				col.Nullable = isPtr | ||||||
| 				tagPrefix = ctx.params[0] | 				tagPrefix = strings.Trim(ctx.params[0], "'") | ||||||
| 				if col.IsPrimaryKey { | 				if col.IsPrimaryKey { | ||||||
| 					col.Name = ctx.col.FieldName | 					col.Name = ctx.col.FieldName | ||||||
| 					col.IsPrimaryKey = false | 					col.IsPrimaryKey = false | ||||||
|  | @ -315,7 +366,7 @@ func ExtendsTagHandler(ctx *Context) error { | ||||||
| 	default: | 	default: | ||||||
| 		//TODO: warning
 | 		//TODO: warning
 | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return ErrIgnoreField | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // CacheTagHandler describes cache tag handler
 | // CacheTagHandler describes cache tag handler
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue