Statistics
| Branch: | Revision:

root / trunk / Pithos.Core / FileState.cs @ 759bd3c4

History | View | Annotate | Download (17.1 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 0c02aa65 Panagiotis Kanavos
using System.Threading.Tasks;
45 eeee29e3 Panagiotis Kanavos
using Castle.ActiveRecord;
46 b5061ac8 Panagiotis Kanavos
using Castle.ActiveRecord.Framework;
47 759bd3c4 Panagiotis Kanavos
using Castle.ActiveRecord.Queries;
48 759bd3c4 Panagiotis Kanavos
using NHibernate.Criterion;
49 0af3141d Panagiotis Kanavos
using Pithos.Core.Agents;
50 eeee29e3 Panagiotis Kanavos
using Pithos.Interfaces;
51 540b8cf8 Panagiotis Kanavos
using Pithos.Network;
52 4ec636f6 Panagiotis Kanavos
using log4net;
53 eeee29e3 Panagiotis Kanavos
54 eeee29e3 Panagiotis Kanavos
namespace Pithos.Core
55 eeee29e3 Panagiotis Kanavos
{
56 eeee29e3 Panagiotis Kanavos
    using System;
57 eeee29e3 Panagiotis Kanavos
    using System.Collections.Generic;
58 eeee29e3 Panagiotis Kanavos
    using System.Linq;
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 4ec636f6 Panagiotis Kanavos
        private static readonly ILog Log = LogManager.GetLogger("FileState");
67 e81dd1f6 Panagiotis Kanavos
68 e81dd1f6 Panagiotis Kanavos
        private IList<FileTag> _tags = new List<FileTag>();
69 3c43ec9b Panagiotis Kanavos
70 9c4346c9 Panagiotis Kanavos
        [PrimaryKey(PrimaryKeyType.Guid)]
71 9c4346c9 Panagiotis Kanavos
        public Guid Id { get; set; }
72 0eea575a Panagiotis Kanavos
73 3c76f045 Panagiotis Kanavos
        
74 e81dd1f6 Panagiotis Kanavos
        [Property(Unique = true, UniqueKey = "IX_FileState_FilePath")]
75 3c76f045 Panagiotis Kanavos
        public string FilePath { get; set; }
76 eeee29e3 Panagiotis Kanavos
77 eeee29e3 Panagiotis Kanavos
        [Property]
78 eeee29e3 Panagiotis Kanavos
        public FileOverlayStatus OverlayStatus { get; set; }
79 eeee29e3 Panagiotis Kanavos
80 eeee29e3 Panagiotis Kanavos
        [Property]
81 eeee29e3 Panagiotis Kanavos
        public FileStatus FileStatus { get; set; }
82 eeee29e3 Panagiotis Kanavos
83 eeee29e3 Panagiotis Kanavos
        [Property]
84 eeee29e3 Panagiotis Kanavos
        public string Checksum { get; set; }
85 283809f3 Panagiotis Kanavos
86 9c4346c9 Panagiotis Kanavos
87 bfc13ed8 Panagiotis Kanavos
        [Property]
88 bfc13ed8 Panagiotis Kanavos
        public long? Version { get; set; }
89 bfc13ed8 Panagiotis Kanavos
90 bfc13ed8 Panagiotis Kanavos
        [Property]
91 bfc13ed8 Panagiotis Kanavos
        public DateTime? VersionTimeStamp { get; set; }
92 cfed7823 Panagiotis Kanavos
93 cfed7823 Panagiotis Kanavos
94 cfed7823 Panagiotis Kanavos
        [Property]
95 cfed7823 Panagiotis Kanavos
        public bool IsShared { get; set; }
96 cfed7823 Panagiotis Kanavos
97 cfed7823 Panagiotis Kanavos
        [Property]
98 cfed7823 Panagiotis Kanavos
        public string SharedBy { get; set; }
99 cfed7823 Panagiotis Kanavos
100 cfed7823 Panagiotis Kanavos
        [Property]
101 cfed7823 Panagiotis Kanavos
        public bool ShareWrite { get; set; }
102 cfed7823 Panagiotis Kanavos
103 3c76f045 Panagiotis Kanavos
        [Property]
104 3c76f045 Panagiotis Kanavos
        public bool IsFolder{ get; set; }
105 bfc13ed8 Panagiotis Kanavos
106 e81dd1f6 Panagiotis Kanavos
        [HasMany(Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Lazy = true, Inverse = true)]
107 3c43ec9b Panagiotis Kanavos
        public IList<FileTag> Tags
108 3c43ec9b Panagiotis Kanavos
        {
109 e81dd1f6 Panagiotis Kanavos
            get { return _tags; }
110 e81dd1f6 Panagiotis Kanavos
            set { _tags = value; }
111 3c43ec9b Panagiotis Kanavos
        }
112 0c02aa65 Panagiotis Kanavos
113 540b8cf8 Panagiotis Kanavos
        [Property]
114 540b8cf8 Panagiotis Kanavos
        public DateTime Modified { get; set; }
115 540b8cf8 Panagiotis Kanavos
116 540b8cf8 Panagiotis Kanavos
117 540b8cf8 Panagiotis Kanavos
        public FileSystemInfo GetFileSystemInfo()
118 540b8cf8 Panagiotis Kanavos
        {
119 540b8cf8 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(FilePath))
120 540b8cf8 Panagiotis Kanavos
                throw new InvalidOperationException();
121 540b8cf8 Panagiotis Kanavos
            Contract.EndContractBlock();
122 e81dd1f6 Panagiotis Kanavos
123 540b8cf8 Panagiotis Kanavos
            return Directory.Exists(FilePath) ?
124 540b8cf8 Panagiotis Kanavos
                (FileSystemInfo)new DirectoryInfo(FilePath)
125 540b8cf8 Panagiotis Kanavos
                : new FileInfo(FilePath);
126 540b8cf8 Panagiotis Kanavos
        }
127 540b8cf8 Panagiotis Kanavos
128 540b8cf8 Panagiotis Kanavos
        public string GetRelativeUrl(AccountInfo accountInfo)
129 540b8cf8 Panagiotis Kanavos
        {
130 540b8cf8 Panagiotis Kanavos
            if (accountInfo==null)
131 540b8cf8 Panagiotis Kanavos
                throw new ArgumentNullException("accountInfo");
132 540b8cf8 Panagiotis Kanavos
            Contract.EndContractBlock();
133 540b8cf8 Panagiotis Kanavos
134 540b8cf8 Panagiotis Kanavos
            var fsi=GetFileSystemInfo();
135 540b8cf8 Panagiotis Kanavos
            return fsi.AsRelativeUrlTo(accountInfo.AccountPath);
136 540b8cf8 Panagiotis Kanavos
        }
137 039a89e5 Panagiotis Kanavos
        /*public static FileState FindByFilePath(string absolutePath)
138 bfc13ed8 Panagiotis Kanavos
        {
139 0af3141d Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
140 0af3141d Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
141 0af3141d Panagiotis Kanavos
            Contract.EndContractBlock();
142 4ec636f6 Panagiotis Kanavos
            try
143 4ec636f6 Panagiotis Kanavos
            {
144 e81dd1f6 Panagiotis Kanavos
145 e81dd1f6 Panagiotis Kanavos
                
146 e81dd1f6 Panagiotis Kanavos
147 3c76f045 Panagiotis Kanavos
                return Queryable.FirstOrDefault(s => s.FilePath == absolutePath);
148 4ec636f6 Panagiotis Kanavos
            }
149 4ec636f6 Panagiotis Kanavos
            catch (Exception ex)
150 4ec636f6 Panagiotis Kanavos
            {
151 4ec636f6 Panagiotis Kanavos
                Log.Error(ex.ToString());
152 4ec636f6 Panagiotis Kanavos
                throw;
153 4ec636f6 Panagiotis Kanavos
            }
154 e81dd1f6 Panagiotis Kanavos
155 4ec636f6 Panagiotis Kanavos
156 039a89e5 Panagiotis Kanavos
        }*/
157 bfc13ed8 Panagiotis Kanavos
158 e81dd1f6 Panagiotis Kanavos
       /* public static void DeleteByFilePath(string absolutePath)
159 0af3141d Panagiotis Kanavos
        {
160 e81dd1f6 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
161 0af3141d Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
162 0af3141d Panagiotis Kanavos
            Contract.EndContractBlock();
163 e81dd1f6 Panagiotis Kanavos
164 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
165 e81dd1f6 Panagiotis Kanavos
                        {
166 e81dd1f6 Panagiotis Kanavos
                            const string hqlDelete = "delete FileState where FilePath = :path";
167 e81dd1f6 Panagiotis Kanavos
                            var deletedEntities = session.CreateQuery(hqlDelete)
168 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
169 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
170 e81dd1f6 Panagiotis Kanavos
                            return deletedEntities;
171 e81dd1f6 Panagiotis Kanavos
                        }, null);
172 e81dd1f6 Panagiotis Kanavos
173 e81dd1f6 Panagiotis Kanavos
        }*/
174 0af3141d Panagiotis Kanavos
175 ab2f6f79 Panagiotis Kanavos
        public static void StoreFileStatus(string absolutePath, FileStatus newStatus)
176 ab2f6f79 Panagiotis Kanavos
        {
177 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
178 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
179 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
180 ab2f6f79 Panagiotis Kanavos
181 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
182 e81dd1f6 Panagiotis Kanavos
                        {
183 3c76f045 Panagiotis Kanavos
                            const string hqlUpdate = "update FileState set FileStatus= :status where FilePath = :path ";
184 e81dd1f6 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)
185 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
186 e81dd1f6 Panagiotis Kanavos
                                .SetEnum("status", newStatus)
187 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
188 e81dd1f6 Panagiotis Kanavos
                            if (updatedEntities == 0)
189 e81dd1f6 Panagiotis Kanavos
                            {
190 e81dd1f6 Panagiotis Kanavos
                                var newState = new FileState
191 e81dd1f6 Panagiotis Kanavos
                                                   {
192 3c76f045 Panagiotis Kanavos
                                                       FilePath = absolutePath,
193 e81dd1f6 Panagiotis Kanavos
                                                       Id = Guid.NewGuid(),
194 3c76f045 Panagiotis Kanavos
                                                       FileStatus = newStatus,
195 3c76f045 Panagiotis Kanavos
                                                       IsFolder=Directory.Exists(absolutePath)
196 e81dd1f6 Panagiotis Kanavos
                                                   };
197 e81dd1f6 Panagiotis Kanavos
                                newState.CreateAndFlush();
198 e81dd1f6 Panagiotis Kanavos
                            }
199 e81dd1f6 Panagiotis Kanavos
                            return null;
200 e81dd1f6 Panagiotis Kanavos
                        }, null);
