mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Use created & updated instead BeforeInsert & BeforeUpdate (#2482)
* use created & updated instead BeforeInsert & BeforeUpdate * fix vendor checksum * only show generated SQL when development mode * remove extra update column updated_unix * remove trace config
This commit is contained in:
		| @@ -86,13 +86,7 @@ type Action struct { | |||||||
| 	IsPrivate   bool      `xorm:"INDEX NOT NULL DEFAULT false"` | 	IsPrivate   bool      `xorm:"INDEX NOT NULL DEFAULT false"` | ||||||
| 	Content     string    `xorm:"TEXT"` | 	Content     string    `xorm:"TEXT"` | ||||||
| 	Created     time.Time `xorm:"-"` | 	Created     time.Time `xorm:"-"` | ||||||
| 	CreatedUnix int64     `xorm:"INDEX"` | 	CreatedUnix int64     `xorm:"INDEX created"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert will be invoked by XORM before inserting a record |  | ||||||
| // representing this object. |  | ||||||
| func (a *Action) BeforeInsert() { |  | ||||||
| 	a.CreatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // AfterSet updates the webhook object upon setting a column. | // AfterSet updates the webhook object upon setting a column. | ||||||
|   | |||||||
| @@ -29,12 +29,7 @@ type Notice struct { | |||||||
| 	Type        NoticeType | 	Type        NoticeType | ||||||
| 	Description string    `xorm:"TEXT"` | 	Description string    `xorm:"TEXT"` | ||||||
| 	Created     time.Time `xorm:"-"` | 	Created     time.Time `xorm:"-"` | ||||||
| 	CreatedUnix int64     `xorm:"INDEX"` | 	CreatedUnix int64     `xorm:"INDEX created"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert is invoked from XORM before inserting an object of this type. |  | ||||||
| func (n *Notice) BeforeInsert() { |  | ||||||
| 	n.CreatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // AfterSet is invoked from XORM after setting the value of a field of this object. | // AfterSet is invoked from XORM after setting the value of a field of this object. | ||||||
|   | |||||||
| @@ -28,12 +28,7 @@ type Attachment struct { | |||||||
| 	Name          string | 	Name          string | ||||||
| 	DownloadCount int64     `xorm:"DEFAULT 0"` | 	DownloadCount int64     `xorm:"DEFAULT 0"` | ||||||
| 	Created       time.Time `xorm:"-"` | 	Created       time.Time `xorm:"-"` | ||||||
| 	CreatedUnix   int64 | 	CreatedUnix   int64     `xorm:"created"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert is invoked from XORM before inserting an object of this type. |  | ||||||
| func (a *Attachment) BeforeInsert() { |  | ||||||
| 	a.CreatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // AfterSet is invoked from XORM after setting the value of a field of | // AfterSet is invoked from XORM after setting the value of a field of | ||||||
|   | |||||||
| @@ -22,20 +22,9 @@ type ProtectedBranch struct { | |||||||
| 	BranchName  string `xorm:"UNIQUE(s)"` | 	BranchName  string `xorm:"UNIQUE(s)"` | ||||||
| 	CanPush     bool | 	CanPush     bool | ||||||
| 	Created     time.Time `xorm:"-"` | 	Created     time.Time `xorm:"-"` | ||||||
| 	CreatedUnix int64 | 	CreatedUnix int64     `xorm:"created"` | ||||||
| 	Updated     time.Time `xorm:"-"` | 	Updated     time.Time `xorm:"-"` | ||||||
| 	UpdatedUnix int64 | 	UpdatedUnix int64     `xorm:"updated"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert before protected branch insert create and update time |  | ||||||
| func (protectBranch *ProtectedBranch) BeforeInsert() { |  | ||||||
| 	protectBranch.CreatedUnix = time.Now().Unix() |  | ||||||
| 	protectBranch.UpdatedUnix = protectBranch.CreatedUnix |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate before protected branch update time |  | ||||||
| func (protectBranch *ProtectedBranch) BeforeUpdate() { |  | ||||||
| 	protectBranch.UpdatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // GetProtectedBranchByRepoID getting protected branch by repo ID | // GetProtectedBranchByRepoID getting protected branch by repo ID | ||||||
|   | |||||||
| @@ -54,23 +54,16 @@ type Issue struct { | |||||||
| 	Deadline     time.Time `xorm:"-"` | 	Deadline     time.Time `xorm:"-"` | ||||||
| 	DeadlineUnix int64     `xorm:"INDEX"` | 	DeadlineUnix int64     `xorm:"INDEX"` | ||||||
| 	Created      time.Time `xorm:"-"` | 	Created      time.Time `xorm:"-"` | ||||||
| 	CreatedUnix  int64     `xorm:"INDEX"` | 	CreatedUnix  int64     `xorm:"INDEX created"` | ||||||
| 	Updated      time.Time `xorm:"-"` | 	Updated      time.Time `xorm:"-"` | ||||||
| 	UpdatedUnix  int64     `xorm:"INDEX"` | 	UpdatedUnix  int64     `xorm:"INDEX updated"` | ||||||
|  |  | ||||||
| 	Attachments []*Attachment `xorm:"-"` | 	Attachments []*Attachment `xorm:"-"` | ||||||
| 	Comments    []*Comment    `xorm:"-"` | 	Comments    []*Comment    `xorm:"-"` | ||||||
| } | } | ||||||
|  |  | ||||||
| // BeforeInsert is invoked from XORM before inserting an object of this type. |  | ||||||
| func (issue *Issue) BeforeInsert() { |  | ||||||
| 	issue.CreatedUnix = time.Now().Unix() |  | ||||||
| 	issue.UpdatedUnix = issue.CreatedUnix |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. | // BeforeUpdate is invoked from XORM before updating this object. | ||||||
| func (issue *Issue) BeforeUpdate() { | func (issue *Issue) BeforeUpdate() { | ||||||
| 	issue.UpdatedUnix = time.Now().Unix() |  | ||||||
| 	issue.DeadlineUnix = issue.Deadline.Unix() | 	issue.DeadlineUnix = issue.Deadline.Unix() | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -581,7 +574,6 @@ func (issue *Issue) ReadBy(userID int64) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func updateIssueCols(e Engine, issue *Issue, cols ...string) error { | func updateIssueCols(e Engine, issue *Issue, cols ...string) error { | ||||||
| 	cols = append(cols, "updated_unix") |  | ||||||
| 	if _, err := e.Id(issue.ID).Cols(cols...).Update(issue); err != nil { | 	if _, err := e.Id(issue.ID).Cols(cols...).Update(issue); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -99,9 +99,9 @@ type Comment struct { | |||||||
| 	RenderedContent string `xorm:"-"` | 	RenderedContent string `xorm:"-"` | ||||||
|  |  | ||||||
| 	Created     time.Time `xorm:"-"` | 	Created     time.Time `xorm:"-"` | ||||||
| 	CreatedUnix int64     `xorm:"INDEX"` | 	CreatedUnix int64     `xorm:"INDEX created"` | ||||||
| 	Updated     time.Time `xorm:"-"` | 	Updated     time.Time `xorm:"-"` | ||||||
| 	UpdatedUnix int64     `xorm:"INDEX"` | 	UpdatedUnix int64     `xorm:"INDEX updated"` | ||||||
|  |  | ||||||
| 	// Reference issue in commit message | 	// Reference issue in commit message | ||||||
| 	CommitSHA string `xorm:"VARCHAR(40)"` | 	CommitSHA string `xorm:"VARCHAR(40)"` | ||||||
| @@ -112,18 +112,6 @@ type Comment struct { | |||||||
| 	ShowTag CommentTag `xorm:"-"` | 	ShowTag CommentTag `xorm:"-"` | ||||||
| } | } | ||||||
|  |  | ||||||
| // BeforeInsert will be invoked by XORM before inserting a record |  | ||||||
| // representing this object. |  | ||||||
| func (c *Comment) BeforeInsert() { |  | ||||||
| 	c.CreatedUnix = time.Now().Unix() |  | ||||||
| 	c.UpdatedUnix = c.CreatedUnix |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. |  | ||||||
| func (c *Comment) BeforeUpdate() { |  | ||||||
| 	c.UpdatedUnix = time.Now().Unix() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // AfterSet is invoked from XORM after setting the value of a field of this object. | // AfterSet is invoked from XORM after setting the value of a field of this object. | ||||||
| func (c *Comment) AfterSet(colName string, _ xorm.Cell) { | func (c *Comment) AfterSet(colName string, _ xorm.Cell) { | ||||||
| 	var err error | 	var err error | ||||||
|   | |||||||
| @@ -2,8 +2,9 @@ package models | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"github.com/go-xorm/xorm" |  | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
|  | 	"github.com/go-xorm/xorm" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // LFSMetaObject stores metadata for LFS tracked files. | // LFSMetaObject stores metadata for LFS tracked files. | ||||||
| @@ -14,7 +15,7 @@ type LFSMetaObject struct { | |||||||
| 	RepositoryID int64     `xorm:"UNIQUE(s) INDEX NOT NULL"` | 	RepositoryID int64     `xorm:"UNIQUE(s) INDEX NOT NULL"` | ||||||
| 	Existing     bool      `xorm:"-"` | 	Existing     bool      `xorm:"-"` | ||||||
| 	Created      time.Time `xorm:"-"` | 	Created      time.Time `xorm:"-"` | ||||||
| 	CreatedUnix  int64 | 	CreatedUnix  int64     `xorm:"created"` | ||||||
| } | } | ||||||
|  |  | ||||||
| // LFSTokenResponse defines the JSON structure in which the JWT token is stored. | // LFSTokenResponse defines the JSON structure in which the JWT token is stored. | ||||||
| @@ -108,11 +109,6 @@ func RemoveLFSMetaObjectByOid(oid string) error { | |||||||
| 	return sess.Commit() | 	return sess.Commit() | ||||||
| } | } | ||||||
|  |  | ||||||
| // BeforeInsert sets the time at which the LFSMetaObject was created. |  | ||||||
| func (m *LFSMetaObject) BeforeInsert() { |  | ||||||
| 	m.CreatedUnix = time.Now().Unix() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // AfterSet stores the LFSMetaObject creation time in the database as local time. | // AfterSet stores the LFSMetaObject creation time in the database as local time. | ||||||
| func (m *LFSMetaObject) AfterSet(colName string, _ xorm.Cell) { | func (m *LFSMetaObject) AfterSet(colName string, _ xorm.Cell) { | ||||||
| 	switch colName { | 	switch colName { | ||||||
|   | |||||||
| @@ -148,20 +148,9 @@ type LoginSource struct { | |||||||
| 	Cfg           core.Conversion `xorm:"TEXT"` | 	Cfg           core.Conversion `xorm:"TEXT"` | ||||||
|  |  | ||||||
| 	Created     time.Time `xorm:"-"` | 	Created     time.Time `xorm:"-"` | ||||||
| 	CreatedUnix int64     `xorm:"INDEX"` | 	CreatedUnix int64     `xorm:"INDEX created"` | ||||||
| 	Updated     time.Time `xorm:"-"` | 	Updated     time.Time `xorm:"-"` | ||||||
| 	UpdatedUnix int64     `xorm:"INDEX"` | 	UpdatedUnix int64     `xorm:"INDEX updated"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert is invoked from XORM before inserting an object of this type. |  | ||||||
| func (source *LoginSource) BeforeInsert() { |  | ||||||
| 	source.CreatedUnix = time.Now().Unix() |  | ||||||
| 	source.UpdatedUnix = source.CreatedUnix |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. |  | ||||||
| func (source *LoginSource) BeforeUpdate() { |  | ||||||
| 	source.UpdatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // Cell2Int64 converts a xorm.Cell type to int64, | // Cell2Int64 converts a xorm.Cell type to int64, | ||||||
|   | |||||||
| @@ -241,6 +241,7 @@ func NewTestEngine(x *xorm.Engine) (err error) { | |||||||
|  |  | ||||||
| 	x.SetMapper(core.GonicMapper{}) | 	x.SetMapper(core.GonicMapper{}) | ||||||
| 	x.SetLogger(log.XORMLogger) | 	x.SetLogger(log.XORMLogger) | ||||||
|  | 	x.ShowSQL(!setting.ProdMode) | ||||||
| 	return x.StoreEngine("InnoDB").Sync2(tables...) | 	return x.StoreEngine("InnoDB").Sync2(tables...) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -211,20 +211,9 @@ type Repository struct { | |||||||
| 	Size     int64       `xorm:"NOT NULL DEFAULT 0"` | 	Size     int64       `xorm:"NOT NULL DEFAULT 0"` | ||||||
|  |  | ||||||
| 	Created     time.Time `xorm:"-"` | 	Created     time.Time `xorm:"-"` | ||||||
| 	CreatedUnix int64     `xorm:"INDEX"` | 	CreatedUnix int64     `xorm:"INDEX created"` | ||||||
| 	Updated     time.Time `xorm:"-"` | 	Updated     time.Time `xorm:"-"` | ||||||
| 	UpdatedUnix int64     `xorm:"INDEX"` | 	UpdatedUnix int64     `xorm:"INDEX updated"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert is invoked from XORM before inserting an object of this type. |  | ||||||
| func (repo *Repository) BeforeInsert() { |  | ||||||
| 	repo.CreatedUnix = time.Now().Unix() |  | ||||||
| 	repo.UpdatedUnix = repo.CreatedUnix |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. |  | ||||||
| func (repo *Repository) BeforeUpdate() { |  | ||||||
| 	repo.UpdatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // AfterSet is invoked from XORM after setting the value of a field of this object. | // AfterSet is invoked from XORM after setting the value of a field of this object. | ||||||
|   | |||||||
| @@ -40,18 +40,26 @@ type Mirror struct { | |||||||
|  |  | ||||||
| // BeforeInsert will be invoked by XORM before inserting a record | // BeforeInsert will be invoked by XORM before inserting a record | ||||||
| func (m *Mirror) BeforeInsert() { | func (m *Mirror) BeforeInsert() { | ||||||
| 	m.UpdatedUnix = time.Now().Unix() | 	if m != nil { | ||||||
| 	m.NextUpdateUnix = m.NextUpdate.Unix() | 		m.UpdatedUnix = time.Now().Unix() | ||||||
|  | 		m.NextUpdateUnix = m.NextUpdate.Unix() | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. | // BeforeUpdate is invoked from XORM before updating this object. | ||||||
| func (m *Mirror) BeforeUpdate() { | func (m *Mirror) BeforeUpdate() { | ||||||
| 	m.UpdatedUnix = time.Now().Unix() | 	if m != nil { | ||||||
| 	m.NextUpdateUnix = m.NextUpdate.Unix() | 		m.UpdatedUnix = time.Now().Unix() | ||||||
|  | 		m.NextUpdateUnix = m.NextUpdate.Unix() | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // AfterSet is invoked from XORM after setting the value of a field of this object. | // AfterSet is invoked from XORM after setting the value of a field of this object. | ||||||
| func (m *Mirror) AfterSet(colName string, _ xorm.Cell) { | func (m *Mirror) AfterSet(colName string, _ xorm.Cell) { | ||||||
|  | 	if m == nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	var err error | 	var err error | ||||||
| 	switch colName { | 	switch colName { | ||||||
| 	case "repo_id": | 	case "repo_id": | ||||||
|   | |||||||
| @@ -55,21 +55,11 @@ type PublicKey struct { | |||||||
| 	Type        KeyType    `xorm:"NOT NULL DEFAULT 1"` | 	Type        KeyType    `xorm:"NOT NULL DEFAULT 1"` | ||||||
|  |  | ||||||
| 	Created           time.Time `xorm:"-"` | 	Created           time.Time `xorm:"-"` | ||||||
| 	CreatedUnix       int64 | 	CreatedUnix       int64     `xorm:"created"` | ||||||
| 	Updated           time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. | 	Updated           time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. | ||||||
| 	UpdatedUnix       int64 | 	UpdatedUnix       int64     `xorm:"updated"` | ||||||
| 	HasRecentActivity bool `xorm:"-"` | 	HasRecentActivity bool      `xorm:"-"` | ||||||
| 	HasUsed           bool `xorm:"-"` | 	HasUsed           bool      `xorm:"-"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert will be invoked by XORM before inserting a record |  | ||||||
| func (key *PublicKey) BeforeInsert() { |  | ||||||
| 	key.CreatedUnix = time.Now().Unix() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. |  | ||||||
| func (key *PublicKey) BeforeUpdate() { |  | ||||||
| 	key.UpdatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // AfterSet is invoked from XORM after setting the value of a field of this object. | // AfterSet is invoked from XORM after setting the value of a field of this object. | ||||||
| @@ -633,21 +623,11 @@ type DeployKey struct { | |||||||
| 	Content     string `xorm:"-"` | 	Content     string `xorm:"-"` | ||||||
|  |  | ||||||
| 	Created           time.Time `xorm:"-"` | 	Created           time.Time `xorm:"-"` | ||||||
| 	CreatedUnix       int64 | 	CreatedUnix       int64     `xorm:"created"` | ||||||
| 	Updated           time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. | 	Updated           time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. | ||||||
| 	UpdatedUnix       int64 | 	UpdatedUnix       int64     `xorm:"updated"` | ||||||
| 	HasRecentActivity bool `xorm:"-"` | 	HasRecentActivity bool      `xorm:"-"` | ||||||
| 	HasUsed           bool `xorm:"-"` | 	HasUsed           bool      `xorm:"-"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert will be invoked by XORM before inserting a record |  | ||||||
| func (key *DeployKey) BeforeInsert() { |  | ||||||
| 	key.CreatedUnix = time.Now().Unix() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. |  | ||||||
| func (key *DeployKey) BeforeUpdate() { |  | ||||||
| 	key.UpdatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // AfterSet is invoked from XORM after setting the value of a field of this object. | // AfterSet is invoked from XORM after setting the value of a field of this object. | ||||||
|   | |||||||
| @@ -66,20 +66,9 @@ type CommitStatus struct { | |||||||
| 	CreatorID   int64 | 	CreatorID   int64 | ||||||
|  |  | ||||||
| 	Created     time.Time `xorm:"-"` | 	Created     time.Time `xorm:"-"` | ||||||
| 	CreatedUnix int64     `xorm:"INDEX"` | 	CreatedUnix int64     `xorm:"INDEX created"` | ||||||
| 	Updated     time.Time `xorm:"-"` | 	Updated     time.Time `xorm:"-"` | ||||||
| 	UpdatedUnix int64     `xorm:"INDEX"` | 	UpdatedUnix int64     `xorm:"INDEX updated"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert is invoked from XORM before inserting an object of this type. |  | ||||||
| func (status *CommitStatus) BeforeInsert() { |  | ||||||
| 	status.CreatedUnix = time.Now().Unix() |  | ||||||
| 	status.UpdatedUnix = status.CreatedUnix |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. |  | ||||||
| func (status *CommitStatus) BeforeUpdate() { |  | ||||||
| 	status.UpdatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // AfterSet is invoked from XORM after setting the value of a field of | // AfterSet is invoked from XORM after setting the value of a field of | ||||||
|   | |||||||
| @@ -21,23 +21,13 @@ type AccessToken struct { | |||||||
| 	Sha1 string `xorm:"UNIQUE VARCHAR(40)"` | 	Sha1 string `xorm:"UNIQUE VARCHAR(40)"` | ||||||
|  |  | ||||||
| 	Created           time.Time `xorm:"-"` | 	Created           time.Time `xorm:"-"` | ||||||
| 	CreatedUnix       int64     `xorm:"INDEX"` | 	CreatedUnix       int64     `xorm:"INDEX created"` | ||||||
| 	Updated           time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. | 	Updated           time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. | ||||||
| 	UpdatedUnix       int64     `xorm:"INDEX"` | 	UpdatedUnix       int64     `xorm:"INDEX updated"` | ||||||
| 	HasRecentActivity bool      `xorm:"-"` | 	HasRecentActivity bool      `xorm:"-"` | ||||||
| 	HasUsed           bool      `xorm:"-"` | 	HasUsed           bool      `xorm:"-"` | ||||||
| } | } | ||||||
|  |  | ||||||
| // BeforeInsert will be invoked by XORM before inserting a record representing this object. |  | ||||||
| func (t *AccessToken) BeforeInsert() { |  | ||||||
| 	t.CreatedUnix = time.Now().Unix() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. |  | ||||||
| func (t *AccessToken) BeforeUpdate() { |  | ||||||
| 	t.UpdatedUnix = time.Now().Unix() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // AfterSet is invoked from XORM after setting the value of a field of this object. | // AfterSet is invoked from XORM after setting the value of a field of this object. | ||||||
| func (t *AccessToken) AfterSet(colName string, _ xorm.Cell) { | func (t *AccessToken) AfterSet(colName string, _ xorm.Cell) { | ||||||
| 	switch colName { | 	switch colName { | ||||||
|   | |||||||
| @@ -26,19 +26,9 @@ type TwoFactor struct { | |||||||
| 	ScratchToken string | 	ScratchToken string | ||||||
|  |  | ||||||
| 	Created     time.Time `xorm:"-"` | 	Created     time.Time `xorm:"-"` | ||||||
| 	CreatedUnix int64     `xorm:"INDEX"` | 	CreatedUnix int64     `xorm:"INDEX created"` | ||||||
| 	Updated     time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. | 	Updated     time.Time `xorm:"-"` // Note: Updated must below Created for AfterSet. | ||||||
| 	UpdatedUnix int64     `xorm:"INDEX"` | 	UpdatedUnix int64     `xorm:"INDEX updated"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert will be invoked by XORM before inserting a record representing this object. |  | ||||||
| func (t *TwoFactor) BeforeInsert() { |  | ||||||
| 	t.CreatedUnix = time.Now().Unix() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. |  | ||||||
| func (t *TwoFactor) BeforeUpdate() { |  | ||||||
| 	t.UpdatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // AfterSet is invoked from XORM after setting the value of a field of this object. | // AfterSet is invoked from XORM after setting the value of a field of this object. | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ func CreateTestEngine(fixturesDir string) error { | |||||||
| 	if err = x.StoreEngine("InnoDB").Sync2(tables...); err != nil { | 	if err = x.StoreEngine("InnoDB").Sync2(tables...); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | 	x.ShowSQL(true) | ||||||
|  |  | ||||||
| 	return InitFixtures(&testfixtures.SQLite{}, fixturesDir) | 	return InitFixtures(&testfixtures.SQLite{}, fixturesDir) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -94,9 +94,9 @@ type User struct { | |||||||
| 	Salt             string `xorm:"VARCHAR(10)"` | 	Salt             string `xorm:"VARCHAR(10)"` | ||||||
|  |  | ||||||
| 	Created       time.Time `xorm:"-"` | 	Created       time.Time `xorm:"-"` | ||||||
| 	CreatedUnix   int64     `xorm:"INDEX"` | 	CreatedUnix   int64     `xorm:"INDEX created"` | ||||||
| 	Updated       time.Time `xorm:"-"` | 	Updated       time.Time `xorm:"-"` | ||||||
| 	UpdatedUnix   int64     `xorm:"INDEX"` | 	UpdatedUnix   int64     `xorm:"INDEX updated"` | ||||||
| 	LastLogin     time.Time `xorm:"-"` | 	LastLogin     time.Time `xorm:"-"` | ||||||
| 	LastLoginUnix int64     `xorm:"INDEX"` | 	LastLoginUnix int64     `xorm:"INDEX"` | ||||||
|  |  | ||||||
| @@ -135,18 +135,11 @@ type User struct { | |||||||
| 	DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"` | 	DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"` | ||||||
| } | } | ||||||
|  |  | ||||||
| // BeforeInsert is invoked from XORM before inserting an object of this type. |  | ||||||
| func (u *User) BeforeInsert() { |  | ||||||
| 	u.CreatedUnix = time.Now().Unix() |  | ||||||
| 	u.UpdatedUnix = u.CreatedUnix |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate is invoked from XORM before updating this object. | // BeforeUpdate is invoked from XORM before updating this object. | ||||||
| func (u *User) BeforeUpdate() { | func (u *User) BeforeUpdate() { | ||||||
| 	if u.MaxRepoCreation < -1 { | 	if u.MaxRepoCreation < -1 { | ||||||
| 		u.MaxRepoCreation = -1 | 		u.MaxRepoCreation = -1 | ||||||
| 	} | 	} | ||||||
| 	u.UpdatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // SetLastLogin set time to last login | // SetLastLogin set time to last login | ||||||
| @@ -897,7 +890,6 @@ func UpdateUserCols(u *User, cols ...string) error { | |||||||
| 	u.Website = base.TruncateString(u.Website, 255) | 	u.Website = base.TruncateString(u.Website, 255) | ||||||
| 	u.Description = base.TruncateString(u.Description, 255) | 	u.Description = base.TruncateString(u.Description, 255) | ||||||
|  |  | ||||||
| 	cols = append(cols, "updated_unix") |  | ||||||
| 	_, err := x.Id(u.ID).Cols(cols...).Update(u) | 	_, err := x.Id(u.ID).Cols(cols...).Update(u) | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|   | |||||||
| @@ -107,22 +107,9 @@ type Webhook struct { | |||||||
| 	LastStatus   HookStatus // Last delivery status | 	LastStatus   HookStatus // Last delivery status | ||||||
|  |  | ||||||
| 	Created     time.Time `xorm:"-"` | 	Created     time.Time `xorm:"-"` | ||||||
| 	CreatedUnix int64     `xorm:"INDEX"` | 	CreatedUnix int64     `xorm:"INDEX created"` | ||||||
| 	Updated     time.Time `xorm:"-"` | 	Updated     time.Time `xorm:"-"` | ||||||
| 	UpdatedUnix int64     `xorm:"INDEX"` | 	UpdatedUnix int64     `xorm:"INDEX updated"` | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeInsert will be invoked by XORM before inserting a record |  | ||||||
| // representing this object |  | ||||||
| func (w *Webhook) BeforeInsert() { |  | ||||||
| 	w.CreatedUnix = time.Now().Unix() |  | ||||||
| 	w.UpdatedUnix = w.CreatedUnix |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // BeforeUpdate will be invoked by XORM before updating a record |  | ||||||
| // representing this object |  | ||||||
| func (w *Webhook) BeforeUpdate() { |  | ||||||
| 	w.UpdatedUnix = time.Now().Unix() |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // AfterSet updates the webhook object upon setting a column | // AfterSet updates the webhook object upon setting a column | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								vendor/github.com/go-xorm/core/type.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/go-xorm/core/type.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -100,7 +100,8 @@ var ( | |||||||
| 	LongBlob   = "LONGBLOB" | 	LongBlob   = "LONGBLOB" | ||||||
| 	Bytea      = "BYTEA" | 	Bytea      = "BYTEA" | ||||||
|  |  | ||||||
| 	Bool = "BOOL" | 	Bool    = "BOOL" | ||||||
|  | 	Boolean = "BOOLEAN" | ||||||
|  |  | ||||||
| 	Serial    = "SERIAL" | 	Serial    = "SERIAL" | ||||||
| 	BigSerial = "BIGSERIAL" | 	BigSerial = "BIGSERIAL" | ||||||
| @@ -163,7 +164,7 @@ var ( | |||||||
| 	uintTypes = sort.StringSlice{"*uint", "*uint16", "*uint32", "*uint8"} | 	uintTypes = sort.StringSlice{"*uint", "*uint16", "*uint32", "*uint8"} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // !nashtsai! treat following var as interal const values, these are used for reflect.TypeOf comparision | // !nashtsai! treat following var as interal const values, these are used for reflect.TypeOf comparison | ||||||
| var ( | var ( | ||||||
| 	c_EMPTY_STRING       string | 	c_EMPTY_STRING       string | ||||||
| 	c_BOOL_DEFAULT       bool | 	c_BOOL_DEFAULT       bool | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -34,7 +34,7 @@ Drivers for Go's sql package which currently support database/sql includes: | |||||||
|  |  | ||||||
| * Mysql: [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) | * Mysql: [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) | ||||||
|  |  | ||||||
| * MyMysql: [github.com/ziutek/mymysql/godrv](https://github.com/ziutek/mymysql/godrv) | * MyMysql: [github.com/ziutek/mymysql/godrv](https://github.com/ziutek/mymysql/tree/master/godrv) | ||||||
|  |  | ||||||
| * Postgres: [github.com/lib/pq](https://github.com/lib/pq) | * Postgres: [github.com/lib/pq](https://github.com/lib/pq) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								vendor/github.com/go-xorm/xorm/cache_lru.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/go-xorm/xorm/cache_lru.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -15,13 +15,12 @@ import ( | |||||||
|  |  | ||||||
| // LRUCacher implments cache object facilities | // LRUCacher implments cache object facilities | ||||||
| type LRUCacher struct { | type LRUCacher struct { | ||||||
| 	idList   *list.List | 	idList         *list.List | ||||||
| 	sqlList  *list.List | 	sqlList        *list.List | ||||||
| 	idIndex  map[string]map[string]*list.Element | 	idIndex        map[string]map[string]*list.Element | ||||||
| 	sqlIndex map[string]map[string]*list.Element | 	sqlIndex       map[string]map[string]*list.Element | ||||||
| 	store    core.CacheStore | 	store          core.CacheStore | ||||||
| 	mutex    sync.Mutex | 	mutex          sync.Mutex | ||||||
| 	// maxSize    int |  | ||||||
| 	MaxElementSize int | 	MaxElementSize int | ||||||
| 	Expired        time.Duration | 	Expired        time.Duration | ||||||
| 	GcInterval     time.Duration | 	GcInterval     time.Duration | ||||||
| @@ -54,8 +53,6 @@ func (m *LRUCacher) RunGC() { | |||||||
|  |  | ||||||
| // GC check ids lit and sql list to remove all element expired | // GC check ids lit and sql list to remove all element expired | ||||||
| func (m *LRUCacher) GC() { | func (m *LRUCacher) GC() { | ||||||
| 	//fmt.Println("begin gc ...") |  | ||||||
| 	//defer fmt.Println("end gc ...") |  | ||||||
| 	m.mutex.Lock() | 	m.mutex.Lock() | ||||||
| 	defer m.mutex.Unlock() | 	defer m.mutex.Unlock() | ||||||
| 	var removedNum int | 	var removedNum int | ||||||
| @@ -64,12 +61,10 @@ func (m *LRUCacher) GC() { | |||||||
| 			time.Now().Sub(e.Value.(*idNode).lastVisit) > m.Expired { | 			time.Now().Sub(e.Value.(*idNode).lastVisit) > m.Expired { | ||||||
| 			removedNum++ | 			removedNum++ | ||||||
| 			next := e.Next() | 			next := e.Next() | ||||||
| 			//fmt.Println("removing ...", e.Value) |  | ||||||
| 			node := e.Value.(*idNode) | 			node := e.Value.(*idNode) | ||||||
| 			m.delBean(node.tbName, node.id) | 			m.delBean(node.tbName, node.id) | ||||||
| 			e = next | 			e = next | ||||||
| 		} else { | 		} else { | ||||||
| 			//fmt.Printf("removing %d cache nodes ..., left %d\n", removedNum, m.idList.Len()) |  | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -80,12 +75,10 @@ func (m *LRUCacher) GC() { | |||||||
| 			time.Now().Sub(e.Value.(*sqlNode).lastVisit) > m.Expired { | 			time.Now().Sub(e.Value.(*sqlNode).lastVisit) > m.Expired { | ||||||
| 			removedNum++ | 			removedNum++ | ||||||
| 			next := e.Next() | 			next := e.Next() | ||||||
| 			//fmt.Println("removing ...", e.Value) |  | ||||||
| 			node := e.Value.(*sqlNode) | 			node := e.Value.(*sqlNode) | ||||||
| 			m.delIds(node.tbName, node.sql) | 			m.delIds(node.tbName, node.sql) | ||||||
| 			e = next | 			e = next | ||||||
| 		} else { | 		} else { | ||||||
| 			//fmt.Printf("removing %d cache nodes ..., left %d\n", removedNum, m.sqlList.Len()) |  | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -116,7 +109,6 @@ func (m *LRUCacher) GetIds(tableName, sql string) interface{} { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	m.delIds(tableName, sql) | 	m.delIds(tableName, sql) | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -134,7 +126,6 @@ func (m *LRUCacher) GetBean(tableName string, id string) interface{} { | |||||||
| 			// if expired, remove the node and return nil | 			// if expired, remove the node and return nil | ||||||
| 			if time.Now().Sub(lastTime) > m.Expired { | 			if time.Now().Sub(lastTime) > m.Expired { | ||||||
| 				m.delBean(tableName, id) | 				m.delBean(tableName, id) | ||||||
| 				//m.clearIds(tableName) |  | ||||||
| 				return nil | 				return nil | ||||||
| 			} | 			} | ||||||
| 			m.idList.MoveToBack(el) | 			m.idList.MoveToBack(el) | ||||||
| @@ -148,7 +139,6 @@ func (m *LRUCacher) GetBean(tableName string, id string) interface{} { | |||||||
|  |  | ||||||
| 	// store bean is not exist, then remove memory's index | 	// store bean is not exist, then remove memory's index | ||||||
| 	m.delBean(tableName, id) | 	m.delBean(tableName, id) | ||||||
| 	//m.clearIds(tableName) |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -166,8 +156,8 @@ func (m *LRUCacher) clearIds(tableName string) { | |||||||
| // ClearIds clears all sql-ids mapping on table tableName from cache | // ClearIds clears all sql-ids mapping on table tableName from cache | ||||||
| func (m *LRUCacher) ClearIds(tableName string) { | func (m *LRUCacher) ClearIds(tableName string) { | ||||||
| 	m.mutex.Lock() | 	m.mutex.Lock() | ||||||
| 	defer m.mutex.Unlock() |  | ||||||
| 	m.clearIds(tableName) | 	m.clearIds(tableName) | ||||||
|  | 	m.mutex.Unlock() | ||||||
| } | } | ||||||
|  |  | ||||||
| func (m *LRUCacher) clearBeans(tableName string) { | func (m *LRUCacher) clearBeans(tableName string) { | ||||||
| @@ -184,14 +174,13 @@ func (m *LRUCacher) clearBeans(tableName string) { | |||||||
| // ClearBeans clears all beans in some table | // ClearBeans clears all beans in some table | ||||||
| func (m *LRUCacher) ClearBeans(tableName string) { | func (m *LRUCacher) ClearBeans(tableName string) { | ||||||
| 	m.mutex.Lock() | 	m.mutex.Lock() | ||||||
| 	defer m.mutex.Unlock() |  | ||||||
| 	m.clearBeans(tableName) | 	m.clearBeans(tableName) | ||||||
|  | 	m.mutex.Unlock() | ||||||
| } | } | ||||||
|  |  | ||||||
| // PutIds pus ids into table | // PutIds pus ids into table | ||||||
| func (m *LRUCacher) PutIds(tableName, sql string, ids interface{}) { | func (m *LRUCacher) PutIds(tableName, sql string, ids interface{}) { | ||||||
| 	m.mutex.Lock() | 	m.mutex.Lock() | ||||||
| 	defer m.mutex.Unlock() |  | ||||||
| 	if _, ok := m.sqlIndex[tableName]; !ok { | 	if _, ok := m.sqlIndex[tableName]; !ok { | ||||||
| 		m.sqlIndex[tableName] = make(map[string]*list.Element) | 		m.sqlIndex[tableName] = make(map[string]*list.Element) | ||||||
| 	} | 	} | ||||||
| @@ -207,12 +196,12 @@ func (m *LRUCacher) PutIds(tableName, sql string, ids interface{}) { | |||||||
| 		node := e.Value.(*sqlNode) | 		node := e.Value.(*sqlNode) | ||||||
| 		m.delIds(node.tbName, node.sql) | 		m.delIds(node.tbName, node.sql) | ||||||
| 	} | 	} | ||||||
|  | 	m.mutex.Unlock() | ||||||
| } | } | ||||||
|  |  | ||||||
| // PutBean puts beans into table | // PutBean puts beans into table | ||||||
| func (m *LRUCacher) PutBean(tableName string, id string, obj interface{}) { | func (m *LRUCacher) PutBean(tableName string, id string, obj interface{}) { | ||||||
| 	m.mutex.Lock() | 	m.mutex.Lock() | ||||||
| 	defer m.mutex.Unlock() |  | ||||||
| 	var el *list.Element | 	var el *list.Element | ||||||
| 	var ok bool | 	var ok bool | ||||||
|  |  | ||||||
| @@ -229,6 +218,7 @@ func (m *LRUCacher) PutBean(tableName string, id string, obj interface{}) { | |||||||
| 		node := e.Value.(*idNode) | 		node := e.Value.(*idNode) | ||||||
| 		m.delBean(node.tbName, node.id) | 		m.delBean(node.tbName, node.id) | ||||||
| 	} | 	} | ||||||
|  | 	m.mutex.Unlock() | ||||||
| } | } | ||||||
|  |  | ||||||
| func (m *LRUCacher) delIds(tableName, sql string) { | func (m *LRUCacher) delIds(tableName, sql string) { | ||||||
| @@ -244,8 +234,8 @@ func (m *LRUCacher) delIds(tableName, sql string) { | |||||||
| // DelIds deletes ids | // DelIds deletes ids | ||||||
| func (m *LRUCacher) DelIds(tableName, sql string) { | func (m *LRUCacher) DelIds(tableName, sql string) { | ||||||
| 	m.mutex.Lock() | 	m.mutex.Lock() | ||||||
| 	defer m.mutex.Unlock() |  | ||||||
| 	m.delIds(tableName, sql) | 	m.delIds(tableName, sql) | ||||||
|  | 	m.mutex.Unlock() | ||||||
| } | } | ||||||
|  |  | ||||||
| func (m *LRUCacher) delBean(tableName string, id string) { | func (m *LRUCacher) delBean(tableName string, id string) { | ||||||
| @@ -261,8 +251,8 @@ func (m *LRUCacher) delBean(tableName string, id string) { | |||||||
| // DelBean deletes beans in some table | // DelBean deletes beans in some table | ||||||
| func (m *LRUCacher) DelBean(tableName string, id string) { | func (m *LRUCacher) DelBean(tableName string, id string) { | ||||||
| 	m.mutex.Lock() | 	m.mutex.Lock() | ||||||
| 	defer m.mutex.Unlock() |  | ||||||
| 	m.delBean(tableName, id) | 	m.delBean(tableName, id) | ||||||
|  | 	m.mutex.Unlock() | ||||||
| } | } | ||||||
|  |  | ||||||
| type idNode struct { | type idNode struct { | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								vendor/github.com/go-xorm/xorm/circle.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/go-xorm/xorm/circle.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -21,7 +21,16 @@ database: | |||||||
| test: | test: | ||||||
|   override: |   override: | ||||||
|     # './...' is a relative pattern which means all subdirectories |     # './...' is a relative pattern which means all subdirectories | ||||||
|     - go test -v -race -db="sqlite3::mysql::mymysql::postgres" -conn_str="./test.db::root:@/xorm_test::xorm_test/root/::dbname=xorm_test sslmode=disable" -coverprofile=coverage.txt -covermode=atomic |     - go get -u github.com/wadey/gocovmerge; | ||||||
|  |     - go test -v -race -db="sqlite3" -conn_str="./test.db" -coverprofile=coverage1-1.txt -covermode=atomic | ||||||
|  |     - go test -v -race -db="sqlite3" -conn_str="./test.db" -cache=true -coverprofile=coverage1-2.txt -covermode=atomic | ||||||
|  |     - go test -v -race -db="mysql" -conn_str="root:@/xorm_test" -coverprofile=coverage2-1.txt -covermode=atomic | ||||||
|  |     - go test -v -race -db="mysql" -conn_str="root:@/xorm_test" -cache=true -coverprofile=coverage2-2.txt -covermode=atomic | ||||||
|  |     - go test -v -race -db="mymysql" -conn_str="xorm_test/root/" -coverprofile=coverage3-1.txt -covermode=atomic | ||||||
|  |     - go test -v -race -db="mymysql" -conn_str="xorm_test/root/" -cache=true -coverprofile=coverage3-2.txt -covermode=atomic | ||||||
|  |     - go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -coverprofile=coverage4-1.txt -covermode=atomic | ||||||
|  |     - go test -v -race -db="postgres" -conn_str="dbname=xorm_test sslmode=disable" -cache=true -coverprofile=coverage4-2.txt -covermode=atomic | ||||||
|  |     - gocovmerge coverage1-1.txt coverage1-2.txt coverage2-1.txt coverage2-2.txt coverage3-1.txt coverage3-2.txt coverage4-1.txt coverage4-2.txt > coverage.txt | ||||||
|     - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./sqlite3.sh |     - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./sqlite3.sh | ||||||
|     - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./mysql.sh |     - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./mysql.sh | ||||||
|     - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./postgres.sh |     - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./postgres.sh | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								vendor/github.com/go-xorm/xorm/convert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/go-xorm/xorm/convert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -334,3 +334,15 @@ func convertInt(v interface{}) (int64, error) { | |||||||
| 	} | 	} | ||||||
| 	return 0, fmt.Errorf("unsupported type: %v", v) | 	return 0, fmt.Errorf("unsupported type: %v", v) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func asBool(bs []byte) (bool, error) { | ||||||
|  | 	if len(bs) == 0 { | ||||||
|  | 		return false, nil | ||||||
|  | 	} | ||||||
|  | 	if bs[0] == 0x00 { | ||||||
|  | 		return false, nil | ||||||
|  | 	} else if bs[0] == 0x01 { | ||||||
|  | 		return true, nil | ||||||
|  | 	} | ||||||
|  | 	return strconv.ParseBool(string(bs)) | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/go-xorm/xorm/dialect_postgres.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/go-xorm/xorm/dialect_postgres.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -781,6 +781,9 @@ func (db *postgres) SqlType(c *core.Column) string { | |||||||
| 	case core.TinyInt: | 	case core.TinyInt: | ||||||
| 		res = core.SmallInt | 		res = core.SmallInt | ||||||
| 		return res | 		return res | ||||||
|  | 	case core.Bit: | ||||||
|  | 		res = core.Boolean | ||||||
|  | 		return res | ||||||
| 	case core.MediumInt, core.Int, core.Integer: | 	case core.MediumInt, core.Int, core.Integer: | ||||||
| 		if c.IsAutoIncrement { | 		if c.IsAutoIncrement { | ||||||
| 			return core.Serial | 			return core.Serial | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -90,7 +90,7 @@ another is Rows | |||||||
|  |  | ||||||
| 5. Update one or more records | 5. Update one or more records | ||||||
|  |  | ||||||
|     affected, err := engine.Id(...).Update(&user) |     affected, err := engine.ID(...).Update(&user) | ||||||
|     // UPDATE user SET ... |     // UPDATE user SET ... | ||||||
|  |  | ||||||
| 6. Delete one or more records, Delete MUST has condition | 6. Delete one or more records, Delete MUST has condition | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								vendor/github.com/go-xorm/xorm/engine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/go-xorm/xorm/engine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -273,36 +273,6 @@ func (engine *Engine) logSQL(sqlStr string, sqlArgs ...interface{}) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (engine *Engine) logSQLQueryTime(sqlStr string, args []interface{}, executionBlock func() (*core.Stmt, *core.Rows, error)) (*core.Stmt, *core.Rows, error) { |  | ||||||
| 	if engine.showSQL && engine.showExecTime { |  | ||||||
| 		b4ExecTime := time.Now() |  | ||||||
| 		stmt, res, err := executionBlock() |  | ||||||
| 		execDuration := time.Since(b4ExecTime) |  | ||||||
| 		if len(args) > 0 { |  | ||||||
| 			engine.logger.Infof("[SQL] %s %v - took: %v", sqlStr, args, execDuration) |  | ||||||
| 		} else { |  | ||||||
| 			engine.logger.Infof("[SQL] %s - took: %v", sqlStr, execDuration) |  | ||||||
| 		} |  | ||||||
| 		return stmt, res, err |  | ||||||
| 	} |  | ||||||
| 	return executionBlock() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (engine *Engine) logSQLExecutionTime(sqlStr string, args []interface{}, executionBlock func() (sql.Result, error)) (sql.Result, error) { |  | ||||||
| 	if engine.showSQL && engine.showExecTime { |  | ||||||
| 		b4ExecTime := time.Now() |  | ||||||
| 		res, err := executionBlock() |  | ||||||
| 		execDuration := time.Since(b4ExecTime) |  | ||||||
| 		if len(args) > 0 { |  | ||||||
| 			engine.logger.Infof("[sql] %s [args] %v - took: %v", sqlStr, args, execDuration) |  | ||||||
| 		} else { |  | ||||||
| 			engine.logger.Infof("[sql] %s - took: %v", sqlStr, execDuration) |  | ||||||
| 		} |  | ||||||
| 		return res, err |  | ||||||
| 	} |  | ||||||
| 	return executionBlock() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sql provides raw sql input parameter. When you have a complex SQL statement | // Sql provides raw sql input parameter. When you have a complex SQL statement | ||||||
| // and cannot use Where, Id, In and etc. Methods to describe, you can use SQL. | // and cannot use Where, Id, In and etc. Methods to describe, you can use SQL. | ||||||
| // | // | ||||||
| @@ -1384,6 +1354,13 @@ func (engine *Engine) QueryString(sqlStr string, args ...interface{}) ([]map[str | |||||||
| 	return session.QueryString(sqlStr, args...) | 	return session.QueryString(sqlStr, args...) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // QueryInterface runs a raw sql and return records as []map[string]interface{} | ||||||
|  | func (engine *Engine) QueryInterface(sqlStr string, args ...interface{}) ([]map[string]interface{}, error) { | ||||||
|  | 	session := engine.NewSession() | ||||||
|  | 	defer session.Close() | ||||||
|  | 	return session.QueryInterface(sqlStr, args...) | ||||||
|  | } | ||||||
|  |  | ||||||
| // Insert one or more records | // Insert one or more records | ||||||
| func (engine *Engine) Insert(beans ...interface{}) (int64, error) { | func (engine *Engine) Insert(beans ...interface{}) (int64, error) { | ||||||
| 	session := engine.NewSession() | 	session := engine.NewSession() | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								vendor/github.com/go-xorm/xorm/rows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/go-xorm/xorm/rows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -17,7 +17,6 @@ type Rows struct { | |||||||
| 	NoTypeCheck bool | 	NoTypeCheck bool | ||||||
|  |  | ||||||
| 	session   *Session | 	session   *Session | ||||||
| 	stmt      *core.Stmt |  | ||||||
| 	rows      *core.Rows | 	rows      *core.Rows | ||||||
| 	fields    []string | 	fields    []string | ||||||
| 	beanType  reflect.Type | 	beanType  reflect.Type | ||||||
| @@ -29,8 +28,6 @@ func newRows(session *Session, bean interface{}) (*Rows, error) { | |||||||
| 	rows.session = session | 	rows.session = session | ||||||
| 	rows.beanType = reflect.Indirect(reflect.ValueOf(bean)).Type() | 	rows.beanType = reflect.Indirect(reflect.ValueOf(bean)).Type() | ||||||
|  |  | ||||||
| 	defer rows.session.resetStatement() |  | ||||||
|  |  | ||||||
| 	var sqlStr string | 	var sqlStr string | ||||||
| 	var args []interface{} | 	var args []interface{} | ||||||
| 	var err error | 	var err error | ||||||
| @@ -53,32 +50,11 @@ func newRows(session *Session, bean interface{}) (*Rows, error) { | |||||||
| 		args = rows.session.statement.RawParams | 		args = rows.session.statement.RawParams | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for _, filter := range rows.session.engine.dialect.Filters() { | 	rows.rows, err = rows.session.queryRows(sqlStr, args...) | ||||||
| 		sqlStr = filter.Do(sqlStr, session.engine.dialect, rows.session.statement.RefTable) | 	if err != nil { | ||||||
| 	} | 		rows.lastError = err | ||||||
|  | 		rows.Close() | ||||||
| 	rows.session.saveLastSQL(sqlStr, args...) | 		return nil, err | ||||||
| 	if rows.session.prepareStmt { |  | ||||||
| 		rows.stmt, err = rows.session.DB().Prepare(sqlStr) |  | ||||||
| 		if err != nil { |  | ||||||
| 			rows.lastError = err |  | ||||||
| 			rows.Close() |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		rows.rows, err = rows.stmt.Query(args...) |  | ||||||
| 		if err != nil { |  | ||||||
| 			rows.lastError = err |  | ||||||
| 			rows.Close() |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 	} else { |  | ||||||
| 		rows.rows, err = rows.session.DB().Query(sqlStr, args...) |  | ||||||
| 		if err != nil { |  | ||||||
| 			rows.lastError = err |  | ||||||
| 			rows.Close() |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	rows.fields, err = rows.rows.Columns() | 	rows.fields, err = rows.rows.Columns() | ||||||
| @@ -142,17 +118,10 @@ func (rows *Rows) Close() error { | |||||||
| 		if rows.rows != nil { | 		if rows.rows != nil { | ||||||
| 			rows.lastError = rows.rows.Close() | 			rows.lastError = rows.rows.Close() | ||||||
| 			if rows.lastError != nil { | 			if rows.lastError != nil { | ||||||
| 				defer rows.stmt.Close() |  | ||||||
| 				return rows.lastError | 				return rows.lastError | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if rows.stmt != nil { |  | ||||||
| 			rows.lastError = rows.stmt.Close() |  | ||||||
| 		} |  | ||||||
| 	} else { | 	} else { | ||||||
| 		if rows.stmt != nil { |  | ||||||
| 			defer rows.stmt.Close() |  | ||||||
| 		} |  | ||||||
| 		if rows.rows != nil { | 		if rows.rows != nil { | ||||||
| 			defer rows.rows.Close() | 			defer rows.rows.Close() | ||||||
| 		} | 		} | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								vendor/github.com/go-xorm/xorm/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/go-xorm/xorm/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -303,6 +303,7 @@ func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount | |||||||
| 		var newValue = newElemFunc(fields) | 		var newValue = newElemFunc(fields) | ||||||
| 		bean := newValue.Interface() | 		bean := newValue.Interface() | ||||||
| 		dataStruct := rValue(bean) | 		dataStruct := rValue(bean) | ||||||
|  |  | ||||||
| 		// handle beforeClosures | 		// handle beforeClosures | ||||||
| 		scanResults, err := session.row2Slice(rows, fields, fieldsCount, bean) | 		scanResults, err := session.row2Slice(rows, fields, fieldsCount, bean) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @@ -312,7 +313,6 @@ func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		err = sliceValueSetFunc(&newValue, pk) | 		err = sliceValueSetFunc(&newValue, pk) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| @@ -631,9 +631,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, f | |||||||
| 						// however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne | 						// however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne | ||||||
| 						// property to be fetched lazily | 						// property to be fetched lazily | ||||||
| 						structInter := reflect.New(fieldValue.Type()) | 						structInter := reflect.New(fieldValue.Type()) | ||||||
| 						newsession := session.engine.NewSession() | 						has, err := session.ID(pk).NoCascade().get(structInter.Interface()) | ||||||
| 						defer newsession.Close() |  | ||||||
| 						has, err := newsession.ID(pk).NoCascade().Get(structInter.Interface()) |  | ||||||
| 						if err != nil { | 						if err != nil { | ||||||
| 							return nil, err | 							return nil, err | ||||||
| 						} | 						} | ||||||
| @@ -777,14 +775,6 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, f | |||||||
| 	return pk, nil | 	return pk, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) queryPreprocess(sqlStr *string, paramStr ...interface{}) { |  | ||||||
| 	for _, filter := range session.engine.dialect.Filters() { |  | ||||||
| 		*sqlStr = filter.Do(*sqlStr, session.engine.dialect, session.statement.RefTable) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	session.saveLastSQL(*sqlStr, paramStr...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // saveLastSQL stores executed query information | // saveLastSQL stores executed query information | ||||||
| func (session *Session) saveLastSQL(sql string, args ...interface{}) { | func (session *Session) saveLastSQL(sql string, args ...interface{}) { | ||||||
| 	session.lastSQL = sql | 	session.lastSQL = sql | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								vendor/github.com/go-xorm/xorm/session_convert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/go-xorm/xorm/session_convert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -144,8 +144,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, | |||||||
| 	case reflect.String: | 	case reflect.String: | ||||||
| 		fieldValue.SetString(string(data)) | 		fieldValue.SetString(string(data)) | ||||||
| 	case reflect.Bool: | 	case reflect.Bool: | ||||||
| 		d := string(data) | 		v, err := asBool(data) | ||||||
| 		v, err := strconv.ParseBool(d) |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return fmt.Errorf("arg %v as bool: %s", key, err.Error()) | 			return fmt.Errorf("arg %v as bool: %s", key, err.Error()) | ||||||
| 		} | 		} | ||||||
| @@ -227,9 +226,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, | |||||||
| 					// however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne | 					// however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne | ||||||
| 					// property to be fetched lazily | 					// property to be fetched lazily | ||||||
| 					structInter := reflect.New(fieldValue.Type()) | 					structInter := reflect.New(fieldValue.Type()) | ||||||
| 					newsession := session.engine.NewSession() | 					has, err := session.ID(pk).NoCascade().get(structInter.Interface()) | ||||||
| 					defer newsession.Close() |  | ||||||
| 					has, err := newsession.Id(pk).NoCascade().Get(structInter.Interface()) |  | ||||||
| 					if err != nil { | 					if err != nil { | ||||||
| 						return err | 						return err | ||||||
| 					} | 					} | ||||||
| @@ -510,9 +507,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value, | |||||||
| 						// !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch | 						// !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch | ||||||
| 						// however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne | 						// however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne | ||||||
| 						// property to be fetched lazily | 						// property to be fetched lazily | ||||||
| 						newsession := session.engine.NewSession() | 						has, err := session.ID(pk).NoCascade().get(structInter.Interface()) | ||||||
| 						defer newsession.Close() |  | ||||||
| 						has, err := newsession.Id(pk).NoCascade().Get(structInter.Interface()) |  | ||||||
| 						if err != nil { | 						if err != nil { | ||||||
| 							return err | 							return err | ||||||
| 						} | 						} | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								vendor/github.com/go-xorm/xorm/session_delete.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/go-xorm/xorm/session_delete.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -12,14 +12,14 @@ import ( | |||||||
| 	"github.com/go-xorm/core" | 	"github.com/go-xorm/core" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func (session *Session) cacheDelete(sqlStr string, args ...interface{}) error { | func (session *Session) cacheDelete(table *core.Table, tableName, sqlStr string, args ...interface{}) error { | ||||||
| 	if session.statement.RefTable == nil || | 	if table == nil || | ||||||
| 		session.tx != nil { | 		session.tx != nil { | ||||||
| 		return ErrCacheFailed | 		return ErrCacheFailed | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for _, filter := range session.engine.dialect.Filters() { | 	for _, filter := range session.engine.dialect.Filters() { | ||||||
| 		sqlStr = filter.Do(sqlStr, session.engine.dialect, session.statement.RefTable) | 		sqlStr = filter.Do(sqlStr, session.engine.dialect, table) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	newsql := session.statement.convertIDSQL(sqlStr) | 	newsql := session.statement.convertIDSQL(sqlStr) | ||||||
| @@ -27,11 +27,11 @@ func (session *Session) cacheDelete(sqlStr string, args ...interface{}) error { | |||||||
| 		return ErrCacheFailed | 		return ErrCacheFailed | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cacher := session.engine.getCacher2(session.statement.RefTable) | 	cacher := session.engine.getCacher2(table) | ||||||
| 	tableName := session.statement.TableName() | 	pkColumns := table.PKColumns() | ||||||
| 	ids, err := core.GetCacheSql(cacher, tableName, newsql, args) | 	ids, err := core.GetCacheSql(cacher, tableName, newsql, args) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		resultsSlice, err := session.query(newsql, args...) | 		resultsSlice, err := session.queryBytes(newsql, args...) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| @@ -40,7 +40,7 @@ func (session *Session) cacheDelete(sqlStr string, args ...interface{}) error { | |||||||
| 			for _, data := range resultsSlice { | 			for _, data := range resultsSlice { | ||||||
| 				var id int64 | 				var id int64 | ||||||
| 				var pk core.PK = make([]interface{}, 0) | 				var pk core.PK = make([]interface{}, 0) | ||||||
| 				for _, col := range session.statement.RefTable.PKColumns() { | 				for _, col := range pkColumns { | ||||||
| 					if v, ok := data[col.Name]; !ok { | 					if v, ok := data[col.Name]; !ok { | ||||||
| 						return errors.New("no id") | 						return errors.New("no id") | ||||||
| 					} else if col.SQLType.IsText() { | 					} else if col.SQLType.IsText() { | ||||||
| @@ -58,27 +58,23 @@ func (session *Session) cacheDelete(sqlStr string, args ...interface{}) error { | |||||||
| 				ids = append(ids, pk) | 				ids = append(ids, pk) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} /*else { | 	} | ||||||
| 	    session.engine.LogDebug("delete cache sql %v", newsql) |  | ||||||
| 	    cacher.DelIds(tableName, genSqlKey(newsql, args)) |  | ||||||
| 	}*/ |  | ||||||
|  |  | ||||||
| 	for _, id := range ids { | 	for _, id := range ids { | ||||||
| 		session.engine.logger.Debug("[cacheDelete] delete cache obj", tableName, id) | 		session.engine.logger.Debug("[cacheDelete] delete cache obj:", tableName, id) | ||||||
| 		sid, err := id.ToString() | 		sid, err := id.ToString() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		cacher.DelBean(tableName, sid) | 		cacher.DelBean(tableName, sid) | ||||||
| 	} | 	} | ||||||
| 	session.engine.logger.Debug("[cacheDelete] clear cache sql", tableName) | 	session.engine.logger.Debug("[cacheDelete] clear cache table:", tableName) | ||||||
| 	cacher.ClearIds(tableName) | 	cacher.ClearIds(tableName) | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Delete records, bean's non-empty fields are conditions | // Delete records, bean's non-empty fields are conditions | ||||||
| func (session *Session) Delete(bean interface{}) (int64, error) { | func (session *Session) Delete(bean interface{}) (int64, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
| @@ -86,7 +82,6 @@ func (session *Session) Delete(bean interface{}) (int64, error) { | |||||||
| 	if err := session.statement.setRefValue(rValue(bean)); err != nil { | 	if err := session.statement.setRefValue(rValue(bean)); err != nil { | ||||||
| 		return 0, err | 		return 0, err | ||||||
| 	} | 	} | ||||||
| 	var table = session.statement.RefTable |  | ||||||
|  |  | ||||||
| 	// handle before delete processors | 	// handle before delete processors | ||||||
| 	for _, closure := range session.beforeClosures { | 	for _, closure := range session.beforeClosures { | ||||||
| @@ -106,7 +101,9 @@ func (session *Session) Delete(bean interface{}) (int64, error) { | |||||||
| 		return 0, ErrNeedDeletedCond | 		return 0, ErrNeedDeletedCond | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var tableName = session.engine.Quote(session.statement.TableName()) | 	var tableNameNoQuote = session.statement.TableName() | ||||||
|  | 	var tableName = session.engine.Quote(tableNameNoQuote) | ||||||
|  | 	var table = session.statement.RefTable | ||||||
| 	var deleteSQL string | 	var deleteSQL string | ||||||
| 	if len(condSQL) > 0 { | 	if len(condSQL) > 0 { | ||||||
| 		deleteSQL = fmt.Sprintf("DELETE FROM %v WHERE %v", tableName, condSQL) | 		deleteSQL = fmt.Sprintf("DELETE FROM %v WHERE %v", tableName, condSQL) | ||||||
| @@ -202,10 +199,11 @@ func (session *Session) Delete(bean interface{}) (int64, error) { | |||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if cacher := session.engine.getCacher2(session.statement.RefTable); cacher != nil && session.statement.UseCache { | 	if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | ||||||
| 		session.cacheDelete(deleteSQL, argsForCache...) | 		session.cacheDelete(table, tableNameNoQuote, deleteSQL, argsForCache...) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	session.statement.RefTable = table | ||||||
| 	res, err := session.exec(realSQL, condArgs...) | 	res, err := session.exec(realSQL, condArgs...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return 0, err | 		return 0, err | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								vendor/github.com/go-xorm/xorm/session_exist.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/go-xorm/xorm/session_exist.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -10,12 +10,10 @@ import ( | |||||||
| 	"reflect" | 	"reflect" | ||||||
|  |  | ||||||
| 	"github.com/go-xorm/builder" | 	"github.com/go-xorm/builder" | ||||||
| 	"github.com/go-xorm/core" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Exist returns true if the record exist otherwise return false | // Exist returns true if the record exist otherwise return false | ||||||
| func (session *Session) Exist(bean ...interface{}) (bool, error) { | func (session *Session) Exist(bean ...interface{}) (bool, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
| @@ -69,19 +67,11 @@ func (session *Session) Exist(bean ...interface{}) (bool, error) { | |||||||
| 		args = session.statement.RawParams | 		args = session.statement.RawParams | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	session.queryPreprocess(&sqlStr, args...) | 	rows, err := session.queryRows(sqlStr, args...) | ||||||
|  |  | ||||||
| 	var rawRows *core.Rows |  | ||||||
| 	if session.isAutoCommit { |  | ||||||
| 		_, rawRows, err = session.innerQuery(sqlStr, args...) |  | ||||||
| 	} else { |  | ||||||
| 		rawRows, err = session.tx.Query(sqlStr, args...) |  | ||||||
| 	} |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
|  | 	defer rows.Close() | ||||||
|  |  | ||||||
| 	defer rawRows.Close() | 	return rows.Next(), nil | ||||||
|  |  | ||||||
| 	return rawRows.Next(), nil |  | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										46
									
								
								vendor/github.com/go-xorm/xorm/session_find.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/go-xorm/xorm/session_find.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -23,11 +23,13 @@ const ( | |||||||
| // are conditions. beans could be []Struct, []*Struct, map[int64]Struct | // are conditions. beans could be []Struct, []*Struct, map[int64]Struct | ||||||
| // map[int64]*Struct | // map[int64]*Struct | ||||||
| func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) error { | func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) error { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
|  | 	return session.find(rowsSlicePtr, condiBean...) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) error { | ||||||
| 	sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) | 	sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) | ||||||
| 	if sliceValue.Kind() != reflect.Slice && sliceValue.Kind() != reflect.Map { | 	if sliceValue.Kind() != reflect.Slice && sliceValue.Kind() != reflect.Map { | ||||||
| 		return errors.New("needs a pointer to a slice or a map") | 		return errors.New("needs a pointer to a slice or a map") | ||||||
| @@ -157,21 +159,13 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) | |||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) noCacheFind(table *core.Table, containerValue reflect.Value, sqlStr string, args ...interface{}) error { | func (session *Session) noCacheFind(table *core.Table, containerValue reflect.Value, sqlStr string, args ...interface{}) error { | ||||||
| 	var rawRows *core.Rows | 	rows, err := session.queryRows(sqlStr, args...) | ||||||
| 	var err error |  | ||||||
|  |  | ||||||
| 	session.queryPreprocess(&sqlStr, args...) |  | ||||||
| 	if session.isAutoCommit { |  | ||||||
| 		_, rawRows, err = session.innerQuery(sqlStr, args...) |  | ||||||
| 	} else { |  | ||||||
| 		rawRows, err = session.tx.Query(sqlStr, args...) |  | ||||||
| 	} |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer rawRows.Close() | 	defer rows.Close() | ||||||
|  |  | ||||||
| 	fields, err := rawRows.Columns() | 	fields, err := rows.Columns() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| @@ -245,20 +239,20 @@ func (session *Session) noCacheFind(table *core.Table, containerValue reflect.Va | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		return session.rows2Beans(rawRows, fields, len(fields), tb, newElemFunc, containerValueSetFunc) | 		return session.rows2Beans(rows, fields, len(fields), tb, newElemFunc, containerValueSetFunc) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for rawRows.Next() { | 	for rows.Next() { | ||||||
| 		var newValue = newElemFunc(fields) | 		var newValue = newElemFunc(fields) | ||||||
| 		bean := newValue.Interface() | 		bean := newValue.Interface() | ||||||
|  |  | ||||||
| 		switch elemType.Kind() { | 		switch elemType.Kind() { | ||||||
| 		case reflect.Slice: | 		case reflect.Slice: | ||||||
| 			err = rawRows.ScanSlice(bean) | 			err = rows.ScanSlice(bean) | ||||||
| 		case reflect.Map: | 		case reflect.Map: | ||||||
| 			err = rawRows.ScanMap(bean) | 			err = rows.ScanMap(bean) | ||||||
| 		default: | 		default: | ||||||
| 			err = rawRows.Scan(bean) | 			err = rows.Scan(bean) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @@ -299,12 +293,11 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	tableName := session.statement.TableName() | 	tableName := session.statement.TableName() | ||||||
|  |  | ||||||
| 	table := session.statement.RefTable | 	table := session.statement.RefTable | ||||||
| 	cacher := session.engine.getCacher2(table) | 	cacher := session.engine.getCacher2(table) | ||||||
| 	ids, err := core.GetCacheSql(cacher, tableName, newsql, args) | 	ids, err := core.GetCacheSql(cacher, tableName, newsql, args) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		rows, err := session.DB().Query(newsql, args...) | 		rows, err := session.queryRows(newsql, args...) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| @@ -334,13 +327,13 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in | |||||||
| 			ids = append(ids, pk) | 			ids = append(ids, pk) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		session.engine.logger.Debug("[cacheFind] cache sql:", ids, tableName, newsql, args) | 		session.engine.logger.Debug("[cacheFind] cache sql:", ids, tableName, sqlStr, newsql, args) | ||||||
| 		err = core.PutCacheSql(cacher, ids, tableName, newsql, args) | 		err = core.PutCacheSql(cacher, ids, tableName, newsql, args) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		session.engine.logger.Debug("[cacheFind] cache hit sql:", newsql, args) | 		session.engine.logger.Debug("[cacheFind] cache hit sql:", tableName, sqlStr, newsql, args) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) | 	sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) | ||||||
| @@ -355,7 +348,7 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in | |||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		bean := cacher.GetBean(tableName, sid) | 		bean := cacher.GetBean(tableName, sid) | ||||||
| 		if bean == nil { | 		if bean == nil || reflect.ValueOf(bean).Elem().Type() != t { | ||||||
| 			ides = append(ides, id) | 			ides = append(ides, id) | ||||||
| 			ididxes[sid] = idx | 			ididxes[sid] = idx | ||||||
| 		} else { | 		} else { | ||||||
| @@ -376,9 +369,6 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if len(ides) > 0 { | 	if len(ides) > 0 { | ||||||
| 		newSession := session.engine.NewSession() |  | ||||||
| 		defer newSession.Close() |  | ||||||
|  |  | ||||||
| 		slices := reflect.New(reflect.SliceOf(t)) | 		slices := reflect.New(reflect.SliceOf(t)) | ||||||
| 		beans := slices.Interface() | 		beans := slices.Interface() | ||||||
|  |  | ||||||
| @@ -388,18 +378,18 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in | |||||||
| 				ff = append(ff, ie[0]) | 				ff = append(ff, ie[0]) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			newSession.In("`"+table.PrimaryKeys[0]+"`", ff...) | 			session.In("`"+table.PrimaryKeys[0]+"`", ff...) | ||||||
| 		} else { | 		} else { | ||||||
| 			for _, ie := range ides { | 			for _, ie := range ides { | ||||||
| 				cond := builder.NewCond() | 				cond := builder.NewCond() | ||||||
| 				for i, name := range table.PrimaryKeys { | 				for i, name := range table.PrimaryKeys { | ||||||
| 					cond = cond.And(builder.Eq{"`" + name + "`": ie[i]}) | 					cond = cond.And(builder.Eq{"`" + name + "`": ie[i]}) | ||||||
| 				} | 				} | ||||||
| 				newSession.Or(cond) | 				session.Or(cond) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		err = newSession.NoCache().Find(beans) | 		err = session.NoCache().Table(tableName).find(beans) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								vendor/github.com/go-xorm/xorm/session_get.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/go-xorm/xorm/session_get.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -15,11 +15,13 @@ import ( | |||||||
| // Get retrieve one record from database, bean's non-empty fields | // Get retrieve one record from database, bean's non-empty fields | ||||||
| // will be as conditions | // will be as conditions | ||||||
| func (session *Session) Get(bean interface{}) (bool, error) { | func (session *Session) Get(bean interface{}) (bool, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
|  | 	return session.get(bean) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (session *Session) get(bean interface{}) (bool, error) { | ||||||
| 	beanValue := reflect.ValueOf(bean) | 	beanValue := reflect.ValueOf(bean) | ||||||
| 	if beanValue.Kind() != reflect.Ptr { | 	if beanValue.Kind() != reflect.Ptr { | ||||||
| 		return false, errors.New("needs a pointer to a value") | 		return false, errors.New("needs a pointer to a value") | ||||||
| @@ -51,8 +53,10 @@ func (session *Session) Get(bean interface{}) (bool, error) { | |||||||
| 		args = session.statement.RawParams | 		args = session.statement.RawParams | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	table := session.statement.RefTable | ||||||
|  |  | ||||||
| 	if session.canCache() && beanValue.Elem().Kind() == reflect.Struct { | 	if session.canCache() && beanValue.Elem().Kind() == reflect.Struct { | ||||||
| 		if cacher := session.engine.getCacher2(session.statement.RefTable); cacher != nil && | 		if cacher := session.engine.getCacher2(table); cacher != nil && | ||||||
| 			!session.statement.unscoped { | 			!session.statement.unscoped { | ||||||
| 			has, err := session.cacheGet(bean, sqlStr, args...) | 			has, err := session.cacheGet(bean, sqlStr, args...) | ||||||
| 			if err != ErrCacheFailed { | 			if err != ErrCacheFailed { | ||||||
| @@ -61,54 +65,43 @@ func (session *Session) Get(bean interface{}) (bool, error) { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return session.nocacheGet(beanValue.Elem().Kind(), bean, sqlStr, args...) | 	return session.nocacheGet(beanValue.Elem().Kind(), table, bean, sqlStr, args...) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) nocacheGet(beanKind reflect.Kind, bean interface{}, sqlStr string, args ...interface{}) (bool, error) { | func (session *Session) nocacheGet(beanKind reflect.Kind, table *core.Table, bean interface{}, sqlStr string, args ...interface{}) (bool, error) { | ||||||
| 	session.queryPreprocess(&sqlStr, args...) | 	rows, err := session.queryRows(sqlStr, args...) | ||||||
|  |  | ||||||
| 	var rawRows *core.Rows |  | ||||||
| 	var err error |  | ||||||
| 	if session.isAutoCommit { |  | ||||||
| 		_, rawRows, err = session.innerQuery(sqlStr, args...) |  | ||||||
| 	} else { |  | ||||||
| 		rawRows, err = session.tx.Query(sqlStr, args...) |  | ||||||
| 	} |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
|  | 	defer rows.Close() | ||||||
|  |  | ||||||
| 	defer rawRows.Close() | 	if !rows.Next() { | ||||||
|  |  | ||||||
| 	if !rawRows.Next() { |  | ||||||
| 		return false, nil | 		return false, nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	switch beanKind { | 	switch beanKind { | ||||||
| 	case reflect.Struct: | 	case reflect.Struct: | ||||||
| 		fields, err := rawRows.Columns() | 		fields, err := rows.Columns() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			// WARN: Alougth rawRows return true, but get fields failed | 			// WARN: Alougth rows return true, but get fields failed | ||||||
| 			return true, err | 			return true, err | ||||||
| 		} | 		} | ||||||
| 		dataStruct := rValue(bean) |  | ||||||
| 		if err := session.statement.setRefValue(dataStruct); err != nil { |  | ||||||
| 			return false, err |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		scanResults, err := session.row2Slice(rawRows, fields, len(fields), bean) | 		scanResults, err := session.row2Slice(rows, fields, len(fields), bean) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return false, err | 			return false, err | ||||||
| 		} | 		} | ||||||
| 		rawRows.Close() | 		// close it before covert data | ||||||
|  | 		rows.Close() | ||||||
|  |  | ||||||
| 		_, err = session.slice2Bean(scanResults, fields, len(fields), bean, &dataStruct, session.statement.RefTable) | 		dataStruct := rValue(bean) | ||||||
|  | 		_, err = session.slice2Bean(scanResults, fields, len(fields), bean, &dataStruct, table) | ||||||
| 	case reflect.Slice: | 	case reflect.Slice: | ||||||
| 		err = rawRows.ScanSlice(bean) | 		err = rows.ScanSlice(bean) | ||||||
| 	case reflect.Map: | 	case reflect.Map: | ||||||
| 		err = rawRows.ScanMap(bean) | 		err = rows.ScanMap(bean) | ||||||
| 	default: | 	default: | ||||||
| 		err = rawRows.Scan(bean) | 		err = rows.Scan(bean) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return true, err | 	return true, err | ||||||
| @@ -131,11 +124,11 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf | |||||||
| 	cacher := session.engine.getCacher2(session.statement.RefTable) | 	cacher := session.engine.getCacher2(session.statement.RefTable) | ||||||
| 	tableName := session.statement.TableName() | 	tableName := session.statement.TableName() | ||||||
| 	session.engine.logger.Debug("[cacheGet] find sql:", newsql, args) | 	session.engine.logger.Debug("[cacheGet] find sql:", newsql, args) | ||||||
| 	ids, err := core.GetCacheSql(cacher, tableName, newsql, args) |  | ||||||
| 	table := session.statement.RefTable | 	table := session.statement.RefTable | ||||||
|  | 	ids, err := core.GetCacheSql(cacher, tableName, newsql, args) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		var res = make([]string, len(table.PrimaryKeys)) | 		var res = make([]string, len(table.PrimaryKeys)) | ||||||
| 		rows, err := session.DB().Query(newsql, args...) | 		rows, err := session.NoCache().queryRows(newsql, args...) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return false, err | 			return false, err | ||||||
| 		} | 		} | ||||||
| @@ -172,7 +165,7 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf | |||||||
| 			return false, err | 			return false, err | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		session.engine.logger.Debug("[cacheGet] cache hit sql:", newsql) | 		session.engine.logger.Debug("[cacheGet] cache hit sql:", newsql, ids) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if len(ids) > 0 { | 	if len(ids) > 0 { | ||||||
| @@ -186,7 +179,7 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf | |||||||
| 		cacheBean := cacher.GetBean(tableName, sid) | 		cacheBean := cacher.GetBean(tableName, sid) | ||||||
| 		if cacheBean == nil { | 		if cacheBean == nil { | ||||||
| 			cacheBean = bean | 			cacheBean = bean | ||||||
| 			has, err = session.nocacheGet(reflect.Struct, cacheBean, sqlStr, args...) | 			has, err = session.nocacheGet(reflect.Struct, table, cacheBean, sqlStr, args...) | ||||||
| 			if err != nil || !has { | 			if err != nil || !has { | ||||||
| 				return has, err | 				return has, err | ||||||
| 			} | 			} | ||||||
|   | |||||||
							
								
								
									
										35
									
								
								vendor/github.com/go-xorm/xorm/session_insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/go-xorm/xorm/session_insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -22,7 +22,6 @@ func (session *Session) Insert(beans ...interface{}) (int64, error) { | |||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
| 	defer session.resetStatement() |  | ||||||
|  |  | ||||||
| 	for _, bean := range beans { | 	for _, bean := range beans { | ||||||
| 		sliceValue := reflect.Indirect(reflect.ValueOf(bean)) | 		sliceValue := reflect.Indirect(reflect.ValueOf(bean)) | ||||||
| @@ -214,22 +213,23 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error | |||||||
|  |  | ||||||
| 	var sql = "INSERT INTO %s (%v%v%v) VALUES (%v)" | 	var sql = "INSERT INTO %s (%v%v%v) VALUES (%v)" | ||||||
| 	var statement string | 	var statement string | ||||||
|  | 	var tableName = session.statement.TableName() | ||||||
| 	if session.engine.dialect.DBType() == core.ORACLE { | 	if session.engine.dialect.DBType() == core.ORACLE { | ||||||
| 		sql = "INSERT ALL INTO %s (%v%v%v) VALUES (%v) SELECT 1 FROM DUAL" | 		sql = "INSERT ALL INTO %s (%v%v%v) VALUES (%v) SELECT 1 FROM DUAL" | ||||||
| 		temp := fmt.Sprintf(") INTO %s (%v%v%v) VALUES (", | 		temp := fmt.Sprintf(") INTO %s (%v%v%v) VALUES (", | ||||||
| 			session.engine.Quote(session.statement.TableName()), | 			session.engine.Quote(tableName), | ||||||
| 			session.engine.QuoteStr(), | 			session.engine.QuoteStr(), | ||||||
| 			strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), | 			strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), | ||||||
| 			session.engine.QuoteStr()) | 			session.engine.QuoteStr()) | ||||||
| 		statement = fmt.Sprintf(sql, | 		statement = fmt.Sprintf(sql, | ||||||
| 			session.engine.Quote(session.statement.TableName()), | 			session.engine.Quote(tableName), | ||||||
| 			session.engine.QuoteStr(), | 			session.engine.QuoteStr(), | ||||||
| 			strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), | 			strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), | ||||||
| 			session.engine.QuoteStr(), | 			session.engine.QuoteStr(), | ||||||
| 			strings.Join(colMultiPlaces, temp)) | 			strings.Join(colMultiPlaces, temp)) | ||||||
| 	} else { | 	} else { | ||||||
| 		statement = fmt.Sprintf(sql, | 		statement = fmt.Sprintf(sql, | ||||||
| 			session.engine.Quote(session.statement.TableName()), | 			session.engine.Quote(tableName), | ||||||
| 			session.engine.QuoteStr(), | 			session.engine.QuoteStr(), | ||||||
| 			strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), | 			strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), | ||||||
| 			session.engine.QuoteStr(), | 			session.engine.QuoteStr(), | ||||||
| @@ -241,7 +241,7 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | 	if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | ||||||
| 		session.cacheInsert(session.statement.TableName()) | 		session.cacheInsert(table, tableName) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	lenAfterClosures := len(session.afterClosures) | 	lenAfterClosures := len(session.afterClosures) | ||||||
| @@ -280,7 +280,6 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error | |||||||
|  |  | ||||||
| // InsertMulti insert multiple records | // InsertMulti insert multiple records | ||||||
| func (session *Session) InsertMulti(rowsSlicePtr interface{}) (int64, error) { | func (session *Session) InsertMulti(rowsSlicePtr interface{}) (int64, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
| @@ -349,18 +348,19 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var sqlStr string | 	var sqlStr string | ||||||
|  | 	var tableName = session.statement.TableName() | ||||||
| 	if len(colPlaces) > 0 { | 	if len(colPlaces) > 0 { | ||||||
| 		sqlStr = fmt.Sprintf("INSERT INTO %s (%v%v%v) VALUES (%v)", | 		sqlStr = fmt.Sprintf("INSERT INTO %s (%v%v%v) VALUES (%v)", | ||||||
| 			session.engine.Quote(session.statement.TableName()), | 			session.engine.Quote(tableName), | ||||||
| 			session.engine.QuoteStr(), | 			session.engine.QuoteStr(), | ||||||
| 			strings.Join(colNames, session.engine.Quote(", ")), | 			strings.Join(colNames, session.engine.Quote(", ")), | ||||||
| 			session.engine.QuoteStr(), | 			session.engine.QuoteStr(), | ||||||
| 			colPlaces) | 			colPlaces) | ||||||
| 	} else { | 	} else { | ||||||
| 		if session.engine.dialect.DBType() == core.MYSQL { | 		if session.engine.dialect.DBType() == core.MYSQL { | ||||||
| 			sqlStr = fmt.Sprintf("INSERT INTO %s VALUES ()", session.engine.Quote(session.statement.TableName())) | 			sqlStr = fmt.Sprintf("INSERT INTO %s VALUES ()", session.engine.Quote(tableName)) | ||||||
| 		} else { | 		} else { | ||||||
| 			sqlStr = fmt.Sprintf("INSERT INTO %s DEFAULT VALUES", session.engine.Quote(session.statement.TableName())) | 			sqlStr = fmt.Sprintf("INSERT INTO %s DEFAULT VALUES", session.engine.Quote(tableName)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -395,7 +395,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | |||||||
| 	// for postgres, many of them didn't implement lastInsertId, so we should | 	// for postgres, many of them didn't implement lastInsertId, so we should | ||||||
| 	// implemented it ourself. | 	// implemented it ourself. | ||||||
| 	if session.engine.dialect.DBType() == core.ORACLE && len(table.AutoIncrement) > 0 { | 	if session.engine.dialect.DBType() == core.ORACLE && len(table.AutoIncrement) > 0 { | ||||||
| 		res, err := session.query("select seq_atable.currval from dual", args...) | 		res, err := session.queryBytes("select seq_atable.currval from dual", args...) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return 0, err | 			return 0, err | ||||||
| 		} | 		} | ||||||
| @@ -403,7 +403,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | |||||||
| 		handleAfterInsertProcessorFunc(bean) | 		handleAfterInsertProcessorFunc(bean) | ||||||
|  |  | ||||||
| 		if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | 		if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | ||||||
| 			session.cacheInsert(session.statement.TableName()) | 			session.cacheInsert(table, tableName) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if table.Version != "" && session.statement.checkVersion { | 		if table.Version != "" && session.statement.checkVersion { | ||||||
| @@ -440,7 +440,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | |||||||
| 	} else if session.engine.dialect.DBType() == core.POSTGRES && len(table.AutoIncrement) > 0 { | 	} else if session.engine.dialect.DBType() == core.POSTGRES && len(table.AutoIncrement) > 0 { | ||||||
| 		//assert table.AutoIncrement != "" | 		//assert table.AutoIncrement != "" | ||||||
| 		sqlStr = sqlStr + " RETURNING " + session.engine.Quote(table.AutoIncrement) | 		sqlStr = sqlStr + " RETURNING " + session.engine.Quote(table.AutoIncrement) | ||||||
| 		res, err := session.query(sqlStr, args...) | 		res, err := session.queryBytes(sqlStr, args...) | ||||||
|  |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return 0, err | 			return 0, err | ||||||
| @@ -448,7 +448,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | |||||||
| 		handleAfterInsertProcessorFunc(bean) | 		handleAfterInsertProcessorFunc(bean) | ||||||
|  |  | ||||||
| 		if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | 		if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | ||||||
| 			session.cacheInsert(session.statement.TableName()) | 			session.cacheInsert(table, tableName) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if table.Version != "" && session.statement.checkVersion { | 		if table.Version != "" && session.statement.checkVersion { | ||||||
| @@ -491,7 +491,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | |||||||
| 		defer handleAfterInsertProcessorFunc(bean) | 		defer handleAfterInsertProcessorFunc(bean) | ||||||
|  |  | ||||||
| 		if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | 		if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | ||||||
| 			session.cacheInsert(session.statement.TableName()) | 			session.cacheInsert(table, tableName) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if table.Version != "" && session.statement.checkVersion { | 		if table.Version != "" && session.statement.checkVersion { | ||||||
| @@ -532,7 +532,6 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | |||||||
| // The in parameter bean must a struct or a point to struct. The return | // The in parameter bean must a struct or a point to struct. The return | ||||||
| // parameter is inserted and error | // parameter is inserted and error | ||||||
| func (session *Session) InsertOne(bean interface{}) (int64, error) { | func (session *Session) InsertOne(bean interface{}) (int64, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
| @@ -540,14 +539,12 @@ func (session *Session) InsertOne(bean interface{}) (int64, error) { | |||||||
| 	return session.innerInsert(bean) | 	return session.innerInsert(bean) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) cacheInsert(tables ...string) error { | func (session *Session) cacheInsert(table *core.Table, tables ...string) error { | ||||||
| 	if session.statement.RefTable == nil { | 	if table == nil { | ||||||
| 		return ErrCacheFailed | 		return ErrCacheFailed | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	table := session.statement.RefTable |  | ||||||
| 	cacher := session.engine.getCacher2(table) | 	cacher := session.engine.getCacher2(table) | ||||||
|  |  | ||||||
| 	for _, t := range tables { | 	for _, t := range tables { | ||||||
| 		session.engine.logger.Debug("[cache] clear sql:", t) | 		session.engine.logger.Debug("[cache] clear sql:", t) | ||||||
| 		cacher.ClearIds(t) | 		cacher.ClearIds(t) | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								vendor/github.com/go-xorm/xorm/session_iterate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/go-xorm/xorm/session_iterate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -19,6 +19,10 @@ func (session *Session) Rows(bean interface{}) (*Rows, error) { | |||||||
| // are conditions. beans could be []Struct, []*Struct, map[int64]Struct | // are conditions. beans could be []Struct, []*Struct, map[int64]Struct | ||||||
| // map[int64]*Struct | // map[int64]*Struct | ||||||
| func (session *Session) Iterate(bean interface{}, fun IterFunc) error { | func (session *Session) Iterate(bean interface{}, fun IterFunc) error { | ||||||
|  | 	if session.isAutoClose { | ||||||
|  | 		defer session.Close() | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	rows, err := session.Rows(bean) | 	rows, err := session.Rows(bean) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
|   | |||||||
							
								
								
									
										177
									
								
								vendor/github.com/go-xorm/xorm/session_query.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								vendor/github.com/go-xorm/xorm/session_query.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | |||||||
|  | // Copyright 2017 The Xorm Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
|  | package xorm | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"reflect" | ||||||
|  | 	"strconv" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	"github.com/go-xorm/core" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Query runs a raw sql and return records as []map[string][]byte | ||||||
|  | func (session *Session) Query(sqlStr string, args ...interface{}) ([]map[string][]byte, error) { | ||||||
|  | 	if session.isAutoClose { | ||||||
|  | 		defer session.Close() | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return session.queryBytes(sqlStr, args...) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func value2String(rawValue *reflect.Value) (str string, err error) { | ||||||
|  | 	aa := reflect.TypeOf((*rawValue).Interface()) | ||||||
|  | 	vv := reflect.ValueOf((*rawValue).Interface()) | ||||||
|  | 	switch aa.Kind() { | ||||||
|  | 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||||
|  | 		str = strconv.FormatInt(vv.Int(), 10) | ||||||
|  | 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: | ||||||
|  | 		str = strconv.FormatUint(vv.Uint(), 10) | ||||||
|  | 	case reflect.Float32, reflect.Float64: | ||||||
|  | 		str = strconv.FormatFloat(vv.Float(), 'f', -1, 64) | ||||||
|  | 	case reflect.String: | ||||||
|  | 		str = vv.String() | ||||||
|  | 	case reflect.Array, reflect.Slice: | ||||||
|  | 		switch aa.Elem().Kind() { | ||||||
|  | 		case reflect.Uint8: | ||||||
|  | 			data := rawValue.Interface().([]byte) | ||||||
|  | 			str = string(data) | ||||||
|  | 			if str == "\x00" { | ||||||
|  | 				str = "0" | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
|  | 			err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name()) | ||||||
|  | 		} | ||||||
|  | 	// time type | ||||||
|  | 	case reflect.Struct: | ||||||
|  | 		if aa.ConvertibleTo(core.TimeType) { | ||||||
|  | 			str = vv.Convert(core.TimeType).Interface().(time.Time).Format(time.RFC3339Nano) | ||||||
|  | 		} else { | ||||||
|  | 			err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name()) | ||||||
|  | 		} | ||||||
|  | 	case reflect.Bool: | ||||||
|  | 		str = strconv.FormatBool(vv.Bool()) | ||||||
|  | 	case reflect.Complex128, reflect.Complex64: | ||||||
|  | 		str = fmt.Sprintf("%v", vv.Complex()) | ||||||
|  | 	/* TODO: unsupported types below | ||||||
|  | 	   case reflect.Map: | ||||||
|  | 	   case reflect.Ptr: | ||||||
|  | 	   case reflect.Uintptr: | ||||||
|  | 	   case reflect.UnsafePointer: | ||||||
|  | 	   case reflect.Chan, reflect.Func, reflect.Interface: | ||||||
|  | 	*/ | ||||||
|  | 	default: | ||||||
|  | 		err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name()) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func row2mapStr(rows *core.Rows, fields []string) (resultsMap 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 rows2Strings(rows *core.Rows) (resultsSlice []map[string]string, err error) { | ||||||
|  | 	fields, err := rows.Columns() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	for rows.Next() { | ||||||
|  | 		result, err := row2mapStr(rows, fields) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		resultsSlice = append(resultsSlice, result) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return resultsSlice, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // QueryString runs a raw sql and return records as []map[string]string | ||||||
|  | func (session *Session) QueryString(sqlStr string, args ...interface{}) ([]map[string]string, error) { | ||||||
|  | 	if session.isAutoClose { | ||||||
|  | 		defer session.Close() | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	rows, err := session.queryRows(sqlStr, args...) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer rows.Close() | ||||||
|  |  | ||||||
|  | 	return rows2Strings(rows) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func row2mapInterface(rows *core.Rows, fields []string) (resultsMap map[string]interface{}, err error) { | ||||||
|  | 	resultsMap = make(map[string]interface{}, len(fields)) | ||||||
|  | 	scanResultContainers := make([]interface{}, len(fields)) | ||||||
|  | 	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 { | ||||||
|  | 		resultsMap[key] = reflect.Indirect(reflect.ValueOf(scanResultContainers[ii])).Interface() | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func rows2Interfaces(rows *core.Rows) (resultsSlice []map[string]interface{}, err error) { | ||||||
|  | 	fields, err := rows.Columns() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	for rows.Next() { | ||||||
|  | 		result, err := row2mapInterface(rows, fields) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		resultsSlice = append(resultsSlice, result) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return resultsSlice, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // QueryInterface runs a raw sql and return records as []map[string]interface{} | ||||||
|  | func (session *Session) QueryInterface(sqlStr string, args ...interface{}) ([]map[string]interface{}, error) { | ||||||
|  | 	if session.isAutoClose { | ||||||
|  | 		defer session.Close() | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	rows, err := session.queryRows(sqlStr, args...) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer rows.Close() | ||||||
|  |  | ||||||
|  | 	return rows2Interfaces(rows) | ||||||
|  | } | ||||||
							
								
								
									
										360
									
								
								vendor/github.com/go-xorm/xorm/session_raw.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										360
									
								
								vendor/github.com/go-xorm/xorm/session_raw.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -6,61 +6,113 @@ package xorm | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"database/sql" | 	"database/sql" | ||||||
| 	"fmt" |  | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"strconv" |  | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/go-xorm/core" | 	"github.com/go-xorm/core" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func (session *Session) query(sqlStr string, paramStr ...interface{}) ([]map[string][]byte, error) { | func (session *Session) queryPreprocess(sqlStr *string, paramStr ...interface{}) { | ||||||
| 	session.queryPreprocess(&sqlStr, paramStr...) | 	for _, filter := range session.engine.dialect.Filters() { | ||||||
|  | 		*sqlStr = filter.Do(*sqlStr, session.engine.dialect, session.statement.RefTable) | ||||||
| 	if session.isAutoCommit { |  | ||||||
| 		return session.innerQuery2(sqlStr, paramStr...) |  | ||||||
| 	} | 	} | ||||||
| 	return session.txQuery(session.tx, sqlStr, paramStr...) |  | ||||||
|  | 	session.lastSQL = *sqlStr | ||||||
|  | 	session.lastSQLArgs = paramStr | ||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) txQuery(tx *core.Tx, sqlStr string, params ...interface{}) ([]map[string][]byte, error) { | func (session *Session) queryRows(sqlStr string, args ...interface{}) (*core.Rows, error) { | ||||||
| 	rows, err := tx.Query(sqlStr, params...) | 	defer session.resetStatement() | ||||||
|  |  | ||||||
|  | 	session.queryPreprocess(&sqlStr, args...) | ||||||
|  |  | ||||||
|  | 	if session.engine.showSQL { | ||||||
|  | 		if session.engine.showExecTime { | ||||||
|  | 			b4ExecTime := time.Now() | ||||||
|  | 			defer func() { | ||||||
|  | 				execDuration := time.Since(b4ExecTime) | ||||||
|  | 				if len(args) > 0 { | ||||||
|  | 					session.engine.logger.Infof("[SQL] %s %#v - took: %v", sqlStr, args, execDuration) | ||||||
|  | 				} else { | ||||||
|  | 					session.engine.logger.Infof("[SQL] %s - took: %v", sqlStr, execDuration) | ||||||
|  | 				} | ||||||
|  | 			}() | ||||||
|  | 		} else { | ||||||
|  | 			if len(args) > 0 { | ||||||
|  | 				session.engine.logger.Infof("[SQL] %v %#v", sqlStr, args) | ||||||
|  | 			} else { | ||||||
|  | 				session.engine.logger.Infof("[SQL] %v", sqlStr) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if session.isAutoCommit { | ||||||
|  | 		if session.prepareStmt { | ||||||
|  | 			// don't clear stmt since session will cache them | ||||||
|  | 			stmt, err := session.doPrepare(sqlStr) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return nil, err | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			rows, err := stmt.Query(args...) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return nil, err | ||||||
|  | 			} | ||||||
|  | 			return rows, nil | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		rows, err := session.DB().Query(sqlStr, args...) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		return rows, nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	rows, err := session.tx.Query(sqlStr, args...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer rows.Close() | 	return rows, nil | ||||||
|  |  | ||||||
| 	return rows2maps(rows) |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) innerQuery(sqlStr string, params ...interface{}) (*core.Stmt, *core.Rows, error) { | func (session *Session) queryRow(sqlStr string, args ...interface{}) *core.Row { | ||||||
| 	var callback func() (*core.Stmt, *core.Rows, error) | 	return core.NewRow(session.queryRows(sqlStr, args...)) | ||||||
| 	if session.prepareStmt { | } | ||||||
| 		callback = func() (*core.Stmt, *core.Rows, error) { |  | ||||||
| 			stmt, err := session.doPrepare(sqlStr) | func value2Bytes(rawValue *reflect.Value) ([]byte, error) { | ||||||
| 			if err != nil { | 	str, err := value2String(rawValue) | ||||||
| 				return nil, nil, err |  | ||||||
| 			} |  | ||||||
| 			rows, err := stmt.Query(params...) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, nil, err |  | ||||||
| 			} |  | ||||||
| 			return stmt, rows, nil |  | ||||||
| 		} |  | ||||||
| 	} else { |  | ||||||
| 		callback = func() (*core.Stmt, *core.Rows, error) { |  | ||||||
| 			rows, err := session.DB().Query(sqlStr, params...) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, nil, err |  | ||||||
| 			} |  | ||||||
| 			return nil, rows, err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	stmt, rows, err := session.engine.logSQLQueryTime(sqlStr, params, callback) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return stmt, rows, nil | 	return []byte(str), nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func row2map(rows *core.Rows, fields []string) (resultsMap 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) { | func rows2maps(rows *core.Rows) (resultsSlice []map[string][]byte, err error) { | ||||||
| @@ -79,197 +131,45 @@ func rows2maps(rows *core.Rows) (resultsSlice []map[string][]byte, err error) { | |||||||
| 	return resultsSlice, nil | 	return resultsSlice, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func value2Bytes(rawValue *reflect.Value) (data []byte, err error) { | func (session *Session) queryBytes(sqlStr string, args ...interface{}) ([]map[string][]byte, error) { | ||||||
| 	var str string | 	rows, err := session.queryRows(sqlStr, args...) | ||||||
| 	str, err = reflect2value(rawValue) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	data = []byte(str) |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func row2map(rows *core.Rows, fields []string) (resultsMap 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 { |  | ||||||
| 			//fmt.Println("ignore ...", key, rawValue) |  | ||||||
| 			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 (session *Session) innerQuery2(sqlStr string, params ...interface{}) ([]map[string][]byte, error) { |  | ||||||
| 	_, rows, err := session.innerQuery(sqlStr, params...) |  | ||||||
| 	if rows != nil { |  | ||||||
| 		defer rows.Close() |  | ||||||
| 	} |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	defer rows.Close() | ||||||
|  |  | ||||||
| 	return rows2maps(rows) | 	return rows2maps(rows) | ||||||
| } | } | ||||||
|  |  | ||||||
| // Query runs a raw sql and return records as []map[string][]byte | func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, error) { | ||||||
| func (session *Session) Query(sqlStr string, paramStr ...interface{}) ([]map[string][]byte, error) { |  | ||||||
| 	defer session.resetStatement() | 	defer session.resetStatement() | ||||||
| 	if session.isAutoClose { |  | ||||||
| 		defer session.Close() |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return session.query(sqlStr, paramStr...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func rows2Strings(rows *core.Rows) (resultsSlice []map[string]string, err error) { |  | ||||||
| 	fields, err := rows.Columns() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	for rows.Next() { |  | ||||||
| 		result, err := row2mapStr(rows, fields) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 		resultsSlice = append(resultsSlice, result) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return resultsSlice, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func reflect2value(rawValue *reflect.Value) (str string, err error) { |  | ||||||
| 	aa := reflect.TypeOf((*rawValue).Interface()) |  | ||||||
| 	vv := reflect.ValueOf((*rawValue).Interface()) |  | ||||||
| 	switch aa.Kind() { |  | ||||||
| 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: |  | ||||||
| 		str = strconv.FormatInt(vv.Int(), 10) |  | ||||||
| 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: |  | ||||||
| 		str = strconv.FormatUint(vv.Uint(), 10) |  | ||||||
| 	case reflect.Float32, reflect.Float64: |  | ||||||
| 		str = strconv.FormatFloat(vv.Float(), 'f', -1, 64) |  | ||||||
| 	case reflect.String: |  | ||||||
| 		str = vv.String() |  | ||||||
| 	case reflect.Array, reflect.Slice: |  | ||||||
| 		switch aa.Elem().Kind() { |  | ||||||
| 		case reflect.Uint8: |  | ||||||
| 			data := rawValue.Interface().([]byte) |  | ||||||
| 			str = string(data) |  | ||||||
| 		default: |  | ||||||
| 			err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name()) |  | ||||||
| 		} |  | ||||||
| 	// time type |  | ||||||
| 	case reflect.Struct: |  | ||||||
| 		if aa.ConvertibleTo(core.TimeType) { |  | ||||||
| 			str = vv.Convert(core.TimeType).Interface().(time.Time).Format(time.RFC3339Nano) |  | ||||||
| 		} else { |  | ||||||
| 			err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name()) |  | ||||||
| 		} |  | ||||||
| 	case reflect.Bool: |  | ||||||
| 		str = strconv.FormatBool(vv.Bool()) |  | ||||||
| 	case reflect.Complex128, reflect.Complex64: |  | ||||||
| 		str = fmt.Sprintf("%v", vv.Complex()) |  | ||||||
| 	/* TODO: unsupported types below |  | ||||||
| 	   case reflect.Map: |  | ||||||
| 	   case reflect.Ptr: |  | ||||||
| 	   case reflect.Uintptr: |  | ||||||
| 	   case reflect.UnsafePointer: |  | ||||||
| 	   case reflect.Chan, reflect.Func, reflect.Interface: |  | ||||||
| 	*/ |  | ||||||
| 	default: |  | ||||||
| 		err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name()) |  | ||||||
| 	} |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func value2String(rawValue *reflect.Value) (data string, err error) { |  | ||||||
| 	data, err = reflect2value(rawValue) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func row2mapStr(rows *core.Rows, fields []string) (resultsMap 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 ignore |  | ||||||
| 		if rawValue.Interface() == nil { |  | ||||||
| 			//fmt.Println("ignore ...", key, rawValue) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if data, err := value2String(&rawValue); err == nil { |  | ||||||
| 			result[key] = data |  | ||||||
| 		} else { |  | ||||||
| 			return nil, err // !nashtsai! REVIEW, should return err or just error log? |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return result, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func txQuery2(tx *core.Tx, sqlStr string, params ...interface{}) ([]map[string]string, error) { |  | ||||||
| 	rows, err := tx.Query(sqlStr, params...) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	defer rows.Close() |  | ||||||
|  |  | ||||||
| 	return rows2Strings(rows) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func query2(db *core.DB, sqlStr string, params ...interface{}) ([]map[string]string, error) { |  | ||||||
| 	rows, err := db.Query(sqlStr, params...) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	defer rows.Close() |  | ||||||
| 	return rows2Strings(rows) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // QueryString runs a raw sql and return records as []map[string]string |  | ||||||
| func (session *Session) QueryString(sqlStr string, args ...interface{}) ([]map[string]string, error) { |  | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { |  | ||||||
| 		defer session.Close() |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	session.queryPreprocess(&sqlStr, args...) | 	session.queryPreprocess(&sqlStr, args...) | ||||||
|  |  | ||||||
| 	if session.isAutoCommit { | 	if session.engine.showSQL { | ||||||
| 		return query2(session.DB(), sqlStr, args...) | 		if session.engine.showExecTime { | ||||||
|  | 			b4ExecTime := time.Now() | ||||||
|  | 			defer func() { | ||||||
|  | 				execDuration := time.Since(b4ExecTime) | ||||||
|  | 				if len(args) > 0 { | ||||||
|  | 					session.engine.logger.Infof("[SQL] %s %#v - took: %v", sqlStr, args, execDuration) | ||||||
|  | 				} else { | ||||||
|  | 					session.engine.logger.Infof("[SQL] %s - took: %v", sqlStr, execDuration) | ||||||
|  | 				} | ||||||
|  | 			}() | ||||||
|  | 		} else { | ||||||
|  | 			if len(args) > 0 { | ||||||
|  | 				session.engine.logger.Infof("[SQL] %v %#v", sqlStr, args) | ||||||
|  | 			} else { | ||||||
|  | 				session.engine.logger.Infof("[SQL] %v", sqlStr) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if !session.isAutoCommit { | ||||||
|  | 		return session.tx.Exec(sqlStr, args...) | ||||||
| 	} | 	} | ||||||
| 	return txQuery2(session.tx, sqlStr, args...) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Execute sql |  | ||||||
| func (session *Session) innerExec(sqlStr string, args ...interface{}) (sql.Result, error) { |  | ||||||
| 	if session.prepareStmt { | 	if session.prepareStmt { | ||||||
| 		stmt, err := session.doPrepare(sqlStr) | 		stmt, err := session.doPrepare(sqlStr) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @@ -286,32 +186,8 @@ func (session *Session) innerExec(sqlStr string, args ...interface{}) (sql.Resul | |||||||
| 	return session.DB().Exec(sqlStr, args...) | 	return session.DB().Exec(sqlStr, args...) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, error) { |  | ||||||
| 	for _, filter := range session.engine.dialect.Filters() { |  | ||||||
| 		// TODO: for table name, it's no need to RefTable |  | ||||||
| 		sqlStr = filter.Do(sqlStr, session.engine.dialect, session.statement.RefTable) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	session.saveLastSQL(sqlStr, args...) |  | ||||||
|  |  | ||||||
| 	return session.engine.logSQLExecutionTime(sqlStr, args, func() (sql.Result, error) { |  | ||||||
| 		if session.isAutoCommit { |  | ||||||
| 			// FIXME: oci8 can not auto commit (github.com/mattn/go-oci8) |  | ||||||
| 			if session.engine.dialect.DBType() == core.ORACLE { |  | ||||||
| 				session.Begin() |  | ||||||
| 				r, err := session.tx.Exec(sqlStr, args...) |  | ||||||
| 				session.Commit() |  | ||||||
| 				return r, err |  | ||||||
| 			} |  | ||||||
| 			return session.innerExec(sqlStr, args...) |  | ||||||
| 		} |  | ||||||
| 		return session.tx.Exec(sqlStr, args...) |  | ||||||
| 	}) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Exec raw sql | // Exec raw sql | ||||||
| func (session *Session) Exec(sqlStr string, args ...interface{}) (sql.Result, error) { | func (session *Session) Exec(sqlStr string, args ...interface{}) (sql.Result, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								vendor/github.com/go-xorm/xorm/session_schema.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/go-xorm/xorm/session_schema.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -16,7 +16,6 @@ import ( | |||||||
|  |  | ||||||
| // Ping test if database is ok | // Ping test if database is ok | ||||||
| func (session *Session) Ping() error { | func (session *Session) Ping() error { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
| @@ -35,7 +34,6 @@ func (session *Session) CreateTable(bean interface{}) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) createTable(bean interface{}) error { | func (session *Session) createTable(bean interface{}) error { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	v := rValue(bean) | 	v := rValue(bean) | ||||||
| 	if err := session.statement.setRefValue(v); err != nil { | 	if err := session.statement.setRefValue(v); err != nil { | ||||||
| 		return err | 		return err | ||||||
| @@ -56,7 +54,6 @@ func (session *Session) CreateIndexes(bean interface{}) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) createIndexes(bean interface{}) error { | func (session *Session) createIndexes(bean interface{}) error { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	v := rValue(bean) | 	v := rValue(bean) | ||||||
| 	if err := session.statement.setRefValue(v); err != nil { | 	if err := session.statement.setRefValue(v); err != nil { | ||||||
| 		return err | 		return err | ||||||
| @@ -81,7 +78,6 @@ func (session *Session) CreateUniques(bean interface{}) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) createUniques(bean interface{}) error { | func (session *Session) createUniques(bean interface{}) error { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	v := rValue(bean) | 	v := rValue(bean) | ||||||
| 	if err := session.statement.setRefValue(v); err != nil { | 	if err := session.statement.setRefValue(v); err != nil { | ||||||
| 		return err | 		return err | ||||||
| @@ -107,7 +103,6 @@ func (session *Session) DropIndexes(bean interface{}) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) dropIndexes(bean interface{}) error { | func (session *Session) dropIndexes(bean interface{}) error { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	v := rValue(bean) | 	v := rValue(bean) | ||||||
| 	if err := session.statement.setRefValue(v); err != nil { | 	if err := session.statement.setRefValue(v); err != nil { | ||||||
| 		return err | 		return err | ||||||
| @@ -133,7 +128,6 @@ func (session *Session) DropTable(beanOrTableName interface{}) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) dropTable(beanOrTableName interface{}) error { | func (session *Session) dropTable(beanOrTableName interface{}) error { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	tableName, err := session.engine.tableName(beanOrTableName) | 	tableName, err := session.engine.tableName(beanOrTableName) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| @@ -142,7 +136,7 @@ func (session *Session) dropTable(beanOrTableName interface{}) error { | |||||||
| 	var needDrop = true | 	var needDrop = true | ||||||
| 	if !session.engine.dialect.SupportDropIfExists() { | 	if !session.engine.dialect.SupportDropIfExists() { | ||||||
| 		sqlStr, args := session.engine.dialect.TableCheckSql(tableName) | 		sqlStr, args := session.engine.dialect.TableCheckSql(tableName) | ||||||
| 		results, err := session.query(sqlStr, args...) | 		results, err := session.queryBytes(sqlStr, args...) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| @@ -172,9 +166,8 @@ func (session *Session) IsTableExist(beanOrTableName interface{}) (bool, error) | |||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) isTableExist(tableName string) (bool, error) { | func (session *Session) isTableExist(tableName string) (bool, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	sqlStr, args := session.engine.dialect.TableCheckSql(tableName) | 	sqlStr, args := session.engine.dialect.TableCheckSql(tableName) | ||||||
| 	results, err := session.query(sqlStr, args...) | 	results, err := session.queryBytes(sqlStr, args...) | ||||||
| 	return len(results) > 0, err | 	return len(results) > 0, err | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -196,12 +189,9 @@ func (session *Session) IsTableEmpty(bean interface{}) (bool, error) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) isTableEmpty(tableName string) (bool, error) { | func (session *Session) isTableEmpty(tableName string) (bool, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
|  |  | ||||||
| 	var total int64 | 	var total int64 | ||||||
| 	sqlStr := fmt.Sprintf("select count(*) from %s", session.engine.Quote(tableName)) | 	sqlStr := fmt.Sprintf("select count(*) from %s", session.engine.Quote(tableName)) | ||||||
| 	err := session.DB().QueryRow(sqlStr).Scan(&total) | 	err := session.queryRow(sqlStr).Scan(&total) | ||||||
| 	session.saveLastSQL(sqlStr) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		if err == sql.ErrNoRows { | 		if err == sql.ErrNoRows { | ||||||
| 			err = nil | 			err = nil | ||||||
| @@ -214,8 +204,6 @@ func (session *Session) isTableEmpty(tableName string) (bool, error) { | |||||||
|  |  | ||||||
| // find if index is exist according cols | // find if index is exist according cols | ||||||
| func (session *Session) isIndexExist2(tableName string, cols []string, unique bool) (bool, error) { | func (session *Session) isIndexExist2(tableName string, cols []string, unique bool) (bool, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
|  |  | ||||||
| 	indexes, err := session.engine.dialect.GetIndexes(tableName) | 	indexes, err := session.engine.dialect.GetIndexes(tableName) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| @@ -233,8 +221,6 @@ func (session *Session) isIndexExist2(tableName string, cols []string, unique bo | |||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) addColumn(colName string) error { | func (session *Session) addColumn(colName string) error { | ||||||
| 	defer session.resetStatement() |  | ||||||
|  |  | ||||||
| 	col := session.statement.RefTable.GetColumn(colName) | 	col := session.statement.RefTable.GetColumn(colName) | ||||||
| 	sql, args := session.statement.genAddColumnStr(col) | 	sql, args := session.statement.genAddColumnStr(col) | ||||||
| 	_, err := session.exec(sql, args...) | 	_, err := session.exec(sql, args...) | ||||||
| @@ -242,18 +228,13 @@ func (session *Session) addColumn(colName string) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) addIndex(tableName, idxName string) error { | func (session *Session) addIndex(tableName, idxName string) error { | ||||||
| 	defer session.resetStatement() |  | ||||||
|  |  | ||||||
| 	index := session.statement.RefTable.Indexes[idxName] | 	index := session.statement.RefTable.Indexes[idxName] | ||||||
| 	sqlStr := session.engine.dialect.CreateIndexSql(tableName, index) | 	sqlStr := session.engine.dialect.CreateIndexSql(tableName, index) | ||||||
|  |  | ||||||
| 	_, err := session.exec(sqlStr) | 	_, err := session.exec(sqlStr) | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|  |  | ||||||
| func (session *Session) addUnique(tableName, uqeName string) error { | func (session *Session) addUnique(tableName, uqeName string) error { | ||||||
| 	defer session.resetStatement() |  | ||||||
|  |  | ||||||
| 	index := session.statement.RefTable.Indexes[uqeName] | 	index := session.statement.RefTable.Indexes[uqeName] | ||||||
| 	sqlStr := session.engine.dialect.CreateIndexSql(tableName, index) | 	sqlStr := session.engine.dialect.CreateIndexSql(tableName, index) | ||||||
| 	_, err := session.exec(sqlStr) | 	_, err := session.exec(sqlStr) | ||||||
|   | |||||||
							
								
								
									
										26
									
								
								vendor/github.com/go-xorm/xorm/session_stats.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/go-xorm/xorm/session_stats.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -13,7 +13,6 @@ import ( | |||||||
| // Count counts the records. bean's non-empty fields | // Count counts the records. bean's non-empty fields | ||||||
| // are conditions. | // are conditions. | ||||||
| func (session *Session) Count(bean ...interface{}) (int64, error) { | func (session *Session) Count(bean ...interface{}) (int64, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
| @@ -31,15 +30,8 @@ func (session *Session) Count(bean ...interface{}) (int64, error) { | |||||||
| 		args = session.statement.RawParams | 		args = session.statement.RawParams | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	session.queryPreprocess(&sqlStr, args...) |  | ||||||
|  |  | ||||||
| 	var total int64 | 	var total int64 | ||||||
| 	if session.isAutoCommit { | 	err = session.queryRow(sqlStr, args...).Scan(&total) | ||||||
| 		err = session.DB().QueryRow(sqlStr, args...).Scan(&total) |  | ||||||
| 	} else { |  | ||||||
| 		err = session.tx.QueryRow(sqlStr, args...).Scan(&total) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if err == sql.ErrNoRows || err == nil { | 	if err == sql.ErrNoRows || err == nil { | ||||||
| 		return total, nil | 		return total, nil | ||||||
| 	} | 	} | ||||||
| @@ -49,7 +41,6 @@ func (session *Session) Count(bean ...interface{}) (int64, error) { | |||||||
|  |  | ||||||
| // sum call sum some column. bean's non-empty fields are conditions. | // sum call sum some column. bean's non-empty fields are conditions. | ||||||
| func (session *Session) sum(res interface{}, bean interface{}, columnNames ...string) error { | func (session *Session) sum(res interface{}, bean interface{}, columnNames ...string) error { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
| @@ -73,22 +64,11 @@ func (session *Session) sum(res interface{}, bean interface{}, columnNames ...st | |||||||
| 		args = session.statement.RawParams | 		args = session.statement.RawParams | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	session.queryPreprocess(&sqlStr, args...) |  | ||||||
|  |  | ||||||
| 	if isSlice { | 	if isSlice { | ||||||
| 		if session.isAutoCommit { | 		err = session.queryRow(sqlStr, args...).ScanSlice(res) | ||||||
| 			err = session.DB().QueryRow(sqlStr, args...).ScanSlice(res) |  | ||||||
| 		} else { |  | ||||||
| 			err = session.tx.QueryRow(sqlStr, args...).ScanSlice(res) |  | ||||||
| 		} |  | ||||||
| 	} else { | 	} else { | ||||||
| 		if session.isAutoCommit { | 		err = session.queryRow(sqlStr, args...).Scan(res) | ||||||
| 			err = session.DB().QueryRow(sqlStr, args...).Scan(res) |  | ||||||
| 		} else { |  | ||||||
| 			err = session.tx.QueryRow(sqlStr, args...).Scan(res) |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err == sql.ErrNoRows || err == nil { | 	if err == sql.ErrNoRows || err == nil { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								vendor/github.com/go-xorm/xorm/session_update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/go-xorm/xorm/session_update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -15,8 +15,8 @@ import ( | |||||||
| 	"github.com/go-xorm/core" | 	"github.com/go-xorm/core" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func (session *Session) cacheUpdate(sqlStr string, args ...interface{}) error { | func (session *Session) cacheUpdate(table *core.Table, tableName, sqlStr string, args ...interface{}) error { | ||||||
| 	if session.statement.RefTable == nil || | 	if table == nil || | ||||||
| 		session.tx != nil { | 		session.tx != nil { | ||||||
| 		return ErrCacheFailed | 		return ErrCacheFailed | ||||||
| 	} | 	} | ||||||
| @@ -26,7 +26,7 @@ func (session *Session) cacheUpdate(sqlStr string, args ...interface{}) error { | |||||||
| 		return ErrCacheFailed | 		return ErrCacheFailed | ||||||
| 	} | 	} | ||||||
| 	for _, filter := range session.engine.dialect.Filters() { | 	for _, filter := range session.engine.dialect.Filters() { | ||||||
| 		newsql = filter.Do(newsql, session.engine.dialect, session.statement.RefTable) | 		newsql = filter.Do(newsql, session.engine.dialect, table) | ||||||
| 	} | 	} | ||||||
| 	session.engine.logger.Debug("[cacheUpdate] new sql", oldhead, newsql) | 	session.engine.logger.Debug("[cacheUpdate] new sql", oldhead, newsql) | ||||||
|  |  | ||||||
| @@ -39,13 +39,12 @@ func (session *Session) cacheUpdate(sqlStr string, args ...interface{}) error { | |||||||
| 			nStart = strings.Count(oldhead, "$") | 			nStart = strings.Count(oldhead, "$") | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	table := session.statement.RefTable |  | ||||||
| 	cacher := session.engine.getCacher2(table) | 	cacher := session.engine.getCacher2(table) | ||||||
| 	tableName := session.statement.TableName() |  | ||||||
| 	session.engine.logger.Debug("[cacheUpdate] get cache sql", newsql, args[nStart:]) | 	session.engine.logger.Debug("[cacheUpdate] get cache sql", newsql, args[nStart:]) | ||||||
| 	ids, err := core.GetCacheSql(cacher, tableName, newsql, args[nStart:]) | 	ids, err := core.GetCacheSql(cacher, tableName, newsql, args[nStart:]) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		rows, err := session.DB().Query(newsql, args[nStart:]...) | 		rows, err := session.NoCache().queryRows(newsql, args[nStart:]...) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| @@ -144,7 +143,6 @@ func (session *Session) cacheUpdate(sqlStr string, args ...interface{}) error { | |||||||
| //         You should call UseBool if you have bool to use. | //         You should call UseBool if you have bool to use. | ||||||
| //        2.float32 & float64 may be not inexact as conditions | //        2.float32 & float64 may be not inexact as conditions | ||||||
| func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int64, error) { | func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int64, error) { | ||||||
| 	defer session.resetStatement() |  | ||||||
| 	if session.isAutoClose { | 	if session.isAutoClose { | ||||||
| 		defer session.Close() | 		defer session.Close() | ||||||
| 	} | 	} | ||||||
| @@ -249,8 +247,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	st := session.statement | 	st := &session.statement | ||||||
| 	defer session.resetStatement() |  | ||||||
|  |  | ||||||
| 	var sqlStr string | 	var sqlStr string | ||||||
| 	var condArgs []interface{} | 	var condArgs []interface{} | ||||||
| @@ -282,6 +279,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | |||||||
| 		condSQL = condSQL + fmt.Sprintf(" ORDER BY %v", st.OrderStr) | 		condSQL = condSQL + fmt.Sprintf(" ORDER BY %v", st.OrderStr) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	var tableName = session.statement.TableName() | ||||||
| 	// TODO: Oracle support needed | 	// TODO: Oracle support needed | ||||||
| 	var top string | 	var top string | ||||||
| 	if st.LimitN > 0 { | 	if st.LimitN > 0 { | ||||||
| @@ -290,7 +288,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | |||||||
| 		} else if st.Engine.dialect.DBType() == core.SQLITE { | 		} else if st.Engine.dialect.DBType() == core.SQLITE { | ||||||
| 			tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN) | 			tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN) | ||||||
| 			cond = cond.And(builder.Expr(fmt.Sprintf("rowid IN (SELECT rowid FROM %v %v)", | 			cond = cond.And(builder.Expr(fmt.Sprintf("rowid IN (SELECT rowid FROM %v %v)", | ||||||
| 				session.engine.Quote(session.statement.TableName()), tempCondSQL), condArgs...)) | 				session.engine.Quote(tableName), tempCondSQL), condArgs...)) | ||||||
| 			condSQL, condArgs, err = builder.ToSQL(cond) | 			condSQL, condArgs, err = builder.ToSQL(cond) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return 0, err | 				return 0, err | ||||||
| @@ -301,7 +299,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | |||||||
| 		} else if st.Engine.dialect.DBType() == core.POSTGRES { | 		} else if st.Engine.dialect.DBType() == core.POSTGRES { | ||||||
| 			tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN) | 			tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN) | ||||||
| 			cond = cond.And(builder.Expr(fmt.Sprintf("CTID IN (SELECT CTID FROM %v %v)", | 			cond = cond.And(builder.Expr(fmt.Sprintf("CTID IN (SELECT CTID FROM %v %v)", | ||||||
| 				session.engine.Quote(session.statement.TableName()), tempCondSQL), condArgs...)) | 				session.engine.Quote(tableName), tempCondSQL), condArgs...)) | ||||||
| 			condSQL, condArgs, err = builder.ToSQL(cond) | 			condSQL, condArgs, err = builder.ToSQL(cond) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return 0, err | 				return 0, err | ||||||
| @@ -315,7 +313,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | |||||||
| 				table != nil && len(table.PrimaryKeys) == 1 { | 				table != nil && len(table.PrimaryKeys) == 1 { | ||||||
| 				cond = builder.Expr(fmt.Sprintf("%s IN (SELECT TOP (%d) %s FROM %v%v)", | 				cond = builder.Expr(fmt.Sprintf("%s IN (SELECT TOP (%d) %s FROM %v%v)", | ||||||
| 					table.PrimaryKeys[0], st.LimitN, table.PrimaryKeys[0], | 					table.PrimaryKeys[0], st.LimitN, table.PrimaryKeys[0], | ||||||
| 					session.engine.Quote(session.statement.TableName()), condSQL), condArgs...) | 					session.engine.Quote(tableName), condSQL), condArgs...) | ||||||
|  |  | ||||||
| 				condSQL, condArgs, err = builder.ToSQL(cond) | 				condSQL, condArgs, err = builder.ToSQL(cond) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| @@ -336,7 +334,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | |||||||
|  |  | ||||||
| 	sqlStr = fmt.Sprintf("UPDATE %v%v SET %v %v", | 	sqlStr = fmt.Sprintf("UPDATE %v%v SET %v %v", | ||||||
| 		top, | 		top, | ||||||
| 		session.engine.Quote(session.statement.TableName()), | 		session.engine.Quote(tableName), | ||||||
| 		strings.Join(colNames, ", "), | 		strings.Join(colNames, ", "), | ||||||
| 		condSQL) | 		condSQL) | ||||||
|  |  | ||||||
| @@ -351,8 +349,9 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | |||||||
|  |  | ||||||
| 	if table != nil { | 	if table != nil { | ||||||
| 		if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | 		if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { | ||||||
| 			cacher.ClearIds(session.statement.TableName()) | 			//session.cacheUpdate(table, tableName, sqlStr, args...) | ||||||
| 			cacher.ClearBeans(session.statement.TableName()) | 			cacher.ClearIds(tableName) | ||||||
|  | 			cacher.ClearBeans(tableName) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -362,7 +361,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 | |||||||
| 			closure(bean) | 			closure(bean) | ||||||
| 		} | 		} | ||||||
| 		if processor, ok := interface{}(bean).(AfterUpdateProcessor); ok { | 		if processor, ok := interface{}(bean).(AfterUpdateProcessor); ok { | ||||||
| 			session.engine.logger.Debug("[event]", session.statement.TableName(), " has after update processor") | 			session.engine.logger.Debug("[event]", tableName, " has after update processor") | ||||||
| 			processor.AfterUpdate() | 			processor.AfterUpdate() | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								vendor/github.com/go-xorm/xorm/statement.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/go-xorm/xorm/statement.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1205,7 +1205,8 @@ func (statement *Statement) convertIDSQL(sqlStr string) string { | |||||||
| 			top = fmt.Sprintf("TOP %d ", statement.LimitN) | 			top = fmt.Sprintf("TOP %d ", statement.LimitN) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		return fmt.Sprintf("SELECT %s%s FROM %v", top, colstrs, sqls[1]) | 		newsql := fmt.Sprintf("SELECT %s%s FROM %v", top, colstrs, sqls[1]) | ||||||
|  | 		return newsql | ||||||
| 	} | 	} | ||||||
| 	return "" | 	return "" | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								vendor/github.com/go-xorm/xorm/test_mssql_cache.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/go-xorm/xorm/test_mssql_cache.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | go test -db=mssql -conn_str="server=192.168.1.58;user id=sa;password=123456;database=xorm_test" -cache=true | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/go-xorm/xorm/test_mymysql_cache.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/go-xorm/xorm/test_mymysql_cache.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | go test -db=mymysql -conn_str="xorm_test/root/" -cache=true | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/go-xorm/xorm/test_mysql_cache.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/go-xorm/xorm/test_mysql_cache.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | go test -db=mysql -conn_str="root:@/xorm_test" -cache=true | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/go-xorm/xorm/test_postgres_cache.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/go-xorm/xorm/test_postgres_cache.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | go test -db=postgres -conn_str="dbname=xorm_test sslmode=disable" -cache=true | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/go-xorm/xorm/test_sqlite_cache.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/go-xorm/xorm/test_sqlite_cache.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | go test -db=sqlite3 -conn_str="./test.db?cache=shared&mode=rwc" -cache=true | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/go-xorm/xorm/xorm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-xorm/xorm/xorm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -17,7 +17,7 @@ import ( | |||||||
|  |  | ||||||
| const ( | const ( | ||||||
| 	// Version show the xorm's version | 	// Version show the xorm's version | ||||||
| 	Version string = "0.6.3.0713" | 	Version string = "0.6.4.0910" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func regDrvsNDialects() bool { | func regDrvsNDialects() bool { | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							| @@ -456,10 +456,10 @@ | |||||||
| 			"revisionTime": "2017-05-19T03:21:30Z" | 			"revisionTime": "2017-05-19T03:21:30Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "KOHXTLwpgTMxBB9aGF2aIxkWdm8=", | 			"checksumSHA1": "HMavuxvDhKOwmbbFnYt9hfT6jE0=", | ||||||
| 			"path": "github.com/go-xorm/core", | 			"path": "github.com/go-xorm/core", | ||||||
| 			"revision": "71c1070a861118827352b1394eb86cbfeef5c513", | 			"revision": "da1adaf7a28ca792961721a34e6e04945200c890", | ||||||
| 			"revisionTime": "2017-08-22T05:50:40Z" | 			"revisionTime": "2017-09-09T08:56:53Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "k52lEKLp8j5M+jFpe+3u+bIFpxQ=", | 			"checksumSHA1": "k52lEKLp8j5M+jFpe+3u+bIFpxQ=", | ||||||
| @@ -468,10 +468,10 @@ | |||||||
| 			"revisionTime": "2016-08-11T02:11:45Z" | 			"revisionTime": "2016-08-11T02:11:45Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "0F65zfDi1ys3KD/wMKtxC2k13DA=", | 			"checksumSHA1": "SoZDnkd5NdwE0g4MY1nTAl8ZtPo=", | ||||||
| 			"path": "github.com/go-xorm/xorm", | 			"path": "github.com/go-xorm/xorm", | ||||||
| 			"revision": "a10b5aba4bb97b30daa74e7c0363d3084ede0514", | 			"revision": "c29485f954ed6495861c0098f9a1642a467299c8", | ||||||
| 			"revisionTime": "2017-08-20T09:05:42Z" | 			"revisionTime": "2017-09-10T12:58:18Z" | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			"checksumSHA1": "1ft/4j5MFa7C9dPI9whL03HSUzk=", | 			"checksumSHA1": "1ft/4j5MFa7C9dPI9whL03HSUzk=", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lunny Xiao
					Lunny Xiao