diff options
Diffstat (limited to 'OpenSim/Region/Environment/Modules/ContentManagementSystem/FileSystemDatabase.cs')
-rw-r--r-- | OpenSim/Region/Environment/Modules/ContentManagementSystem/FileSystemDatabase.cs | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/OpenSim/Region/Environment/Modules/ContentManagementSystem/FileSystemDatabase.cs b/OpenSim/Region/Environment/Modules/ContentManagementSystem/FileSystemDatabase.cs new file mode 100644 index 0000000..e1f519b --- /dev/null +++ b/OpenSim/Region/Environment/Modules/ContentManagementSystem/FileSystemDatabase.cs | |||
@@ -0,0 +1,260 @@ | |||
1 | // FileSystemDatabase.cs | ||
2 | // User: bongiojp | ||
3 | |||
4 | using System; | ||
5 | using System.Collections.Generic; | ||
6 | using System.IO; | ||
7 | using System.Reflection; | ||
8 | using System.Xml; | ||
9 | using libsecondlife; | ||
10 | using Nini.Config; | ||
11 | using OpenSim.Framework; | ||
12 | using OpenSim.Region.Environment.Interfaces; | ||
13 | using OpenSim.Region.Environment.Modules.World.Serialiser; | ||
14 | using OpenSim.Region.Environment.Modules.World.Terrain; | ||
15 | using OpenSim.Region.Environment.Scenes; | ||
16 | using log4net; | ||
17 | using OpenSim.Region.Physics.Manager; | ||
18 | using Axiom.Math; | ||
19 | using Slash=System.IO.Path; | ||
20 | using System.Diagnostics; | ||
21 | |||
22 | namespace OpenSim.Region.Environment.Modules.ContentManagement | ||
23 | { | ||
24 | public class FileSystemDatabase : IContentDatabase | ||
25 | { | ||
26 | public static float TimeToDownload = 0; | ||
27 | public static float TimeToSave = 0; | ||
28 | |||
29 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
30 | |||
31 | private string m_repodir = null; | ||
32 | private Dictionary<LLUUID, IRegionSerialiser> m_serialiser = new Dictionary<LLUUID, IRegionSerialiser>(); | ||
33 | private Dictionary<LLUUID, Scene> m_scenes = new Dictionary<LLUUID, Scene>(); | ||
34 | |||
35 | public FileSystemDatabase() | ||
36 | { | ||
37 | } | ||
38 | |||
39 | public void Initialise(Scene scene, string dir) | ||
40 | { | ||
41 | lock(this) | ||
42 | { | ||
43 | if (m_repodir == null) | ||
44 | m_repodir = dir; | ||
45 | } | ||
46 | lock(m_scenes) | ||
47 | m_scenes.Add(scene.RegionInfo.RegionID, scene); | ||
48 | } | ||
49 | |||
50 | |||
51 | // Run once and only once. | ||
52 | public void PostInitialise() | ||
53 | { | ||
54 | SetupSerialiser(); | ||
55 | |||
56 | m_log.Info("[FSDB]: Creating repository in " + m_repodir + "."); | ||
57 | CreateDirectory(); | ||
58 | } | ||
59 | |||
60 | // called by postinitialise | ||
61 | private void SetupSerialiser() | ||
62 | { | ||
63 | if (m_serialiser.Count == 0) | ||
64 | foreach(LLUUID region in m_scenes.Keys) | ||
65 | m_serialiser.Add(region, | ||
66 | m_scenes[region].RequestModuleInterface<IRegionSerialiser>() | ||
67 | ); | ||
68 | } | ||
69 | |||
70 | // called by postinitialise | ||
71 | private void CreateDirectory() | ||
72 | { | ||
73 | string scenedir; | ||
74 | if (!Directory.Exists(m_repodir)) | ||
75 | Directory.CreateDirectory(m_repodir); | ||
76 | |||
77 | foreach (LLUUID region in m_scenes.Keys) | ||
78 | { | ||
79 | scenedir = m_repodir + Slash.DirectorySeparatorChar + region + Slash.DirectorySeparatorChar; | ||
80 | if (!Directory.Exists(scenedir)) | ||
81 | Directory.CreateDirectory(scenedir); | ||
82 | } | ||
83 | } | ||
84 | |||
85 | public int NumOfRegionRev(LLUUID regionid) | ||
86 | { | ||
87 | string scenedir = m_repodir + Slash.DirectorySeparatorChar + regionid + Slash.DirectorySeparatorChar; | ||
88 | m_log.Info("[FSDB]: Reading scene dir: " + scenedir); | ||
89 | string[] directories = Directory.GetDirectories(scenedir); | ||
90 | return directories.Length; | ||
91 | } | ||
92 | |||
93 | public int GetMostRecentRevision(LLUUID regionid) | ||
94 | { | ||
95 | return NumOfRegionRev(regionid); | ||
96 | } | ||
97 | |||
98 | public void SaveRegion(LLUUID regionid, string regionName, string logMessage) | ||
99 | { | ||
100 | m_log.Info("[FSDB]: ..............................."); | ||
101 | string scenedir = m_repodir + Slash.DirectorySeparatorChar + regionid + Slash.DirectorySeparatorChar; | ||
102 | |||
103 | m_log.Info("[FSDB]: checking if scene directory exists: " + scenedir); | ||
104 | if (!Directory.Exists(scenedir)) | ||
105 | Directory.CreateDirectory(scenedir); | ||
106 | |||
107 | int newRevisionNum = GetMostRecentRevision(regionid)+1; | ||
108 | string revisiondir = scenedir + newRevisionNum + Slash.DirectorySeparatorChar; | ||
109 | |||
110 | m_log.Info("[FSDB]: checking if revision directory exists: " + revisiondir); | ||
111 | if (!Directory.Exists(revisiondir)) | ||
112 | Directory.CreateDirectory(revisiondir); | ||
113 | |||
114 | try { | ||
115 | Stopwatch x = new Stopwatch(); | ||
116 | x.Start(); | ||
117 | if (m_scenes.ContainsKey(regionid)) | ||
118 | { | ||
119 | m_serialiser[regionid].SerialiseRegion(m_scenes[regionid], revisiondir); | ||
120 | } | ||
121 | x.Stop(); | ||
122 | TimeToSave += x.ElapsedMilliseconds; | ||
123 | m_log.Info("[FileSystemDatabase] Time spent serialising regions to files on disk for " + regionName + ": " + x.ElapsedMilliseconds); | ||
124 | m_log.Info("[FileSystemDatabase] Time spent serialising regions to files on disk so far: " + TimeToSave); | ||
125 | } | ||
126 | catch (Exception e) | ||
127 | { | ||
128 | m_log.ErrorFormat("[FSDB]: Serialisation of region failed: " + e); | ||
129 | return; | ||
130 | } | ||
131 | |||
132 | try { | ||
133 | // Finish by writing log message. | ||
134 | FileStream file = new FileStream(revisiondir + "log", FileMode.Create, FileAccess.ReadWrite); | ||
135 | StreamWriter sw = new StreamWriter(file); | ||
136 | sw.Write(logMessage); | ||
137 | sw.Close(); | ||
138 | } | ||
139 | catch (Exception e) | ||
140 | { | ||
141 | m_log.ErrorFormat("[FSDB]: Failed trying to save log file " + e); | ||
142 | return; | ||
143 | } | ||
144 | } | ||
145 | |||
146 | public System.Collections.ArrayList GetRegionObjectXMLList(LLUUID regionid, int revision) | ||
147 | { | ||
148 | System.Collections.ArrayList objectList = new System.Collections.ArrayList(); | ||
149 | string filename = m_repodir + Slash.DirectorySeparatorChar + regionid + Slash.DirectorySeparatorChar + | ||
150 | + revision + Slash.DirectorySeparatorChar + "objects.xml"; | ||
151 | XmlDocument doc = new XmlDocument(); | ||
152 | XmlNode rootNode; | ||
153 | //int primCount = 0; | ||
154 | //SceneObjectGroup obj = null; | ||
155 | |||
156 | if(File.Exists(filename)) | ||
157 | { | ||
158 | XmlTextReader reader = new XmlTextReader(filename); | ||
159 | reader.WhitespaceHandling = WhitespaceHandling.None; | ||
160 | doc.Load(reader); | ||
161 | reader.Close(); | ||
162 | rootNode = doc.FirstChild; | ||
163 | foreach (XmlNode aPrimNode in rootNode.ChildNodes) | ||
164 | { | ||
165 | objectList.Add(aPrimNode.OuterXml); | ||
166 | } | ||
167 | return objectList; | ||
168 | } | ||
169 | return null; | ||
170 | } | ||
171 | |||
172 | public System.Collections.ArrayList GetRegionObjectXMLList(LLUUID regionid) | ||
173 | { | ||
174 | int revision = NumOfRegionRev(regionid); | ||
175 | m_log.Info("[FSDB]: found revisions:" + revision); | ||
176 | System.Collections.ArrayList xmlList = new System.Collections.ArrayList(); | ||
177 | string filename = m_repodir + Slash.DirectorySeparatorChar + regionid + Slash.DirectorySeparatorChar + | ||
178 | + revision + Slash.DirectorySeparatorChar + "objects.xml"; | ||
179 | XmlDocument doc = new XmlDocument(); | ||
180 | XmlNode rootNode; | ||
181 | |||
182 | |||
183 | m_log.Info("[FSDB]: Checking if " + filename + " exists."); | ||
184 | if(File.Exists(filename)) | ||
185 | { | ||
186 | Stopwatch x = new Stopwatch(); | ||
187 | x.Start(); | ||
188 | |||
189 | XmlTextReader reader = new XmlTextReader(filename); | ||
190 | reader.WhitespaceHandling = WhitespaceHandling.None; | ||
191 | doc.Load(reader); | ||
192 | reader.Close(); | ||
193 | rootNode = doc.FirstChild; | ||
194 | |||
195 | foreach (XmlNode aPrimNode in rootNode.ChildNodes) | ||
196 | xmlList.Add(aPrimNode.OuterXml); | ||
197 | |||
198 | x.Stop(); | ||
199 | TimeToDownload += x.ElapsedMilliseconds; | ||
200 | m_log.Info("[FileSystemDatabase] Time spent retrieving xml files so far: " + TimeToDownload); | ||
201 | |||
202 | return xmlList; | ||
203 | } | ||
204 | return null; | ||
205 | } | ||
206 | |||
207 | public string GetRegionObjectHeightMap(LLUUID regionid) | ||
208 | { | ||
209 | String filename = m_repodir + Slash.DirectorySeparatorChar + regionid + | ||
210 | Slash.DirectorySeparatorChar + "heightmap.r32"; | ||
211 | FileStream fs = new FileStream( filename, FileMode.Open); | ||
212 | StreamReader sr = new StreamReader(fs); | ||
213 | String result = sr.ReadToEnd(); | ||
214 | sr.Close(); | ||
215 | fs.Close(); | ||
216 | return result; | ||
217 | } | ||
218 | |||
219 | public string GetRegionObjectHeightMap(LLUUID regionid, int revision) | ||
220 | { | ||
221 | String filename = m_repodir + Slash.DirectorySeparatorChar + regionid + | ||
222 | Slash.DirectorySeparatorChar + "heightmap.r32"; | ||
223 | FileStream fs = new FileStream( filename, FileMode.Open); | ||
224 | StreamReader sr = new StreamReader(fs); | ||
225 | String result = sr.ReadToEnd(); | ||
226 | sr.Close(); | ||
227 | fs.Close(); | ||
228 | return result; | ||
229 | } | ||
230 | |||
231 | public System.Collections.Generic.SortedDictionary<string, string> ListOfRegionRevisions(LLUUID regionid) | ||
232 | { | ||
233 | SortedDictionary<string, string> revisionDict = new SortedDictionary<string,string>(); | ||
234 | |||
235 | string scenedir = m_repodir + Slash.DirectorySeparatorChar + regionid + Slash.DirectorySeparatorChar; | ||
236 | string[] directories = Directory.GetDirectories(scenedir); | ||
237 | |||
238 | FileStream fs = null; | ||
239 | StreamReader sr = null; | ||
240 | String logMessage = ""; | ||
241 | String logLocation = ""; | ||
242 | foreach(string revisionDir in directories) | ||
243 | { | ||
244 | try { | ||
245 | logLocation = revisionDir + Slash.DirectorySeparatorChar + "log"; | ||
246 | fs = new FileStream( logLocation, FileMode.Open); | ||
247 | sr = new StreamReader(fs); | ||
248 | logMessage = sr.ReadToEnd(); | ||
249 | sr.Close(); | ||
250 | fs.Close(); | ||
251 | revisionDict.Add(revisionDir, logMessage); | ||
252 | } | ||
253 | catch (Exception) | ||
254 | {} | ||
255 | } | ||
256 | |||
257 | return revisionDict; | ||
258 | } | ||
259 | } | ||
260 | } | ||