Statistics
| Branch: | Revision:

root / trunk / Pithos.Core / FileState.cs @ 4147814e

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