Transaction per folder

pull/156/head
M66B 6 years ago
parent 101003eaa1
commit 7a23d0bffd

@ -773,19 +773,13 @@ class Core {
Log.i("Start sync folders account=" + account.name); Log.i("Start sync folders account=" + account.name);
// Get remote folders // Get default folder
Folder defaultFolder = istore.getDefaultFolder(); Folder defaultFolder = istore.getDefaultFolder();
char separator = defaultFolder.getSeparator(); char separator = defaultFolder.getSeparator();
EntityLog.log(context, account.name + " folder separator=" + separator); EntityLog.log(context, account.name + " folder separator=" + separator);
// Get remote folder attributes // Get remote folders
Folder[] ifolders = defaultFolder.list("*"); Folder[] ifolders = defaultFolder.list("*");
Map<Folder, String[]> attrs = new HashMap<>();
Map<Folder, Boolean> subscribed = new HashMap<>();
for (Folder ifolder : ifolders) {
subscribed.put(ifolder, ifolder.isSubscribed());
attrs.put(ifolder, ((IMAPFolder) ifolder).getAttributes());
}
Log.i("Remote folder count=" + ifolders.length + " separator=" + separator); Log.i("Remote folder count=" + ifolders.length + " separator=" + separator);
// Get folder names // Get folder names
@ -808,27 +802,30 @@ class Core {
names.add(folder.name); names.add(folder.name);
Log.i("Local folder count=" + names.size()); Log.i("Local folder count=" + names.size());
try {
db.beginTransaction();
Map<String, EntityFolder> nameFolder = new HashMap<>(); Map<String, EntityFolder> nameFolder = new HashMap<>();
Map<String, List<EntityFolder>> parentFolders = new HashMap<>(); Map<String, List<EntityFolder>> parentFolders = new HashMap<>();
for (Folder ifolder : ifolders) { for (Folder ifolder : ifolders) {
String fullName = ifolder.getFullName(); // No I/O String fullName = ifolder.getFullName();
String[] attr = attrs.get(ifolder); boolean subscribed = ifolder.isSubscribed();
String type = EntityFolder.getType(attr, fullName); String[] attr = ((IMAPFolder) ifolder).getAttributes();
String type = EntityFolder.getType(attr, fullName);
EntityLog.log(context, account.name + ":" + fullName + EntityLog.log(context, account.name + ":" + fullName +
" attrs=" + TextUtils.join(" ", attr) + " type=" + type); " attrs=" + TextUtils.join(" ", attr) + " type=" + type);
if (type != null) { if (type != null) {
names.remove(fullName); names.remove(fullName);
String display = null; String display = null;
if (account.prefix != null && fullName.startsWith(account.prefix + separator)) if (account.prefix != null && fullName.startsWith(account.prefix + separator))
display = fullName.substring(account.prefix.length() + 1); display = fullName.substring(account.prefix.length() + 1);
EntityFolder folder = db.folder().getFolderByName(account.id, fullName); EntityFolder folder;
try {
db.beginTransaction();
folder = db.folder().getFolderByName(account.id, fullName);
if (folder == null) { if (folder == null) {
folder = new EntityFolder(); folder = new EntityFolder();
folder.account = account.id; folder.account = account.id;
@ -836,7 +833,7 @@ class Core {
folder.display = display; folder.display = display;
folder.type = (EntityFolder.SYSTEM.equals(type) ? type : EntityFolder.USER); folder.type = (EntityFolder.SYSTEM.equals(type) ? type : EntityFolder.USER);
folder.synchronize = false; folder.synchronize = false;
folder.subscribed = subscribed.get(ifolder); folder.subscribed = subscribed;
folder.poll = ("imap.gmail.com".equals(account.host)); folder.poll = ("imap.gmail.com".equals(account.host));
folder.sync_days = EntityFolder.DEFAULT_SYNC; folder.sync_days = EntityFolder.DEFAULT_SYNC;
folder.keep_days = EntityFolder.DEFAULT_KEEP; folder.keep_days = EntityFolder.DEFAULT_KEEP;
@ -846,7 +843,7 @@ class Core {
Log.i(folder.name + " exists type=" + folder.type); Log.i(folder.name + " exists type=" + folder.type);
if (folder.subscribed == null || !folder.subscribed.equals(subscribed)) if (folder.subscribed == null || !folder.subscribed.equals(subscribed))
db.folder().setFolderSubscribed(folder.id, subscribed.get(ifolder)); db.folder().setFolderSubscribed(folder.id, subscribed);
if (folder.display == null && display != null) { if (folder.display == null && display != null) {
db.folder().setFolderDisplay(folder.id, display); db.folder().setFolderDisplay(folder.id, display);
@ -866,31 +863,31 @@ class Core {
db.folder().setFolderType(folder.id, type); db.folder().setFolderType(folder.id, type);
} }
} }
db.setTransactionSuccessful();
nameFolder.put(folder.name, folder); } finally {
String parentName = folder.getParentName(separator); db.endTransaction();
if (!parentFolders.containsKey(parentName)) Log.i("End sync folder");
parentFolders.put(parentName, new ArrayList<EntityFolder>());
parentFolders.get(parentName).add(folder);
} }
for (String parentName : parentFolders.keySet()) { nameFolder.put(folder.name, folder);
EntityFolder parent = nameFolder.get(parentName); String parentName = folder.getParentName(separator);
for (EntityFolder child : parentFolders.get(parentName)) if (!parentFolders.containsKey(parentName))
db.folder().setFolderParent(child.id, parent == null ? null : parent.id); parentFolders.put(parentName, new ArrayList<EntityFolder>());
} parentFolders.get(parentName).add(folder);
} }
}
Log.i("Delete local count=" + names.size()); Log.i("Updating folder parents=" + parentFolders.size());
for (String name : names) { for (String parentName : parentFolders.keySet()) {
Log.i(name + " delete"); EntityFolder parent = nameFolder.get(parentName);
db.folder().deleteFolder(account.id, name); for (EntityFolder child : parentFolders.get(parentName))
} db.folder().setFolderParent(child.id, parent == null ? null : parent.id);
}
db.setTransactionSuccessful(); Log.i("Delete local count=" + names.size());
} finally { for (String name : names) {
db.endTransaction(); Log.i(name + " delete");
Log.i("End sync folder"); db.folder().deleteFolder(account.id, name);
} }
} }

Loading…
Cancel
Save