Statistics
| Branch: | Revision:

root / trunk / Pithos.Core / FileState.cs @ 174bbb6e

History | View | Annotate | Download (20.6 kB)

1 255f5f86 Panagiotis Kanavos
#region
2 255f5f86 Panagiotis Kanavos
/* -----------------------------------------------------------------------
3 255f5f86 Panagiotis Kanavos
 * <copyright file="FileState.cs" company="GRNet">
4 255f5f86 Panagiotis Kanavos
 * 
5 255f5f86 Panagiotis Kanavos
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6 255f5f86 Panagiotis Kanavos
 *
7 255f5f86 Panagiotis Kanavos
 * Redistribution and use in source and binary forms, with or
8 255f5f86 Panagiotis Kanavos
 * without modification, are permitted provided that the following
9 255f5f86 Panagiotis Kanavos
 * conditions are met:
10 255f5f86 Panagiotis Kanavos
 *
11 255f5f86 Panagiotis Kanavos
 *   1. Redistributions of source code must retain the above
12 255f5f86 Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
13 255f5f86 Panagiotis Kanavos
 *      disclaimer.
14 255f5f86 Panagiotis Kanavos
 *
15 255f5f86 Panagiotis Kanavos
 *   2. Redistributions in binary form must reproduce the above
16 255f5f86 Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
17 255f5f86 Panagiotis Kanavos
 *      disclaimer in the documentation and/or other materials
18 255f5f86 Panagiotis Kanavos
 *      provided with the distribution.
19 255f5f86 Panagiotis Kanavos
 *
20 255f5f86 Panagiotis Kanavos
 *
21 255f5f86 Panagiotis Kanavos
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 255f5f86 Panagiotis Kanavos
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 255f5f86 Panagiotis Kanavos
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 255f5f86 Panagiotis Kanavos
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 255f5f86 Panagiotis Kanavos
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 255f5f86 Panagiotis Kanavos
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 255f5f86 Panagiotis Kanavos
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 255f5f86 Panagiotis Kanavos
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 255f5f86 Panagiotis Kanavos
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 255f5f86 Panagiotis Kanavos
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 255f5f86 Panagiotis Kanavos
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 255f5f86 Panagiotis Kanavos
 * POSSIBILITY OF SUCH DAMAGE.
33 255f5f86 Panagiotis Kanavos
 *
34 255f5f86 Panagiotis Kanavos
 * The views and conclusions contained in the software and
35 255f5f86 Panagiotis Kanavos
 * documentation are those of the authors and should not be
36 255f5f86 Panagiotis Kanavos
 * interpreted as representing official policies, either expressed
37 255f5f86 Panagiotis Kanavos
 * or implied, of GRNET S.A.
38 255f5f86 Panagiotis Kanavos
 * </copyright>
39 255f5f86 Panagiotis Kanavos
 * -----------------------------------------------------------------------
40 255f5f86 Panagiotis Kanavos
 */