201 ab2f6f79 Panagiotis Kanavos
202 ab2f6f79 Panagiotis Kanavos
        }
203 ab2f6f79 Panagiotis Kanavos
204 ab2f6f79 Panagiotis Kanavos
        public static void StoreOverlayStatus(string absolutePath, FileOverlayStatus newStatus)
205 ab2f6f79 Panagiotis Kanavos
        {
206 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
207 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
208 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
209 ab2f6f79 Panagiotis Kanavos
210 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
211 e81dd1f6 Panagiotis Kanavos
                        {
212 e81dd1f6 Panagiotis Kanavos
                            const string hqlUpdate =
213 3c76f045 Panagiotis Kanavos
                                "update FileState set OverlayStatus= :status where FilePath = :path ";
214 3c76f045 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)                                
215 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
216 3c76f045 Panagiotis Kanavos
                                .SetEnum("status", newStatus)                                
217 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
218 e81dd1f6 Panagiotis Kanavos
                            if (updatedEntities == 0)
219 e81dd1f6 Panagiotis Kanavos
                            {
220 e81dd1f6 Panagiotis Kanavos
                                var newState = new FileState
221 e81dd1f6 Panagiotis Kanavos
                                                   {
222 e81dd1f6 Panagiotis Kanavos
                                                       FilePath = absolutePath,
223 e81dd1f6 Panagiotis Kanavos
                                                       Id = Guid.NewGuid(),
224 3c76f045 Panagiotis Kanavos
                                                       OverlayStatus = newStatus,
225 3c76f045 Panagiotis Kanavos
                                                       IsFolder=Directory.Exists(absolutePath)
226 e81dd1f6 Panagiotis Kanavos
                                                   };
227 e81dd1f6 Panagiotis Kanavos
                                newState.CreateAndFlush();
228 e81dd1f6 Panagiotis Kanavos
                            }
229 e81dd1f6 Panagiotis Kanavos
                            return null;
230 e81dd1f6 Panagiotis Kanavos
                        }, null);
