package sqlite import ( "context" "database/sql" "go.temporal.io/api/serviceerror" "go.temporal.io/server/common/persistence/sql/sqlplugin" ) const ( getTaskMinMaxQry = `SELECT task_id, data, data_encoding ` + `FROM tasks ` + `WHERE range_hash = ? AND task_queue_id = ? AND task_id >= ? AND task_id < ? ` + ` ORDER BY task_id LIMIT ?` getTaskMinQry = `SELECT task_id, data, data_encoding ` + `FROM tasks ` + `WHERE range_hash = ? AND task_queue_id = ? AND task_id >= ? ORDER BY task_id LIMIT ?` createTaskQry = `INSERT INTO ` + `tasks(range_hash, task_queue_id, task_id, data, data_encoding) ` + `VALUES(:range_hash, :task_queue_id, :task_id, :data, :data_encoding)` // deleteTaskQry = `DELETE FROM tasks ` + // `WHERE range_hash = ? AND task_queue_id = ? AND task_id = ?` rangeDeleteTaskQry = `DELETE FROM tasks ` + `WHERE range_hash = ? AND task_queue_id = ? AND task_id IN (SELECT task_id FROM tasks WHERE range_hash = ? AND task_queue_id = ? AND task_id < ? ` + `ORDER BY task_queue_id,task_id LIMIT ? ) ` ) // InsertIntoTasks inserts one or more rows into tasks table func (mdb *db) InsertIntoTasks( ctx context.Context, rows []sqlplugin.TasksRow, ) (sql.Result, error) { return mdb.conn.NamedExecContext(ctx, createTaskQry, rows, ) } // SelectFromTasks reads one or more rows from tasks table func (mdb *db) SelectFromTasks( ctx context.Context, filter sqlplugin.TasksFilter, ) ([]sqlplugin.TasksRow, error) { var err error var rows []sqlplugin.TasksRow switch { case filter.ExclusiveMaxTaskID != nil: err = mdb.conn.SelectContext(ctx, &rows, getTaskMinMaxQry, filter.RangeHash, filter.TaskQueueID, *filter.InclusiveMinTaskID, *filter.ExclusiveMaxTaskID, *filter.PageSize, ) default: err = mdb.conn.SelectContext(ctx, &rows, getTaskMinQry, filter.RangeHash, filter.TaskQueueID, *filter.ExclusiveMaxTaskID, *filter.PageSize, ) } if err != nil { return nil, err } return rows, nil } // DeleteFromTasks deletes one or more rows from tasks table func (mdb *db) DeleteFromTasks( ctx context.Context, filter sqlplugin.TasksFilter, ) (sql.Result, error) { if filter.ExclusiveMaxTaskID == nil { return nil, serviceerror.NewInternal("missing ExclusiveMaxTaskID parameter") } if filter.Limit == nil || *filter.Limit == 0 { return nil, serviceerror.NewInternal("missing limit parameter") } return mdb.conn.ExecContext(ctx, rangeDeleteTaskQry, filter.RangeHash, filter.TaskQueueID, filter.RangeHash, filter.TaskQueueID, *filter.ExclusiveMaxTaskID, *filter.Limit, ) }