internal void ReplaceFileTimes(Dictionary <string, LocalState.FileTimestamp> filetimes) { lock (this) { try { BeginTransaction(); DeleteAll <LocalState.FileTimestamp>(); foreach (var x in filetimes) { LocalState.FileTimestamp fst = new FileTimestamp() { DataIdentifier = x.Value.DataIdentifier, CanonicalName = x.Key, LastSeenTime = x.Value.LastSeenTime }; Insert(fst); } Commit(); var oldList = LoadFileTimes(); } catch { Rollback(); throw; } } }
internal void UpdateFileTime(string canonicalName, LocalState.FileTimestamp ft, bool?present) { lock (this) { LocalState.FileTimestamp prior = null; if (!present.HasValue || present.Value == true) { prior = Find <LocalState.FileTimestamp>(x => x.CanonicalName == canonicalName); } if (prior == null) { prior = new FileTimestamp() { CanonicalName = canonicalName, LastSeenTime = ft.LastSeenTime, DataIdentifier = ft.DataIdentifier }; Insert(prior); } else { prior.LastSeenTime = ft.LastSeenTime; prior.DataIdentifier = ft.DataIdentifier; Update(prior); } } }
public override void Save(OutputWriter output) { Assert.ArgumentNotNull(output, nameof(output)); output.WriteStartElement("File"); output.WriteAttributeString("Include", File); output.WriteAttributeString(@"FileTimestamp", FileTimestamp.ToString(CultureInfo.InvariantCulture)); output.WriteAttributeString(@"FileSize", FileSize.ToString(CultureInfo.InvariantCulture)); output.WriteAttributeString(@"ServerTimestamp", ServerTimestamp.ToString(CultureInfo.InvariantCulture)); output.WriteAttributeString(@"ServerFileSize", ServerFileSize.ToString(CultureInfo.InvariantCulture)); if (IsConflict) { output.WriteAttributeString(@"IsConflict", @"True"); output.WriteAttributeString(@"ConflictResolution", ConflictResolution.ToString()); } if (HideFromToolbox) { output.WriteAttributeString(@"HideFromToolbox", @"True"); } foreach (var itemUri in Items) { output.WriteStartElement("Item"); output.WriteAttributeString(@"DatabaseName", itemUri.DatabaseName.ToString()); output.WriteValue(itemUri.ItemId.ToString()); output.WriteEndElement(); } output.WriteEndElement(); }
/// <summary> /// Constructs and starts the cleaner. /// </summary> /// <param name="path">Path of the folder to periodically cleanup</param> /// <param name="threshold">The minimum lifetime of the file to be deleted</param> /// <param name="interval">How often the cleanup occurs</param> /// <param name="timestampToCheck">Timestamp to use to determine if the file must be deleted</param> public FreshFolder(string path, TimeSpan threshold, TimeSpan interval, FileTimestamp timestampToCheck) { Path = path; Threshold = threshold; Interval = interval; TimestampToCheck = timestampToCheck; if (!Enum.IsDefined(typeof(FileTimestamp), timestampToCheck)) { throw new InvalidEnumArgumentException("Unexpected FileTimestamp: \"" + TimestampToCheck + "\""); } _cleanLock = new object(); _timer = new Timer(Clean, null, TimeSpan.Zero, interval); }
/// <summary> /// Gets the <see cref="VSSFlags" /> value corresponding with the /// specified <see cref="FileTimestamp" />. /// </summary> /// <param name="timestamp">A <see cref="FileTimestamp" />.</param> /// <returns> /// An <see cref="int" /> representing the <see cref="VSSFlags" /> value /// for the <paramref name="timestamp" />. /// </returns> protected int GetFileTimestampFlags(FileTimestamp timestamp) { switch (timestamp) { case FileTimestamp.Current: return(Convert.ToInt32(VSSFlags.VSSFLAG_TIMENOW)); case FileTimestamp.Modified: return(Convert.ToInt32(VSSFlags.VSSFLAG_TIMEMOD)); case FileTimestamp.Updated: return(Convert.ToInt32(VSSFlags.VSSFLAG_TIMEUPD)); default: throw new InvalidEnumArgumentException("timestamp", (int)timestamp, typeof(FileTimestamp)); } }
internal Dictionary <string, LocalState.FileTimestamp> LoadFileTimesOptimized() { Dictionary <string, LocalState.FileTimestamp> result = new Dictionary <string, LocalState.FileTimestamp>(); var query = SQLite.SQLite3.Prepare2(this.Handle, "SELECT CanonicalName, LastSeenTime, DataIdentifier FROM FileTimestamp"); byte[] array = new byte[1024]; int bsize = 1024; unsafe { while (SQLite.SQLite3.Step(query) == SQLite.SQLite3.Result.Row) { var iptr = SQLite.SQLite3.ColumnText(query, 0); int size = SQLite.SQLite3.ColumnBytes(query, 0); if (size > bsize) { bsize = size * 2; array = new byte[bsize]; } System.Runtime.InteropServices.Marshal.Copy(iptr, array, 0, size); string cname = Encoding.UTF8.GetString(array, 0, size); iptr = SQLite.SQLite3.ColumnText(query, 2); size = SQLite.SQLite3.ColumnBytes(query, 2); LocalState.FileTimestamp ft = new FileTimestamp() { CanonicalName = cname, DataIdentifier = new string((sbyte *)iptr, 0, size), LastSeenTime = new DateTime(SQLite.SQLite3.ColumnInt64(query, 1)), }; result[cname] = ft; } } SQLite.SQLite3.Finalize(query); return(result); }
/// <summary> /// Gets the <see cref="VSSFlags" /> value corresponding with the /// specified <see cref="FileTimestamp" />. /// </summary> /// <param name="timestamp">A <see cref="FileTimestamp" />.</param> /// <returns> /// An <see cref="int" /> representing the <see cref="VSSFlags" /> value /// for the <paramref name="timestamp" />. /// </returns> protected int GetFileTimestampFlags(FileTimestamp timestamp) { switch (timestamp) { case FileTimestamp.Current: return Convert.ToInt32(VSSFlags.VSSFLAG_TIMENOW); case FileTimestamp.Modified: return Convert.ToInt32(VSSFlags.VSSFLAG_TIMEMOD); case FileTimestamp.Updated: return Convert.ToInt32(VSSFlags.VSSFLAG_TIMEUPD); default: throw new InvalidEnumArgumentException("timestamp", (int) timestamp, typeof(FileTimestamp)); } }