231 ab2f6f79 Panagiotis Kanavos
232 ab2f6f79 Panagiotis Kanavos
        }
233 ab2f6f79 Panagiotis Kanavos
234 e81dd1f6 Panagiotis Kanavos
/*
235 ab2f6f79 Panagiotis Kanavos
        public static void UpdateStatus(string absolutePath, FileStatus fileStatus, FileOverlayStatus overlayStatus)
236 ab2f6f79 Panagiotis Kanavos
        {
237 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
238 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
239 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
240 ab2f6f79 Panagiotis Kanavos
241 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
242 e81dd1f6 Panagiotis Kanavos
                        {
243 e81dd1f6 Panagiotis Kanavos
                            const string hqlUpdate =
244 e81dd1f6 Panagiotis Kanavos
                                "update FileState set OverlayStatus= :overlayStatus, FileStatus= :fileStatus where FilePath = :path  ";
245 e81dd1f6 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)
246 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
247 e81dd1f6 Panagiotis Kanavos
                                .SetEnum("fileStatus", fileStatus)
248 e81dd1f6 Panagiotis Kanavos
                                .SetEnum("overlayStatus", overlayStatus)
249 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
250 e81dd1f6 Panagiotis Kanavos
                            return updatedEntities;
251 e81dd1f6 Panagiotis Kanavos
                        }, null);
252 ab2f6f79 Panagiotis Kanavos
253 ab2f6f79 Panagiotis Kanavos
        }
254 e81dd1f6 Panagiotis Kanavos
*/
255 e81dd1f6 Panagiotis Kanavos
256 e81dd1f6 Panagiotis Kanavos
/*
257 ab2f6f79 Panagiotis Kanavos
        public static void UpdateStatus(string absolutePath, FileStatus fileStatus)
258 ab2f6f79 Panagiotis Kanavos
        {
259 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
260 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
261 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
262 ab2f6f79 Panagiotis Kanavos
263 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
264 e81dd1f6 Panagiotis Kanavos
                        {
265 e81dd1f6 Panagiotis Kanavos
                            const string hqlUpdate =
266 e81dd1f6 Panagiotis Kanavos
                                "update FileState set FileStatus= :fileStatus where FilePath = :path  ";
267 e81dd1f6 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)
268 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
269 e81dd1f6 Panagiotis Kanavos
                                .SetEnum("fileStatus", fileStatus)
270 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
271 e81dd1f6 Panagiotis Kanavos
                            return updatedEntities;
272 e81dd1f6 Panagiotis Kanavos
                        }, null);
273 ab2f6f79 Panagiotis Kanavos
274 ab2f6f79 Panagiotis Kanavos
        }
275 ab2f6f79 Panagiotis Kanavos
276 e81dd1f6 Panagiotis Kanavos
*/
277 ab2f6f79 Panagiotis Kanavos
        public static void RenameState(string oldPath, string newPath)