41 255f5f86 Panagiotis Kanavos
#endregion
42 bfc13ed8 Panagiotis Kanavos
using System.Diagnostics.Contracts;
43 5ce54458 Panagiotis Kanavos
using System.IO;
44 db8a9589 Panagiotis Kanavos
using System.Reflection;
45 0c02aa65 Panagiotis Kanavos
using System.Threading.Tasks;
46 eeee29e3 Panagiotis Kanavos
using Castle.ActiveRecord;
47 b5061ac8 Panagiotis Kanavos
using Castle.ActiveRecord.Framework;
48 759bd3c4 Panagiotis Kanavos
using Castle.ActiveRecord.Queries;
49 759bd3c4 Panagiotis Kanavos
using NHibernate.Criterion;
50 0af3141d Panagiotis Kanavos
using Pithos.Core.Agents;
51 eeee29e3 Panagiotis Kanavos
using Pithos.Interfaces;
52 540b8cf8 Panagiotis Kanavos
using Pithos.Network;
53 4ec636f6 Panagiotis Kanavos
using log4net;
54 eeee29e3 Panagiotis Kanavos
55 eeee29e3 Panagiotis Kanavos
namespace Pithos.Core
56 eeee29e3 Panagiotis Kanavos
{
57 eeee29e3 Panagiotis Kanavos
    using System;
58 fec5da06 Panagiotis Kanavos
    using System.Collections.Generic;    
59 eeee29e3 Panagiotis Kanavos
60 eeee29e3 Panagiotis Kanavos
    /// <summary>
61 eeee29e3 Panagiotis Kanavos
    /// TODO: Update summary.
62 eeee29e3 Panagiotis Kanavos
    /// </summary>
63 eeee29e3 Panagiotis Kanavos
    [ActiveRecord]
64 e81dd1f6 Panagiotis Kanavos
    public class FileState : ActiveRecordLinqBase<FileState>
65 eeee29e3 Panagiotis Kanavos
    {
66 db8a9589 Panagiotis Kanavos
        private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
67 db8a9589 Panagiotis Kanavos
68 e81dd1f6 Panagiotis Kanavos
69 e81dd1f6 Panagiotis Kanavos
        private IList<FileTag> _tags = new List<FileTag>();
70 3c43ec9b Panagiotis Kanavos
71 9c4346c9 Panagiotis Kanavos
        [PrimaryKey(PrimaryKeyType.Guid)]
72 9c4346c9 Panagiotis Kanavos
        public Guid Id { get; set; }
73 0eea575a Panagiotis Kanavos
74 3c76f045 Panagiotis Kanavos
        
75 e81dd1f6 Panagiotis Kanavos
        [Property(Unique = true, UniqueKey = "IX_FileState_FilePath")]
76 3c76f045 Panagiotis Kanavos
        public string FilePath { get; set; }
77 eeee29e3 Panagiotis Kanavos
78 eeee29e3 Panagiotis Kanavos
        [Property]
79 eeee29e3 Panagiotis Kanavos
        public FileOverlayStatus OverlayStatus { get; set; }
80 eeee29e3 Panagiotis Kanavos
81 eeee29e3 Panagiotis Kanavos
        [Property]
82 eeee29e3 Panagiotis Kanavos
        public FileStatus FileStatus { get; set; }
83 eeee29e3 Panagiotis Kanavos
84 174bbb6e Panagiotis Kanavos
        private string _checksum;
85 174bbb6e Panagiotis Kanavos
86 174bbb6e Panagiotis Kanavos
        /// <summary>
87 174bbb6e Panagiotis Kanavos
        /// The tophash value of the file, calculated by using a Merkle hash with the SHA256 algorithm
88 174bbb6e Panagiotis Kanavos
        /// </summary>
89 174bbb6e Panagiotis Kanavos
        /// <remarks>
90 174bbb6e Panagiotis Kanavos
        /// The SHA256 algorithm is substantially more expenive than other algorithms.
91 174bbb6e Panagiotis Kanavos
        /// Recalculating the Checksum should be avoided whenever possible.
92 174bbb6e Panagiotis Kanavos
        /// </remarks>
93 eeee29e3 Panagiotis Kanavos
        [Property]
94 174bbb6e Panagiotis Kanavos
        public string Checksum
95 174bbb6e Panagiotis Kanavos
        {
96 174bbb6e Panagiotis Kanavos
            get
97 174bbb6e Panagiotis Kanavos
            {
98 174bbb6e Panagiotis Kanavos
                return _checksum;
99 174bbb6e Panagiotis Kanavos
            }
100 174bbb6e Panagiotis Kanavos
            set
101 174bbb6e Panagiotis Kanavos
            {
102 174bbb6e Panagiotis Kanavos
                _checksum = value;
103 174bbb6e Panagiotis Kanavos
            }
104 174bbb6e Panagiotis Kanavos
        }
105 174bbb6e Panagiotis Kanavos
106 174bbb6e Panagiotis Kanavos
        private string _shortHash;
107 174bbb6e Panagiotis Kanavos
108 174bbb6e Panagiotis Kanavos
        /// <summary>
109 174bbb6e Panagiotis Kanavos
        /// An easy to calcualte hash over the entire file, used to detect file changes
110 174bbb6e Panagiotis Kanavos
        /// </summary>
111 174bbb6e Panagiotis Kanavos
        /// <remarks>The algorithm used to calculate this hash should be cheap</remarks>
112 174bbb6e Panagiotis Kanavos
        [Property(NotNull=true,Default="")]
113 174bbb6e Panagiotis Kanavos
        public string ShortHash
114 174bbb6e Panagiotis Kanavos
        {
115 174bbb6e Panagiotis Kanavos
            get
116 174bbb6e Panagiotis Kanavos
            {
117 174bbb6e Panagiotis Kanavos
                return _shortHash;
118 174bbb6e Panagiotis Kanavos
            }
119 174bbb6e Panagiotis Kanavos
            set
120 174bbb6e Panagiotis Kanavos
            {
121 174bbb6e Panagiotis Kanavos
                _shortHash = value;
122 174bbb6e Panagiotis Kanavos
            }
123 174bbb6e Panagiotis Kanavos
        }
124 283809f3 Panagiotis Kanavos
125 9c4346c9 Panagiotis Kanavos
126 bfc13ed8 Panagiotis Kanavos
        [Property]
127 bfc13ed8 Panagiotis Kanavos
        public long? Version { get; set; }
128 bfc13ed8 Panagiotis Kanavos
129 bfc13ed8 Panagiotis Kanavos
        [Property]
130 bfc13ed8 Panagiotis Kanavos
        public DateTime? VersionTimeStamp { get; set; }
131 cfed7823 Panagiotis Kanavos
132 cfed7823 Panagiotis Kanavos
133 cfed7823 Panagiotis Kanavos
        [Property]
134 cfed7823 Panagiotis Kanavos
        public bool IsShared { get; set; }
135 cfed7823 Panagiotis Kanavos
136 cfed7823 Panagiotis Kanavos
        [Property]
137 cfed7823 Panagiotis Kanavos
        public string SharedBy { get; set; }
138 cfed7823 Panagiotis Kanavos
139 cfed7823 Panagiotis Kanavos
        [Property]
140 cfed7823 Panagiotis Kanavos
        public bool ShareWrite { get; set; }
141 cfed7823 Panagiotis Kanavos
142 3c76f045 Panagiotis Kanavos
        [Property]
143 3c76f045 Panagiotis Kanavos
        public bool IsFolder{ get; set; }
144 bfc13ed8 Panagiotis Kanavos
145 e81dd1f6 Panagiotis Kanavos
        [HasMany(Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Lazy = true, Inverse = true)]
146 3c43ec9b Panagiotis Kanavos
        public IList<FileTag> Tags
147 3c43ec9b Panagiotis Kanavos
        {
148 e81dd1f6 Panagiotis Kanavos
            get { return _tags; }
149 e81dd1f6 Panagiotis Kanavos
            set { _tags = value; }
150 3c43ec9b Panagiotis Kanavos
        }
151 0c02aa65 Panagiotis Kanavos
152 540b8cf8 Panagiotis Kanavos
        [Property]
153 540b8cf8 Panagiotis Kanavos
        public DateTime Modified { get; set; }
154 540b8cf8 Panagiotis Kanavos
155 540b8cf8 Panagiotis Kanavos
156 540b8cf8 Panagiotis Kanavos
        public FileSystemInfo GetFileSystemInfo()
157 540b8cf8 Panagiotis Kanavos
        {
158 540b8cf8 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(FilePath))
159 540b8cf8 Panagiotis Kanavos
                throw new InvalidOperationException();
160 540b8cf8 Panagiotis Kanavos
            Contract.EndContractBlock();
161 e81dd1f6 Panagiotis Kanavos
162 540b8cf8 Panagiotis Kanavos
            return Directory.Exists(FilePath) ?
163 540b8cf8 Panagiotis Kanavos
                (FileSystemInfo)new DirectoryInfo(FilePath)
164 540b8cf8 Panagiotis Kanavos
                : new FileInfo(FilePath);
165 540b8cf8 Panagiotis Kanavos
        }
166 540b8cf8 Panagiotis Kanavos
167 540b8cf8 Panagiotis Kanavos
        public string GetRelativeUrl(AccountInfo accountInfo)
168 540b8cf8 Panagiotis Kanavos
        {
169 540b8cf8 Panagiotis Kanavos
            if (accountInfo==null)
170 540b8cf8 Panagiotis Kanavos
                throw new ArgumentNullException("accountInfo");
171 540b8cf8 Panagiotis Kanavos
            Contract.EndContractBlock();
172 540b8cf8 Panagiotis Kanavos
173 540b8cf8 Panagiotis Kanavos
            var fsi=GetFileSystemInfo();
174 540b8cf8 Panagiotis Kanavos
            return fsi.AsRelativeUrlTo(accountInfo.AccountPath);
175 540b8cf8 Panagiotis Kanavos
        }
176 039a89e5 Panagiotis Kanavos
        /*public static FileState FindByFilePath(string absolutePath)
177 bfc13ed8 Panagiotis Kanavos
        {
178 0af3141d Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
179 0af3141d Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
180 0af3141d Panagiotis Kanavos
            Contract.EndContractBlock();
181 4ec636f6 Panagiotis Kanavos
            try
182 4ec636f6 Panagiotis Kanavos
            {
183 e81dd1f6 Panagiotis Kanavos
184 e81dd1f6 Panagiotis Kanavos
                
185 e81dd1f6 Panagiotis Kanavos
186 3c76f045 Panagiotis Kanavos
                return Queryable.FirstOrDefault(s => s.FilePath == absolutePath);
187 4ec636f6 Panagiotis Kanavos
            }
188 4ec636f6 Panagiotis Kanavos
            catch (Exception ex)
189 4ec636f6 Panagiotis Kanavos
            {
190 4ec636f6 Panagiotis Kanavos
                Log.Error(ex.ToString());
191 4ec636f6 Panagiotis Kanavos
                throw;
192 4ec636f6 Panagiotis Kanavos
            }
193 e81dd1f6 Panagiotis Kanavos
194 4ec636f6 Panagiotis Kanavos
195 039a89e5 Panagiotis Kanavos
        }*/
196 bfc13ed8 Panagiotis Kanavos
197 e81dd1f6 Panagiotis Kanavos
       /* public static void DeleteByFilePath(string absolutePath)
198 0af3141d Panagiotis Kanavos
        {
199 e81dd1f6 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
200 0af3141d Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
201 0af3141d Panagiotis Kanavos
            Contract.EndContractBlock();
202 e81dd1f6 Panagiotis Kanavos
203 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
204 e81dd1f6 Panagiotis Kanavos
                        {
205 e81dd1f6 Panagiotis Kanavos
                            const string hqlDelete = "delete FileState where FilePath = :path";
206 e81dd1f6 Panagiotis Kanavos
                            var deletedEntities = session.CreateQuery(hqlDelete)
207 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
208 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
209 e81dd1f6 Panagiotis Kanavos
                            return deletedEntities;
210 e81dd1f6 Panagiotis Kanavos
                        }, null);
211 e81dd1f6 Panagiotis Kanavos
212 e81dd1f6 Panagiotis Kanavos
        }*/
213 0af3141d Panagiotis Kanavos
214 ab2f6f79 Panagiotis Kanavos
        public static void StoreFileStatus(string absolutePath, FileStatus newStatus)
215 ab2f6f79 Panagiotis Kanavos
        {
216 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
217 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
218 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
219 ab2f6f79 Panagiotis Kanavos
220 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
221 e81dd1f6 Panagiotis Kanavos
                        {
222 3c76f045 Panagiotis Kanavos
                            const string hqlUpdate = "update FileState set FileStatus= :status where FilePath = :path ";
223 e81dd1f6 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)
224 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
225 e81dd1f6 Panagiotis Kanavos
                                .SetEnum("status", newStatus)
226 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
227 e81dd1f6 Panagiotis Kanavos
                            if (updatedEntities == 0)
228 e81dd1f6 Panagiotis Kanavos
                            {
229 e81dd1f6 Panagiotis Kanavos
                                var newState = new FileState
230 e81dd1f6 Panagiotis Kanavos
                                                   {
231 3c76f045 Panagiotis Kanavos
                                                       FilePath = absolutePath,
232 e81dd1f6 Panagiotis Kanavos
                                                       Id = Guid.NewGuid(),
233 3c76f045 Panagiotis Kanavos
                                                       FileStatus = newStatus,
234 3c76f045 Panagiotis Kanavos
                                                       IsFolder=Directory.Exists(absolutePath)
235 e81dd1f6 Panagiotis Kanavos
                                                   };
236 e81dd1f6 Panagiotis Kanavos
                                newState.CreateAndFlush();
237 e81dd1f6 Panagiotis Kanavos
                            }
238 e81dd1f6 Panagiotis Kanavos
                            return null;
239 e81dd1f6 Panagiotis Kanavos
                        }, null);
