Пример #1
0
        public static bool insertUnchanged(SQLiteConnection conn, DirectoryStatus oldStatus, DirectoryStatus newStatus)
        {
            try
            {
                if (oldStatus.Equals(newStatus))
                    return true;
                Dictionary<String, DirectoryFile> diff;
                diff = oldStatus.Files.Where(x => !newStatus.Files.ContainsKey(x.Key)).ToDictionary(x => x.Key, x => x.Value);
                
                foreach (var item in diff)
                {

                    using (SQLiteCommand cmd = conn.CreateCommand())
                    {
                        DirectoryFile file = item.Value;
                        if (file.Directory)
                        {
                            cmd.CommandText = @"insert into snapshots (user_id,creation_time,path,filename,last_mod_time,directory,deleted) values"
                                + " (@user, @creationTime, @path, @filename, @lastModTime, @directory, @deleted);";
                            cmd.Parameters.AddWithValue("@user", newStatus.Username);
                            cmd.Parameters.AddWithValue("@creationTime", newStatus.CreationTime.ToString(date_format));
                            cmd.Parameters.AddWithValue("@path", file.Path + "\\");
                            cmd.Parameters.AddWithValue("@filename", file.Filename);
                            cmd.Parameters.AddWithValue("@lastModTime", file.LastModificationTime.ToString(date_format));
                            cmd.Parameters.AddWithValue("@directory", file.Directory);
                            cmd.Parameters.AddWithValue("@deleted", file.Deleted);
                            cmd.ExecuteNonQuery();
                            DirectoryFile newFile = file.clone();
                            newStatus.Files.Add(newFile.Fullname, newFile);
                        }
                        else
                        {
                            cmd.CommandText = @"insert into snapshots (user_id,file_id,creation_time,checksum,path,filename,last_mod_time,deleted) values"
                                + " (@user, @fileId, @creationTime, @checksum, @path, @filename, @lastModTime, @deleted);";
                            cmd.Parameters.AddWithValue("@user", file.UserId);
                            cmd.Parameters.AddWithValue("@fileId", file.Id);
                            cmd.Parameters.AddWithValue("@creationTime", newStatus.CreationTime.ToString(date_format));
                            cmd.Parameters.AddWithValue("@checksum", file.Checksum);
                            cmd.Parameters.AddWithValue("@path", file.Path + "\\");
                            cmd.Parameters.AddWithValue("@filename", file.Filename);
                            cmd.Parameters.AddWithValue("@lastModTime", file.LastModificationTime.ToString(date_format));
                            cmd.Parameters.AddWithValue("@deleted", file.Deleted);
                            cmd.ExecuteNonQuery();
                            DirectoryFile newFile = file.clone();
                            newStatus.Files.Add(newFile.Fullname, newFile);
                        }
                    }
                }
                return true;
            }
            catch (SQLiteException) { return false;}
            
        }
Пример #2
0
 public bool synchronize(DirectoryStatus local, DirectoryStatus remote, BackgroundWorker worker)
 {
     try
     {
         if (local.Equals(remote))
             return true;
         byte[] command = BitConverter.GetBytes((UInt32)Networking.CONNECTION_CODES.START_SYNCH);
         tcpClient.Client.Send(command);
         var fileAdded = local.getDifference(remote);
         var fileDeleted = remote.getDifference(local);
         var fileUpdated = remote.getIntersect(local);
         long tot = fileAdded.Count + fileDeleted.Count + fileUpdated.Count;
         long i = 0;
         foreach (var item in fileAdded)
         {
             addFile(item.Value);
             double percentage = (double)i / tot;
             worker.ReportProgress((int)(percentage * 100));
             i++;
         }
         
         foreach (var item in fileDeleted)
         {
             if (!fileDeleted.ContainsKey(item.Value.Path))
                 deleteFile(item.Value);
             double percentage = (double)i / tot;
             worker.ReportProgress((int)(percentage * 100));
             i++;
         }
         
         foreach (var item in fileUpdated)
         {
             DirectoryFile remoteFile = item.Value;
             DirectoryFile localFile = local.Files[item.Key];
             if (!localFile.Equals(remoteFile))
             {
                 updateFile(localFile);
                 double percentage = (double)i / tot;
                 worker.ReportProgress((int)(percentage * 100));
                 i++;
             }
         }
         command = BitConverter.GetBytes((UInt32)Networking.CONNECTION_CODES.END_SYNCH);
         tcpClient.Client.Send(command);
         //added ok to be sure server commited
         command = Networking.my_recv(4, tcpClient.Client);
         if (command != null && (
                 ((Networking.CONNECTION_CODES)BitConverter.ToUInt32(command, 0) == Networking.CONNECTION_CODES.OK)))
         {
             return true;
         }
         else return false;
     }
     catch (Exception) { return false; }
 }