public override FolderMetadata LoadFolderMetadata(string currId, SourceOption option) { string opt = (option == SourceOption.SOURCE_ID_NOT_EQUALS) ? " <> " : " = "; var folderMetadata = new FolderMetadata(currId, this.RootPath); var db = new SQLiteAccess(Path.Combine(this.StoragePath, Configuration.DATABASE_NAME), false); using (SqliteConnection con = db.NewSQLiteConnection()) { if (con == null) { throw new DatabaseException(String.Format(m_ResourceManager.GetString("err_somethingNotFound"), Path.Combine(this.StoragePath, Configuration.DATABASE_NAME))); } string cmdText = "SELECT * FROM " + Configuration.TLB_FOLDERMETADATA + " WHERE " + Configuration.COL_SOURCE_ID + opt + " @sourceId"; var paramList = new SqliteParameterCollection { new SqliteParameter("@sourceId", DbType.String) { Value = currId } }; db.ExecuteReader(cmdText, paramList, reader => folderMetadata.FolderMetadataItems.Add( new FolderMetadataItem( (string)reader[Configuration.COL_SOURCE_ID], (string)reader[Configuration.COL_FOLDER_RELATIVE_PATH], (int)reader[Configuration.COL_IS_FOLDER_EMPTY]))); } return(folderMetadata); }
private void SyncEmptyFolders() { //read metadata of the current folder in file system FolderMetadata currentItems = MetaDataProvider.GenerateFolderMetadata(_job.SyncSource.Path, _job.SyncSource.ID, false, false, true); //read the folder metadata of current folder stored in database FolderMetadata oldCurrentItems = mdProvider.LoadFolderMetadata(_job.SyncSource.ID, SourceOption.SOURCE_ID_EQUALS); //read folder metadata of the other source stored in the database FolderMetadata otherItems = mdProvider.LoadFolderMetadata(_job.SyncSource.ID, SourceOption.SOURCE_ID_NOT_EQUALS); //get the difference between current folder metadata with its previous state (from previous sync session). FolderMetadataComparer comparer1 = new FolderMetadataComparer(oldCurrentItems, currentItems); //get the difference between current folder metadata with the other folder's previous metadata FolderMetadataComparer compare2 = new FolderMetadataComparer(currentItems, otherItems); FolderMetadataComparer comparer3 = new FolderMetadataComparer(oldCurrentItems.FolderMetadataItems, compare2.LeftOnly); FolderMetadataComparer comparer4 = new FolderMetadataComparer(compare2.RightOnly, comparer1.LeftOnly); List <FolderMetadataItem> temps = comparer3.Both.ToList(); temps.Sort(new FolderMetadataItemComparer()); temps.Reverse(); foreach (FolderMetadataItem item in temps) { SyncExecutor.DeleteFolder(this._job.SyncSource.Path, item.RelativePath, true); } foreach (FolderMetadataItem item in comparer4.LeftOnly) { if (item.IsEmpty == 1) { SyncExecutor.CreateFolder(this._job.SyncSource.Path, item.RelativePath); } } currentItems = MetaDataProvider.GenerateFolderMetadata(_job.SyncSource.Path, _job.SyncSource.ID, false, false, true); mdProvider.UpdateFolderMetadata(oldCurrentItems, currentItems, false); }
public override bool UpdateFolderMetadata(FolderMetadata oldMetadata, FolderMetadata newMetadata, bool storeOnlyEmptyFolder) { oldMetadata.FolderMetadataItems.ToList().Sort(new FolderMetadataItemComparer()); newMetadata.FolderMetadataItems.ToList().Sort(new FolderMetadataItemComparer()); //Find the metadata items that in the current folder only IEnumerable <FolderMetadataItem> newOnly = newMetadata.FolderMetadataItems.Where( @new => !oldMetadata.FolderMetadataItems.Contains(@new, new FolderMetadataItemComparer()) && (storeOnlyEmptyFolder?Files.FileUtils.IsDirectoryEmpty(@new.AbsolutePath):true) ); //find metadata items that not in the current folder but metadata store IEnumerable <FolderMetadataItem> oldOnly = oldMetadata.FolderMetadataItems.Where( old => !newMetadata.FolderMetadataItems.Contains(old, new FolderMetadataItemComparer())); var db = new SQLiteAccess(Path.Combine(this.StoragePath, Configuration.DATABASE_NAME), false); using (var con = db.NewSQLiteConnection()) { if (con == null) { throw new DatabaseException(String.Format(m_ResourceManager.GetString("err_somethingNotFound"), Path.Combine(this.StoragePath, Configuration.DATABASE_NAME))); } var transaction = (SqliteTransaction)con.BeginTransaction(); try { this.Add(newOnly.ToList(), con); this.Delete(oldOnly.ToList(), con); transaction.Commit(); } catch (Exception) { transaction.Rollback(); return(false); } } return(true); }
/// <summary> /// Function to generate folder metadata of a given folder /// </summary> /// <param name="fromPath"></param> /// <param name="id"></param> /// <param name="excludeHidden"></param> /// <returns></returns> public static FolderMetadata GenerateFolderMetadata(string fromPath, string id, bool excludeHidden, bool createIfNotExist, bool excludeNonEmpty) { if (!Directory.Exists((fromPath)) && createIfNotExist) { Directory.CreateDirectory((fromPath)); } FolderMetadata folderMetadata = new FolderMetadata(id, fromPath); DirectoryInfo di = new DirectoryInfo(fromPath); DirectoryInfo[] directories = null; AddDirectorySecurity(fromPath); directories = di.GetDirectories("*.*", SearchOption.AllDirectories); if (directories == null) { return(new FolderMetadata(id, fromPath)); } IEnumerable <DirectoryInfo> noHiddenDirectories = from dir in directories where ( (excludeHidden?!Files.FileUtils.IsDirectoryHidden(dir.FullName):true)) select dir; directories = noHiddenDirectories.ToArray <DirectoryInfo>(); foreach (DirectoryInfo dirInfo in directories) { int isEmpty = (Files.FileUtils.IsDirectoryEmpty(dirInfo.FullName)) ? 1 : 0; folderMetadata.FolderMetadataItems.Add( new FolderMetadataItem(id, dirInfo.FullName, fromPath, isEmpty)); } return(folderMetadata); }
/// <summary> /// Update folder metadata /// </summary> /// <returns></returns> private bool UpdateFolderMetadata(FolderMetadata oldMetadata, FolderMetadata newMetadata, SqliteConnection con) { //Find the metadata items that in the current folder only IEnumerable <FolderMetadataItem> newOnly = newMetadata.FolderMetadataItems.Where( @new => !oldMetadata.FolderMetadataItems.Contains(@new, new FolderMetadataItemComparer()) ); //find metadata items that not in the current folder but metadata store IEnumerable <FolderMetadataItem> oldOnly = oldMetadata.FolderMetadataItems.Where( old => !newMetadata.FolderMetadataItems.Contains(old, new FolderMetadataItemComparer())); try { this.Add(newOnly.ToList(), con); this.Delete(oldOnly.ToList(), con); } catch (Exception) { return(false); } return(true); }
public Metadata(FileMetaData fileMetadata, FolderMetadata folderMetadata) { this.FileMetadata = fileMetadata; this.FolderMetadata = folderMetadata; }
/// <summary> /// /// </summary> /// <param name="oldItems"></param> /// <param name="newItems"></param> /// <returns></returns> public abstract bool UpdateFolderMetadata(FolderMetadata oldItems, FolderMetadata newItems, bool storeOnlyEmptyFolder);
/// <summary> /// Provides the ... /// </summary> /// <param name="current"></param> /// <param name="stored"></param> public FolderMetadataComparer(FolderMetadata left, FolderMetadata right) { this.left = left; this.right = right; Compare(left.FolderMetadataItems, right.FolderMetadataItems); }
/// <summary> /// Function to generate folder metadata of a given folder /// </summary> /// <param name="fromPath"></param> /// <param name="id"></param> /// <param name="excludeHidden"></param> /// <returns></returns> public static FolderMetadata GenerateFolderMetadata(string fromPath, string id, bool excludeHidden, bool createIfNotExist, bool excludeNonEmpty) { if (!Directory.Exists((fromPath)) && createIfNotExist) Directory.CreateDirectory((fromPath)); FolderMetadata folderMetadata = new FolderMetadata(id, fromPath); DirectoryInfo di = new DirectoryInfo(fromPath); DirectoryInfo[] directories = null; AddDirectorySecurity(fromPath); directories = di.GetDirectories("*.*", SearchOption.AllDirectories); if (directories == null) return new FolderMetadata( id, fromPath ); IEnumerable<DirectoryInfo> noHiddenDirectories = from dir in directories where ( (excludeHidden?!Files.FileUtils.IsDirectoryHidden(dir.FullName):true)) select dir; directories = noHiddenDirectories.ToArray<DirectoryInfo>(); foreach (DirectoryInfo dirInfo in directories) { int isEmpty = (Files.FileUtils.IsDirectoryEmpty(dirInfo.FullName)) ? 1 : 0; folderMetadata.FolderMetadataItems.Add( new FolderMetadataItem(id, dirInfo.FullName, fromPath, isEmpty)); } return folderMetadata; }
/// <summary> /// Update folder metadata /// </summary> /// <returns></returns> private bool UpdateFolderMetadata(FolderMetadata oldMetadata, FolderMetadata newMetadata, SqliteConnection con) { //Find the metadata items that in the current folder only IEnumerable<FolderMetadataItem> newOnly = newMetadata.FolderMetadataItems.Where( @new => !oldMetadata.FolderMetadataItems.Contains(@new, new FolderMetadataItemComparer()) ); //find metadata items that not in the current folder but metadata store IEnumerable<FolderMetadataItem> oldOnly = oldMetadata.FolderMetadataItems.Where( old => !newMetadata.FolderMetadataItems.Contains(old, new FolderMetadataItemComparer())); try { this.Add(newOnly.ToList(), con); this.Delete(oldOnly.ToList(), con); } catch (Exception) { return false; } return true; }
public override bool UpdateFolderMetadata(FolderMetadata oldMetadata, FolderMetadata newMetadata, bool storeOnlyEmptyFolder) { oldMetadata.FolderMetadataItems.ToList().Sort(new FolderMetadataItemComparer()); newMetadata.FolderMetadataItems.ToList().Sort(new FolderMetadataItemComparer()); //Find the metadata items that in the current folder only IEnumerable<FolderMetadataItem> newOnly = newMetadata.FolderMetadataItems.Where( @new => !oldMetadata.FolderMetadataItems.Contains(@new, new FolderMetadataItemComparer()) && (storeOnlyEmptyFolder?Files.FileUtils.IsDirectoryEmpty(@new.AbsolutePath):true) ); //find metadata items that not in the current folder but metadata store IEnumerable<FolderMetadataItem> oldOnly = oldMetadata.FolderMetadataItems.Where( old => !newMetadata.FolderMetadataItems.Contains(old, new FolderMetadataItemComparer())); var db = new SQLiteAccess(Path.Combine(this.StoragePath, Configuration.DATABASE_NAME),false); using (var con = db.NewSQLiteConnection()) { if (con == null) throw new DatabaseException(String.Format(m_ResourceManager.GetString("err_somethingNotFound"), Path.Combine(this.StoragePath, Configuration.DATABASE_NAME))); var transaction = (SqliteTransaction)con.BeginTransaction(); try { this.Add(newOnly.ToList(), con); this.Delete(oldOnly.ToList(), con); transaction.Commit(); } catch (Exception) { transaction.Rollback(); return false; } } return true; }
public override FolderMetadata LoadFolderMetadata(string currId, SourceOption option) { string opt = (option == SourceOption.SOURCE_ID_NOT_EQUALS) ? " <> " : " = "; var folderMetadata = new FolderMetadata(currId, this.RootPath); var db = new SQLiteAccess(Path.Combine(this.StoragePath, Configuration.DATABASE_NAME),false); using (SqliteConnection con = db.NewSQLiteConnection()) { if (con == null) throw new DatabaseException(String.Format(m_ResourceManager.GetString("err_somethingNotFound"), Path.Combine(this.StoragePath, Configuration.DATABASE_NAME))); string cmdText = "SELECT * FROM " + Configuration.TLB_FOLDERMETADATA + " WHERE " + Configuration.COL_SOURCE_ID + opt + " @sourceId"; var paramList = new SqliteParameterCollection {new SqliteParameter("@sourceId", DbType.String) {Value = currId}}; db.ExecuteReader(cmdText, paramList, reader => folderMetadata.FolderMetadataItems.Add( new FolderMetadataItem( (string)reader[Configuration.COL_SOURCE_ID], (string)reader[Configuration.COL_FOLDER_RELATIVE_PATH], (int)reader[Configuration.COL_IS_FOLDER_EMPTY] ))); } return folderMetadata; }