@@ -79,7 +79,7 @@ export const make: (
7979 pg : ( ) =>
8080 sql `CREATE TABLE IF NOT EXISTS ${ tableNameSql } (
8181 sequence SERIAL PRIMARY KEY,
82- id UUID NOT NULL,
82+ id VARCHAR(36) NOT NULL,
8383 queue_name VARCHAR(100) NOT NULL,
8484 element TEXT NOT NULL,
8585 completed BOOLEAN NOT NULL,
@@ -94,7 +94,7 @@ export const make: (
9494 sql `IF NOT EXISTS (SELECT * FROM sysobjects WHERE name=${ tableNameSql } AND xtype='U')
9595 CREATE TABLE ${ tableNameSql } (
9696 sequence INT IDENTITY(1,1) PRIMARY KEY,
97- id UNIQUEIDENTIFIER NOT NULL,
97+ id NVARCHAR(36) NOT NULL,
9898 queue_name NVARCHAR(100) NOT NULL,
9999 element NVARCHAR(MAX) NOT NULL,
100100 completed BIT NOT NULL,
@@ -122,6 +122,14 @@ export const make: (
122122 )`
123123 } )
124124
125+ yield * sql . onDialectOrElse ( {
126+ mssql : ( ) =>
127+ sql `IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = N'idx_${ tableName } _id')
128+ CREATE UNIQUE INDEX idx_${ tableNameSql } _id ON ${ tableNameSql } (id)` ,
129+ mysql : ( ) => sql `CREATE UNIQUE INDEX ${ sql ( `idx_${ tableName } _id` ) } ON ${ tableNameSql } (id)` . pipe ( Effect . ignore ) ,
130+ orElse : ( ) => sql `CREATE UNIQUE INDEX IF NOT EXISTS ${ sql ( `idx_${ tableName } _id` ) } ON ${ tableNameSql } (id)`
131+ } )
132+
125133 yield * sql . onDialectOrElse ( {
126134 mssql : ( ) =>
127135 sql `IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = N'idx_${ tableName } _take')
@@ -149,6 +157,34 @@ export const make: (
149157 sql `CREATE INDEX IF NOT EXISTS ${ sql ( `idx_${ tableName } _update` ) } ON ${ tableNameSql } (sequence, acquired_by)`
150158 } )
151159
160+ const offer = sql . onDialectOrElse ( {
161+ pg : ( ) => ( id : string , name : string , element : string ) =>
162+ sql `
163+ INSERT INTO ${ tableNameSql } (id, queue_name, element, completed, attempts, created_at, updated_at)
164+ VALUES (${ id } , ${ name } , ${ element } , FALSE, 0, ${ sqlNow } , ${ sqlNow } )
165+ ON CONFLICT (id) DO NOTHING
166+ ` ,
167+ mysql : ( ) => ( id : string , name : string , element : string ) =>
168+ sql `
169+ INSERT IGNORE INTO ${ tableNameSql } (id, queue_name, element, completed, attempts, created_at, updated_at)
170+ VALUES (${ id } , ${ name } , ${ element } , FALSE, 0, ${ sqlNow } , ${ sqlNow } )
171+ ` ,
172+ mssql : ( ) => ( id : string , name : string , element : string ) =>
173+ sql `
174+ IF NOT EXISTS (SELECT 1 FROM ${ tableNameSql } WHERE id = ${ id } )
175+ BEGIN
176+ INSERT INTO ${ tableNameSql } (id, queue_name, element, completed, attempts, created_at, updated_at)
177+ VALUES (${ id } , ${ name } , ${ element } , 0, 0, ${ sqlNow } , ${ sqlNow } )
178+ END
179+ ` ,
180+ // sqlite
181+ orElse : ( ) => ( id : string , name : string , element : string ) =>
182+ sql `
183+ INSERT OR IGNORE INTO ${ tableNameSql } (id, queue_name, element, completed, attempts, created_at, updated_at)
184+ VALUES (${ id } , ${ name } , ${ element } , FALSE, 0, ${ sqlNow } , ${ sqlNow } )
185+ `
186+ } )
187+
152188 const wrapString = sql . onDialectOrElse ( {
153189 mssql : ( ) => ( s : string ) => `N'${ s } '` ,
154190 orElse : ( ) => ( s : string ) => `'${ s } '`
@@ -159,10 +195,6 @@ export const make: (
159195 sqlite : ( ) => sql . literal ( "1" ) ,
160196 orElse : ( ) => sql . literal ( "TRUE" )
161197 } )
162- const sqlFalse = sql . onDialectOrElse ( {
163- sqlite : ( ) => sql . literal ( "0" ) ,
164- orElse : ( ) => sql . literal ( "FALSE" )
165- } )
166198
167199 const workerIdSql = stringLiteral ( workerId )
168200 const elementIds = new Set < number > ( )
@@ -361,22 +393,14 @@ export const make: (
361393 } )
362394
363395 return PersistedQueue . PersistedQueueStore . of ( {
364- offer : ( name , id , element ) =>
365- Effect . suspend ( ( ) =>
366- sql `
367- INSERT INTO ${ tableNameSql } (id, queue_name, element, completed, attempts, created_at, updated_at)
368- VALUES (${ id } , ${ name } , ${ JSON . stringify ( element ) } , ${ sqlFalse } , 0, ${ sqlNow } , ${ sqlNow } )
369- `
370- ) . pipe (
371- Effect . catchAllCause ( ( cause ) =>
372- Effect . fail (
373- new PersistedQueue . PersistedQueueError ( {
374- message : "Failed to offer element to persisted queue" ,
375- cause : Cause . squash ( cause )
376- } )
377- )
378- )
379- ) ,
396+ offer : ( { element, id, name } ) =>
397+ Effect . catchAllCause ( Effect . suspend ( ( ) => offer ( id , name , JSON . stringify ( element ) ) ) , ( cause ) =>
398+ Effect . fail (
399+ new PersistedQueue . PersistedQueueError ( {
400+ message : "Failed to offer element to persisted queue" ,
401+ cause : Cause . squash ( cause )
402+ } )
403+ ) ) ,
380404 take : ( { maxAttempts, name } ) =>
381405 Effect . uninterruptibleMask ( ( restore ) =>
382406 RcMap . get ( mailboxes , new QueueKey ( { name, maxAttempts } ) ) . pipe (
0 commit comments