aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs')
-rw-r--r--OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs267
1 files changed, 267 insertions, 0 deletions
diff --git a/OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs b/OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs
new file mode 100644
index 0000000..8214bc8
--- /dev/null
+++ b/OpenSim/Region/Storage/LocalStorageDb4o/Db4LocalStorage.cs
@@ -0,0 +1,267 @@
1/*
2* Copyright (c) Contributors, http://www.openmetaverse.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28using System;
29using Db4objects.Db4o;
30using libsecondlife;
31using OpenSim.Framework.Console;
32using OpenSim.Framework.Interfaces;
33using OpenSim.Framework.Types;
34
35namespace OpenSim.Region.Storage.LocalStorageDb4o
36{
37 /// <summary>
38 ///
39 /// </summary>
40 public class Db4LocalStorage : ILocalStorage
41 {
42 private IObjectContainer db;
43 private string datastore;
44
45 public Db4LocalStorage()
46 {
47
48 }
49
50 public void Initialise(string dfile)
51 {
52 MainLog.Instance.Warn("Db4LocalStorage Opening " + dfile);
53 datastore = dfile;
54 try
55 {
56 db = Db4oFactory.OpenFile(datastore);
57 MainLog.Instance.Verbose("Db4LocalStorage creation");
58 }
59 catch (Exception e)
60 {
61 db.Close();
62 MainLog.Instance.Warn("Db4LocalStorage :Constructor - Exception occured");
63 MainLog.Instance.Warn(e.ToString());
64 }
65 }
66
67 public void StorePrim(PrimData prim)
68 {
69 IObjectSet result = db.Query(new UUIDPrimQuery(prim.FullID));
70 if (result.Count > 0)
71 {
72 //prim already in storage
73 //so update it
74 PrimData found = (PrimData)result.Next();
75 found.PathBegin = prim.PathBegin;
76 found.PathCurve = prim.PathCurve;
77 found.PathEnd = prim.PathEnd;
78 found.PathRadiusOffset = prim.PathRadiusOffset;
79 found.PathRevolutions = prim.PathRevolutions;
80 found.PathScaleX = prim.PathScaleX;
81 found.PathScaleY = prim.PathScaleY;
82 found.PathShearX = prim.PathShearX;
83 found.PathShearY = prim.PathShearY;
84 found.PathSkew = prim.PathSkew;
85 found.PathTaperX = prim.PathTaperX;
86 found.PathTaperY = prim.PathTaperY;
87 found.PathTwist = prim.PathTwist;
88 found.PathTwistBegin = prim.PathTwistBegin;
89 found.PCode = prim.PCode;
90 found.ProfileBegin = prim.ProfileBegin;
91 found.ProfileCurve = prim.ProfileCurve;
92 found.ProfileEnd = prim.ProfileEnd;
93 found.ProfileHollow = prim.ProfileHollow;
94 found.Position = prim.Position;
95 found.Rotation = prim.Rotation;
96 found.TextureEntry = prim.TextureEntry;
97 db.Set(found);
98 db.Commit();
99 }
100 else
101 {
102 //not in storage
103 db.Set(prim);
104 db.Commit();
105 }
106 }
107
108 public void RemovePrim(LLUUID primID)
109 {
110 IObjectSet result = db.Query(new UUIDPrimQuery(primID));
111 if (result.Count > 0)
112 {
113 PrimData found = (PrimData)result.Next();
114 db.Delete(found);
115 }
116 }
117
118
119 public void LoadPrimitives(ILocalStorageReceiver receiver)
120 {
121 IObjectSet result = db.Get(typeof(PrimData));
122 MainLog.Instance.Verbose("Db4LocalStorage.cs: LoadPrimitives() - number of prims in storages is " + result.Count);
123 foreach (PrimData prim in result)
124 {
125 receiver.PrimFromStorage(prim);
126 }
127 }
128
129 public float[] LoadWorld()
130 {
131 MainLog.Instance.Verbose("LoadWorld() - Loading world....");
132 float[] heightmap = null;
133 MainLog.Instance.Verbose("LoadWorld() - Looking for a heightmap in local DB");
134 IObjectSet world_result = db.Get(typeof(MapStorage));
135 if (world_result.Count > 0)
136 {
137 MainLog.Instance.Verbose("LoadWorld() - Found a heightmap in local database, loading");
138 MapStorage map = (MapStorage)world_result.Next();
139 //blank.LandMap = map.Map;
140 heightmap = map.Map;
141 }
142 return heightmap;
143 }
144
145 public void SaveMap(float[] heightmap)
146 {
147 IObjectSet world_result = db.Get(typeof(MapStorage));
148 if (world_result.Count > 0)
149 {
150 MainLog.Instance.Verbose("SaveWorld() - updating saved copy of heightmap in local database");
151 MapStorage map = (MapStorage)world_result.Next();
152 db.Delete(map);
153 }
154 MapStorage map1 = new MapStorage();
155 map1.Map = heightmap; //OpenSim_Main.local_world.LandMap;
156 db.Set(map1);
157 db.Commit();
158 }
159
160 public void SaveParcel(ParcelData parcel)
161 {
162 IObjectSet result = db.Query(new UUIDParcelQuery(parcel.globalID));
163 if (result.Count > 0)
164 {
165 //Old Parcel
166 ParcelData updateParcel = (ParcelData)result.Next();
167 updateParcel.AABBMax = parcel.AABBMax;
168 updateParcel.AABBMin = parcel.AABBMin;
169 updateParcel.area = parcel.area;
170 updateParcel.auctionID = parcel.auctionID;
171 updateParcel.authBuyerID = parcel.authBuyerID;
172 updateParcel.category = parcel.category;
173 updateParcel.claimDate = parcel.claimDate;
174 updateParcel.claimPrice = parcel.claimPrice;
175 updateParcel.groupID = parcel.groupID;
176 updateParcel.groupPrims = parcel.groupPrims;
177 updateParcel.isGroupOwned = parcel.isGroupOwned;
178 updateParcel.landingType = parcel.landingType;
179 updateParcel.mediaAutoScale = parcel.mediaAutoScale;
180 updateParcel.mediaID = parcel.mediaID;
181 updateParcel.mediaURL = parcel.mediaURL;
182 updateParcel.musicURL = parcel.musicURL;
183 updateParcel.localID = parcel.localID;
184 updateParcel.ownerID = parcel.ownerID;
185 updateParcel.passHours = parcel.passHours;
186 updateParcel.passPrice = parcel.passPrice;
187 updateParcel.parcelBitmapByteArray = (byte[])parcel.parcelBitmapByteArray.Clone();
188 updateParcel.parcelDesc = parcel.parcelDesc;
189 updateParcel.parcelFlags = parcel.parcelFlags;
190 updateParcel.parcelName = parcel.parcelName;
191 updateParcel.parcelStatus = parcel.parcelStatus;
192 updateParcel.salePrice = parcel.salePrice;
193 updateParcel.snapshotID = parcel.snapshotID;
194 updateParcel.userLocation = parcel.userLocation;
195 updateParcel.userLookAt = parcel.userLookAt;
196
197 db.Set(updateParcel);
198 }
199 else
200 {
201 db.Set(parcel);
202 }
203 db.Commit();
204 }
205
206 public void SaveParcels(ParcelData[] parcel_data)
207 {
208 MainLog.Instance.Notice("Parcel Backup: Saving Parcels...");
209 int i;
210 for (i = 0; i < parcel_data.GetLength(0); i++)
211 {
212
213 SaveParcel(parcel_data[i]);
214
215 }
216 MainLog.Instance.Notice("Parcel Backup: Parcel Save Complete");
217 }
218
219 public void RemoveParcel(ParcelData parcel)
220 {
221 IObjectSet result = db.Query(new UUIDParcelQuery(parcel.globalID));
222 if (result.Count > 0)
223 {
224 db.Delete(result[0]);
225 }
226 db.Commit();
227 }
228 public void RemoveAllParcels()
229 {
230 MainLog.Instance.Notice("Parcel Backup: Removing all parcels...");
231 IObjectSet result = db.Get(typeof(ParcelData));
232 if (result.Count > 0)
233 {
234 foreach (ParcelData parcelData in result)
235 {
236 RemoveParcel(parcelData);
237 }
238 }
239 }
240
241 public void LoadParcels(ILocalStorageParcelReceiver recv)
242 {
243 MainLog.Instance.Notice("Parcel Backup: Loading Parcels...");
244 IObjectSet result = db.Get(typeof(ParcelData));
245 if (result.Count > 0)
246 {
247 MainLog.Instance.Notice("Parcel Backup: Parcels exist in database.");
248 foreach (ParcelData parcelData in result)
249 {
250
251 recv.ParcelFromStorage(parcelData);
252 }
253 }
254 else
255 {
256 MainLog.Instance.Notice("Parcel Backup: No parcels exist. Creating basic parcel.");
257 recv.NoParcelDataFromStorage();
258 }
259 MainLog.Instance.Notice("Parcel Backup: Parcels Restored");
260 }
261 public void ShutDown()
262 {
263 db.Commit();
264 db.Close();
265 }
266 }
267} \ No newline at end of file