/*GRB*
Gerbera - https://gerbera.io/
sql_migration.h - this file is part of Gerbera.
Copyright (C) 2026 Gerbera Contributors
Gerbera is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
Gerbera is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Gerbera. If not, see .
$Id$
*/
/// @file database/sql_migration.h
#ifndef __SQL_MIGRATION_H__
#define __SQL_MIGRATION_H__
#include "sql_database.h"
template
class EnumColumnMapper;
enum class BrowseColumn;
enum class MetadataColumn;
enum class ResourceColumn;
enum class ResourceDataType;
#define RESOURCE_SEP '|'
// @brief utility class for database migrations
class SQLMigration {
private:
/// @brief Back reference to database
std::shared_ptr database;
/// @brief handling of cds_object columns
std::shared_ptr> browseColumnMapper;
/// @brief handling of meta_data columns
std::shared_ptr> metaColumnMapper;
/// @brief handling of resource columns
std::shared_ptr> resColumnMapper;
/// @brief generator commands for resources
std::map addResourceColumnCmd;
public:
/// @brief constructor
SQLMigration(
std::shared_ptr database,
std::shared_ptr> browseColumnMapper,
std::shared_ptr> metaColumnMapper,
std::shared_ptr> resColumnMapper,
std::map addResourceColumnCmd)
: database(std::move(database))
, browseColumnMapper(std::move(browseColumnMapper))
, metaColumnMapper(std::move(metaColumnMapper))
, resColumnMapper(std::move(resColumnMapper))
, addResourceColumnCmd(std::move(addResourceColumnCmd))
{
}
/// @brief upgrade database version by applying migration commands
void upgradeDatabase(
unsigned int dbVersion,
const std::map& hashies,
const fs::path& upgradeFile,
std::string_view updateVersionCommand,
std::size_t firstDBVersion,
unsigned int stringLimit);
private:
/// @brief migrate metadata from mt_cds_objects to mt_metadata before removing the column (DBVERSION 12)
bool doMetadataMigration();
/// @brief migrate metadata for cdsObject
void migrateMetadata(int objectId, const std::string& metadataStr);
/// @brief Add a column to resource table for each defined resource attribute
void prepareResourceTable();
/// @brief migrate resources from mt_cds_objects to grb_resource before removing the column (DBVERSION 13)
bool doResourceMigration();
/// @brief migrate resource data for cdsObject
void migrateResources(int objectId, const std::string& resourcesStr);
/// @brief drop prefix from location
bool doLocationMigration();
/// @brief migrate a location for cdsObject
void migrateLocation(int objectId, const std::string& location);
};
#endif