240 ab2f6f79 Panagiotis Kanavos
241 ab2f6f79 Panagiotis Kanavos
        }
242 ab2f6f79 Panagiotis Kanavos
243 174bbb6e Panagiotis Kanavos
        /*public static void StoreOverlayStatus(string absolutePath, FileOverlayStatus newStatus)
244 174bbb6e Panagiotis Kanavos
        {
245 174bbb6e Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
246 174bbb6e Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
247 174bbb6e Panagiotis Kanavos
            Contract.EndContractBlock();
248 174bbb6e Panagiotis Kanavos
249 174bbb6e Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
250 174bbb6e Panagiotis Kanavos
                        {
251 174bbb6e Panagiotis Kanavos
                            const string hqlUpdate =
252 174bbb6e Panagiotis Kanavos
                                "update FileState set OverlayStatus= :status where FilePath = :path ";
253 174bbb6e Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)                                
254 174bbb6e Panagiotis Kanavos
                                .SetString("path", absolutePath)
255 174bbb6e Panagiotis Kanavos
                                .SetEnum("status", newStatus)                                
256 174bbb6e Panagiotis Kanavos
                                .ExecuteUpdate();
257 174bbb6e Panagiotis Kanavos
                            if (updatedEntities == 0)
258 174bbb6e Panagiotis Kanavos
                            {
259 174bbb6e Panagiotis Kanavos
                                var newState = new FileState
260 174bbb6e Panagiotis Kanavos
                                                   {
261 174bbb6e Panagiotis Kanavos
                                                       FilePath = absolutePath,
262 174bbb6e Panagiotis Kanavos
                                                       Id = Guid.NewGuid(),
263 174bbb6e Panagiotis Kanavos
                                                       OverlayStatus = newStatus,
264 174bbb6e Panagiotis Kanavos
                                                       ShortHash = String.Empty,
265 174bbb6e Panagiotis Kanavos
                                                       IsFolder=Directory.Exists(absolutePath)
266 174bbb6e Panagiotis Kanavos
                                                   };
267 174bbb6e Panagiotis Kanavos
                                newState.CreateAndFlush();
268 174bbb6e Panagiotis Kanavos
                            }
269 174bbb6e Panagiotis Kanavos
                            return null;
270 174bbb6e Panagiotis Kanavos
                        }, null);
271 174bbb6e Panagiotis Kanavos
272 174bbb6e Panagiotis Kanavos
        }
273 174bbb6e Panagiotis Kanavos
*/
274 174bbb6e Panagiotis Kanavos
        public static void StoreOverlayStatus(string absolutePath, FileOverlayStatus newStatus,string shortHash)
