Statistics
| Branch: | Revision:

root / trunk / Pithos.Core / FileState.cs @ db8a9589

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