278 ab2f6f79 Panagiotis Kanavos
        {
279 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(oldPath))
280 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("oldPath");
281 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
282 ab2f6f79 Panagiotis Kanavos
283 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
284 e81dd1f6 Panagiotis Kanavos
                        {
285 e81dd1f6 Panagiotis Kanavos
                            const string hqlUpdate =
286 3c76f045 Panagiotis Kanavos
                                "update FileState set FilePath= :newPath where FilePath = :oldPath ";
287 e81dd1f6 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)
288 3c76f045 Panagiotis Kanavos
                                .SetString("oldPath", oldPath)
289 3c76f045 Panagiotis Kanavos
                                .SetString("newPath", newPath)
290 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
291 e81dd1f6 Panagiotis Kanavos
                            return updatedEntities;
292 e81dd1f6 Panagiotis Kanavos
                        }, null);
293 ab2f6f79 Panagiotis Kanavos
294 ab2f6f79 Panagiotis Kanavos
        }
295 ab2f6f79 Panagiotis Kanavos
296 e81dd1f6 Panagiotis Kanavos
     /*   public static void UpdateStatus(Guid id, FileStatus fileStatus)
297 ab2f6f79 Panagiotis Kanavos
        {
298 ab2f6f79 Panagiotis Kanavos
299 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
300 ab2f6f79 Panagiotis Kanavos
            {
301 e81dd1f6 Panagiotis Kanavos
                const string hqlUpdate =
302 e81dd1f6 Panagiotis Kanavos
                    "update FileState set FileStatus= :fileStatus where Id = :id  ";
303 ab2f6f79 Panagiotis Kanavos
                var updatedEntities = session.CreateQuery(hqlUpdate)
304 e81dd1f6 Panagiotis Kanavos
                    .SetGuid("id", id)
305 e81dd1f6 Panagiotis Kanavos
                    .SetEnum("fileStatus", fileStatus)
306 e81dd1f6 Panagiotis Kanavos
                    .ExecuteUpdate();
307 a0dcfcc9 Panagiotis Kanavos
                return updatedEntities;
308 ab2f6f79 Panagiotis Kanavos
            }, null);
309 e81dd1f6 Panagiotis Kanavos
        }*/
