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;} }
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; } }