现在的位置: 首页 > 综合 > 正文

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

2014年04月28日 ⁄ 综合 ⁄ 共 5043字 ⁄ 字号 评论关闭

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

转载时请注明出处和作者联系方式
作者联系方式:李先静 <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~~




抱歉!评论已关闭.