275 ab2f6f79 Panagiotis Kanavos
        {
276 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
277 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
278 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
279 ab2f6f79 Panagiotis Kanavos
280 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
281 e81dd1f6 Panagiotis Kanavos
                        {
282 e81dd1f6 Panagiotis Kanavos
                            const string hqlUpdate =
283 3c76f045 Panagiotis Kanavos
                                "update FileState set OverlayStatus= :status where FilePath = :path ";
284 3c76f045 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)                                
285 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
286 3c76f045 Panagiotis Kanavos
                                .SetEnum("status", newStatus)                                
287 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
288 e81dd1f6 Panagiotis Kanavos
                            if (updatedEntities == 0)
289 e81dd1f6 Panagiotis Kanavos
                            {
290 e81dd1f6 Panagiotis Kanavos
                                var newState = new FileState
291 e81dd1f6 Panagiotis Kanavos
                                                   {
292 e81dd1f6 Panagiotis Kanavos
                                                       FilePath = absolutePath,
293 e81dd1f6 Panagiotis Kanavos
                                                       Id = Guid.NewGuid(),
294 3c76f045 Panagiotis Kanavos
                                                       OverlayStatus = newStatus,
295 174bbb6e Panagiotis Kanavos
                                                       ShortHash = shortHash??String.Empty,
296 3c76f045 Panagiotis Kanavos
                                                       IsFolder=Directory.Exists(absolutePath)
297 e81dd1f6 Panagiotis Kanavos
                                                   };
298 e81dd1f6 Panagiotis Kanavos
                                newState.CreateAndFlush();
299 e81dd1f6 Panagiotis Kanavos
                            }
300 e81dd1f6 Panagiotis Kanavos
                            return null;
301 e81dd1f6 Panagiotis Kanavos
                        }, null);