310 ab2f6f79 Panagiotis Kanavos
311 ab2f6f79 Panagiotis Kanavos
        public static void UpdateChecksum(string absolutePath, string checksum)
312 ab2f6f79 Panagiotis Kanavos
        {
313 ab2f6f79 Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(absolutePath))
314 ab2f6f79 Panagiotis Kanavos
                throw new ArgumentNullException("absolutePath");
315 ab2f6f79 Panagiotis Kanavos
            Contract.EndContractBlock();
316 ab2f6f79 Panagiotis Kanavos
317 e81dd1f6 Panagiotis Kanavos
            ExecuteWithRetry((session, instance) =>
318 e81dd1f6 Panagiotis Kanavos
                        {
319 3c76f045 Panagiotis Kanavos
                            const string hqlUpdate = "update FileState set Checksum= :checksum where FilePath = :path ";
320 e81dd1f6 Panagiotis Kanavos
                            var updatedEntities = session.CreateQuery(hqlUpdate)
321 3c76f045 Panagiotis Kanavos
                                .SetString("path", absolutePath)
322 e81dd1f6 Panagiotis Kanavos
                                .SetString("checksum", checksum)
323 e81dd1f6 Panagiotis Kanavos
                                .ExecuteUpdate();
324 e81dd1f6 Panagiotis Kanavos
                            return updatedEntities;
325 e81dd1f6 Panagiotis Kanavos
                        }, null);
326 ab2f6f79 Panagiotis Kanavos
327 ab2f6f79 Panagiotis Kanavos
        }
328 0af3141d Panagiotis Kanavos
329 e81dd1f6 Panagiotis Kanavos
        public static void ChangeRootPath(string oldPath, string newPath)
330 5120f3cb Panagiotis Kanavos
        {
331 5120f3cb Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(oldPath))
332 5120f3cb Panagiotis Kanavos
                throw new ArgumentNullException("oldPath");
333 5120f3cb Panagiotis Kanavos
            if (!Path.IsPathRooted(oldPath))
334 5120f3cb Panagiotis Kanavos
                throw new ArgumentException("oldPath must be an absolute path", "oldPath");
335 5120f3cb Panagiotis Kanavos
            if (string.IsNullOrWhiteSpace(newPath))
336 5120f3cb Panagiotis Kanavos
                throw new ArgumentNullException("newPath");
337 5120f3cb Panagiotis Kanavos
            if (!Path.IsPathRooted(newPath))
338 5120f3cb Panagiotis Kanavos
                throw new ArgumentException("newPath must be an absolute path", "newPath");
339 5120f3cb Panagiotis Kanavos
            Contract.EndContractBlock();
340 5120f3cb Panagiotis Kanavos
341 5120f3cb Panagiotis Kanavos
            //Ensure the paths end with the same character
342 5120f3cb Panagiotis Kanavos
            if (!oldPath.EndsWith("\\"))
343 5120f3cb Panagiotis Kanavos
                oldPath = oldPath + "\\";
344 5120f3cb Panagiotis Kanavos
            if (!newPath.EndsWith("\\"))
345 5120f3cb Panagiotis Kanavos
                newPath = newPath + "\\";
346 5120f3cb Panagiotis Kanavos
347 e81dd1f6 Panagiotis Kanavos
                ExecuteWithRetry((session, instance) =>
348 5120f3cb Panagiotis Kanavos
                            {
349 5120f3cb Panagiotis Kanavos
                                const string hqlUpdate =
350 5120f3cb Panagiotis Kanavos
                                    "update FileState set FilePath = replace(FilePath,:oldPath,:newPath) where FilePath like :oldPath || '%' ";
351 e81dd1f6 Panagiotis Kanavos
                                var renames = session.CreateQuery(hqlUpdate)
352 3c76f045 Panagiotis Kanavos
                                    .SetString("oldPath", oldPath)
353 3c76f045 Panagiotis Kanavos
                                    .SetString("newPath", newPath)
354 5120f3cb Panagiotis Kanavos
                                    .ExecuteUpdate();
355 a0dcfcc9 Panagiotis Kanavos
                                return renames;
356 5120f3cb Panagiotis Kanavos
                            }, null);
