C++ 实现数据库版本升级接口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/csenjoy/article/details/88060981

一、应用场景

         随着需求的变化,数据库表结构可能发生改变,这个时候就需要对数据库文件进行升级。抽象接口如下:

//注:class IDataBase;
//typdef shared_prt<IDataBase> SPIDataBase;

class IDBVersion;
class IDBVersionFactory;
typedef shared_ptr<IDBVersion> SPIDBVersion;
typedef shared_ptr<IDBVersionFactory> SPIDBVersion;
class IDBVersion
{
public:
    virtual ~IDBVersion() {}
    //创建该版本的数据库
    virtual bool OnCreate(SPIDataBase spDb) = 0;
    //升级到当前版本,初始化版本数据库不需要升级
    virtual bool Upgrade(SPIDataBase spDb) = 0;
}

//提供抽象工厂模式,扩展数据库版本升级
//升级数据库时,提供对应版本升级实现方法以及对应创建Factory对象
//此时,不需要更改客户代码,就能完成数据库版本升级
class IDBVersionFactory
{
public:
  virtual ~IDBVersionFactory(){}
  virtual SPIDBVersion ProduceVersion() = 0;
}

升级数据库版本,需要提供对应版本对此接口的实现

//提供函数接口获取对应版本IDBVersion
class CDBVersion1;   //......实现略
class CDBVersionFactory1;//......实现略
class CDBVersion2;//......实现略
class CDBVersionFactory2;//......实现略

SPIDBVersion GetSuitableVersion(const int iVersion)
{
   SPIDBVersionFactory spFactory;
   SPIDBVersion spVersion;
   switch(iVersion)
    {
        case 1:
        {
            spFactory = SPIDBVersionFactory(new CDBVersionFactory1);
            if(spFactory)
            {
                spVerion = spFactory->ProduceVersion();
            }
        }
        break;
        case 2:
        {
            spFactory = SPIDBVersionFactory(new CDBVersionFactory2);
            if(spFactory)
            {
                spVerion = spFactory->ProduceVersion();
            }
        }
        break;

        default:
        {   
            spFactory = SPIDBVersionFactory(new CDBVersionFactory1);
            if(spFactory)
            {
                spVerion = spFactory->ProduceVersion();
            }
        }
        break;
    }
}

  数据版本升级主逻辑:

bool OpenDB(void *param)
{
   SPIDataBase spDb;
   int iVersion, iOldVersion, iNewVersion;
   //param参数用于实例化 数据库对象
   //......省略步骤
   //......省略数据库当前版本,和历史版本获取
   assert(spDb);

   //iOldVersion,读取数据获取,如果不存在数据库则iOldVersion将赋值为初始化版本1
   SPIDBVersion spVersion = GetSuitableVersion(iOldVersion);
   assert(spVersion);
   spVersion->OnCreate(spDb);//创建表操作,不存在则创建

   for(iVersion = iOldVersion + 1; iVersion <= iNewVersion; ++iVersion)
   {
        spVersion = GetSuitableVersioin(iVersion);
        assert(spVersion);
        spVersion->Upgrade(spDb);
   }

    return true;
}

最后:今后完成数据库版本升级时,需要新版本的实现以及工厂类:提供前一个版本升级到后一个版本的升级方法。修改SPIDBVersion GetSuitableVersion(const int iVersion)接口,即完成版本升级

猜你喜欢

转载自blog.csdn.net/csenjoy/article/details/88060981
今日推荐