diff --git a/.babelrc b/.babelrc index 3291901..beec9bd 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,4 @@ { - "plugins": [ "transform-es2015-destructuring", "transform-object-rest-spread" ], + "plugins": [ "transform-es2015-destructuring", "transform-object-rest-spread", "transform-es2015-block-scoping" ], "retainLines": true } diff --git a/db.sql b/db.sql index 81d1bd6..ecb91d5 100644 --- a/db.sql +++ b/db.sql @@ -51,6 +51,7 @@ create index messages_flags on messages using gin (folder_id, flags); create index messages_messageid on messages (messageid); create index messages_refs on messages using gin (refs); create index messages_vertag on messages (folder_id, vertag); +create index messages_time on messages (folder_id, time); create table threads ( id serial not null primary key, diff --git a/operetta.js b/operetta.js index 1faf595..73848f7 100644 --- a/operetta.js +++ b/operetta.js @@ -73,6 +73,7 @@ Syncer.sync = function*(account) { [ self.versionTag ] = yield pg.select('MAX(vertag)').from('messages') .where({ folder_id: row.id }).val(gen.ef()); + self.versionTag = self.versionTag || 0; } yield pg.update('folders', { uidvalidity: box.uidvalidity, unread_count: box.messages.new }) .where({ id: row.id }).run(gen.ef()); @@ -313,6 +314,8 @@ Syncer.addMessage = function*(msgrow, attrs) var t = Date.parse(header.date[0]); if (!isNaN(t)) header.date = new Date(t); + else + header.date = null; } if (!header.date) header.date = new Date(attrs.date); @@ -332,26 +335,18 @@ Syncer.addMessage = function*(msgrow, attrs) msgrow.flags = toPgArray(msgrow.flags); msgrow.refs = toPgArray(header.references); msgrow.vertag = self.versionTag; + + var thisIsFirst = false; if (header.references.length) { - var [ threadId ] = yield pgtx.select('MAX(thread_id)').from('messages') + let [ threadId ] = yield pgtx.select('MAX(thread_id)').from('messages') .where(pg.sql.in('messageid', header.references)).val(gen.ef()); if (!threadId) { [ threadId ] = yield pgtx.select('MAX(thread_id)').from('messages') .where(new pg.sql.Binary('@>', 'refs', toPgArray([msgrow.messageid]))).val(gen.ef()); - } - if (threadId) - { - try - { - yield pgtx.update('threads', { msg_count: pg.sql('msg_count+1') }) - .where({ id: threadId }).run(gen.ef()); - } - catch (e) - { - throw new Error(''+e); - } + if (threadId) + thisIsFirst = true; } msgrow.thread_id = threadId; } @@ -365,6 +360,13 @@ Syncer.addMessage = function*(msgrow, attrs) }).returning('id').val(gen.ef()); yield pgtx.update('messages', { thread_id: msgrow.thread_id }).where({ id: msgrow.id }).run(gen.ef()); } + else + { + let upd = pgtx.update('threads', { msg_count: pg.sql('msg_count+1') }); + if (thisIsFirst) + upd.first_msg = msgrow.id; + yield upd.where({ id: msgrow.threadId }).run(gen.ef()); + } end_transaction(); } diff --git a/package.json b/package.json index b659fa4..2a536ac 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ }, "devDependencies": { "babel-cli": "latest", + "babel-plugin-transform-es2015-block-scoping": "latest", "babel-plugin-transform-es2015-destructuring": "latest", "babel-plugin-transform-object-rest-spread": "latest", "eslint": "latest",