302 ab2f6f79 Panagiotis Kanavos
303 ab2f6f79 Panagiotis Kanavos
        }
304 ab2f6f79 Panagiotis Kanavos
305 e81dd1f6 Panagiotis Kanavos
/*
306 ab2f6f79 Panagiotis Kanavos
        public static void UpdateStatus(string absolutePath, FileStatus fileStatus, FileOverlayStatus overlayStatus)
307 ab2f6f79 Panagiotis Kanavos
        {
308 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
309 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
310 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
311 ab2f6f79 Panagiotis Kanavos
312 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
313 e81dd1f6 Panagiotis Kanavos
                        {
314 e81dd1f6 Panagiotis Kanavos
                            const string hqlUpdate =
315 e81dd1f6 Panagiotis Kanavos
                                "update FileState set OverlayStatus= :overlayStatus, FileStatus= :fileStatus where FilePath = :path  ";
316 e81dd1f6 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)
317 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
318 e81dd1f6 Panagiotis Kanavos
                                .SetEnum("fileStatus", fileStatus)
319 e81dd1f6 Panagiotis Kanavos
                                .SetEnum("overlayStatus", overlayStatus)
320 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
321 e81dd1f6 Panagiotis Kanavos
                            return updatedEntities;
322 e81dd1f6 Panagiotis Kanavos
                        }, null);
323 ab2f6f79 Panagiotis Kanavos
324 ab2f6f79 Panagiotis Kanavos
        }
325 e81dd1f6 Panagiotis Kanavos
*/
326 e81dd1f6 Panagiotis Kanavos
327 e81dd1f6 Panagiotis Kanavos
/*
328 ab2f6f79 Panagiotis Kanavos
        public static void UpdateStatus(string absolutePath, FileStatus fileStatus)
329 ab2f6f79 Panagiotis Kanavos
        {
330 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
331 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
332 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
333 ab2f6f79 Panagiotis Kanavos
334 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
335 e81dd1f6 Panagiotis Kanavos
                        {
336 e81dd1f6 Panagiotis Kanavos
                            const string hqlUpdate =
337 e81dd1f6 Panagiotis Kanavos
                                "update FileState set FileStatus= :fileStatus where FilePath = :path  ";
338 e81dd1f6 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)
339 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
340 e81dd1f6 Panagiotis Kanavos
                                .SetEnum("fileStatus", fileStatus)
341 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
342 e81dd1f6 Panagiotis Kanavos
                            return updatedEntities;
343 e81dd1f6 Panagiotis Kanavos
                        }, null);
344 ab2f6f79 Panagiotis Kanavos
345 ab2f6f79 Panagiotis Kanavos
        }
346 ab2f6f79 Panagiotis Kanavos
347 e81dd1f6 Panagiotis Kanavos
*/
348 ab2f6f79 Panagiotis Kanavos
        public static void RenameState(string oldPath, string newPath)
