2019-08-03 14:10:47 +02:00
|
|
|
package postgres
|
|
|
|
|
|
2020-06-27 18:48:19 +02:00
|
|
|
import "github.com/go-jet/jet/v2/internal/jet"
|
2019-08-03 14:10:47 +02:00
|
|
|
|
2019-08-17 14:49:35 +02:00
|
|
|
// TableLockMode is a type of possible SQL table lock
|
2019-08-11 09:52:02 +02:00
|
|
|
type TableLockMode string
|
2019-08-03 14:10:47 +02:00
|
|
|
|
|
|
|
|
// Lock types for LockStatement.
|
|
|
|
|
const (
|
2019-08-11 09:52:02 +02:00
|
|
|
LOCK_ACCESS_SHARE TableLockMode = "ACCESS SHARE"
|
|
|
|
|
LOCK_ROW_SHARE TableLockMode = "ROW SHARE"
|
|
|
|
|
LOCK_ROW_EXCLUSIVE TableLockMode = "ROW EXCLUSIVE"
|
|
|
|
|
LOCK_SHARE_UPDATE_EXCLUSIVE TableLockMode = "SHARE UPDATE EXCLUSIVE"
|
|
|
|
|
LOCK_SHARE TableLockMode = "SHARE"
|
|
|
|
|
LOCK_SHARE_ROW_EXCLUSIVE TableLockMode = "SHARE ROW EXCLUSIVE"
|
|
|
|
|
LOCK_EXCLUSIVE TableLockMode = "EXCLUSIVE"
|
|
|
|
|
LOCK_ACCESS_EXCLUSIVE TableLockMode = "ACCESS EXCLUSIVE"
|
2019-08-03 14:10:47 +02:00
|
|
|
)
|
|
|
|
|
|
2019-08-17 14:49:35 +02:00
|
|
|
// LockStatement is interface for MySQL LOCK tables
|
2019-08-11 09:52:02 +02:00
|
|
|
type LockStatement interface {
|
2019-08-17 10:43:16 +02:00
|
|
|
Statement
|
2019-08-03 14:10:47 +02:00
|
|
|
|
2019-08-11 09:52:02 +02:00
|
|
|
IN(lockMode TableLockMode) LockStatement
|
|
|
|
|
NOWAIT() LockStatement
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-17 14:49:35 +02:00
|
|
|
// LOCK creates LockStatement from list of tables
|
2019-08-11 09:52:02 +02:00
|
|
|
func LOCK(tables ...jet.SerializerTable) LockStatement {
|
|
|
|
|
newLock := &lockStatementImpl{}
|
2019-08-17 18:32:01 +02:00
|
|
|
newLock.SerializerStatement = jet.NewStatementImpl(Dialect, jet.LockStatementType, newLock,
|
2019-08-11 09:52:02 +02:00
|
|
|
&newLock.StatementBegin, &newLock.In, &newLock.NoWait)
|
|
|
|
|
|
|
|
|
|
newLock.StatementBegin.Name = "LOCK TABLE"
|
|
|
|
|
newLock.StatementBegin.Tables = tables
|
|
|
|
|
newLock.NoWait.Name = "NOWAIT"
|
|
|
|
|
return newLock
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type lockStatementImpl struct {
|
2019-08-17 18:32:01 +02:00
|
|
|
jet.SerializerStatement
|
2019-08-11 09:52:02 +02:00
|
|
|
|
|
|
|
|
StatementBegin jet.ClauseStatementBegin
|
|
|
|
|
In jet.ClauseIn
|
|
|
|
|
NoWait jet.ClauseOptional
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *lockStatementImpl) IN(lockMode TableLockMode) LockStatement {
|
|
|
|
|
l.In.LockMode = string(lockMode)
|
|
|
|
|
return l
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *lockStatementImpl) NOWAIT() LockStatement {
|
|
|
|
|
l.NoWait.Show = true
|
|
|
|
|
return l
|
|
|
|
|
}
|