package org.ovirt.engine.core.dao; import java.util.Collection; import java.util.List; import javax.inject.Named; import javax.inject.Singleton; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; import org.ovirt.engine.core.common.businessentities.AsyncTask; import org.ovirt.engine.core.common.businessentities.AsyncTaskEntity; import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.CustomMapSqlParameterSource; import org.ovirt.engine.core.dal.dbbroker.DbEngineDialect; import org.ovirt.engine.core.dal.dbbroker.DbFacadeUtils; import org.ovirt.engine.core.dal.dbbroker.MapSqlParameterMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; /** * {@code AsyncTaskDaoImpl} provides an implementation of {@link AsyncTaskDao}. */ @Named @Singleton public class AsyncTaskDaoImpl extends BaseDao implements AsyncTaskDao { private static final Logger log = LoggerFactory.getLogger(AsyncTaskDaoImpl.class); private static final RowMapper<Guid> idRowMapper = (rs, rowNum) -> getGuidDefaultEmpty(rs, "id"); private static final RowMapper<AsyncTaskEntity> asyncTaskEntityRowMapper = (rs, rowNum) -> { AsyncTaskEntity entity = new AsyncTaskEntity(); entity.setEntityId(getGuid(rs, "entity_id")); entity.setTaskId(getGuid(rs, "async_task_id")); entity.setEntityType(VdcObjectType.valueOf(rs.getString("entity_type"))); return entity; }; private static final RowMapper<AsyncTask> asyncTaskRowMapper = (rs, rowNum) -> { AsyncTask entity = new AsyncTask(); entity.setresult(AsyncTaskResultEnum.forValue(rs.getInt("result"))); entity.setstatus(AsyncTaskStatusEnum.forValue(rs.getInt("status"))); entity.setUserId(getGuidDefaultEmpty(rs, "user_id")); entity.setTaskId(getGuidDefaultEmpty(rs, "task_id")); entity.setVdsmTaskId(getGuid(rs, "vdsm_task_id")); entity.setStepId(getGuid(rs, "step_id")); entity.setCommandId(getGuidDefaultEmpty(rs, "command_id")); entity.setRootCommandId(getGuidDefaultEmpty(rs, "root_command_id")); entity.setStartTime(DbFacadeUtils.fromDate(rs.getTimestamp("started_at"))); entity.setTaskType(AsyncTaskType.forValue(rs.getInt("task_type"))); entity.setStoragePoolId(getGuidDefaultEmpty(rs, "storage_pool_id")); return entity; }; private static class AsyncTaskParameterSource extends CustomMapSqlParameterSource { public AsyncTaskParameterSource(DbEngineDialect dialect, AsyncTask task) { super(dialect); addValue("action_type", task.getActionType()); addValue("result", task.getresult()); addValue("status", task.getstatus()); addValue("vdsm_task_id", task.getVdsmTaskId()); addValue("user_id", task.getUserId()); addValue("task_id", task.getTaskId()); addValue("step_id", task.getStepId()); addValue("command_id", task.getCommandId()); addValue("root_command_id", task.getRootCommandId()); } } private MapSqlParameterMapper<AsyncTaskEntity> mapper = entity -> { CustomMapSqlParameterSource paramSource = getCustomMapSqlParameterSource(); paramSource.addValue("task_id", entity.getTaskId()). addValue("entity_id", entity.getEntityId()). addValue("entity_type", entity.getEntityType().toString()); return paramSource; }; @Override public AsyncTask get(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("task_id", id); return getCallsHandler().executeRead("Getasync_tasksBytask_id", asyncTaskRowMapper, parameterSource); } @Override public AsyncTask getByVdsmTaskId(Guid vdsmTaskId) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vdsm_task_id", vdsmTaskId); return getCallsHandler().executeRead("GetAsyncTasksByVdsmTaskId", asyncTaskRowMapper, parameterSource); } @Override public List<AsyncTask> getAll() { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource(); return getCallsHandler().executeReadList("GetAllFromasync_tasks", asyncTaskRowMapper, parameterSource); } private AsyncTaskParameterSource getTaskParameterSource(AsyncTask task) { return new AsyncTaskParameterSource(getDialect(), task); } @Override public void saveOrUpdate(AsyncTask task) { AsyncTaskParameterSource parameterSource = getTaskParameterSource(task); parameterSource.addValue("started_at", task.getStartTime()); parameterSource.addValue("storage_pool_id", task.getStoragePoolId()); parameterSource.addValue("async_task_type", task.getTaskType()); getCallsHandler().executeModification("InsertOrUpdateAsyncTasks", parameterSource); } @Override public void save(AsyncTask task) { AsyncTaskParameterSource parameterSource = getTaskParameterSource(task); parameterSource.addValue("started_at", task.getStartTime()); parameterSource.addValue("storage_pool_id", task.getStoragePoolId()); parameterSource.addValue("async_task_type", task.getTaskType()); getCallsHandler().executeModification("Insertasync_tasks", parameterSource); } @Override public void update(AsyncTask task) { logNullParameters(task); AsyncTaskParameterSource parameterSource = getTaskParameterSource(task); parameterSource.addValue("storage_pool_id", task.getStoragePoolId()); getCallsHandler().executeModification("Updateasync_tasks", parameterSource); } private static void logNullParameters(AsyncTask task) { if (task.getActionParameters() == null) { StringBuilder sb = new StringBuilder("Null action_parameters:\n"); StackTraceElement[] st = Thread.currentThread().getStackTrace(); for (StackTraceElement element : st) { sb.append(String.format("\tMethod: %1$s%n", element.getMethodName())); } log.error(sb.toString()); } } @Override public int remove(Guid id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("task_id", id); return getCallsHandler().executeModificationReturnResult("Deleteasync_tasks", parameterSource); } public int removeByVdsmTaskId(Guid vdsmTaskId) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("vdsm_task_id", vdsmTaskId); return getCallsHandler().executeModificationReturnResult("DeleteAsyncTasksByVdsmTaskId", parameterSource); } @Override public List<Guid> getAsyncTaskIdsByEntity(Guid entityId) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("entity_id", entityId); return getCallsHandler().executeReadList("GetAsyncTasksIdsByEntityId", idRowMapper, parameterSource); } @Override public List<Guid> getAsyncTaskIdsByStoragePoolId(Guid storagePoolId) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("storage_pool_id", storagePoolId); return getCallsHandler().executeReadList("GetAsyncTasksByStoragePoolId", idRowMapper, parameterSource); } @Override public List<AsyncTask> getTasksByEntity(Guid entityId) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("entity_id", entityId); return getCallsHandler().executeReadList("GetAsyncTasksByEntityId", asyncTaskRowMapper, parameterSource); } @Override public void insertAsyncTaskEntities(Collection<AsyncTaskEntity> asyncTaskEntities) { getCallsHandler().executeStoredProcAsBatch("InsertAsyncTaskEntities", asyncTaskEntities, mapper); } @Override public List<AsyncTaskEntity> getAllAsyncTaskEntitiesByTaskId(Guid taskId) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("task_id", taskId); return getCallsHandler().executeReadList("GetAsyncTaskEntitiesByTaskId", asyncTaskEntityRowMapper, parameterSource); } }