jet/postgres/lock_statement.go

57 lines
1.6 KiB
Go
Raw Normal View History

2019-08-03 14:10:47 +02:00
package postgres
import "source.gleipnir.technology/Gleipnir/jet/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
}