357 5120f3cb Panagiotis Kanavos
        }
358 5120f3cb Panagiotis Kanavos
359 e81dd1f6 Panagiotis Kanavos
        public static Task<FileState> CreateForAsync(string filePath, int blockSize, string algorithm)
360 0c02aa65 Panagiotis Kanavos
        {
361 bfc13ed8 Panagiotis Kanavos
            if (blockSize <= 0)
362 bfc13ed8 Panagiotis Kanavos
                throw new ArgumentOutOfRangeException("blockSize");
363 bfc13ed8 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(algorithm))
364 bfc13ed8 Panagiotis Kanavos
                throw new ArgumentNullException("algorithm");
365 bfc13ed8 Panagiotis Kanavos
            Contract.EndContractBlock();
366 bfc13ed8 Panagiotis Kanavos
367 bfc13ed8 Panagiotis Kanavos
368 0c02aa65 Panagiotis Kanavos
            var fileState = new FileState
369 0c02aa65 Panagiotis Kanavos
                                {
370 3c76f045 Panagiotis Kanavos
                                    FilePath = filePath,
371 e81dd1f6 Panagiotis Kanavos
                                    OverlayStatus = FileOverlayStatus.Unversioned,
372 9c4346c9 Panagiotis Kanavos
                                    FileStatus = FileStatus.Created,
373 e81dd1f6 Panagiotis Kanavos
                                    Id = Guid.NewGuid()
374 0c02aa65 Panagiotis Kanavos
                                };
375 9c4346c9 Panagiotis Kanavos
376 9c4346c9 Panagiotis Kanavos
377 e81dd1f6 Panagiotis Kanavos
            return fileState.UpdateHashesAsync(blockSize, algorithm);
378 0c02aa65 Panagiotis Kanavos
        }
379 0c02aa65 Panagiotis Kanavos
380 e81dd1f6 Panagiotis Kanavos
        public async Task<FileState> UpdateHashesAsync(int blockSize, string algorithm)
381 9c4346c9 Panagiotis Kanavos
        {
382 e81dd1f6 Panagiotis Kanavos
            if (blockSize <= 0)
383 bfc13ed8 Panagiotis Kanavos
                throw new ArgumentOutOfRangeException("blockSize");
384 bfc13ed8 Panagiotis Kanavos
            if (String.IsNullOrWhiteSpace(algorithm))
385 bfc13ed8 Panagiotis Kanavos
                throw new ArgumentNullException("algorithm");
386 bfc13ed8 Panagiotis Kanavos
            Contract.EndContractBlock();
387 e81dd1f6 Panagiotis Kanavos
388 5ce54458 Panagiotis Kanavos
            //Skip updating the hash for folders
389 5ce54458 Panagiotis Kanavos
            if (Directory.Exists(FilePath))
390 f3d080df Panagiotis Kanavos
                return this;
391 5ce54458 Panagiotis Kanavos
392 f3d080df Panagiotis Kanavos
            var hash = await TaskEx.Run(() =>
393 e81dd1f6 Panagiotis Kanavos
                                            {
394 e81dd1f6 Panagiotis Kanavos
                                                var info = new FileInfo(FilePath);
395 e81dd1f6 Panagiotis Kanavos
                                                return info.CalculateHash(blockSize, algorithm);
396 e81dd1f6 Panagiotis Kanavos
                                            });
397 a27aa447 Panagiotis Kanavos
398 f3d080df Panagiotis Kanavos
            Checksum = hash;
399 e81dd1f6 Panagiotis Kanavos
400 f3d080df Panagiotis Kanavos
            return this;
401 9c4346c9 Panagiotis Kanavos
        }
402 e81dd1f6 Panagiotis Kanavos
403 e81dd1f6 Panagiotis Kanavos
        private static void ExecuteWithRetry(NHibernateDelegate call, object state)