349 ab2f6f79 Panagiotis Kanavos
        {
350 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(oldPath))
351 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("oldPath");
352 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
353 ab2f6f79 Panagiotis Kanavos
354 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
355 e81dd1f6 Panagiotis Kanavos
                        {
356 e81dd1f6 Panagiotis Kanavos
                            const string hqlUpdate =
357 3c76f045 Panagiotis Kanavos
                                "update FileState set FilePath= :newPath where FilePath = :oldPath ";
358 e81dd1f6 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)
359 3c76f045 Panagiotis Kanavos
                                .SetString("oldPath", oldPath)
360 3c76f045 Panagiotis Kanavos
                                .SetString("newPath", newPath)
361 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
362 e81dd1f6 Panagiotis Kanavos
                            return updatedEntities;
363 e81dd1f6 Panagiotis Kanavos
                        }, null);
364 ab2f6f79 Panagiotis Kanavos
365 ab2f6f79 Panagiotis Kanavos
        }
366 ab2f6f79 Panagiotis Kanavos
367 e81dd1f6 Panagiotis Kanavos
     /*   public static void UpdateStatus(Guid id, FileStatus fileStatus)
368 ab2f6f79 Panagiotis Kanavos
        {
369 ab2f6f79 Panagiotis Kanavos
370 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
371 ab2f6f79 Panagiotis Kanavos
            {
372 e81dd1f6 Panagiotis Kanavos
                const string hqlUpdate =
373 e81dd1f6 Panagiotis Kanavos
                    "update FileState set FileStatus= :fileStatus where Id = :id  ";
374 ab2f6f79 Panagiotis Kanavos
                var updatedEntities = session.CreateQuery(hqlUpdate)
375 e81dd1f6 Panagiotis Kanavos
                    .SetGuid("id", id)
376 e81dd1f6 Panagiotis Kanavos
                    .SetEnum("fileStatus", fileStatus)
377 e81dd1f6 Panagiotis Kanavos
                    .ExecuteUpdate();
378 a0dcfcc9 Panagiotis Kanavos
                return updatedEntities;
379 ab2f6f79 Panagiotis Kanavos
            }, null);
380 e81dd1f6 Panagiotis Kanavos
        }*/
381 ab2f6f79 Panagiotis Kanavos
382 174bbb6e Panagiotis Kanavos
        public static void UpdateChecksum(string absolutePath, string shortHash, string checksum)
383 ab2f6f79 Panagiotis Kanavos
        {
384 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
385 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
386 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
387 ab2f6f79 Panagiotis Kanavos
388 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
389 e81dd1f6 Panagiotis Kanavos
                        {
390 174bbb6e Panagiotis Kanavos
                            const string hqlUpdate = "update FileState set Checksum= :checksum,ShortHash=:shortHash where FilePath = :path ";
391 e81dd1f6 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)
392 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
393 e81dd1f6 Panagiotis Kanavos
                                .SetString("checksum", checksum)
394 174bbb6e Panagiotis Kanavos
                                .SetString("shortHash", shortHash)
395 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
396 e81dd1f6 Panagiotis Kanavos
                            return updatedEntities;
397 e81dd1f6 Panagiotis Kanavos
                        }, null);
398 ab2f6f79 Panagiotis Kanavos
399 ab2f6f79 Panagiotis Kanavos
        }
400 0af3141d Panagiotis Kanavos
401 e81dd1f6 Panagiotis Kanavos
        public static void ChangeRootPath(string oldPath, string newPath)
402 5120f3cb Panagiotis Kanavos
        {
403 5120f3cb Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(oldPath))
404 5120f3cb Panagiotis Kanavos
                throw new ArgumentNullException("oldPath");
405 5120f3cb Panagiotis Kanavos
            if (!Path.IsPathRooted(oldPath))
406 5120f3cb Panagiotis Kanavos
                throw new ArgumentException("oldPath must be an absolute path", "oldPath");
407 5120f3cb Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(newPath))
408 5120f3cb Panagiotis Kanavos
                throw new ArgumentNullException("newPath");
409 5120f3cb Panagiotis Kanavos
            if (!Path.IsPathRooted(newPath))
410 5120f3cb Panagiotis Kanavos
                throw new ArgumentException("newPath must be an absolute path", "newPath");
411 5120f3cb Panagiotis Kanavos
            Contract.EndContractBlock();
412 5120f3cb Panagiotis Kanavos
413 5120f3cb Panagiotis Kanavos
            //Ensure the paths end with the same character
414 5120f3cb Panagiotis Kanavos
            if (!oldPath.EndsWith("\\"))
415 5120f3cb Panagiotis Kanavos
                oldPath = oldPath + "\\";
