Wiki » History » Version 36
Tomek Dziemidowicz, 2019-07-18 09:05 PM
1 | 2 | Tomek Dziemidowicz | h1. SQLite-sync documentation |
---|---|---|---|
2 | |||
3 | *Owner* : AMPLIFIER sp. z o.o. |
||
4 | *Contact* : support (at) ampliapps.com |
||
5 | *website* : https://ampliapps.com |
||
6 | |||
7 | 3 | Tomek Dziemidowicz | {{>toc}} |
8 | |||
9 | 9 | Tomek Dziemidowicz | Welcome to the AMPLI-SYNC documentation! |
10 | We have language bindings in JavaScript, .NET C#, Java and Objective-C! |
||
11 | 1 | Tomek Dziemidowicz | |
12 | 9 | Tomek Dziemidowicz | h2. AMPLI-SYNC concept |
13 | |||
14 | h3. Solution diagram |
||
15 | |||
16 | 8 | Tomek Dziemidowicz | !{width:700px}SQLite-sync-structure.png! |
17 | 1 | Tomek Dziemidowicz | |
18 | 13 | Tomek Dziemidowicz | * Devices communicate with server using HTTP/HTTPS protocol. |
19 | * Proxy Load Balancer. If necessary, proxy can redirect request to another instance of SQLite-core. |
||
20 | * Authorization provider will generate token based on response from authorization provider. |
||
21 | 9 | Tomek Dziemidowicz | |
22 | h3. Proxy Balancer flowchart |
||
23 | |||
24 | !{width:400px}SQLite-sync-proxy-balancer.png! |
||
25 | |||
26 | h3. Authorization Provider flowchart |
||
27 | |||
28 | !{width:350px}SQLite-sync-authentication-process.png! |
||
29 | |||
30 | 2 | Tomek Dziemidowicz | h2. REST API (server API) |
31 | |||
32 | 10 | Tomek Dziemidowicz | h3. Protocol version |
33 | |||
34 | This document describes integration with the REST API 3.x protocol. |
||
35 | |||
36 | h3. Service description |
||
37 | |||
38 | There are two stages to processing a request: |
||
39 | |||
40 | 12 | Tomek Dziemidowicz | * Device places an request. |
41 | * SQLite-sync server confirms the request has been processed successfully and sends confirmation with eventual conflict list that need to be resolved. |
||
42 | 10 | Tomek Dziemidowicz | |
43 | 11 | Tomek Dziemidowicz | h3. Synchronization flowchart |
44 | |||
45 | !{width:200px;}Device-synchronization-diagram.png! |
||
46 | 10 | Tomek Dziemidowicz | |
47 | 23 | Tomek Dziemidowicz | h3. Request URL format |
48 | 22 | Tomek Dziemidowicz | |
49 | Sample REST API call: |
||
50 | <pre> |
||
51 | https://example.com/API3/__method___ |
||
52 | </pre> |
||
53 | Explanation: |
||
54 | *https://example.com/* - adres of REST API service |
||
55 | *API3* - version of synchronization |
||
56 | *__method___* - method/action |
||
57 | |||
58 | 24 | Tomek Dziemidowicz | h3. API methods |
59 | |||
60 | 28 | Tomek Dziemidowicz | h4. *API3* - control method |
61 | |||
62 | *Method* : GET |
||
63 | *Path* : “/API3” |
||
64 | *Produces* : TEXT_HTML |
||
65 | *Description* : control method. Returns “API[v3] SQLite-Sync.COM is working correctly!” if web service is correctly configured. |
||
66 | |||
67 | 29 | Tomek Dziemidowicz | h4. *InitializeSubscriber* - Reinitialize subscriber |
68 | 28 | Tomek Dziemidowicz | |
69 | *Method* : GET |
||
70 | *Path* : “/InitializeSubscriber/{subscriberUUID}” |
||
71 | *Produces* : TEXT_PLAIN |
||
72 | *Description* : Reinitialize subscriber, create empty schema on device, prepare master database for new subscriber. |
||
73 | |||
74 | Implementation examples: |
||
75 | 29 | Tomek Dziemidowicz | * [[InitializeSubscriber Objective-C]] |
76 | * [[InitializeSubscriber .NET C#]] |
||
77 | * [[InitializeSubscriber JAVA]] |
||
78 | * [[InitializeSubscriber JavaScript]] |
||
79 | 28 | Tomek Dziemidowicz | |
80 | 25 | Tomek Dziemidowicz | h4. *Sync* - gets changes for table |
81 | 26 | Tomek Dziemidowicz | |
82 | 1 | Tomek Dziemidowicz | *Method* : GET |
83 | 26 | Tomek Dziemidowicz | *Path* : /Sync/{subscriberUUID}/{tableName} |
84 | 1 | Tomek Dziemidowicz | *Produces* : TEXT_PLAIN |
85 | 26 | Tomek Dziemidowicz | *Description* : Get changed data. |
86 | Params: |
||
87 | 1 | Tomek Dziemidowicz | *subscriberUUID* - identifier of subscriber. By default device unique ID is used. But we can place there any value (also #user.UUID) |
88 | 26 | Tomek Dziemidowicz | *tableName* - name of table from database (without schema) |
89 | 1 | Tomek Dziemidowicz | Response: |
90 | 26 | Tomek Dziemidowicz | <pre><code class="xml"> |
91 | <?xml version="1.0" encoding="utf-8"?> |
||
92 | <records> |
||
93 | <r a="1"> |
||
94 | <c>2</c> |
||
95 | <c>Document</c> |
||
96 | <c>75541</c> |
||
97 | <c>2014-02-13 00:00:00</c> |
||
98 | <c>665.000</c> |
||
99 | <c>2c93d64e-cc72-11e3-87e0-f82fa8e587f9</c> |
||
100 | </r> |
||
101 | <r a="2"> |
||
102 | <c>4</c> |
||
103 | <c>Document 4</c> |
||
104 | <c>4879</c> |
||
105 | <c>2014-04-23 13:44:48</c> |
||
106 | <c>4875.000</c> |
||
107 | <c>2c93d765-cc72-11e3-87e0-f82fa8e587f9</c> |
||
108 | </r> |
||
109 | </records> |
||
110 | </code></pre> |
||
111 | <records> - section contains records |
||
112 | <r a=”1”> - here starts record. |
||
113 | </r> - here record ends |
||
114 | Attribute “a” (action type) |
||
115 | 1 - new record |
||
116 | 2 - update for record |
||
117 | 1 | Tomek Dziemidowicz | |
118 | 27 | Tomek Dziemidowicz | Implementation examples: |
119 | 26 | Tomek Dziemidowicz | * [[Objective-C]] |
120 | * [[.NET C#]] |
||
121 | * [[JAVA]] |
||
122 | * [[JavaScript]] |
||
123 | 25 | Tomek Dziemidowicz | |
124 | 34 | Tomek Dziemidowicz | h4. *CommitSync* - control method |
125 | 33 | Tomek Dziemidowicz | |
126 | *Method* : GET |
||
127 | *Path* : “/CommitSync/{syncId}” |
||
128 | *Produces* : TEXT_PLAIN |
||
129 | *Description* : If device recieved all changes without error this method should be call to tell server that there was no errors during receiving package. Params: *syncId* - id of data package |
||
130 | |||
131 | Implementation examples: |
||
132 | * [[CommitSync Objective-C]] |
||
133 | * [[CommitSync .NET C#]] |
||
134 | * [[CommitSync JAVA]] |
||
135 | * [[CommitSync JavaScript]] |
||
136 | |||
137 | 35 | Tomek Dziemidowicz | h4. *Send* - control method |
138 | |||
139 | 36 | Tomek Dziemidowicz | *Method* : POST |
140 | *Path* : “/Send” |
||
141 | *Consumes* : JSON |
||
142 | *Produces* : TEXT_PLAIN |
||
143 | *Description* : Send changes from device to master database. |
||
144 | 1 | Tomek Dziemidowicz | |
145 | 36 | Tomek Dziemidowicz | For sample data format with changes see XML code sample. |
146 | |||
147 | Implementation examples: |
||
148 | * [[Send Objective-C]] |
||
149 | * [[Send .NET C#]] |
||
150 | * [[Send JAVA]] |
||
151 | * [[Send JavaScript]] |
||
152 | 35 | Tomek Dziemidowicz | |
153 | 2 | Tomek Dziemidowicz | h2. Conflict Resolution |
154 | |||
155 | h2. Update procedure |
||
156 | |||
157 | h2. Data filtering |
||
158 | |||
159 | 1 | Tomek Dziemidowicz | h2. Installation |
160 | 9 | Tomek Dziemidowicz | |
161 | 18 | Tomek Dziemidowicz | h3. Server Prerequisites |
162 | |||
163 | To make ampli-sync server work you need: |
||
164 | * Apache Tomcat 8. |
||
165 | * Java |
||
166 | * Linux/Windows environment. |
||
167 | |||
168 | 9 | Tomek Dziemidowicz | h3. Manual |
169 | |||
170 | 14 | Tomek Dziemidowicz | Steps needed to install AMPLI-SYNC manually on Ubuntu. |
171 | |||
172 | 15 | Tomek Dziemidowicz | # Install Tomcat on Ubuntu: |
173 | 14 | Tomek Dziemidowicz | https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-8-on-ubuntu-16-04 |
174 | # Create new user |
||
175 | <pre> |
||
176 | sudo adduser amplisync |
||
177 | </pre> |
||
178 | System will ask you for password for newly created user. |
||
179 | # Add user to group ‘tomcat’ |
||
180 | <pre> |
||
181 | sudo usermod -a -G tomcat amplisync |
||
182 | </pre> |
||
183 | # Chang in web.xml path variable to |
||
184 | <pre> |
||
185 | \home/sqlitesync/demo |
||
186 | </pre> |
||
187 | # Install new application in Tomcat. Start with switching to amplisync user. |
||
188 | <pre> |
||
189 | su amplisync |
||
190 | </pre> |
||
191 | # Create new folder /home/sqlitesync/demo |
||
192 | 16 | Tomek Dziemidowicz | # Upload new service amplisync-demo to Tomcat. You can do that using Tomcat application manager, or you can put WAR file in Tomcat webapps folder. Name of your WAR file is app name in Tomcat environment. Remember to not place spaces and special chars in name of your WAR file. |
193 | 17 | Tomek Dziemidowicz | # Restart Tomcat: |
194 | 14 | Tomek Dziemidowicz | <pre> |
195 | service tomcat restart |
||
196 | </pre> |
||
197 | Now you can access your installation using link: |
||
198 | <pre> |
||
199 | http://your_ip:8080/amplisync-app-name/API3 |
||
200 | </pre> |
||
201 | # Setup permissions: |
||
202 | <pre> |
||
203 | chown -R sqlitesync:tomcat /home/amplisync/demo/ |
||
204 | </pre> |
||
205 | |||
206 | 9 | Tomek Dziemidowicz | h3. Docker |
207 | 2 | Tomek Dziemidowicz | |
208 | 20 | Tomek Dziemidowicz | h3. Configuring AMPLI-SYNC service |
209 | 19 | Tomek Dziemidowicz | |
210 | First you need to adjust website configuration file (web.xml), then you need to change main configuration file (sync.properties). |
||
211 | *Service configuration (web.xml)* |
||
212 | Go to your_webapps_folder/SqliteSync/WEB-INF/web.xml and open for edit. Navigate to section: |
||
213 | <pre><code class="xml"> |
||
214 | <env-entry> |
||
215 | <env-entry-name>working-dir</env-entry-name> |
||
216 | <env-entry-type>java.lang.String</env-entry-type> |
||
217 | <env-entry-value>/your/working/dir/sqlite-sync/</env-entry-value> |
||
218 | </env-entry> |
||
219 | </code></pre> |
||
220 | change env-entry-value key and point to working dir where SQLite-sync.com server will store log files, temporary files and configuration. Create manually a subfolder named config. Create a text file sync.properties in folder config. The path should look like this: |
||
221 | <pre> |
||
222 | \working_dir\config\sync.properties |
||
223 | </pre> |
||
224 | *IMPORTANT* Restart service after changing web.xml. Make sure that Tomcat has read/write access to working dir. |
||
225 | Sample configurations for MySQL server |
||
226 | <pre> |
||
227 | DB_ENGINE = mysql |
||
228 | DBURL = jdbc:mysql://server:3306/dbname?rewriteBatchedStatements=true |
||
229 | DBUSER = user |
||
230 | DBPASS = pass |
||
231 | DBDRIVER = com.mysql.cj.jdbc.Driver |
||
232 | DATE_FORMAT = yyyy-MM-dd HH:mm:ss |
||
233 | HISTORY_DAYS = 7 |
||
234 | LOG_LEVEL = 4 |
||
235 | </pre> |
||
236 | If you faced a timezone error after configuration in `sync.properties` add at the end of connection string: |
||
237 | <pre> |
||
238 | &useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC |
||
239 | </pre> |
||
240 | *Keys explanation* |
||
241 | 21 | Tomek Dziemidowicz | *DB_ENGINE* - type of database engine. Available options: |
242 | * mysql |
||
243 | * mssql |
||
244 | * postgresql |
||
245 | * oracle |
||
246 | |||
247 | 19 | Tomek Dziemidowicz | *LOG_LEVEL* - defain details level for log |
248 | > 4: TRACE, DEBUG, INFO, WARN; (default) |
||
249 | > 3: DEBUG, INFO, WARN; |
||
250 | > 2: INFO,WARN; |
||
251 | > 1: WARN; |
||
252 | > 0 - disable logs |
||
253 | *DATE_FORMAT* - set format of date |
||
254 | default format: yyyy-MM-dd HH:mm:ss |
||
255 | *HISTORY_DAYS* - How long files with sync data will be kept |
||
256 | default value: 7 |
||
257 | When you use MySQL database DO NOT remove from the end of the connection string: |
||
258 | <pre> |
||
259 | ?rewriteBatchedStatements=true |
||
260 | 20 | Tomek Dziemidowicz | </pre> |
261 | 19 | Tomek Dziemidowicz | |
262 | 2 | Tomek Dziemidowicz | h2. Supported databases |
263 | |||
264 | 30 | Tomek Dziemidowicz | AMPLI-SYNC supports those databases: |
265 | |||
266 | * MySQL |
||
267 | * Microsoft SQL Server (2005 and newer) |
||
268 | * Oracle |
||
269 | * PostgreSQL |
||
270 | |||
271 | 31 | Tomek Dziemidowicz | h3. Supported columns data types |
272 | |||
273 | SQLite-sync.com uses own conversion table to match column data types when schema from master database is converted to sqlite database. |
||
274 | * blob |
||
275 | * longblob |
||
276 | * varbinary |
||
277 | * binary |
||
278 | * image |
||
279 | * mediumblob |
||
280 | * varbinarymax |
||
281 | * byte[] |
||
282 | * longtext |
||
283 | * varchar |
||
284 | * nvarchar |
||
285 | * char |
||
286 | * varcharmax |
||
287 | * enum |
||
288 | * mediumtext |
||
289 | * text |
||
290 | * string |
||
291 | * geography |
||
292 | * geometry |
||
293 | * hierarchyid |
||
294 | * nchar |
||
295 | * ntext |
||
296 | * nvarcharmax |
||
297 | * userdefineddatatype |
||
298 | * userdefinedtabletype |
||
299 | * userdefinedtype |
||
300 | * variant |
||
301 | * xml |
||
302 | * tinytext |
||
303 | * set |
||
304 | * time |
||
305 | * timestamp |
||
306 | * year |
||
307 | * datetime |
||
308 | * uniqueidentifier |
||
309 | * datetime2 |
||
310 | * date |
||
311 | * mediumint |
||
312 | * bit |
||
313 | * tinyint |
||
314 | * smallint |
||
315 | * bigint |
||
316 | * int |
||
317 | * boolean |
||
318 | * byte |
||
319 | * long |
||
320 | * int64 |
||
321 | * serial |
||
322 | * int32 |
||
323 | * smalldatetime |
||
324 | * double |
||
325 | * float |
||
326 | * numeric |
||
327 | * decimal |
||
328 | * real |
||
329 | * money |
||
330 | |||
331 | 32 | Tomek Dziemidowicz | h3. Primary Key requirements |
332 | |||
333 | Single and mupltiple columns are supported as primary key. |
||
334 | When column is AUTO_INCREMENT/SERIAL, identity pool management is handled by AMPLI_SYNC. It means when you insert a new record onto the device, the PK will be automatically changed for the first value available for device. |
||
335 | 30 | Tomek Dziemidowicz | |
336 | 2 | Tomek Dziemidowicz | h2. Samples |