public async static Task<bool> Synchronize(string key) { IStorageManager storageManager = StorageHelper.GetStorageManager(key); try { // Wait sign in before sync await TaskHelper.WaitSignInTask(storageManager.GetStorageName()); // Fetching data if (App.ApplicationSettings.Contains(SYNC_KEYS + key)) // Fetching from SQL { System.Diagnostics.Debug.WriteLine("Fetching From SQL"); using (FileObjectDataContext db = new FileObjectDataContext("isostore:/" + key + "_db.sdf")) { if (!db.DatabaseExists()) { App.ApplicationSettings.Remove(SYNC_KEYS + key); return await Synchronize(key); } var rootDB = from FileObjectSQL fos in db.FileItems where fos.ParentId.Equals(ROOT_ID) select fos; List<FileObjectSQL> getSqlList = rootDB.ToList<FileObjectSQL>(); if (getSqlList.Count != 1) return false; FileObjectSQL rootFos = getSqlList.First<FileObjectSQL>(); FileObject rootFolder = FileObject.ConvertToFileObject(db, ROOT_ID); if (DictionaryRoot.ContainsKey(key)) DictionaryRoot.Remove(key); DictionaryRoot.Add(key, rootFolder); Stack<FileObject> stack = new Stack<FileObject>(); stack.Push(rootFolder); if (DictionaryTree.ContainsKey(key)) DictionaryTree.Remove(key); DictionaryTree.Add(key, stack); } System.Diagnostics.Debug.WriteLine("Ended Fetching From SQL"); } else // Fetching from Server { System.Diagnostics.Debug.WriteLine("Fetching From Server"); FileObject rootFolder = await storageManager.Synchronize(); if (DictionaryRoot.ContainsKey(key)) DictionaryRoot.Remove(key); DictionaryRoot.Add(key, rootFolder); Stack<FileObject> stack = new Stack<FileObject>(); stack.Push(rootFolder); if (DictionaryTree.ContainsKey(key)) DictionaryTree.Remove(key); DictionaryTree.Add(key, stack); System.Diagnostics.Debug.WriteLine("Ended Fetching From Server"); // Saving to SQL job using (FileObjectDataContext db = new FileObjectDataContext("isostore:/" + key + "_db.sdf")) { if (db.DatabaseExists()) db.DeleteDatabase(); db.CreateDatabase(); List<FileObjectSQL> sqlList = new List<FileObjectSQL>(); FileObject.ConvertToFileObjectSQL(sqlList, rootFolder, ROOT_ID, 0); for (int i = 0; i < sqlList.Count; i++) db.FileItems.InsertOnSubmit(sqlList[i]); db.SubmitChanges(); } // Saving completed sync true to application settings App.ApplicationSettings.Add(SYNC_KEYS + key, true); App.ApplicationSettings.Save(); } } catch { return false; } return true; }
public static List<FileObject> GetChildList(FileObjectDataContext db, string ParentId) { var dbList = from FileObjectSQL fos in db.FileItems where fos.ParentId == ParentId select fos; List<FileObjectSQL> sqlList = dbList.ToList<FileObjectSQL>(); List<FileObject> list = new List<FileObject>(); for (var i = 0; i < sqlList.Count; i++) list.Add(ConvertToFileObject(db, sqlList[i])); return list; }
public static FileObject ConvertToFileObject(FileObjectDataContext db, string ParentId) { Stack<FileObject> stack = new Stack<FileObject>(); FileObject root = null; var dbList = from FileObjectSQL fos in db.FileItems select fos; //var dbList2 = from FileObjectSQL fos in db.FileItems group fos by fos.ParentId into fos select fos; //List<FileObjectSQL> FindChildList = dbList.ToList<FileObjectSQL>(); //var levelGroupedList = dbList.GroupBy<FileObjectSQL, int>(x => x.Level).ToList(); //var test = dbList.GroupBy<FileObjectSQL, int>(x => x.Level); var list = dbList.ToList(); root = ConvertToFileObject(list[0]); stack.Push(root); for (int i = 1; i < list.Count; i++) { var item = list[i]; //System.Diagnostics.Debug.WriteLine("["+i+"] "+item.Id); FileObject ff = ConvertToFileObject(item); if (item.Type.Equals(PintheCloud.Models.FileObject.FileObjectType.FOLDER)) { if (item.ParentId.Equals(stack.Peek().Id)) { //System.Diagnostics.Debug.WriteLine("add " + ff.Id + " to Parent " + stack.Peek().Id); stack.Peek().FileList.Add(ff); stack.Push(ff); } else { stack.Pop(); if (item.ParentId.Equals(stack.Peek().Id)) { //System.Diagnostics.Debug.WriteLine("add " + ff.Id + "to Parent " + stack.Peek().Id); stack.Peek().FileList.Add(ff); stack.Push(ff); } else { //System.Diagnostics.Debug.WriteLine("i-- from folder"); i--; } } } else { if (item.ParentId.Equals(stack.Peek().Id)) { //System.Diagnostics.Debug.WriteLine("add " + ff.Id + "to Parent " + stack.Peek().Id); stack.Peek().FileList.Add(ff); } else { stack.Pop(); if (item.ParentId.Equals(stack.Peek().Id)) { //System.Diagnostics.Debug.WriteLine("add " + ff.Id + "to Parent " + stack.Peek().Id); stack.Peek().FileList.Add(ff); } else { //System.Diagnostics.Debug.WriteLine("i-- from file"); i--; } } } } return root; }
public static FileObject ConvertToFileObject(FileObjectDataContext db, FileObjectSQL fos) { FileObject fo = new FileObject(fos.Id, fos.Name, fos.Size, fos.Type, fos.Extension, fos.UpdateAt, fos.Thumbnail, fos.DownloadUrl, fos.MimeType); fo.SpotId = fos.SpotId; if (fos.ProfileName != null && fos.ProfileId != null && fos.ProfileEmail != null && fos.ProfilePhoneNumber != null) { fo.Owner = new ProfileObject(); fo.Owner.Id = fos.ProfileId; fo.Owner.Email = fos.ProfileEmail; fo.Owner.Name = fos.ProfileName; fo.Owner.PhoneNumber = fos.ProfilePhoneNumber; } fo.FileList = GetChildList(db, fos.Id); return fo; }