Transaction per folder

pull/156/head
M66B 7 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,14 +802,13 @@ 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[] attr = ((IMAPFolder) ifolder).getAttributes();
String type = EntityFolder.getType(attr, fullName); String type = EntityFolder.getType(attr, fullName);
EntityLog.log(context, account.name + ":" + fullName + EntityLog.log(context, account.name + ":" + fullName +
@ -828,7 +821,11 @@ class Core {
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,6 +863,11 @@ class Core {
db.folder().setFolderType(folder.id, type); db.folder().setFolderType(folder.id, type);
} }
} }
db.setTransactionSuccessful();
} finally {
db.endTransaction();
Log.i("End sync folder");
}
nameFolder.put(folder.name, folder); nameFolder.put(folder.name, folder);
String parentName = folder.getParentName(separator); String parentName = folder.getParentName(separator);
@ -873,25 +875,20 @@ class Core {
parentFolders.put(parentName, new ArrayList<EntityFolder>()); parentFolders.put(parentName, new ArrayList<EntityFolder>());
parentFolders.get(parentName).add(folder); parentFolders.get(parentName).add(folder);
} }
}
Log.i("Updating folder parents=" + parentFolders.size());
for (String parentName : parentFolders.keySet()) { for (String parentName : parentFolders.keySet()) {
EntityFolder parent = nameFolder.get(parentName); EntityFolder parent = nameFolder.get(parentName);
for (EntityFolder child : parentFolders.get(parentName)) for (EntityFolder child : parentFolders.get(parentName))
db.folder().setFolderParent(child.id, parent == null ? null : parent.id); db.folder().setFolderParent(child.id, parent == null ? null : parent.id);
} }
}
Log.i("Delete local count=" + names.size()); Log.i("Delete local count=" + names.size());
for (String name : names) { for (String name : names) {
Log.i(name + " delete"); Log.i(name + " delete");
db.folder().deleteFolder(account.id, name); db.folder().deleteFolder(account.id, name);
} }
db.setTransactionSuccessful();
} finally {
db.endTransaction();
Log.i("End sync folder");
}
} }
private static void onSubscribeFolder(Context context, JSONArray jargs, EntityFolder folder, IMAPFolder ifolder) private static void onSubscribeFolder(Context context, JSONArray jargs, EntityFolder folder, IMAPFolder ifolder)

Loading…
Cancel
Save