404 e81dd1f6 Panagiotis Kanavos
        {
405 e81dd1f6 Panagiotis Kanavos
            int retries = 3;
406 e81dd1f6 Panagiotis Kanavos
            while (retries > 0)
407 e81dd1f6 Panagiotis Kanavos
                try
408 e81dd1f6 Panagiotis Kanavos
                {
409 e81dd1f6 Panagiotis Kanavos
                    using (new SessionScope())
410 e81dd1f6 Panagiotis Kanavos
                    {
411 e81dd1f6 Panagiotis Kanavos
                        Execute(call, state);
412 039a89e5 Panagiotis Kanavos
                        return;
413 e81dd1f6 Panagiotis Kanavos
                    }
414 e81dd1f6 Panagiotis Kanavos
                }
415 1b4a7550 Panagiotis Kanavos
                catch (ActiveRecordException )
416 e81dd1f6 Panagiotis Kanavos
                {
417 e81dd1f6 Panagiotis Kanavos
                    retries--;
418 e81dd1f6 Panagiotis Kanavos
                    if (retries <= 0)
419 e81dd1f6 Panagiotis Kanavos
                        throw;
420 e81dd1f6 Panagiotis Kanavos
                }
421 e81dd1f6 Panagiotis Kanavos
        }
422 759bd3c4 Panagiotis Kanavos
423 759bd3c4 Panagiotis Kanavos
        public static void RemovePaths(IEnumerable<string> removed)
424 759bd3c4 Panagiotis Kanavos
        {
425 759bd3c4 Panagiotis Kanavos
            
426 759bd3c4 Panagiotis Kanavos
            var disjunction = new Disjunction();
427 759bd3c4 Panagiotis Kanavos
428 759bd3c4 Panagiotis Kanavos
            foreach (var path in removed)
429 759bd3c4 Panagiotis Kanavos
            {
430 759bd3c4 Panagiotis Kanavos
                disjunction.Add(Restrictions.On<FileState>(s => s.FilePath).IsLike(path, MatchMode.Start));
431 759bd3c4 Panagiotis Kanavos
            }
432 759bd3c4 Panagiotis Kanavos
433 759bd3c4 Panagiotis Kanavos
            
434 759bd3c4 Panagiotis Kanavos
            
435 759bd3c4 Panagiotis Kanavos
            var query=QueryOver.Of<FileState>().Where(disjunction);
436 759bd3c4 Panagiotis Kanavos
            var aq = new ProjectionQuery<FileState,Guid>(query.DetachedCriteria,
437 759bd3c4 Panagiotis Kanavos
                        Projections.ProjectionList().Add(Projections.Id()));
438 759bd3c4 Panagiotis Kanavos
            var ids=aq.Execute();
439 759bd3c4 Panagiotis Kanavos
            FileState.DeleteAll(ids);
440 759bd3c4 Panagiotis Kanavos
                
441 759bd3c4 Panagiotis Kanavos
        }
442 eeee29e3 Panagiotis Kanavos
    }
443 283809f3 Panagiotis Kanavos
444 9c4346c9 Panagiotis Kanavos
    [ActiveRecord("Tags")]
445 3c43ec9b Panagiotis Kanavos
    public class FileTag : ActiveRecordLinqBase<FileTag>
446 3c43ec9b Panagiotis Kanavos
    {
447 3c43ec9b Panagiotis Kanavos
        [PrimaryKey]
448 9c4346c9 Panagiotis Kanavos
        public int Id { get; set; }
449 9c4346c9 Panagiotis Kanavos
450 9c4346c9 Panagiotis Kanavos
        [Property]
451 9c4346c9 Panagiotis Kanavos
        public string Name { get; set; }
452 3c43ec9b Panagiotis Kanavos
453 3c43ec9b Panagiotis Kanavos
        [Property]
454 3c43ec9b Panagiotis Kanavos
        public string Value { get; set; }
455 3c43ec9b Panagiotis Kanavos
456 9c4346c9 Panagiotis Kanavos
        [BelongsTo("FileStateId")]
457 3c43ec9b Panagiotis Kanavos
        public FileState FileState { get; set; }
458 3c43ec9b Panagiotis Kanavos
459 3c43ec9b Panagiotis Kanavos
    }
460 a0dcfcc9 Panagiotis Kanavos
   
461 eeee29e3 Panagiotis Kanavos
}