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