数据同步管理器设计备忘录
转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>
在设计数据同步管理器时,主要考虑到与不同的PC工具和服务器同步,提高与其它手机的互通性的,方便与第三方合作开发一些增值服务。其基本架构如下
![](https://p-blog.csdn.net/images/p_blog_csdn_net/absurd/228428/o_SyncManager.jpeg)
SyncSource: 是对数据源的抽象,它提供获取数据对象和更新对象的接口。常见的数据源有名片、日程、短信、彩信、邮件、相片、录音和记事等等。这个本来是很简单的东西,但为了实现快同步,每次只传输变化的数据,要手机端记录ChangeLog,就变得有点麻烦了。
对于数据库记录的同步。每条记录要增加创建时间和最后修改时间字段,有了这两个字段,我们可以根据最后同步时间生成新增记录和修改记录两个集合。要生成删除记录集合,我们还要增加一个表,并为每个表增加一个删除触发器。在删除记录时,把表名、ID和删除时间加到删除表中,据此我们就可以得到删除集合了。
对于文件类的同步。我们在目录里放一个索引文件,里面记录文件的创建时间和删除时间,文件ID和文件名的对应关系。修改时间可以通过stat取到,就不用记录了。同样根据最后同步时间我们可以得到新增,修改,删除和正常四个集合。
SyncSource是插件的方式提供的,增加新的SyncSource只要按这个接口提供一个动态库就行了。它的接口如下:
typedef SyncRet (
*
SyncSrcRefFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef SyncRet (
*
SyncSrcUnrefFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef SyncID (
*
SyncSrcGetIDFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef
const
char
*
(
*
SyncSrcGetTypeFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef
const
char
*
(
*
SyncSrcGetNameFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef
const
char
*
(
*
SyncSourceGetURLFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef
const
char
*
(
*
SyncSourceGetDescFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef size_t (
*
SyncSrcGetAllNrFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef size_t (
*
SyncSrcGetDeletedNrFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef size_t (
*
SyncSrcGetModifiedNrFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef size_t (
*
SyncSrcGetNewNrFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef SyncObject
*
(
*
SyncSrcGetObjectFunc)(SyncSrc
*
thiz, SyncObjectType type, size_t index);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef SyncRet (
*
SyncSrcSetObjectFunc)(SyncSrc
*
thiz, SyncObject
*
object
);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef SyncRet (
*
SyncSrcAddObjectFunc)(SyncSrc
*
thiz, SyncObject
*
object
);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef SyncRet (
*
SyncSrcUpdateObjectFunc)(SyncSrc
*
thiz, SyncObject
*
object
);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef SyncRet (
*
SyncSrcDeleteObjectFunc)(SyncSrc
*
thiz, SyncObject
*
object
);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef SyncRet (
*
SyncSrcBeginSyncFunc)(SyncSrc
*
thiz, SyncKind type, time_t last_sync, SyncDataFilter
*
filter);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef SyncRet (
*
SyncSrcEndSyncFunc)(SyncSrc
*
thiz, SyncRet result);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef SyncObject
*
(
*
SyncSrcCreateObjectFunc)(SyncSrc
*
thiz);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
_SyncSrc
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcRefFunc ref;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcUnrefFunc unref;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcGetIDFunc get_id;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcGetTypeFunc get_type;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcGetNameFunc get_name;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSourceGetURLFunc get_url;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSourceGetDescFunc get_desc;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcBeginSyncFunc begin_sync;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcEndSyncFunc end_sync;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcGetAllNrFunc get_all_nr;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcGetDeletedNrFunc get_deleted_nr;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcGetModifiedNrFunc get_modified_nr;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcGetNewNrFunc get_new_nr;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcGetObjectFunc get_object;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcSetObjectFunc set_object;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcAddObjectFunc add_object;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcUpdateObjectFunc update_object;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcDeleteObjectFunc delete_object;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SyncSrcCreateObjectFunc create_object;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
char priv[0];
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
SyncEngine: 是对具体同步方式的抽象。比如TCard备份是一个简单的engine,在备份时,它把SyncSource提供的数据存到TCard中,在恢复时,从Tcard中取出数据,并把数据存到 SyncSource中。Sync4JEngine负责通过SyncML与funambol服务器同步。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);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
_SyncEngine
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
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;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
char priv[0];
}
;
SyncEngineSettings主要负责SyncEngine的设置,每个SyncEngine插件都要提供一个SyncEngineSettings插件,SyncEngineSettings是和GUI相关的,所以与SyneEngine分开提供。SyncEngineSettings的接口很简单:
struct
_SyncEngineSettings;
typedef
struct
_SyncEngineSettings SyncEngineSettings;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
_SyncEngineSettings
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
SyncEngineSettingsRefFunc ref;
SyncEngineSettingsUnrefFunc unref;
SyncEngineSettingsGetIDFunc get_id;
SyncEngineSettingsGetNameFunc get_name;
SyncEngineSettingsEditPartnerFunc edit_partner;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
char priv[0];
}
;
~~end~~