416 5120f3cb Panagiotis Kanavos
            if (!newPath.EndsWith("\\"))
417 5120f3cb Panagiotis Kanavos
                newPath = newPath + "\\";
418 5120f3cb Panagiotis Kanavos
419 e81dd1f6 Panagiotis Kanavos
                ExecuteWithRetry((session, instance) =>
420 5120f3cb Panagiotis Kanavos
                            {
421 5120f3cb Panagiotis Kanavos
                                const string hqlUpdate =
422 5120f3cb Panagiotis Kanavos
                                    "update FileState set FilePath = replace(FilePath,:oldPath,:newPath) where FilePath like :oldPath || '%' ";
423 e81dd1f6 Panagiotis Kanavos
                                var renames = session.CreateQuery(hqlUpdate)
424 3c76f045 Panagiotis Kanavos
                                    .SetString("oldPath", oldPath)
425 3c76f045 Panagiotis Kanavos
                                    .SetString("newPath", newPath)
426 5120f3cb Panagiotis Kanavos
                                    .ExecuteUpdate();
427 a0dcfcc9 Panagiotis Kanavos
                                return renames;
428 5120f3cb Panagiotis Kanavos
                            }, null);
429 5120f3cb Panagiotis Kanavos
        }
430 5120f3cb Panagiotis Kanavos
431 174bbb6e Panagiotis Kanavos
        public static FileState CreateFor(FileSystemInfo info)
432 0c02aa65 Panagiotis Kanavos
        {
433 174bbb6e Panagiotis Kanavos
            Contract.Requires(info!=null);
434 bfc13ed8 Panagiotis Kanavos
            Contract.EndContractBlock();
435 174bbb6e Panagiotis Kanavos
            
436 174bbb6e Panagiotis Kanavos
            if (info is DirectoryInfo)
437 174bbb6e Panagiotis Kanavos
                return new FileState
438 174bbb6e Panagiotis Kanavos
                {
439 174bbb6e Panagiotis Kanavos
                    FilePath = info.FullName,
440 174bbb6e Panagiotis Kanavos
                    OverlayStatus = FileOverlayStatus.Unversioned,
441 174bbb6e Panagiotis Kanavos
                    FileStatus = FileStatus.Created,
442 174bbb6e Panagiotis Kanavos
                    ShortHash=String.Empty,
443 174bbb6e Panagiotis Kanavos
                    Id = Guid.NewGuid()
444 174bbb6e Panagiotis Kanavos
                };
445 bfc13ed8 Panagiotis Kanavos
446 bfc13ed8 Panagiotis Kanavos
447 174bbb6e Panagiotis Kanavos
            var shortHash = ((FileInfo)info).ComputeShortHash();
448 0c02aa65 Panagiotis Kanavos
            var fileState = new FileState
449 0c02aa65 Panagiotis Kanavos
                                {
450 174bbb6e Panagiotis Kanavos
                                    FilePath = info.FullName,
451 e81dd1f6 Panagiotis Kanavos
                                    OverlayStatus = FileOverlayStatus.Unversioned,
452 174bbb6e Panagiotis Kanavos
                                    FileStatus = FileStatus.Created,               
453 174bbb6e Panagiotis Kanavos
                                    ShortHash=shortHash,
454 e81dd1f6 Panagiotis Kanavos
                                    Id = Guid.NewGuid()
455 0c02aa65 Panagiotis Kanavos
                                };
456 174bbb6e Panagiotis Kanavos
            return fileState;
457 0c02aa65 Panagiotis Kanavos
        }
458 0c02aa65 Panagiotis Kanavos
459 e81dd1f6 Panagiotis Kanavos
460 e81dd1f6 Panagiotis Kanavos
        private static void ExecuteWithRetry(NHibernateDelegate call, object state)
461 e81dd1f6 Panagiotis Kanavos
        {
462 e81dd1f6 Panagiotis Kanavos
            int retries = 3;
463 e81dd1f6 Panagiotis Kanavos
            while (retries > 0)
464 e81dd1f6 Panagiotis Kanavos
                try
465 e81dd1f6 Panagiotis Kanavos
                {
466 e81dd1f6 Panagiotis Kanavos
                    using (new SessionScope())
467 e81dd1f6 Panagiotis Kanavos
                    {
468 e81dd1f6 Panagiotis Kanavos
                        Execute(call, state);
469 039a89e5 Panagiotis Kanavos
                        return;
470 e81dd1f6 Panagiotis Kanavos
                    }
471 e81dd1f6 Panagiotis Kanavos
                }
472 1b4a7550 Panagiotis Kanavos
                catch (ActiveRecordException )
473 e81dd1f6 Panagiotis Kanavos
                {
474 e81dd1f6 Panagiotis Kanavos
                    retries--;
475 e81dd1f6 Panagiotis Kanavos
                    if (retries <= 0)
476 e81dd1f6 Panagiotis Kanavos
                        throw;
477 e81dd1f6 Panagiotis Kanavos
                }
478 e81dd1f6 Panagiotis Kanavos
        }
