root / trunk / Pithos.Core / FileState.cs @ 174bbb6e
History | View | Annotate | Download (20.6 kB)
1 | 255f5f86 | Panagiotis Kanavos | #region |
---|---|---|---|
2 | 255f5f86 | Panagiotis Kanavos | /* ----------------------------------------------------------------------- |
3 | 255f5f86 | Panagiotis Kanavos | * <copyright file="FileState.cs" company="GRNet"> |
4 | 255f5f86 | Panagiotis Kanavos | * |
5 | 255f5f86 | Panagiotis Kanavos | * Copyright 2011-2012 GRNET S.A. All rights reserved. |
6 | 255f5f86 | Panagiotis Kanavos | * |
7 | 255f5f86 | Panagiotis Kanavos | * Redistribution and use in source and binary forms, with or |
8 | 255f5f86 | Panagiotis Kanavos | * without modification, are permitted provided that the following |
9 | 255f5f86 | Panagiotis Kanavos | * conditions are met: |
10 | 255f5f86 | Panagiotis Kanavos | * |
11 | 255f5f86 | Panagiotis Kanavos | * 1. Redistributions of source code must retain the above |
12 | 255f5f86 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
13 | 255f5f86 | Panagiotis Kanavos | * disclaimer. |
14 | 255f5f86 | Panagiotis Kanavos | * |
15 | 255f5f86 | Panagiotis Kanavos | * 2. Redistributions in binary form must reproduce the above |
16 | 255f5f86 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
17 | 255f5f86 | Panagiotis Kanavos | * disclaimer in the documentation and/or other materials |
18 | 255f5f86 | Panagiotis Kanavos | * provided with the distribution. |
19 | 255f5f86 | Panagiotis Kanavos | * |
20 | 255f5f86 | Panagiotis Kanavos | * |
21 | 255f5f86 | Panagiotis Kanavos | * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS |
22 | 255f5f86 | Panagiotis Kanavos | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
23 | 255f5f86 | Panagiotis Kanavos | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
24 | 255f5f86 | Panagiotis Kanavos | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR |
25 | 255f5f86 | Panagiotis Kanavos | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
26 | 255f5f86 | Panagiotis Kanavos | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
27 | 255f5f86 | Panagiotis Kanavos | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
28 | 255f5f86 | Panagiotis Kanavos | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
29 | 255f5f86 | Panagiotis Kanavos | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
30 | 255f5f86 | Panagiotis Kanavos | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
31 | 255f5f86 | Panagiotis Kanavos | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
32 | 255f5f86 | Panagiotis Kanavos | * POSSIBILITY OF SUCH DAMAGE. |
33 | 255f5f86 | Panagiotis Kanavos | * |
34 | 255f5f86 | Panagiotis Kanavos | * The views and conclusions contained in the software and |
35 | 255f5f86 | Panagiotis Kanavos | * documentation are those of the authors and should not be |
36 | 255f5f86 | Panagiotis Kanavos | * interpreted as representing official policies, either expressed |
37 | 255f5f86 | Panagiotis Kanavos | * or implied, of GRNET S.A. |
38 | 255f5f86 | Panagiotis Kanavos | * </copyright> |
39 | 255f5f86 | Panagiotis Kanavos | * ----------------------------------------------------------------------- |
40 | 255f5f86 | Panagiotis Kanavos | */ |
41 | 255f5f86 | Panagiotis Kanavos | #endregion |
42 | bfc13ed8 | Panagiotis Kanavos | using System.Diagnostics.Contracts; |
43 | 5ce54458 | Panagiotis Kanavos | using System.IO; |
44 | db8a9589 | Panagiotis Kanavos | using System.Reflection; |
45 | 0c02aa65 | Panagiotis Kanavos | using System.Threading.Tasks; |
46 | eeee29e3 | Panagiotis Kanavos | using Castle.ActiveRecord; |
47 | b5061ac8 | Panagiotis Kanavos | using Castle.ActiveRecord.Framework; |
48 | 759bd3c4 | Panagiotis Kanavos | using Castle.ActiveRecord.Queries; |
49 | 759bd3c4 | Panagiotis Kanavos | using NHibernate.Criterion; |
50 | 0af3141d | Panagiotis Kanavos | using Pithos.Core.Agents; |
51 | eeee29e3 | Panagiotis Kanavos | using Pithos.Interfaces; |
52 | 540b8cf8 | Panagiotis Kanavos | using Pithos.Network; |
53 | 4ec636f6 | Panagiotis Kanavos | using log4net; |
54 | eeee29e3 | Panagiotis Kanavos | |
55 | eeee29e3 | Panagiotis Kanavos | namespace Pithos.Core |
56 | eeee29e3 | Panagiotis Kanavos | { |
57 | eeee29e3 | Panagiotis Kanavos | using System; |
58 | fec5da06 | Panagiotis Kanavos | using System.Collections.Generic; |
59 | eeee29e3 | Panagiotis Kanavos | |
60 | eeee29e3 | Panagiotis Kanavos | /// <summary> |
61 | eeee29e3 | Panagiotis Kanavos | /// TODO: Update summary. |
62 | eeee29e3 | Panagiotis Kanavos | /// </summary> |
63 | eeee29e3 | Panagiotis Kanavos | [ActiveRecord] |
64 | e81dd1f6 | Panagiotis Kanavos | public class FileState : ActiveRecordLinqBase<FileState> |
65 | eeee29e3 | Panagiotis Kanavos | { |
66 | db8a9589 | Panagiotis Kanavos | private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
67 | db8a9589 | Panagiotis Kanavos | |
68 | e81dd1f6 | Panagiotis Kanavos | |
69 | e81dd1f6 | Panagiotis Kanavos | private IList<FileTag> _tags = new List<FileTag>(); |
70 | 3c43ec9b | Panagiotis Kanavos | |
71 | 9c4346c9 | Panagiotis Kanavos | [PrimaryKey(PrimaryKeyType.Guid)] |
72 | 9c4346c9 | Panagiotis Kanavos | public Guid Id { get; set; } |
73 | 0eea575a | Panagiotis Kanavos | |
74 | 3c76f045 | Panagiotis Kanavos | |
75 | e81dd1f6 | Panagiotis Kanavos | [Property(Unique = true, UniqueKey = "IX_FileState_FilePath")] |
76 | 3c76f045 | Panagiotis Kanavos | public string FilePath { get; set; } |
77 | eeee29e3 | Panagiotis Kanavos | |
78 | eeee29e3 | Panagiotis Kanavos | [Property] |
79 | eeee29e3 | Panagiotis Kanavos | public FileOverlayStatus OverlayStatus { get; set; } |
80 | eeee29e3 | Panagiotis Kanavos | |
81 | eeee29e3 | Panagiotis Kanavos | [Property] |
82 | eeee29e3 | Panagiotis Kanavos | public FileStatus FileStatus { get; set; } |
83 | eeee29e3 | Panagiotis Kanavos | |
84 | 174bbb6e | Panagiotis Kanavos | private string _checksum; |
85 | 174bbb6e | Panagiotis Kanavos | |
86 | 174bbb6e | Panagiotis Kanavos | /// <summary> |
87 | 174bbb6e | Panagiotis Kanavos | /// The tophash value of the file, calculated by using a Merkle hash with the SHA256 algorithm |
88 | 174bbb6e | Panagiotis Kanavos | /// </summary> |
89 | 174bbb6e | Panagiotis Kanavos | /// <remarks> |
90 | 174bbb6e | Panagiotis Kanavos | /// The SHA256 algorithm is substantially more expenive than other algorithms. |
91 | 174bbb6e | Panagiotis Kanavos | /// Recalculating the Checksum should be avoided whenever possible. |
92 | 174bbb6e | Panagiotis Kanavos | /// </remarks> |
93 | eeee29e3 | Panagiotis Kanavos | [Property] |
94 | 174bbb6e | Panagiotis Kanavos | public string Checksum |
95 | 174bbb6e | Panagiotis Kanavos | { |
96 | 174bbb6e | Panagiotis Kanavos | get |
97 | 174bbb6e | Panagiotis Kanavos | { |
98 | 174bbb6e | Panagiotis Kanavos | return _checksum; |
99 | 174bbb6e | Panagiotis Kanavos | } |
100 | 174bbb6e | Panagiotis Kanavos | set |
101 | 174bbb6e | Panagiotis Kanavos | { |
102 | 174bbb6e | Panagiotis Kanavos | _checksum = value; |
103 | 174bbb6e | Panagiotis Kanavos | } |
104 | 174bbb6e | Panagiotis Kanavos | } |
105 | 174bbb6e | Panagiotis Kanavos | |
106 | 174bbb6e | Panagiotis Kanavos | private string _shortHash; |
107 | 174bbb6e | Panagiotis Kanavos | |
108 | 174bbb6e | Panagiotis Kanavos | /// <summary> |
109 | 174bbb6e | Panagiotis Kanavos | /// An easy to calcualte hash over the entire file, used to detect file changes |
110 | 174bbb6e | Panagiotis Kanavos | /// </summary> |
111 | 174bbb6e | Panagiotis Kanavos | /// <remarks>The algorithm used to calculate this hash should be cheap</remarks> |
112 | 174bbb6e | Panagiotis Kanavos | [Property(NotNull=true,Default="")] |
113 | 174bbb6e | Panagiotis Kanavos | public string ShortHash |
114 | 174bbb6e | Panagiotis Kanavos | { |
115 | 174bbb6e | Panagiotis Kanavos | get |
116 | 174bbb6e | Panagiotis Kanavos | { |
117 | 174bbb6e | Panagiotis Kanavos | return _shortHash; |
118 | 174bbb6e | Panagiotis Kanavos | } |
119 | 174bbb6e | Panagiotis Kanavos | set |
120 | 174bbb6e | Panagiotis Kanavos | { |
121 | 174bbb6e | Panagiotis Kanavos | _shortHash = value; |
122 | 174bbb6e | Panagiotis Kanavos | } |
123 | 174bbb6e | Panagiotis Kanavos | } |
124 | 283809f3 | Panagiotis Kanavos | |
125 | 9c4346c9 | Panagiotis Kanavos | |
126 | bfc13ed8 | Panagiotis Kanavos | [Property] |
127 | bfc13ed8 | Panagiotis Kanavos | public long? Version { get; set; } |
128 | bfc13ed8 | Panagiotis Kanavos | |
129 | bfc13ed8 | Panagiotis Kanavos | [Property] |
130 | bfc13ed8 | Panagiotis Kanavos | public DateTime? VersionTimeStamp { get; set; } |
131 | cfed7823 | Panagiotis Kanavos | |
132 | cfed7823 | Panagiotis Kanavos | |
133 | cfed7823 | Panagiotis Kanavos | [Property] |
134 | cfed7823 | Panagiotis Kanavos | public bool IsShared { get; set; } |
135 | cfed7823 | Panagiotis Kanavos | |
136 | cfed7823 | Panagiotis Kanavos | [Property] |
137 | cfed7823 | Panagiotis Kanavos | public string SharedBy { get; set; } |
138 | cfed7823 | Panagiotis Kanavos | |
139 | cfed7823 | Panagiotis Kanavos | [Property] |
140 | cfed7823 | Panagiotis Kanavos | public bool ShareWrite { get; set; } |
141 | cfed7823 | Panagiotis Kanavos | |
142 | 3c76f045 | Panagiotis Kanavos | [Property] |
143 | 3c76f045 | Panagiotis Kanavos | public bool IsFolder{ get; set; } |
144 | bfc13ed8 | Panagiotis Kanavos | |
145 | e81dd1f6 | Panagiotis Kanavos | [HasMany(Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Lazy = true, Inverse = true)] |
146 | 3c43ec9b | Panagiotis Kanavos | public IList<FileTag> Tags |
147 | 3c43ec9b | Panagiotis Kanavos | { |
148 | e81dd1f6 | Panagiotis Kanavos | get { return _tags; } |
149 | e81dd1f6 | Panagiotis Kanavos | set { _tags = value; } |
150 | 3c43ec9b | Panagiotis Kanavos | } |
151 | 0c02aa65 | Panagiotis Kanavos | |
152 | 540b8cf8 | Panagiotis Kanavos | [Property] |
153 | 540b8cf8 | Panagiotis Kanavos | public DateTime Modified { get; set; } |
154 | 540b8cf8 | Panagiotis Kanavos | |
155 | 540b8cf8 | Panagiotis Kanavos | |
156 | 540b8cf8 | Panagiotis Kanavos | public FileSystemInfo GetFileSystemInfo() |
157 | 540b8cf8 | Panagiotis Kanavos | { |
158 | 540b8cf8 | Panagiotis Kanavos | if (String.IsNullOrWhiteSpace(FilePath)) |
159 | 540b8cf8 | Panagiotis Kanavos | throw new InvalidOperationException(); |
160 | 540b8cf8 | Panagiotis Kanavos | Contract.EndContractBlock(); |
161 | e81dd1f6 | Panagiotis Kanavos | |
162 | 540b8cf8 | Panagiotis Kanavos | return Directory.Exists(FilePath) ? |
163 | 540b8cf8 | Panagiotis Kanavos | (FileSystemInfo)new DirectoryInfo(FilePath) |
164 | 540b8cf8 | Panagiotis Kanavos | : new FileInfo(FilePath); |
165 | 540b8cf8 | Panagiotis Kanavos | } |
166 | 540b8cf8 | Panagiotis Kanavos | |
167 | 540b8cf8 | Panagiotis Kanavos | public string GetRelativeUrl(AccountInfo accountInfo) |
168 | 540b8cf8 | Panagiotis Kanavos | { |
169 | 540b8cf8 | Panagiotis Kanavos | if (accountInfo==null) |
170 | 540b8cf8 | Panagiotis Kanavos | throw new ArgumentNullException("accountInfo"); |
171 | 540b8cf8 | Panagiotis Kanavos | Contract.EndContractBlock(); |
172 | 540b8cf8 | Panagiotis Kanavos | |
173 | 540b8cf8 | Panagiotis Kanavos | var fsi=GetFileSystemInfo(); |
174 | 540b8cf8 | Panagiotis Kanavos | return fsi.AsRelativeUrlTo(accountInfo.AccountPath); |
175 | 540b8cf8 | Panagiotis Kanavos | } |
176 | 039a89e5 | Panagiotis Kanavos | /*public static FileState FindByFilePath(string absolutePath) |
177 | bfc13ed8 | Panagiotis Kanavos | { |
178 | 0af3141d | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(absolutePath)) |
179 | 0af3141d | Panagiotis Kanavos | throw new ArgumentNullException("absolutePath"); |
180 | 0af3141d | Panagiotis Kanavos | Contract.EndContractBlock(); |
181 | 4ec636f6 | Panagiotis Kanavos | try |
182 | 4ec636f6 | Panagiotis Kanavos | { |
183 | e81dd1f6 | Panagiotis Kanavos | |
184 | e81dd1f6 | Panagiotis Kanavos | |
185 | e81dd1f6 | Panagiotis Kanavos | |
186 | 3c76f045 | Panagiotis Kanavos | return Queryable.FirstOrDefault(s => s.FilePath == absolutePath); |
187 | 4ec636f6 | Panagiotis Kanavos | } |
188 | 4ec636f6 | Panagiotis Kanavos | catch (Exception ex) |
189 | 4ec636f6 | Panagiotis Kanavos | { |
190 | 4ec636f6 | Panagiotis Kanavos | Log.Error(ex.ToString()); |
191 | 4ec636f6 | Panagiotis Kanavos | throw; |
192 | 4ec636f6 | Panagiotis Kanavos | } |
193 | e81dd1f6 | Panagiotis Kanavos | |
194 | 4ec636f6 | Panagiotis Kanavos | |
195 | 039a89e5 | Panagiotis Kanavos | }*/ |
196 | bfc13ed8 | Panagiotis Kanavos | |
197 | e81dd1f6 | Panagiotis Kanavos | /* public static void DeleteByFilePath(string absolutePath) |
198 | 0af3141d | Panagiotis Kanavos | { |
199 | e81dd1f6 | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(absolutePath)) |
200 | 0af3141d | Panagiotis Kanavos | throw new ArgumentNullException("absolutePath"); |
201 | 0af3141d | Panagiotis Kanavos | Contract.EndContractBlock(); |
202 | e81dd1f6 | Panagiotis Kanavos | |
203 | e81dd1f6 | Panagiotis Kanavos | ExecuteWithRetry((session, instance) => |
204 | e81dd1f6 | Panagiotis Kanavos | { |
205 | e81dd1f6 | Panagiotis Kanavos | const string hqlDelete = "delete FileState where FilePath = :path"; |
206 | e81dd1f6 | Panagiotis Kanavos | var deletedEntities = session.CreateQuery(hqlDelete) |
207 | 3c76f045 | Panagiotis Kanavos | .SetString("path", absolutePath) |
208 | e81dd1f6 | Panagiotis Kanavos | .ExecuteUpdate(); |
209 | e81dd1f6 | Panagiotis Kanavos | return deletedEntities; |
210 | e81dd1f6 | Panagiotis Kanavos | }, null); |
211 | e81dd1f6 | Panagiotis Kanavos | |
212 | e81dd1f6 | Panagiotis Kanavos | }*/ |
213 | 0af3141d | Panagiotis Kanavos | |
214 | ab2f6f79 | Panagiotis Kanavos | public static void StoreFileStatus(string absolutePath, FileStatus newStatus) |
215 | ab2f6f79 | Panagiotis Kanavos | { |
216 | ab2f6f79 | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(absolutePath)) |
217 | ab2f6f79 | Panagiotis Kanavos | throw new ArgumentNullException("absolutePath"); |
218 | ab2f6f79 | Panagiotis Kanavos | Contract.EndContractBlock(); |
219 | ab2f6f79 | Panagiotis Kanavos | |
220 | e81dd1f6 | Panagiotis Kanavos | ExecuteWithRetry((session, instance) => |
221 | e81dd1f6 | Panagiotis Kanavos | { |
222 | 3c76f045 | Panagiotis Kanavos | const string hqlUpdate = "update FileState set FileStatus= :status where FilePath = :path "; |
223 | e81dd1f6 | Panagiotis Kanavos | var updatedEntities = session.CreateQuery(hqlUpdate) |
224 | 3c76f045 | Panagiotis Kanavos | .SetString("path", absolutePath) |
225 | e81dd1f6 | Panagiotis Kanavos | .SetEnum("status", newStatus) |
226 | e81dd1f6 | Panagiotis Kanavos | .ExecuteUpdate(); |
227 | e81dd1f6 | Panagiotis Kanavos | if (updatedEntities == 0) |
228 | e81dd1f6 | Panagiotis Kanavos | { |
229 | e81dd1f6 | Panagiotis Kanavos | var newState = new FileState |
230 | e81dd1f6 | Panagiotis Kanavos | { |
231 | 3c76f045 | Panagiotis Kanavos | FilePath = absolutePath, |
232 | e81dd1f6 | Panagiotis Kanavos | Id = Guid.NewGuid(), |
233 | 3c76f045 | Panagiotis Kanavos | FileStatus = newStatus, |
234 | 3c76f045 | Panagiotis Kanavos | IsFolder=Directory.Exists(absolutePath) |
235 | e81dd1f6 | Panagiotis Kanavos | }; |
236 | e81dd1f6 | Panagiotis Kanavos | newState.CreateAndFlush(); |
237 | e81dd1f6 | Panagiotis Kanavos | } |
238 | e81dd1f6 | Panagiotis Kanavos | return null; |
239 | e81dd1f6 | Panagiotis Kanavos | }, null); |
240 | ab2f6f79 | Panagiotis Kanavos | |
241 | ab2f6f79 | Panagiotis Kanavos | } |
242 | ab2f6f79 | Panagiotis Kanavos | |
243 | 174bbb6e | Panagiotis Kanavos | /*public static void StoreOverlayStatus(string absolutePath, FileOverlayStatus newStatus) |
244 | 174bbb6e | Panagiotis Kanavos | { |
245 | 174bbb6e | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(absolutePath)) |
246 | 174bbb6e | Panagiotis Kanavos | throw new ArgumentNullException("absolutePath"); |
247 | 174bbb6e | Panagiotis Kanavos | Contract.EndContractBlock(); |
248 | 174bbb6e | Panagiotis Kanavos | |
249 | 174bbb6e | Panagiotis Kanavos | ExecuteWithRetry((session, instance) => |
250 | 174bbb6e | Panagiotis Kanavos | { |
251 | 174bbb6e | Panagiotis Kanavos | const string hqlUpdate = |
252 | 174bbb6e | Panagiotis Kanavos | "update FileState set OverlayStatus= :status where FilePath = :path "; |
253 | 174bbb6e | Panagiotis Kanavos | var updatedEntities = session.CreateQuery(hqlUpdate) |
254 | 174bbb6e | Panagiotis Kanavos | .SetString("path", absolutePath) |
255 | 174bbb6e | Panagiotis Kanavos | .SetEnum("status", newStatus) |
256 | 174bbb6e | Panagiotis Kanavos | .ExecuteUpdate(); |
257 | 174bbb6e | Panagiotis Kanavos | if (updatedEntities == 0) |
258 | 174bbb6e | Panagiotis Kanavos | { |
259 | 174bbb6e | Panagiotis Kanavos | var newState = new FileState |
260 | 174bbb6e | Panagiotis Kanavos | { |
261 | 174bbb6e | Panagiotis Kanavos | FilePath = absolutePath, |
262 | 174bbb6e | Panagiotis Kanavos | Id = Guid.NewGuid(), |
263 | 174bbb6e | Panagiotis Kanavos | OverlayStatus = newStatus, |
264 | 174bbb6e | Panagiotis Kanavos | ShortHash = String.Empty, |
265 | 174bbb6e | Panagiotis Kanavos | IsFolder=Directory.Exists(absolutePath) |
266 | 174bbb6e | Panagiotis Kanavos | }; |
267 | 174bbb6e | Panagiotis Kanavos | newState.CreateAndFlush(); |
268 | 174bbb6e | Panagiotis Kanavos | } |
269 | 174bbb6e | Panagiotis Kanavos | return null; |
270 | 174bbb6e | Panagiotis Kanavos | }, null); |
271 | 174bbb6e | Panagiotis Kanavos | |
272 | 174bbb6e | Panagiotis Kanavos | } |
273 | 174bbb6e | Panagiotis Kanavos | */ |
274 | 174bbb6e | Panagiotis Kanavos | public static void StoreOverlayStatus(string absolutePath, FileOverlayStatus newStatus,string shortHash) |
275 | ab2f6f79 | Panagiotis Kanavos | { |
276 | ab2f6f79 | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(absolutePath)) |
277 | ab2f6f79 | Panagiotis Kanavos | throw new ArgumentNullException("absolutePath"); |
278 | ab2f6f79 | Panagiotis Kanavos | Contract.EndContractBlock(); |
279 | ab2f6f79 | Panagiotis Kanavos | |
280 | e81dd1f6 | Panagiotis Kanavos | ExecuteWithRetry((session, instance) => |
281 | e81dd1f6 | Panagiotis Kanavos | { |
282 | e81dd1f6 | Panagiotis Kanavos | const string hqlUpdate = |
283 | 3c76f045 | Panagiotis Kanavos | "update FileState set OverlayStatus= :status where FilePath = :path "; |
284 | 3c76f045 | Panagiotis Kanavos | var updatedEntities = session.CreateQuery(hqlUpdate) |
285 | 3c76f045 | Panagiotis Kanavos | .SetString("path", absolutePath) |
286 | 3c76f045 | Panagiotis Kanavos | .SetEnum("status", newStatus) |
287 | e81dd1f6 | Panagiotis Kanavos | .ExecuteUpdate(); |
288 | e81dd1f6 | Panagiotis Kanavos | if (updatedEntities == 0) |
289 | e81dd1f6 | Panagiotis Kanavos | { |
290 | e81dd1f6 | Panagiotis Kanavos | var newState = new FileState |
291 | e81dd1f6 | Panagiotis Kanavos | { |
292 | e81dd1f6 | Panagiotis Kanavos | FilePath = absolutePath, |
293 | e81dd1f6 | Panagiotis Kanavos | Id = Guid.NewGuid(), |
294 | 3c76f045 | Panagiotis Kanavos | OverlayStatus = newStatus, |
295 | 174bbb6e | Panagiotis Kanavos | ShortHash = shortHash??String.Empty, |
296 | 3c76f045 | Panagiotis Kanavos | IsFolder=Directory.Exists(absolutePath) |
297 | e81dd1f6 | Panagiotis Kanavos | }; |
298 | e81dd1f6 | Panagiotis Kanavos | newState.CreateAndFlush(); |
299 | e81dd1f6 | Panagiotis Kanavos | } |
300 | e81dd1f6 | Panagiotis Kanavos | return null; |
301 | e81dd1f6 | Panagiotis Kanavos | }, null); |
302 | ab2f6f79 | Panagiotis Kanavos | |
303 | ab2f6f79 | Panagiotis Kanavos | } |
304 | ab2f6f79 | Panagiotis Kanavos | |
305 | e81dd1f6 | Panagiotis Kanavos | /* |
306 | ab2f6f79 | Panagiotis Kanavos | public static void UpdateStatus(string absolutePath, FileStatus fileStatus, FileOverlayStatus overlayStatus) |
307 | ab2f6f79 | Panagiotis Kanavos | { |
308 | ab2f6f79 | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(absolutePath)) |
309 | ab2f6f79 | Panagiotis Kanavos | throw new ArgumentNullException("absolutePath"); |
310 | ab2f6f79 | Panagiotis Kanavos | Contract.EndContractBlock(); |
311 | ab2f6f79 | Panagiotis Kanavos | |
312 | e81dd1f6 | Panagiotis Kanavos | ExecuteWithRetry((session, instance) => |
313 | e81dd1f6 | Panagiotis Kanavos | { |
314 | e81dd1f6 | Panagiotis Kanavos | const string hqlUpdate = |
315 | e81dd1f6 | Panagiotis Kanavos | "update FileState set OverlayStatus= :overlayStatus, FileStatus= :fileStatus where FilePath = :path "; |
316 | e81dd1f6 | Panagiotis Kanavos | var updatedEntities = session.CreateQuery(hqlUpdate) |
317 | 3c76f045 | Panagiotis Kanavos | .SetString("path", absolutePath) |
318 | e81dd1f6 | Panagiotis Kanavos | .SetEnum("fileStatus", fileStatus) |
319 | e81dd1f6 | Panagiotis Kanavos | .SetEnum("overlayStatus", overlayStatus) |
320 | e81dd1f6 | Panagiotis Kanavos | .ExecuteUpdate(); |
321 | e81dd1f6 | Panagiotis Kanavos | return updatedEntities; |
322 | e81dd1f6 | Panagiotis Kanavos | }, null); |
323 | ab2f6f79 | Panagiotis Kanavos | |
324 | ab2f6f79 | Panagiotis Kanavos | } |
325 | e81dd1f6 | Panagiotis Kanavos | */ |
326 | e81dd1f6 | Panagiotis Kanavos | |
327 | e81dd1f6 | Panagiotis Kanavos | /* |
328 | ab2f6f79 | Panagiotis Kanavos | public static void UpdateStatus(string absolutePath, FileStatus fileStatus) |
329 | ab2f6f79 | Panagiotis Kanavos | { |
330 | ab2f6f79 | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(absolutePath)) |
331 | ab2f6f79 | Panagiotis Kanavos | throw new ArgumentNullException("absolutePath"); |
332 | ab2f6f79 | Panagiotis Kanavos | Contract.EndContractBlock(); |
333 | ab2f6f79 | Panagiotis Kanavos | |
334 | e81dd1f6 | Panagiotis Kanavos | ExecuteWithRetry((session, instance) => |
335 | e81dd1f6 | Panagiotis Kanavos | { |
336 | e81dd1f6 | Panagiotis Kanavos | const string hqlUpdate = |
337 | e81dd1f6 | Panagiotis Kanavos | "update FileState set FileStatus= :fileStatus where FilePath = :path "; |
338 | e81dd1f6 | Panagiotis Kanavos | var updatedEntities = session.CreateQuery(hqlUpdate) |
339 | 3c76f045 | Panagiotis Kanavos | .SetString("path", absolutePath) |
340 | e81dd1f6 | Panagiotis Kanavos | .SetEnum("fileStatus", fileStatus) |
341 | e81dd1f6 | Panagiotis Kanavos | .ExecuteUpdate(); |
342 | e81dd1f6 | Panagiotis Kanavos | return updatedEntities; |
343 | e81dd1f6 | Panagiotis Kanavos | }, null); |
344 | ab2f6f79 | Panagiotis Kanavos | |
345 | ab2f6f79 | Panagiotis Kanavos | } |
346 | ab2f6f79 | Panagiotis Kanavos | |
347 | e81dd1f6 | Panagiotis Kanavos | */ |
348 | ab2f6f79 | Panagiotis Kanavos | public static void RenameState(string oldPath, string newPath) |
349 | ab2f6f79 | Panagiotis Kanavos | { |
350 | ab2f6f79 | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(oldPath)) |
351 | ab2f6f79 | Panagiotis Kanavos | throw new ArgumentNullException("oldPath"); |
352 | ab2f6f79 | Panagiotis Kanavos | Contract.EndContractBlock(); |
353 | ab2f6f79 | Panagiotis Kanavos | |
354 | e81dd1f6 | Panagiotis Kanavos | ExecuteWithRetry((session, instance) => |
355 | e81dd1f6 | Panagiotis Kanavos | { |
356 | e81dd1f6 | Panagiotis Kanavos | const string hqlUpdate = |
357 | 3c76f045 | Panagiotis Kanavos | "update FileState set FilePath= :newPath where FilePath = :oldPath "; |
358 | e81dd1f6 | Panagiotis Kanavos | var updatedEntities = session.CreateQuery(hqlUpdate) |
359 | 3c76f045 | Panagiotis Kanavos | .SetString("oldPath", oldPath) |
360 | 3c76f045 | Panagiotis Kanavos | .SetString("newPath", newPath) |
361 | e81dd1f6 | Panagiotis Kanavos | .ExecuteUpdate(); |
362 | e81dd1f6 | Panagiotis Kanavos | return updatedEntities; |
363 | e81dd1f6 | Panagiotis Kanavos | }, null); |
364 | ab2f6f79 | Panagiotis Kanavos | |
365 | ab2f6f79 | Panagiotis Kanavos | } |
366 | ab2f6f79 | Panagiotis Kanavos | |
367 | e81dd1f6 | Panagiotis Kanavos | /* public static void UpdateStatus(Guid id, FileStatus fileStatus) |
368 | ab2f6f79 | Panagiotis Kanavos | { |
369 | ab2f6f79 | Panagiotis Kanavos | |
370 | e81dd1f6 | Panagiotis Kanavos | ExecuteWithRetry((session, instance) => |
371 | ab2f6f79 | Panagiotis Kanavos | { |
372 | e81dd1f6 | Panagiotis Kanavos | const string hqlUpdate = |
373 | e81dd1f6 | Panagiotis Kanavos | "update FileState set FileStatus= :fileStatus where Id = :id "; |
374 | ab2f6f79 | Panagiotis Kanavos | var updatedEntities = session.CreateQuery(hqlUpdate) |
375 | e81dd1f6 | Panagiotis Kanavos | .SetGuid("id", id) |
376 | e81dd1f6 | Panagiotis Kanavos | .SetEnum("fileStatus", fileStatus) |
377 | e81dd1f6 | Panagiotis Kanavos | .ExecuteUpdate(); |
378 | a0dcfcc9 | Panagiotis Kanavos | return updatedEntities; |
379 | ab2f6f79 | Panagiotis Kanavos | }, null); |
380 | e81dd1f6 | Panagiotis Kanavos | }*/ |
381 | ab2f6f79 | Panagiotis Kanavos | |
382 | 174bbb6e | Panagiotis Kanavos | public static void UpdateChecksum(string absolutePath, string shortHash, string checksum) |
383 | ab2f6f79 | Panagiotis Kanavos | { |
384 | ab2f6f79 | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(absolutePath)) |
385 | ab2f6f79 | Panagiotis Kanavos | throw new ArgumentNullException("absolutePath"); |
386 | ab2f6f79 | Panagiotis Kanavos | Contract.EndContractBlock(); |
387 | ab2f6f79 | Panagiotis Kanavos | |
388 | e81dd1f6 | Panagiotis Kanavos | ExecuteWithRetry((session, instance) => |
389 | e81dd1f6 | Panagiotis Kanavos | { |
390 | 174bbb6e | Panagiotis Kanavos | const string hqlUpdate = "update FileState set Checksum= :checksum,ShortHash=:shortHash where FilePath = :path "; |
391 | e81dd1f6 | Panagiotis Kanavos | var updatedEntities = session.CreateQuery(hqlUpdate) |
392 | 3c76f045 | Panagiotis Kanavos | .SetString("path", absolutePath) |
393 | e81dd1f6 | Panagiotis Kanavos | .SetString("checksum", checksum) |
394 | 174bbb6e | Panagiotis Kanavos | .SetString("shortHash", shortHash) |
395 | e81dd1f6 | Panagiotis Kanavos | .ExecuteUpdate(); |
396 | e81dd1f6 | Panagiotis Kanavos | return updatedEntities; |
397 | e81dd1f6 | Panagiotis Kanavos | }, null); |
398 | ab2f6f79 | Panagiotis Kanavos | |
399 | ab2f6f79 | Panagiotis Kanavos | } |
400 | 0af3141d | Panagiotis Kanavos | |
401 | e81dd1f6 | Panagiotis Kanavos | public static void ChangeRootPath(string oldPath, string newPath) |
402 | 5120f3cb | Panagiotis Kanavos | { |
403 | 5120f3cb | Panagiotis Kanavos | if (String.IsNullOrWhiteSpace(oldPath)) |
404 | 5120f3cb | Panagiotis Kanavos | throw new ArgumentNullException("oldPath"); |
405 | 5120f3cb | Panagiotis Kanavos | if (!Path.IsPathRooted(oldPath)) |
406 | 5120f3cb | Panagiotis Kanavos | throw new ArgumentException("oldPath must be an absolute path", "oldPath"); |
407 | 5120f3cb | Panagiotis Kanavos | if (string.IsNullOrWhiteSpace(newPath)) |
408 | 5120f3cb | Panagiotis Kanavos | throw new ArgumentNullException("newPath"); |
409 | 5120f3cb | Panagiotis Kanavos | if (!Path.IsPathRooted(newPath)) |
410 | 5120f3cb | Panagiotis Kanavos | throw new ArgumentException("newPath must be an absolute path", "newPath"); |
411 | 5120f3cb | Panagiotis Kanavos | Contract.EndContractBlock(); |
412 | 5120f3cb | Panagiotis Kanavos | |
413 | 5120f3cb | Panagiotis Kanavos | //Ensure the paths end with the same character |
414 | 5120f3cb | Panagiotis Kanavos | if (!oldPath.EndsWith("\\")) |
415 | 5120f3cb | Panagiotis Kanavos | oldPath = oldPath + "\\"; |
416 | 5120f3cb | Panagiotis Kanavos | if (!newPath.EndsWith("\\")) |
417 | 5120f3cb | Panagiotis Kanavos | newPath = newPath + "\\"; |
418 | 5120f3cb | Panagiotis Kanavos | |
419 | e81dd1f6 | Panagiotis Kanavos | ExecuteWithRetry((session, instance) => |
420 | 5120f3cb | Panagiotis Kanavos | { |
421 | 5120f3cb | Panagiotis Kanavos | const string hqlUpdate = |
422 | 5120f3cb | Panagiotis Kanavos | "update FileState set FilePath = replace(FilePath,:oldPath,:newPath) where FilePath like :oldPath || '%' "; |
423 | e81dd1f6 | Panagiotis Kanavos | var renames = session.CreateQuery(hqlUpdate) |
424 | 3c76f045 | Panagiotis Kanavos | .SetString("oldPath", oldPath) |
425 | 3c76f045 | Panagiotis Kanavos | .SetString("newPath", newPath) |
426 | 5120f3cb | Panagiotis Kanavos | .ExecuteUpdate(); |
427 | a0dcfcc9 | Panagiotis Kanavos | return renames; |
428 | 5120f3cb | Panagiotis Kanavos | }, null); |
429 | 5120f3cb | Panagiotis Kanavos | } |
430 | 5120f3cb | Panagiotis Kanavos | |
431 | 174bbb6e | Panagiotis Kanavos | public static FileState CreateFor(FileSystemInfo info) |
432 | 0c02aa65 | Panagiotis Kanavos | { |
433 | 174bbb6e | Panagiotis Kanavos | Contract.Requires(info!=null); |
434 | bfc13ed8 | Panagiotis Kanavos | Contract.EndContractBlock(); |
435 | 174bbb6e | Panagiotis Kanavos | |
436 | 174bbb6e | Panagiotis Kanavos | if (info is DirectoryInfo) |
437 | 174bbb6e | Panagiotis Kanavos | return new FileState |
438 | 174bbb6e | Panagiotis Kanavos | { |
439 | 174bbb6e | Panagiotis Kanavos | FilePath = info.FullName, |
440 | 174bbb6e | Panagiotis Kanavos | OverlayStatus = FileOverlayStatus.Unversioned, |
441 | 174bbb6e | Panagiotis Kanavos | FileStatus = FileStatus.Created, |
442 | 174bbb6e | Panagiotis Kanavos | ShortHash=String.Empty, |
443 | 174bbb6e | Panagiotis Kanavos | Id = Guid.NewGuid() |
444 | 174bbb6e | Panagiotis Kanavos | }; |
445 | bfc13ed8 | Panagiotis Kanavos | |
446 | bfc13ed8 | Panagiotis Kanavos | |
447 | 174bbb6e | Panagiotis Kanavos | var shortHash = ((FileInfo)info).ComputeShortHash(); |
448 | 0c02aa65 | Panagiotis Kanavos | var fileState = new FileState |
449 | 0c02aa65 | Panagiotis Kanavos | { |
450 | 174bbb6e | Panagiotis Kanavos | FilePath = info.FullName, |
451 | e81dd1f6 | Panagiotis Kanavos | OverlayStatus = FileOverlayStatus.Unversioned, |
452 | 174bbb6e | Panagiotis Kanavos | FileStatus = FileStatus.Created, |
453 | 174bbb6e | Panagiotis Kanavos | ShortHash=shortHash, |
454 | e81dd1f6 | Panagiotis Kanavos | Id = Guid.NewGuid() |
455 | 0c02aa65 | Panagiotis Kanavos | }; |
456 | 174bbb6e | Panagiotis Kanavos | return fileState; |
457 | 0c02aa65 | Panagiotis Kanavos | } |
458 | 0c02aa65 | Panagiotis Kanavos | |
459 | e81dd1f6 | Panagiotis Kanavos | |
460 | e81dd1f6 | Panagiotis Kanavos | private static void ExecuteWithRetry(NHibernateDelegate call, object state) |
461 | e81dd1f6 | Panagiotis Kanavos | { |
462 | e81dd1f6 | Panagiotis Kanavos | int retries = 3; |
463 | e81dd1f6 | Panagiotis Kanavos | while (retries > 0) |
464 | e81dd1f6 | Panagiotis Kanavos | try |
465 | e81dd1f6 | Panagiotis Kanavos | { |
466 | e81dd1f6 | Panagiotis Kanavos | using (new SessionScope()) |
467 | e81dd1f6 | Panagiotis Kanavos | { |
468 | e81dd1f6 | Panagiotis Kanavos | Execute(call, state); |
469 | 039a89e5 | Panagiotis Kanavos | return; |
470 | e81dd1f6 | Panagiotis Kanavos | } |
471 | e81dd1f6 | Panagiotis Kanavos | } |
472 | 1b4a7550 | Panagiotis Kanavos | catch (ActiveRecordException ) |
473 | e81dd1f6 | Panagiotis Kanavos | { |
474 | e81dd1f6 | Panagiotis Kanavos | retries--; |
475 | e81dd1f6 | Panagiotis Kanavos | if (retries <= 0) |
476 | e81dd1f6 | Panagiotis Kanavos | throw; |
477 | e81dd1f6 | Panagiotis Kanavos | } |
478 | e81dd1f6 | Panagiotis Kanavos | } |
479 | 759bd3c4 | Panagiotis Kanavos | |
480 | fec5da06 | Panagiotis Kanavos | /// <summary> |
481 | 4147814e | Panagiotis Kanavos | /// Mark Unversioned all FileState rows from the database whose path |
482 | fec5da06 | Panagiotis Kanavos | /// starts with one of the removed paths |
483 | fec5da06 | Panagiotis Kanavos | /// </summary> |
484 | fec5da06 | Panagiotis Kanavos | /// <param name="removed"></param> |
485 | 4147814e | Panagiotis Kanavos | public static void UnversionPaths(List<string> removed) |
486 | 759bd3c4 | Panagiotis Kanavos | { |
487 | fec5da06 | Panagiotis Kanavos | if (removed == null) |
488 | fec5da06 | Panagiotis Kanavos | return; |
489 | fec5da06 | Panagiotis Kanavos | if (removed.Count == 0) |
490 | fec5da06 | Panagiotis Kanavos | return; |
491 | 759bd3c4 | Panagiotis Kanavos | |
492 | fec5da06 | Panagiotis Kanavos | //Create a disjunction (list of OR statements |
493 | fec5da06 | Panagiotis Kanavos | var disjunction = new Disjunction(); |
494 | 759bd3c4 | Panagiotis Kanavos | foreach (var path in removed) |
495 | 759bd3c4 | Panagiotis Kanavos | { |
496 | fec5da06 | Panagiotis Kanavos | //with the restriction FileState.FilePath like '@path%' |
497 | fec5da06 | Panagiotis Kanavos | disjunction.Add(Restrictions.On<FileState>(s => s.FilePath) |
498 | fec5da06 | Panagiotis Kanavos | .IsLike(path, MatchMode.Start)); |
499 | 759bd3c4 | Panagiotis Kanavos | } |
500 | 759bd3c4 | Panagiotis Kanavos | |
501 | fec5da06 | Panagiotis Kanavos | //Generate a query from the disjunction |
502 | 759bd3c4 | Panagiotis Kanavos | var query=QueryOver.Of<FileState>().Where(disjunction); |
503 | 4147814e | Panagiotis Kanavos | |
504 | 4147814e | Panagiotis Kanavos | ExecuteWithRetry((session,instance)=> |
505 | 4147814e | Panagiotis Kanavos | { |
506 | 4147814e | Panagiotis Kanavos | using (var t=session.BeginTransaction()) |
507 | 4147814e | Panagiotis Kanavos | { |
508 | 4147814e | Panagiotis Kanavos | var states = query.GetExecutableQueryOver(session).List(); |
509 | 4147814e | Panagiotis Kanavos | foreach (var state in states) |
510 | 4147814e | Panagiotis Kanavos | { |
511 | 4147814e | Panagiotis Kanavos | state.FileStatus = FileStatus.Unversioned; |
512 | 4147814e | Panagiotis Kanavos | state.OverlayStatus = FileOverlayStatus.Unversioned; |
513 | 4147814e | Panagiotis Kanavos | state.Update(); |
514 | 4147814e | Panagiotis Kanavos | } |
515 | 4147814e | Panagiotis Kanavos | t.Commit(); |
516 | 4147814e | Panagiotis Kanavos | } |
517 | 4147814e | Panagiotis Kanavos | return null; |
518 | 4147814e | Panagiotis Kanavos | },null); |
519 | 759bd3c4 | Panagiotis Kanavos | } |
520 | 4147814e | Panagiotis Kanavos | |
521 | eeee29e3 | Panagiotis Kanavos | } |
522 | 283809f3 | Panagiotis Kanavos | |
523 | 9c4346c9 | Panagiotis Kanavos | [ActiveRecord("Tags")] |
524 | 3c43ec9b | Panagiotis Kanavos | public class FileTag : ActiveRecordLinqBase<FileTag> |
525 | 3c43ec9b | Panagiotis Kanavos | { |
526 | 3c43ec9b | Panagiotis Kanavos | [PrimaryKey] |
527 | 9c4346c9 | Panagiotis Kanavos | public int Id { get; set; } |
528 | 9c4346c9 | Panagiotis Kanavos | |
529 | 9c4346c9 | Panagiotis Kanavos | [Property] |
530 | 9c4346c9 | Panagiotis Kanavos | public string Name { get; set; } |
531 | 3c43ec9b | Panagiotis Kanavos | |
532 | 3c43ec9b | Panagiotis Kanavos | [Property] |
533 | 3c43ec9b | Panagiotis Kanavos | public string Value { get; set; } |
534 | 3c43ec9b | Panagiotis Kanavos | |
535 | 9c4346c9 | Panagiotis Kanavos | [BelongsTo("FileStateId")] |
536 | 3c43ec9b | Panagiotis Kanavos | public FileState FileState { get; set; } |
537 | 3c43ec9b | Panagiotis Kanavos | |
538 | 3c43ec9b | Panagiotis Kanavos | } |
539 | a0dcfcc9 | Panagiotis Kanavos | |
540 | eeee29e3 | Panagiotis Kanavos | } |