示例#1
0
        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;
                }
            }
        }
示例#2
0
 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();
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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));
            }
        }
示例#6
0
        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);
        }
示例#7
0
 /// <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));
     }
 }