From 0d69ed805d45623a40510d069a104f1c9e4b17b7 Mon Sep 17 00:00:00 2001 From: skilion Date: Sun, 12 Mar 2017 19:40:38 +0100 Subject: [PATCH] wip for OneDrive Biz --- src/itemdb.d | 4 ++-- src/onedrive.d | 6 +++--- src/sync.d | 19 ++++++++++++------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/itemdb.d b/src/itemdb.d index 6b77734f..556aa0de 100644 --- a/src/itemdb.d +++ b/src/itemdb.d @@ -22,7 +22,7 @@ struct Item final class ItemDatabase { // increment this for every change in the db schema - immutable int itemDatabaseVersion = 2; + immutable int itemDatabaseVersion = 3; Database db; Statement insertItemStmt; @@ -38,7 +38,7 @@ final class ItemDatabase id TEXT NOT NULL PRIMARY KEY, name TEXT NOT NULL, type TEXT NOT NULL, - eTag TEXT NOT NULL, + eTag TEXT, cTag TEXT, mtime TEXT NOT NULL, parentId TEXT, diff --git a/src/onedrive.d b/src/onedrive.d index 7778b83a..b400f2b9 100644 --- a/src/onedrive.d +++ b/src/onedrive.d @@ -83,7 +83,7 @@ final class OneDriveApi write(url, "\n\n", "Enter the response uri: "); readln(response); // match the authorization code - auto c = matchFirst(response, r"(?:code=)(([\w\d]+-){4}[\w\d]+)"); + auto c = matchFirst(response, r"(?:code=)([\w\d-]+)"); if (c.empty) { log.log("Invalid uri"); return false; @@ -105,7 +105,7 @@ final class OneDriveApi { checkAccessTokenExpired(); const(char)[] url = itemByIdUrl ~ id ~ "/delta"; - url ~= "?select=id,name,eTag,cTag,deleted,file,folder,fileSystemInfo,remoteItem,parentReference"; + url ~= "?select=id,name,eTag,cTag,deleted,file,folder,root,fileSystemInfo,remoteItem,parentReference"; if (statusToken) url ~= "&token=" ~ statusToken; return get(url); } @@ -117,7 +117,7 @@ final class OneDriveApi string url = itemByPathUrl ~ encodeComponent(path) ~ ":/delta"; // HACK if (path == ".") url = driveUrl ~ "/root/delta"; - url ~= "?select=id,name,eTag,cTag,deleted,file,folder,fileSystemInfo,remoteItem,parentReference"; + url ~= "?select=id,name,eTag,cTag,deleted,file,folder,root,fileSystemInfo,remoteItem,parentReference"; if (statusToken) url ~= "&token=" ~ statusToken; return get(url); } diff --git a/src/sync.d b/src/sync.d index 885f0c0a..d214e415 100644 --- a/src/sync.d +++ b/src/sync.d @@ -24,6 +24,11 @@ private bool isItemDeleted(const ref JSONValue item) return ("deleted" in item) || ("fileSystemInfo" !in item); } +private bool isItemRoot(const ref JSONValue item) +{ + return ("root" in item) != null; +} + private bool testCrc32(string path, const(char)[] crc32) { if (crc32) { @@ -150,16 +155,16 @@ final class SyncEngine { string id = item["id"].str; string name = item["name"].str; - string eTag = item["eTag"].str; - string parentId = item["parentReference"]["id"].str; - - // HACK: recognize the root directory - if (name == "root" && parentId[$ - 1] == '0' && parentId[$ - 2] == '!') { - parentId = null; - } log.vlog(id, " ", name); + // eTag and parentId do not exists for the root in OneDrive Biz + string eTag, parentId; + if (!isItemRoot(item)) { + eTag = item["eTag"].str; + parentId = item["parentReference"]["id"].str; + } + // skip unwanted items early if (skippedItems.find(parentId).length != 0) { log.vlog("Filtered out");