zoukankan      html  css  js  c++  java
  • 数据同步管理器设计备忘录

    数据同步管理器设计备忘录

    转载时请注明出处和作者联系方式
    作者联系方式:李先静 <xianjimli at hotmail dot com>

    在设计数据同步管理器时,主要考虑到与不同的PC工具和服务器同步,提高与其它手机的互通性的,方便与第三方合作开发一些增值服务。其基本架构如下



    SyncSource: 是对数据源的抽象,它提供获取数据对象和更新对象的接口。常见的数据源有名片、日程、短信、彩信、邮件、相片、录音和记事等等。这个本来是很简单的东西,但为了实现快同步,每次只传输变化的数据,要手机端记录ChangeLog,就变得有点麻烦了。


    对于数据库记录的同步。每条记录要增加创建时间和最后修改时间字段,有了这两个字段,我们可以根据最后同步时间生成新增记录和修改记录两个集合。要生成删除记录集合,我们还要增加一个表,并为每个表增加一个删除触发器。在删除记录时,把表名、ID和删除时间加到删除表中,据此我们就可以得到删除集合了。


    对于文件类的同步。我们在目录里放一个索引文件,里面记录文件的创建时间和删除时间,文件ID和文件名的对应关系。修改时间可以通过stat取到,就不用记录了。同样根据最后同步时间我们可以得到新增,修改,删除和正常四个集合。


    SyncSource是插件的方式提供的,增加新的SyncSource只要按这个接口提供一个动态库就行了。它的接口如下:


    typedef SyncRet (*SyncSrcRefFunc)(SyncSrc* thiz);

    typedef SyncRet (
    *SyncSrcUnrefFunc)(SyncSrc* thiz);

    typedef SyncID (
    *SyncSrcGetIDFunc)(SyncSrc* thiz);

    typedef 
    const char* (*SyncSrcGetTypeFunc)(SyncSrc* thiz);

    typedef 
    const char* (*SyncSrcGetNameFunc)(SyncSrc* thiz);

    typedef 
    const char* (*SyncSourceGetURLFunc)(SyncSrc* thiz);

    typedef 
    const char* (*SyncSourceGetDescFunc)(SyncSrc* thiz);

    typedef size_t (
    *SyncSrcGetAllNrFunc)(SyncSrc* thiz);

    typedef size_t (
    *SyncSrcGetDeletedNrFunc)(SyncSrc* thiz);

    typedef size_t (
    *SyncSrcGetModifiedNrFunc)(SyncSrc* thiz);

    typedef size_t (
    *SyncSrcGetNewNrFunc)(SyncSrc* thiz);

    typedef SyncObject
    * (*SyncSrcGetObjectFunc)(SyncSrc* thiz, SyncObjectType type, size_t index);

    typedef SyncRet (
    *SyncSrcSetObjectFunc)(SyncSrc* thiz, SyncObject* object);

    typedef SyncRet (
    *SyncSrcAddObjectFunc)(SyncSrc* thiz, SyncObject* object);

    typedef SyncRet (
    *SyncSrcUpdateObjectFunc)(SyncSrc* thiz, SyncObject* object);

    typedef SyncRet (
    *SyncSrcDeleteObjectFunc)(SyncSrc* thiz, SyncObject* object);

    typedef SyncRet (
    *SyncSrcBeginSyncFunc)(SyncSrc* thiz, SyncKind type, time_t last_sync, SyncDataFilter* filter);

    typedef SyncRet (
    *SyncSrcEndSyncFunc)(SyncSrc* thiz, SyncRet result);

    typedef SyncObject
    * (*SyncSrcCreateObjectFunc)(SyncSrc* thiz);

    struct _SyncSrc

    {

    SyncSrcRefFunc 
    ref;

    SyncSrcUnrefFunc unref;

    SyncSrcGetIDFunc get_id;

    SyncSrcGetTypeFunc get_type;

    SyncSrcGetNameFunc get_name;

    SyncSourceGetURLFunc get_url;

    SyncSourceGetDescFunc get_desc;

    SyncSrcBeginSyncFunc begin_sync;

    SyncSrcEndSyncFunc end_sync;

    SyncSrcGetAllNrFunc get_all_nr;

    SyncSrcGetDeletedNrFunc get_deleted_nr;

    SyncSrcGetModifiedNrFunc get_modified_nr;

    SyncSrcGetNewNrFunc get_new_nr;

    SyncSrcGetObjectFunc get_object;

    SyncSrcSetObjectFunc set_object;

    SyncSrcAddObjectFunc add_object;

    SyncSrcUpdateObjectFunc update_object;

    SyncSrcDeleteObjectFunc delete_object;

    SyncSrcCreateObjectFunc create_object;


    char priv[0];

    }
    ;


    SyncEngine: 是对具体同步方式的抽象。比如TCard备份是一个简单的engine,在备份时,它把SyncSource提供的数据存到TCard中,在恢复时,从Tcard中取出数据,并把数据存到 SyncSource中。Sync4JEngine负责通过SyncMLfunambol服务器同步。ActiveSyncEngine负责与ActiveSync同步。第三方增加新的同步方式只要实现下面的接口:


    typedef SyncRet     (*SyncEngineRefFunc)(SyncEngine* thiz);
    typedef SyncRet     (
    *SyncEngineUnrefFunc)(SyncEngine* thiz);
    typedef SyncID      (
    *SyncEngineGetIDFunc)(SyncEngine* thiz);
    typedef 
    const char* (*SyncEngineGetNameFunc)(SyncEngine* thiz);
    typedef SyncRet     (
    *SyncEngineBeginSyncFunc)(SyncEngine* thiz, SyncPartnerConfig* partner_config, SyncDataFilter* filter);
    typedef SyncRet     (
    *SyncEngineSyncFunc)(SyncEngine* thiz, SyncSrc* source, time_t last_sync, SyncKind type);
    typedef SyncRet     (
    *SyncEngineCancelFunc)(SyncEngine* thiz);
    typedef SyncRet     (
    *SyncEngineEndSyncFunc)(SyncEngine* thiz);
    typedef SyncRet     (
    *SyncEngineRegEventListenerFunc)(SyncEngine* thiz, SyncOnEventFunc on_event, void* ctx);
    typedef SyncRet     (
    *SyncEngineRegProgressListenerFunc)(SyncEngine* thiz, SyncOnProgressFunc on_progress, void* ctx);

    struct _SyncEngine
    {
            SyncEngineRefFunc                  
    ref;
            SyncEngineUnrefFunc                unref;
            SyncEngineGetIDFunc                get_id;
            SyncEngineGetNameFunc              get_name;
            SyncEngineBeginSyncFunc            begin_sync;
            SyncEngineSyncFunc                 sync;
            SyncEngineCancelFunc               cancel;
            SyncEngineEndSyncFunc              end_sync;
            SyncEngineRegEventListenerFunc     reg_event_listener;
            SyncEngineRegProgressListenerFunc  reg_progress_listener;

            
    char priv[0];
    }
    ;

    SyncEngineSettings主要负责SyncEngine的设置,每个SyncEngine插件都要提供一个SyncEngineSettings插件,SyncEngineSettings是和GUI相关的,所以与SyneEngine分开提供。SyncEngineSettings的接口很简单:


    struct _SyncEngineSettings;
    typedef 
    struct _SyncEngineSettings SyncEngineSettings;

    typedef SyncID (
    *SyncEngineSettingsGetIDFunc)(SyncEngineSettings* thiz);
    typedef 
    const char* (*SyncEngineSettingsGetNameFunc)(SyncEngineSettings* thiz);
    typedef SyncRet (
    *SyncEngineSettingsEditPartnerFunc)(SyncEngineSettings* thiz, SyncPartnerConfig* partner_config, SyncSettingsEditDoneFunc done, void* ctx);
    typedef SyncRet (
    *SyncEngineSettingsRefFunc)(SyncEngineSettings* thiz);
    typedef SyncRet (
    *SyncEngineSettingsUnrefFunc)(SyncEngineSettings* thiz);

    struct _SyncEngineSettings
    {
            SyncEngineSettingsRefFunc          
    ref;
            SyncEngineSettingsUnrefFunc        unref;
            SyncEngineSettingsGetIDFunc        get_id;
            SyncEngineSettingsGetNameFunc      get_name;
            SyncEngineSettingsEditPartnerFunc  edit_partner;

            
    char priv[0];
    }
    ;


    ~~end~~




  • 相关阅读:
    PostgreSQL数据库逻辑复制实践
    CentOS7通过yum安装postgreSQL
    MongoDB动态建表方案(官方原生驱动)
    7大常用开源数据库利弊全对比
    错误:由于系统时间错误证书验证失败导致更新不成功
    deppin更新提示“由于没有公钥,无法验证下列签名”
    Debian 9 Vim无法使用鼠标右键复制 解决方法
    PHP版滑动时间窗口算法
    RabbitMQ PHP 代码示例
    创建或修改 docker 容器内部文件
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167654.html
Copyright © 2011-2022 走看看