mirror of
https://github.com/laurent22/joplin.git
synced 2024-12-24 10:27:10 +02:00
sync
This commit is contained in:
parent
a0400a5e38
commit
d8f71e89df
@ -5,5 +5,5 @@ rm -f "$CLIENT_DIR/tests-build/src"
|
|||||||
mkdir -p "$CLIENT_DIR/tests-build/data"
|
mkdir -p "$CLIENT_DIR/tests-build/data"
|
||||||
ln -s "$CLIENT_DIR/build/src" "$CLIENT_DIR/tests-build"
|
ln -s "$CLIENT_DIR/build/src" "$CLIENT_DIR/tests-build"
|
||||||
|
|
||||||
# npm run build && NODE_PATH="$CLIENT_DIR/tests-build/" npm test tests-build/synchronizer.js
|
npm run build && NODE_PATH="$CLIENT_DIR/tests-build/" npm test tests-build/synchronizer.js
|
||||||
npm run build && NODE_PATH="$CLIENT_DIR/tests-build/" npm test tests-build/services/note-folder-service.js
|
# npm run build && NODE_PATH="$CLIENT_DIR/tests-build/" npm test tests-build/services/note-folder-service.js
|
@ -155,4 +155,8 @@ describe('Synchronizer syncActions', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should sync items', function(done) {
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
@ -138,7 +138,7 @@ class BaseModel {
|
|||||||
|
|
||||||
query.id = itemId;
|
query.id = itemId;
|
||||||
|
|
||||||
Log.info('Saving', JSON.stringify(o));
|
// Log.info('Saving', JSON.stringify(o));
|
||||||
|
|
||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ CREATE TABLE folders (
|
|||||||
title TEXT NOT NULL DEFAULT "",
|
title TEXT NOT NULL DEFAULT "",
|
||||||
created_time INT NOT NULL DEFAULT 0,
|
created_time INT NOT NULL DEFAULT 0,
|
||||||
updated_time INT NOT NULL DEFAULT 0,
|
updated_time INT NOT NULL DEFAULT 0,
|
||||||
|
sync_time INT NOT NULL DEFAULT 0,
|
||||||
is_default BOOLEAN NOT NULL DEFAULT 0
|
is_default BOOLEAN NOT NULL DEFAULT 0
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -20,6 +21,7 @@ CREATE TABLE notes (
|
|||||||
body TEXT NOT NULL DEFAULT "",
|
body TEXT NOT NULL DEFAULT "",
|
||||||
created_time INT NOT NULL DEFAULT 0,
|
created_time INT NOT NULL DEFAULT 0,
|
||||||
updated_time INT NOT NULL DEFAULT 0,
|
updated_time INT NOT NULL DEFAULT 0,
|
||||||
|
sync_time INT NOT NULL DEFAULT 0,
|
||||||
latitude NUMERIC NOT NULL DEFAULT 0,
|
latitude NUMERIC NOT NULL DEFAULT 0,
|
||||||
longitude NUMERIC NOT NULL DEFAULT 0,
|
longitude NUMERIC NOT NULL DEFAULT 0,
|
||||||
altitude NUMERIC NOT NULL DEFAULT 0,
|
altitude NUMERIC NOT NULL DEFAULT 0,
|
||||||
@ -88,6 +90,12 @@ CREATE TABLE table_fields (
|
|||||||
field_default TEXT
|
field_default TEXT
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE item_sync_times (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
item_id TEXT,
|
||||||
|
\`time\` INT
|
||||||
|
);
|
||||||
|
|
||||||
INSERT INTO version (version) VALUES (1);
|
INSERT INTO version (version) VALUES (1);
|
||||||
`;
|
`;
|
||||||
|
|
||||||
@ -142,6 +150,9 @@ class Database {
|
|||||||
}
|
}
|
||||||
|
|
||||||
transactionExecBatch(queries) {
|
transactionExecBatch(queries) {
|
||||||
|
queries.splice(0, 0, 'BEGIN TRANSACTION');
|
||||||
|
queries.push('COMMIT'); // Note: ROLLBACK is currently not supported
|
||||||
|
|
||||||
let chain = [];
|
let chain = [];
|
||||||
for (let i = 0; i < queries.length; i++) {
|
for (let i = 0; i < queries.length; i++) {
|
||||||
let query = this.wrapQuery(queries[i]);
|
let query = this.wrapQuery(queries[i]);
|
||||||
@ -149,6 +160,7 @@ class Database {
|
|||||||
return this.exec(query.sql, query.params);
|
return this.exec(query.sql, query.params);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return promiseChain(chain);
|
return promiseChain(chain);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,18 +259,7 @@ class Database {
|
|||||||
params: params,
|
params: params,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
transaction(readyCallack) {
|
|
||||||
throw new Error('transaction() DEPRECATED');
|
|
||||||
// return new Promise((resolve, reject) => {
|
|
||||||
// this.db_.transaction(
|
|
||||||
// readyCallack,
|
|
||||||
// (error) => { reject(error); },
|
|
||||||
// () => { resolve(); }
|
|
||||||
// );
|
|
||||||
// });
|
|
||||||
}
|
|
||||||
|
|
||||||
wrapQueries(queries) {
|
wrapQueries(queries) {
|
||||||
let output = [];
|
let output = [];
|
||||||
for (let i = 0; i < queries.length; i++) {
|
for (let i = 0; i < queries.length; i++) {
|
||||||
|
39
ReactNativeClient/src/models/item-sync-time.js
Normal file
39
ReactNativeClient/src/models/item-sync-time.js
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import { BaseModel } from 'src/base-model.js';
|
||||||
|
|
||||||
|
class ItemSyncTime extends BaseModel {
|
||||||
|
|
||||||
|
static time(itemId) {
|
||||||
|
if (itemId in this.cache_) return Promise.resolve(this.cache_[itemId]);
|
||||||
|
|
||||||
|
return this.db().selectOne('SELECT * FROM item_sync_times WHERE item_id = ?', [itemId]).then((row) => {
|
||||||
|
this.cache_[itemId] = row ? row.time : 0;
|
||||||
|
return this.cache_[itemId];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static setTime(itemId, time) {
|
||||||
|
return this.db().selectOne('SELECT * FROM item_sync_times WHERE item_id = ?', [itemId]).then((row) => {
|
||||||
|
let p = null;
|
||||||
|
if (row) {
|
||||||
|
p = this.db().exec('UPDATE item_sync_times SET `time` = ? WHERE item_id = ?', [time, itemId]);
|
||||||
|
} else {
|
||||||
|
p = this.db().exec('INSERT INTO item_sync_times (item_id, `time`) VALUES (?, ?)', [itemId, time]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return p.then(() => {
|
||||||
|
this.cache_[itemId] = time;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static deleteTime(itemId) {
|
||||||
|
return this.db().exec('DELETE FROM item_sync_times WHERE item_id = ?', [itemId]).then(() => {
|
||||||
|
delete this.cache_[itemId];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemSyncTime.cache_ = {};
|
||||||
|
|
||||||
|
export { ItemSyncTime };
|
@ -122,7 +122,7 @@ class Note extends BaseModel {
|
|||||||
return super.save(o, options).then((result) => {
|
return super.save(o, options).then((result) => {
|
||||||
// 'result' could be a partial one at this point (if, for example, only one property of it was saved)
|
// 'result' could be a partial one at this point (if, for example, only one property of it was saved)
|
||||||
// so call this.preview() so that the right fields are populated.
|
// so call this.preview() so that the right fields are populated.
|
||||||
return this.preview(result.id);
|
return this.load(result.id);
|
||||||
}).then((note) => {
|
}).then((note) => {
|
||||||
this.dispatch({
|
this.dispatch({
|
||||||
type: 'NOTES_UPDATE_ONE',
|
type: 'NOTES_UPDATE_ONE',
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
function promiseChain(chain) {
|
function promiseChain(chain, defaultValue = null) {
|
||||||
let output = new Promise((resolve, reject) => { resolve(); });
|
let output = new Promise((resolve, reject) => { resolve(defaultValue); });
|
||||||
for (let i = 0; i < chain.length; i++) {
|
for (let i = 0; i < chain.length; i++) {
|
||||||
let f = chain[i];
|
let f = chain[i];
|
||||||
output = output.then(f);
|
output = output.then(f);
|
||||||
|
@ -5,6 +5,7 @@ import { BaseModel } from 'src/base-model.js';
|
|||||||
import { Note } from 'src/models/note.js';
|
import { Note } from 'src/models/note.js';
|
||||||
import { Folder } from 'src/models/folder.js';
|
import { Folder } from 'src/models/folder.js';
|
||||||
import { Log } from 'src/log.js';
|
import { Log } from 'src/log.js';
|
||||||
|
import { time } from 'src/time-utils.js';
|
||||||
import { Registry } from 'src/registry.js';
|
import { Registry } from 'src/registry.js';
|
||||||
|
|
||||||
class NoteFolderService extends BaseService {
|
class NoteFolderService extends BaseService {
|
||||||
@ -72,6 +73,38 @@ class NoteFolderService extends BaseService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static itemsThatNeedSync(context = null, limit = 100) {
|
||||||
|
let now = time.unix();
|
||||||
|
|
||||||
|
if (!context) {
|
||||||
|
context = {
|
||||||
|
hasMoreNotes: true,
|
||||||
|
hasMoreFolders: true,
|
||||||
|
noteOffset: 0,
|
||||||
|
folderOffset: 0,
|
||||||
|
hasMore: true,
|
||||||
|
items: [],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (context.hasMoreNotes) {
|
||||||
|
return BaseModel.db().selectAll('SELECT * FROM notes WHERE sync_time < ? LIMIT ' + limit + ' OFFSET ' + context.noteOffset, [now]).then((items) => {
|
||||||
|
context.items = items;
|
||||||
|
context.hasMoreNotes = items.length >= limit;
|
||||||
|
context.noteOffset += items.length;
|
||||||
|
return context;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return BaseModel.db().selectAll('SELECT * FROM folders WHERE sync_time < ? LIMIT ' + limit + ' OFFSET ' + context.folderOffset, [now]).then((items) => {
|
||||||
|
context.items = items;
|
||||||
|
context.hasMoreFolders = items.length >= limit;
|
||||||
|
context.hasMore = context.hasMoreFolders;
|
||||||
|
context.folderOffset += items.length;
|
||||||
|
return context;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export { NoteFolderService };
|
export { NoteFolderService };
|
@ -201,6 +201,12 @@ class Synchronizer {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
processSyncActions(syncActions) {
|
||||||
|
for (let i = 0; i < syncActions.length; i++) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
processState_uploadChanges() {
|
processState_uploadChanges() {
|
||||||
let remoteFiles = [];
|
let remoteFiles = [];
|
||||||
let processedChangeIds = [];
|
let processedChangeIds = [];
|
||||||
@ -550,12 +556,16 @@ class Synchronizer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.state_ = 'started';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// if (!this.api().session()) {
|
// if (!this.api().session()) {
|
||||||
// Log.info("Sync: cannot start synchronizer because user is not logged in.");
|
// Log.info("Sync: cannot start synchronizer because user is not logged in.");
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
return this.processState('uploadChanges');
|
//return this.processState('uploadChanges');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user