55 "embed"
66 "errors"
77 "fmt"
8- "net/url"
9- "os"
108 "strings"
119 "sync"
1210 "time"
@@ -89,6 +87,7 @@ func createDatabaseIfNotExists(databaseURL string) error {
8987 if err != nil {
9088 return NewInitializationError (fmt .Sprintf ("failed to create database %s: %v" , dbName , err ))
9189 }
90+ getLogger ().Info ("Database created" , "name" , dbName )
9291 }
9392
9493 return nil
@@ -125,36 +124,28 @@ func runMigrations(databaseURL string) error {
125124}
126125
127126// New creates a new SystemDatabase instance and runs migrations
128- func NewSystemDatabase () (SystemDatabase , error ) {
129- // TODO: pass proper config
130- databaseURL := os .Getenv ("DBOS_DATABASE_URL" )
131- if databaseURL == "" {
132- fmt .Println ("DBOS_DATABASE_URL not set, using default: postgres://postgres:${PGPASSWORD}@localhost:5432/dbos?sslmode=disable" )
133- password := url .QueryEscape (os .Getenv ("PGPASSWORD" ))
134- databaseURL = fmt .Sprintf ("postgres://postgres:%s@localhost:5432/dbos?sslmode=disable" , password )
135- }
136-
127+ func NewSystemDatabase (databaseURL string ) (SystemDatabase , error ) {
137128 // Create the database if it doesn't exist
138129 if err := createDatabaseIfNotExists (databaseURL ); err != nil {
139- return nil , NewInitializationError ( fmt .Sprintf ("failed to create database: %v" , err ) )
130+ return nil , fmt .Errorf ("failed to create database: %v" , err )
140131 }
141132
142133 // Run migrations first
143134 if err := runMigrations (databaseURL ); err != nil {
144- return nil , NewInitializationError ( fmt .Sprintf ("failed to run migrations: %v" , err ) )
135+ return nil , fmt .Errorf ("failed to run migrations: %v" , err )
145136 }
146137
147138 // Create pgx pool
148139 pool , err := pgxpool .New (context .Background (), databaseURL )
149140 if err != nil {
150- return nil , NewInitializationError ( fmt .Sprintf ("failed to create connection pool: %v" , err ) )
141+ return nil , fmt .Errorf ("failed to create connection pool: %v" , err )
151142 }
152143
153144 // Test the connection
154145 // FIXME: remove this
155146 if err := pool .Ping (context .Background ()); err != nil {
156147 pool .Close ()
157- return nil , NewInitializationError ( fmt .Sprintf ("failed to ping database: %v" , err ) )
148+ return nil , fmt .Errorf ("failed to ping database: %v" , err )
158149 }
159150
160151 // Create a map of notification payloads to channels
@@ -163,7 +154,7 @@ func NewSystemDatabase() (SystemDatabase, error) {
163154 // Create a connection to listen on notifications
164155 config , err := pgconn .ParseConfig (databaseURL )
165156 if err != nil {
166- return nil , NewInitializationError ( fmt .Sprintf ("failed to parse database URL: %v" , err ) )
157+ return nil , fmt .Errorf ("failed to parse database URL: %v" , err )
167158 }
168159 config .OnNotification = func (c * pgconn.PgConn , n * pgconn.Notification ) {
169160 if n .Channel == "dbos_notifications_channel" {
@@ -180,7 +171,7 @@ func NewSystemDatabase() (SystemDatabase, error) {
180171 }
181172 notificationListenerConnection , err := pgconn .ConnectConfig (context .Background (), config )
182173 if err != nil {
183- return nil , NewInitializationError ( fmt .Sprintf ("failed to connect notification listener to database: %v" , err ) )
174+ return nil , fmt .Errorf ("failed to connect notification listener to database: %v" , err )
184175 }
185176
186177 return & systemDatabase {
@@ -1330,7 +1321,7 @@ func (s *systemDatabase) DequeueWorkflows(ctx context.Context, queue WorkflowQue
13301321 getLogger ().Warn ("Local pending workflows on queue exceeds worker concurrency limit" , "local_pending" , localPendingWorkflows , "queue_name" , queue .Name , "concurrency_limit" , workerConcurrency )
13311322 }
13321323 availableWorkerTasks := max (workerConcurrency - localPendingWorkflows , 0 )
1333- maxTasks = uint ( availableWorkerTasks )
1324+ maxTasks = availableWorkerTasks
13341325 }
13351326
13361327 // Check global concurrency limit
@@ -1345,8 +1336,8 @@ func (s *systemDatabase) DequeueWorkflows(ctx context.Context, queue WorkflowQue
13451336 getLogger ().Warn ("Total pending workflows on queue exceeds global concurrency limit" , "total_pending" , globalPendingWorkflows , "queue_name" , queue .Name , "concurrency_limit" , concurrency )
13461337 }
13471338 availableTasks := max (concurrency - globalPendingWorkflows , 0 )
1348- if uint ( availableTasks ) < maxTasks {
1349- maxTasks = uint ( availableTasks )
1339+ if availableTasks < maxTasks {
1340+ maxTasks = availableTasks
13501341 }
13511342 }
13521343 }
@@ -1383,8 +1374,7 @@ func (s *systemDatabase) DequeueWorkflows(ctx context.Context, queue WorkflowQue
13831374 %s` , lockClause )
13841375 }
13851376
1386- // Add limit if maxTasks is finite
1387- if maxTasks > 0 {
1377+ if maxTasks >= 0 {
13881378 query += fmt .Sprintf (" LIMIT %d" , int (maxTasks ))
13891379 }
13901380
0 commit comments