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 | } |