根据zumero_sync
的文档:
如果需要从服务器中提取大量信息, 可能需要多次调用此函数。
在我使用Zumero的Android应用程序中没有问题;我一直在调用zumero_sync
,直到返回值不以"0;"
开头。
但是,现在我正在尝试编写一个也与我的服务器dbfiles同步的管理脚本。我想使用sqlite3
shell,让脚本通过命令行参数传递SQL来执行。我需要在循环中调用zumero_sync
(SQLite不支持)以确保db完全同步。如果必须,我可以在一个循环中调用sqlite3
(读取它的输出,寻找"0;"
),或者甚至编写一个C ++应用程序来本地调用SQLite / Zumero函数。但如果单个zumero_sync
足够,那肯定会更容易。
我想我的真正问题是:可以zumero_sync
更改,以便在返回之前完成同步吗?如果存在现有行为更有用的情况,可能会有一个参数来指定使用哪种模式?
答案 0 :(得分:4)
我在这里看到两个基本问题:
(1)为什么zumero_sync()按照它的方式工作?
(2)它能以不同的方式工作吗?
我首先回答(2),因为它更容易:是的,它可以有所不同。相反,我们可以(也可能很快就会提到这个)实现一个额外的函数,命名为zumero_sync_complete(),它在循环中执行zumero_sync()的guts,并在同步完成后返回。 / p>
我们没有实现zumero_sync_complete(),因为它没有添加太多值。这是一个简单的循环,所以你可以自己编写它。 : - )
呃,除了不支持循环的脚本环境。就像sqlite3 shell一样。
回答(1):
Zumero同步协议旨在为服务器提供灵活性,以便在需要时返回部分结果。并且为了减少服务器上的负载(并增加其可伸缩性),它通常 想要完全这样做。
鉴于此,将此暴露给客户的一个原因是增加客户的灵活性。只要我们进行多次往返,我们也可以让客户有机会在它们之间做一些事情(比如,可能更新进度条)。
客户端在循环迭代之间可能想要做的另一件事是处理错误。
或者,对于多线程客户端,它可能希望处理同步进行时客户端上发生的更改。
这提出了如何管理锁定的问题?我们在整个循环中持有sqlite写锁吗?或者只有在绝对必要时?
结论:强大的应用程序可能希望实现循环本身,以便它可以做出自己的决定并保持对事物的完全控制。
但是,正如您所观察到的,sqlite3 shell没有循环。它不是一个应用程序。它没有线程。或者进度条。所以这是一个用例,其中zumero_sync()的一种简单且不那么强大的形式是有意义的。