public static void Overwrite(string zipFilePath, IProcessingCallback callback)
        {
            // check existence of zip archive
            if (!System.IO.File.Exists(zipFilePath))
            {
                throw new FileNotFoundException(string.Format("File {0} not found", zipFilePath), zipFilePath);
            }
            // extract zip archive to temp
            DBDescriptor dbDescFrom = DBDescriptor.CreateTempFromArchive(zipFilePath, callback);

            PPDataContext dbFrom   = new PPDataContext(dbDescFrom);
            TreeNode      nodeFrom = TreeNode.GetRootNodes(dbFrom)[0];

            PPDataContext dbTo   = new PPDataContext();
            TreeNode      nodeTo = TreeNode.GetRootNodes(dbTo)[0];

            // merge format table
            OverwriteCardboardFormats(dbFrom, dbTo, callback);
            // merge cardboard profiles
            OverwriteCardboardProfiles(dbFrom, dbTo, callback);
            // merge document types
            OverwriteDocumentTypes(dbFrom, dbTo, callback);

            // first clear existing documents
            ClearExistingDocumentsRecursively(dbFrom, nodeFrom, nodeTo, callback);
            // then merge
            using (PPDataContext dbTo1 = new PPDataContext())
            {
                MergeTreeNodesRecursively(dbFrom, dbTo, nodeFrom, nodeTo, callback);
            }
        }
 /// <summary>
 /// restores a backup database : callback version
 /// </summary>
 public static bool Restore(string zipFilePath, IProcessingCallback callback)
 {
     try
     {
         // clear existing directories
         DBDescriptor dbDescTo = DBDescriptor.Current;
         if (!dbDescTo.Clear())
         {
             if (null != callback)
             {
                 callback.Error("Failed to clear current database!");
             }
             return(false);
         }
         // extract new database
         DBDescriptor dbDescFrom = DBDescriptor.CreateTempFromArchive(zipFilePath, callback);
         // build data contexts
         PPDataContext dbFrom = new PPDataContext(dbDescFrom);
         PPDataContext dbTo   = new PPDataContext(dbDescTo);
         // copy format table
         CopyCardboardFormats(dbFrom, dbTo);
         // copy cardboard profiles
         CopyCardboardProfiles(dbFrom, dbTo);
         // copy document types
         CopyDocumentTypes(dbFrom, dbTo);
         // copy branch nodes recursively
         TreeNode nodeFrom = TreeNode.GetRootNodes(dbFrom)[0];
         TreeNode nodeTo   = TreeNode.GetRootNodes(dbTo)[0];;
         CopyTreeNodesRecursively(dbFrom, dbTo, nodeFrom, nodeTo, callback);
         GC.Collect();
     }
     catch (Exception ex)
     {
         if (null != callback)
         {
             callback.Error(ex.Message);
         }
         _log.Error(ex.ToString());
         return(false);
     }
     return(true);
 }