1- package looper
1+ package lockerpostgresql
22
33import (
44 "context"
55 "database/sql"
66 "fmt"
77 "time"
8+
9+ "github.com/golang-cz/looper"
810)
911
1012const defaultTableName = "looper_lock"
1113
1214// PostgresLocker provides an implementation of the Locker interface using
1315// a PostgreSQL table for storage.
14- func PostgresLocker (ctx context.Context , db * sql.DB , tableName string ) (locker , error ) {
16+ func PostgresLocker (ctx context.Context , db * sql.DB , tableName string ) (looper. Locker , error ) {
1517 if err := db .PingContext (ctx ); err != nil {
16- return nil , fmt .Errorf ("%w: %v" , ErrFailedToConnectToLocker , err )
18+ return nil , fmt .Errorf ("%w: %v" , looper . ErrFailedToConnectToLocker , err )
1719 }
1820
1921 if tableName == "" {
@@ -34,7 +36,7 @@ func PostgresLocker(ctx context.Context, db *sql.DB, tableName string) (locker,
3436}
3537
3638// Locker
37- var _ locker = (* postgresLocker )(nil )
39+ var _ looper. Locker = (* postgresLocker )(nil )
3840
3941type postgresLocker struct {
4042 db * sql.DB
@@ -55,7 +57,7 @@ func createLockTable(ctx context.Context, db *sql.DB, table string) error {
5557 ),
5658 ).Scan (& tableExists )
5759 if err != nil {
58- return fmt .Errorf ("%w: %v" , ErrFailedToCheckLockExistence , err )
60+ return fmt .Errorf ("%w: %v" , looper . ErrFailedToCheckLockExistence , err )
5961 }
6062
6163 if ! tableExists {
@@ -69,59 +71,50 @@ func createLockTable(ctx context.Context, db *sql.DB, table string) error {
6971 table ,
7072 ))
7173 if err != nil {
72- return fmt .Errorf ("%w: %v" , ErrFailedToCreateLockTable , err )
74+ return fmt .Errorf ("%w: %v" , looper . ErrFailedToCreateLockTable , err )
7375 }
7476 }
7577
7678 return nil
7779}
7880
79- func (p * postgresLocker ) lock (
80- ctx context.Context ,
81- key string ,
82- timeout time.Duration ,
83- ) (lock , error ) {
81+ func (p * postgresLocker ) Lock (ctx context.Context , key string , timeout time.Duration ) (looper.Lock , error ) {
8482 // Create a row in the lock table to acquire the lock
85- _ , err := p .db .ExecContext (
86- ctx ,
87- fmt .Sprintf (`
83+ q := fmt .Sprintf (`
8884 INSERT INTO %s (job_name)
8985 VALUES ('%s');` ,
90- p .table ,
91- key ,
92- ))
93- if err != nil {
94- var createdAt time.Time
95- err := p .db .QueryRowContext (
96- ctx ,
97- fmt .Sprintf (`
86+ p .table ,
87+ key ,
88+ )
89+ if _ , err := p .db .ExecContext (ctx , q ); err != nil {
90+ q := fmt .Sprintf (`
9891 SELECT created_at
9992 FROM %s
10093 WHERE job_name = '%s';` ,
101- p .table ,
102- key ,
103- )).Scan (& createdAt )
104- if err != nil {
105- return nil , ErrFailedToCheckLockExistence
94+ p .table ,
95+ key ,
96+ )
97+
98+ var createdAt time.Time
99+ if err := p .db .QueryRowContext (ctx , q ).Scan (& createdAt ); err != nil {
100+ return nil , looper .ErrFailedToCheckLockExistence
106101 }
107102
108103 if createdAt .Before (time .Now ().Add (- timeout )) {
109- _ , err := p .db .ExecContext (
110- ctx ,
111- fmt .Sprintf (`
104+ q := fmt .Sprintf (`
112105 DELETE FROM %s
113106 WHERE job_name = '%s';` ,
114- p .table ,
115- key ,
116- ) )
117- if err != nil {
118- return nil , ErrFailedToReleaseLock
107+ p .table ,
108+ key ,
109+ )
110+ if _ , err := p . db . ExecContext ( ctx , q ); err != nil {
111+ return nil , looper . ErrFailedToReleaseLock
119112 }
120113
121- return p .lock (ctx , key , timeout )
114+ return p .Lock (ctx , key , timeout )
122115 }
123116
124- return nil , ErrFailedToObtainLock
117+ return nil , looper . ErrFailedToObtainLock
125118 }
126119
127120 pl := & postgresLock {
@@ -134,15 +127,15 @@ func (p *postgresLocker) lock(
134127}
135128
136129// Lock
137- var _ lock = (* postgresLock )(nil )
130+ var _ looper. Lock = (* postgresLock )(nil )
138131
139132type postgresLock struct {
140133 db * sql.DB
141134 table string
142135 key string
143136}
144137
145- func (p * postgresLock ) unlock (ctx context.Context ) error {
138+ func (p * postgresLock ) Unlock (ctx context.Context ) error {
146139 // Release the lock by deleting the row
147140 _ , err := p .db .ExecContext (
148141 ctx ,
@@ -153,7 +146,7 @@ func (p *postgresLock) unlock(ctx context.Context) error {
153146 p .key ,
154147 ))
155148 if err != nil {
156- return ErrFailedToReleaseLock
149+ return looper . ErrFailedToReleaseLock
157150 }
158151
159152 return nil
0 commit comments