package org.ovirt.engine.core.dao;
import java.util.Date;
import java.util.List;
import javax.inject.Named;
import javax.inject.Singleton;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.storage.ImageFileType;
import org.ovirt.engine.core.common.businessentities.storage.RepoImage;
import org.ovirt.engine.core.compat.Guid;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
/**
* {@code RepoFileMetaDataDaoImpl} provides an implementation of {@link RepoFileMetaDataDao}.
* It is Responsible for managing the repository files meta data via the persistent layer.
*/
@Named
@Singleton
public class RepoFileMetaDataDaoImpl extends BaseDao implements RepoFileMetaDataDao {
@Override
public void removeRepoDomainFileList(Guid id, ImageFileType fileType) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("storage_domain_id", id);
if (fileType == null || fileType == ImageFileType.All) {
parameterSource.addValue("file_type", null);
} else {
parameterSource.addValue("file_type", fileType.getValue());
}
getCallsHandler().executeModification("DeleteRepo_domain_file_list", parameterSource);
}
@Override
public void addRepoFileMap(RepoImage map) {
MapSqlParameterSource parameterSource =
getCustomMapSqlParameterSource().addValue("repo_domain_id", map.getRepoDomainId())
.addValue("repo_image_id", map.getRepoImageId())
.addValue("repo_image_name", map.getRepoImageName())
.addValue("size", map.getSize())
.addValue("date_created", map.getDateCreated())
.addValue("last_refreshed", map.getLastRefreshed())
.addValue("file_type", map.getFileType().getValue());
getCallsHandler().executeModification("InsertRepo_domain_file_meta_data", parameterSource);
}
/**
* Returns a list of repository files with specific file extension from storage domain id.<BR/>
* If no repository is found, the method will return an empty list.
*/
@Override
public List<RepoImage> getRepoListForStorageDomain(Guid storageDomainId,
ImageFileType fileType) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("storage_domain_id", storageDomainId);
if (fileType == null || fileType == ImageFileType.All) {
parameterSource.addValue("file_type", null);
} else {
parameterSource.addValue("file_type", fileType.getValue());
}
return getCallsHandler().executeReadList("GetRepo_files_by_storage_domain", repoImageMapper, parameterSource);
}
/**
* Returns a list of all repository files with specific file extension from all the storage pools,
* which meet the same status, type and SPM status.
*/
@Override
public List<RepoImage> getAllRepoFilesForAllStoragePools(StorageDomainType storageDomainType,
StoragePoolStatus storagePoolStatus, StorageDomainStatus storageDomainStatus,
VDSStatus vdsStatus) {
MapSqlParameterSource parameterSource =
getCustomMapSqlParameterSource().addValue("storage_domain_type", storageDomainType.getValue());
parameterSource.addValue("storage_pool_status", storagePoolStatus.getValue());
parameterSource.addValue("vds_status", vdsStatus.getValue());
parameterSource.addValue("storage_domain_status", storageDomainStatus.getValue());
return getCallsHandler().executeReadList("GetRepo_files_in_all_storage_pools",
thinRepoImageMapper,
parameterSource);
}
private static final RowMapper<RepoImage> thinRepoImageMapper = (rs, rowNum) -> {
RepoImage entity = new RepoImage();
entity.setRepoDomainId(getGuidDefaultEmpty(rs, "storage_domain_id"));
entity.setLastRefreshed(rs.getLong("last_refreshed"));
entity.setFileType(ImageFileType.forValue(rs.getInt("file_type")));
return entity;
};
private static final RowMapper<RepoImage> repoImageMapper= (rs, rowNum) -> {
RepoImage entity = new RepoImage();
entity.setRepoDomainId(getGuidDefaultEmpty(rs, "repo_domain_id"));
entity.setRepoImageId(rs.getString("repo_image_id"));
entity.setRepoImageName(rs.getString("repo_image_name"));
entity.setSize((Long) rs.getObject("size"));
entity.setDateCreated((Date) rs.getObject("date_created"));
entity.setLastRefreshed(rs.getLong("last_refreshed"));
entity.setFileType(ImageFileType.forValue(rs.getInt("file_type")));
return entity;
};
}