479 759bd3c4 Panagiotis Kanavos
480 fec5da06 Panagiotis Kanavos
        /// <summary>
481 4147814e Panagiotis Kanavos
        /// Mark Unversioned all FileState rows from the database whose path
482 fec5da06 Panagiotis Kanavos
        /// starts with one of the removed paths
483 fec5da06 Panagiotis Kanavos
        /// </summary>
484 fec5da06 Panagiotis Kanavos
        /// <param name="removed"></param>
485 4147814e Panagiotis Kanavos
        public static void UnversionPaths(List<string> removed)
486 759bd3c4 Panagiotis Kanavos
        {
487 fec5da06 Panagiotis Kanavos
            if (removed == null)
488 fec5da06 Panagiotis Kanavos
                return;
489 fec5da06 Panagiotis Kanavos
            if (removed.Count == 0)
490 fec5da06 Panagiotis Kanavos
                return;
491 759bd3c4 Panagiotis Kanavos
492 fec5da06 Panagiotis Kanavos
            //Create a disjunction (list of OR statements
493 fec5da06 Panagiotis Kanavos
            var disjunction = new Disjunction();            
494 759bd3c4 Panagiotis Kanavos
            foreach (var path in removed)
495 759bd3c4 Panagiotis Kanavos
            {
496 fec5da06 Panagiotis Kanavos
                //with the restriction FileState.FilePath like '@path%'
497 fec5da06 Panagiotis Kanavos
                disjunction.Add(Restrictions.On<FileState>(s => s.FilePath)
498 fec5da06 Panagiotis Kanavos
                    .IsLike(path, MatchMode.Start));
499 759bd3c4 Panagiotis Kanavos
            }
500 759bd3c4 Panagiotis Kanavos
501 fec5da06 Panagiotis Kanavos
            //Generate a query from the disjunction
502 759bd3c4 Panagiotis Kanavos
            var query=QueryOver.Of<FileState>().Where(disjunction);
503 4147814e Panagiotis Kanavos
                        
504 4147814e Panagiotis Kanavos
            ExecuteWithRetry((session,instance)=>
505 4147814e Panagiotis Kanavos
                                 {
506 4147814e Panagiotis Kanavos
                                     using (var t=session.BeginTransaction())
507 4147814e Panagiotis Kanavos
                                     {
508 4147814e Panagiotis Kanavos
                                         var states = query.GetExecutableQueryOver(session).List();
509 4147814e Panagiotis Kanavos
                                         foreach (var state in states)
510 4147814e Panagiotis Kanavos
                                         {
511 4147814e Panagiotis Kanavos
                                             state.FileStatus = FileStatus.Unversioned;
512 4147814e Panagiotis Kanavos
                                             state.OverlayStatus = FileOverlayStatus.Unversioned;
513 4147814e Panagiotis Kanavos
                                             state.Update();
514 4147814e Panagiotis Kanavos
                                         }
515 4147814e Panagiotis Kanavos
                                         t.Commit();
516 4147814e Panagiotis Kanavos
                                     }
517 4147814e Panagiotis Kanavos
                                     return null;
518 4147814e Panagiotis Kanavos
                                 },null);
519 759bd3c4 Panagiotis Kanavos
        }
520 4147814e Panagiotis Kanavos
521 eeee29e3 Panagiotis Kanavos
    }
522 283809f3 Panagiotis Kanavos
523 9c4346c9 Panagiotis Kanavos
    [ActiveRecord("Tags")]
524 3c43ec9b Panagiotis Kanavos
    public class FileTag : ActiveRecordLinqBase<FileTag>
525 3c43ec9b Panagiotis Kanavos
    {
526 3c43ec9b Panagiotis Kanavos
        [PrimaryKey]
527 9c4346c9 Panagiotis Kanavos
        public int Id { get; set; }
528 9c4346c9 Panagiotis Kanavos
529 9c4346c9 Panagiotis Kanavos
        [Property]
530 9c4346c9 Panagiotis Kanavos
        public string Name { get; set; }
531 3c43ec9b Panagiotis Kanavos
532 3c43ec9b Panagiotis Kanavos
        [Property]
533 3c43ec9b Panagiotis Kanavos
        public string Value { get; set; }
534 3c43ec9b Panagiotis Kanavos
535 9c4346c9 Panagiotis Kanavos
        [BelongsTo("FileStateId")]
536 3c43ec9b Panagiotis Kanavos
        public FileState FileState { get; set; }
537 3c43ec9b Panagiotis Kanavos
538 3c43ec9b Panagiotis Kanavos
    }
539 a0dcfcc9 Panagiotis Kanavos
   
540 eeee29e3 Panagiotis Kanavos
}