2 // FileAttributesStore.cs
4 // Copyright (C) 2005 Novell, Inc.
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
15 // The above copyright notice and this permission notice shall be included in all
16 // copies or substantial portions of the Software.
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31 namespace Beagle
.Daemon
{
33 public class FileAttributesStore
{
35 private IFileAttributesStore ifas
;
37 public FileAttributesStore (IFileAttributesStore ifas
)
42 public FileAttributes
Read (string path
)
45 return ifas
.Read (path
);
49 public FileAttributes
ReadOrCreate (string path
, Guid unique_id
, out bool created
)
54 FileAttributes attr
= ifas
.Read (path
);
55 // If we pass in a Guid that doesn't match the one we found in the
56 // the attributes, clobber the old attributes and the old unique Guid.
58 || (unique_id
!= Guid
.Empty
&& unique_id
!= attr
.UniqueId
)) {
59 // First drop the old attribute, if there is one.
63 // Now create the new attribute
64 attr
= new FileAttributes ();
65 attr
.UniqueId
= unique_id
;
68 // Now add the new attribute
76 public FileAttributes
ReadOrCreate (string path
, Guid unique_id
)
79 return ReadOrCreate (path
, unique_id
, out dummy
);
82 public FileAttributes
ReadOrCreate (string path
)
84 return ReadOrCreate (path
, Guid
.NewGuid ());
87 public bool Write (FileAttributes attr
)
90 attr
.LastAttrTime
= DateTime
.UtcNow
;
91 return ifas
.Write (attr
);
95 public void Drop (string path
)
102 public void BeginTransaction ()
105 ifas
.BeginTransaction ();
109 public void CommitTransaction ()
112 ifas
.CommitTransaction ();
115 //////////////////////////////////////////////////////////
117 public bool IsUpToDate (string path
, Filter filter
)
123 // If there are no attributes set on the file, there is no
124 // way that we can be up-to-date.
128 // Note that when filter is set to null, we ignore
129 // any existing filter data. That might not be the
130 // expected behavior...
131 if (filter
!= null) {
133 if (! attr
.HasFilterInfo
)
136 if (attr
.FilterName
!= filter
.Name
)
139 // FIXME: Obviously we want to reindex if
140 // attr.FilterVersion < filter.Version.
141 // But what if the filter we would use is older
142 // than the one that was previously used?
143 if (attr
.FilterVersion
!= filter
.Version
)
147 if (FileSystem
.GetLastWriteTimeUtc (path
) > attr
.LastWriteTime
)
153 public bool IsUpToDate (string path
)
155 return IsUpToDate (path
, null);
158 //////////////////////////////////////////////////////////
160 // A convenience routine.
161 public void AttachLastWriteTime (string path
, DateTime mtime
)
163 FileAttributes attr
= ReadOrCreate (path
);
164 attr
.LastWriteTime
= mtime
;
166 Logger
.Log
.Warn ("Couldn't store file attributes for {0}", path
);