aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework
diff options
context:
space:
mode:
authorMW2007-09-10 06:45:54 +0000
committerMW2007-09-10 06:45:54 +0000
commit15423539f98d47201a819e35f80b0c30ee459556 (patch)
tree3eb7831bfaaf5e0309c49f966d19869a9fe72e2b /OpenSim/Framework
parent* Fixed: Accessing xmlrpc with invalid xml data would crash the sim. (diff)
downloadopensim-SC-15423539f98d47201a819e35f80b0c30ee459556.zip
opensim-SC-15423539f98d47201a819e35f80b0c30ee459556.tar.gz
opensim-SC-15423539f98d47201a819e35f80b0c30ee459556.tar.bz2
opensim-SC-15423539f98d47201a819e35f80b0c30ee459556.tar.xz
hooked up sdague new sqlite asset database provider to the old asset system. So we can still use sqlite for assets while we wait for the rest of the new asset system to be wrote.
Needs more testing, so if it causes problems will have to swap back to db4o.
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r--OpenSim/Framework/Communications/Cache/AssetCache.cs12
-rw-r--r--OpenSim/Framework/Communications/Cache/AssetServer.cs4
-rw-r--r--OpenSim/Framework/Communications/Cache/SQLAssetServer.cs297
-rw-r--r--OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs22
-rw-r--r--OpenSim/Framework/General/Interfaces/IAssetProvider.cs18
-rw-r--r--OpenSim/Framework/General/Interfaces/IAssetServer.cs4
-rw-r--r--OpenSim/Framework/General/Types/AssetBase.cs3
7 files changed, 346 insertions, 14 deletions
diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs
index d947228..2dceb54 100644
--- a/OpenSim/Framework/Communications/Cache/AssetCache.cs
+++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs
@@ -144,14 +144,14 @@ namespace OpenSim.Framework.Communications.Caches
144 AssetBase asset = GetAsset(assetID); 144 AssetBase asset = GetAsset(assetID);
145 if (asset == null) 145 if (asset == null)
146 { 146 {
147 this._assetServer.RequestAsset(assetID, isTexture); 147 this._assetServer.FetchAsset(assetID, isTexture);
148 } 148 }
149 return asset; 149 return asset;
150 } 150 }
151 151
152 public void AddAsset(AssetBase asset) 152 public void AddAsset(AssetBase asset)
153 { 153 {
154 System.Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated()); 154 // System.Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated());
155 if (asset.Type == 0) 155 if (asset.Type == 0)
156 { 156 {
157 //Console.WriteLine("which is a texture"); 157 //Console.WriteLine("which is a texture");
@@ -159,7 +159,7 @@ namespace OpenSim.Framework.Communications.Caches
159 { //texture 159 { //texture
160 TextureImage textur = new TextureImage(asset); 160 TextureImage textur = new TextureImage(asset);
161 this.Textures.Add(textur.FullID, textur); 161 this.Textures.Add(textur.FullID, textur);
162 this._assetServer.UploadNewAsset(asset); 162 this._assetServer.CreateAsset(asset);
163 } 163 }
164 else 164 else
165 { 165 {
@@ -173,7 +173,7 @@ namespace OpenSim.Framework.Communications.Caches
173 { 173 {
174 AssetInfo assetInf = new AssetInfo(asset); 174 AssetInfo assetInf = new AssetInfo(asset);
175 this.Assets.Add(assetInf.FullID, assetInf); 175 this.Assets.Add(assetInf.FullID, assetInf);
176 this._assetServer.UploadNewAsset(asset); 176 this._assetServer.CreateAsset(asset);
177 } 177 }
178 } 178 }
179 } 179 }
@@ -384,7 +384,7 @@ namespace OpenSim.Framework.Communications.Caches
384 request.AssetRequestSource = source; 384 request.AssetRequestSource = source;
385 request.Params = transferRequest.TransferInfo.Params; 385 request.Params = transferRequest.TransferInfo.Params;
386 this.RequestedAssets.Add(requestID, request); 386 this.RequestedAssets.Add(requestID, request);
387 this._assetServer.RequestAsset(requestID, false); 387 this._assetServer.FetchAsset(requestID, false);
388 } 388 }
389 return; 389 return;
390 } 390 }
@@ -561,7 +561,7 @@ namespace OpenSim.Framework.Communications.Caches
561 request.IsTextureRequest = true; 561 request.IsTextureRequest = true;
562 request.DiscardLevel = discard; 562 request.DiscardLevel = discard;
563 this.RequestedTextures.Add(imageID, request); 563 this.RequestedTextures.Add(imageID, request);
564 this._assetServer.RequestAsset(imageID, true); 564 this._assetServer.FetchAsset(imageID, true);
565 } 565 }
566 return; 566 return;
567 } 567 }
diff --git a/OpenSim/Framework/Communications/Cache/AssetServer.cs b/OpenSim/Framework/Communications/Cache/AssetServer.cs
index fd203f7..4e2644c 100644
--- a/OpenSim/Framework/Communications/Cache/AssetServer.cs
+++ b/OpenSim/Framework/Communications/Cache/AssetServer.cs
@@ -73,7 +73,7 @@ namespace OpenSim.Framework.Communications.Caches
73 this._receiver = receiver; 73 this._receiver = receiver;
74 } 74 }
75 75
76 public void RequestAsset(LLUUID assetID, bool isTexture) 76 public void FetchAsset(LLUUID assetID, bool isTexture)
77 { 77 {
78 ARequest req = new ARequest(); 78 ARequest req = new ARequest();
79 req.AssetID = assetID; 79 req.AssetID = assetID;
@@ -86,7 +86,7 @@ namespace OpenSim.Framework.Communications.Caches
86 86
87 } 87 }
88 88
89 public void UploadNewAsset(AssetBase asset) 89 public void CreateAsset(AssetBase asset)
90 { 90 {
91 AssetStorage store = new AssetStorage(); 91 AssetStorage store = new AssetStorage();
92 store.Data = asset.Data; 92 store.Data = asset.Data;
diff --git a/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs b/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs
new file mode 100644
index 0000000..50653d8
--- /dev/null
+++ b/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs
@@ -0,0 +1,297 @@
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 System.IO;
30using System.Threading;
31using System.Reflection;
32using libsecondlife;
33using Nini.Config;
34using OpenSim.Framework.Console;
35using OpenSim.Framework.Interfaces;
36using OpenSim.Framework.Types;
37using OpenSim.Framework.Utilities;
38
39namespace OpenSim.Framework.Communications.Caches
40{
41
42 public class SQLAssetServer : IAssetServer
43 {
44 private IAssetReceiver _receiver;
45 private BlockingQueue<ARequest> _assetRequests;
46 private Thread _localAssetServerThread;
47 protected IAssetProvider m_plugin;
48
49
50 public SQLAssetServer()
51 {
52 _assetRequests = new BlockingQueue<ARequest>();
53 AddPlugin("OpenSim.Framework.Data.SQLite.dll");
54 this.SetUpAssetDatabase();
55
56 this._localAssetServerThread = new Thread(new ThreadStart(RunRequests));
57 this._localAssetServerThread.IsBackground = true;
58 this._localAssetServerThread.Start();
59
60 }
61
62 public void AddPlugin(string FileName)
63 {
64 //MainLog.Instance.Verbose("SQLAssetServer", "AssetStorage: Attempting to load " + FileName);
65 Assembly pluginAssembly = Assembly.LoadFrom(FileName);
66
67 foreach (Type pluginType in pluginAssembly.GetTypes())
68 {
69 if (!pluginType.IsAbstract)
70 {
71 Type typeInterface = pluginType.GetInterface("IAssetProvider", true);
72
73 if (typeInterface != null)
74 {
75 IAssetProvider plug = (IAssetProvider)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
76 m_plugin = plug;
77 m_plugin.Initialise("AssetStorage.db", "");
78
79 //MainLog.Instance.Verbose("AssetStorage: Added IAssetProvider Interface");
80 }
81
82 typeInterface = null;
83 }
84 }
85
86 pluginAssembly = null;
87 }
88
89 public void SetReceiver(IAssetReceiver receiver)
90 {
91 this._receiver = receiver;
92 }
93
94 public void FetchAsset(LLUUID assetID, bool isTexture)
95 {
96 ARequest req = new ARequest();
97 req.AssetID = assetID;
98 req.IsTexture = isTexture;
99 this._assetRequests.Enqueue(req);
100 }
101
102 public void UpdateAsset(AssetBase asset)
103 {
104 m_plugin.UpdateAsset(asset);
105 m_plugin.CommitAssets();
106 }
107
108 public void CreateAsset(AssetBase asset)
109 {
110 m_plugin.CreateAsset(asset);
111 m_plugin.CommitAssets();
112 }
113
114 public void SetServerInfo(string ServerUrl, string ServerKey)
115 {
116
117 }
118 public void Close()
119 {
120 m_plugin.CommitAssets();
121 }
122
123 private void RunRequests()
124 {
125
126 while (true)
127 {
128 ARequest req = this._assetRequests.Dequeue();
129
130 m_plugin.FetchAsset(req.AssetID);
131
132 AssetBase asset = m_plugin.FetchAsset(req.AssetID);
133 if (asset != null)
134 {
135 _receiver.AssetReceived(asset, req.IsTexture);
136 }
137 else
138 {
139 _receiver.AssetNotFound(req.AssetID);
140 }
141
142 }
143
144 }
145
146 private void SetUpAssetDatabase()
147 {
148 MainLog.Instance.Verbose("Setting up asset database");
149
150 AssetBase Image = new AssetBase();
151 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000001");
152 Image.Name = "Bricks";
153 this.LoadAsset(Image, true, "bricks.jp2");
154 m_plugin.CreateAsset(Image);
155
156 Image = new AssetBase();
157 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000002");
158 Image.Name = "Plywood";
159 this.LoadAsset(Image, true, "plywood.jp2");
160 m_plugin.CreateAsset(Image);
161
162 Image = new AssetBase();
163 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000003");
164 Image.Name = "Rocks";
165 this.LoadAsset(Image, true, "rocks.jp2");
166 m_plugin.CreateAsset(Image);
167
168 Image = new AssetBase();
169 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000004");
170 Image.Name = "Granite";
171 this.LoadAsset(Image, true, "granite.jp2");
172 m_plugin.CreateAsset(Image);
173
174 Image = new AssetBase();
175 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000005");
176 Image.Name = "Hardwood";
177 this.LoadAsset(Image, true, "hardwood.jp2");
178 m_plugin.CreateAsset(Image);
179
180 Image = new AssetBase();
181 Image.FullID = new LLUUID("00000000-0000-0000-5005-000000000005");
182 Image.Name = "Prim Base Texture";
183 this.LoadAsset(Image, true, "plywood.jp2");
184 m_plugin.CreateAsset(Image);
185
186 Image = new AssetBase();
187 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000006");
188 Image.Name = "Map Base Texture";
189 this.LoadAsset(Image, true, "map_base.jp2");
190 m_plugin.CreateAsset(Image);
191
192 Image = new AssetBase();
193 Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000007");
194 Image.Name = "Map Texture";
195 this.LoadAsset(Image, true, "map1.jp2");
196 m_plugin.CreateAsset(Image);
197
198 Image = new AssetBase();
199 Image.FullID = new LLUUID("00000000-0000-1111-9999-000000000010");
200 Image.Name = "Female Body Texture";
201 this.LoadAsset(Image, true, "femalebody.jp2");
202 m_plugin.CreateAsset(Image);
203
204 Image = new AssetBase();
205 Image.FullID = new LLUUID("00000000-0000-1111-9999-000000000011");
206 Image.Name = "Female Bottom Texture";
207 this.LoadAsset(Image, true, "femalebottom.jp2");
208 m_plugin.CreateAsset(Image);
209
210 Image = new AssetBase();
211 Image.FullID = new LLUUID("00000000-0000-1111-9999-000000000012");
212 Image.Name = "Female Face Texture";
213 this.LoadAsset(Image, true, "femaleface.jp2");
214 m_plugin.CreateAsset(Image);
215
216 Image = new AssetBase();
217 Image.FullID = new LLUUID("77c41e39-38f9-f75a-024e-585989bbabbb");
218 Image.Name = "Skin";
219 Image.Type = 13;
220 Image.InvType = 13;
221 this.LoadAsset(Image, false, "base_skin.dat");
222 m_plugin.CreateAsset(Image);
223
224 Image = new AssetBase();
225 Image.FullID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73");
226 Image.Name = "Shape";
227 Image.Type = 13;
228 Image.InvType = 13;
229 this.LoadAsset(Image, false, "base_shape.dat");
230 m_plugin.CreateAsset(Image);
231
232 Image = new AssetBase();
233 Image.FullID = new LLUUID("00000000-38f9-1111-024e-222222111110");
234 Image.Name = "Shirt";
235 Image.Type = 5;
236 Image.InvType = 18;
237 this.LoadAsset(Image, false, "newshirt.dat");
238 m_plugin.CreateAsset(Image);
239
240 Image = new AssetBase();
241 Image.FullID = new LLUUID("00000000-38f9-1111-024e-222222111120");
242 Image.Name = "Shirt";
243 Image.Type = 5;
244 Image.InvType = 18;
245 this.LoadAsset(Image, false, "newpants.dat");
246 m_plugin.CreateAsset(Image);
247
248 string filePath = Path.Combine(Util.configDir(), "OpenSimAssetSet.xml");
249 if (File.Exists(filePath))
250 {
251 XmlConfigSource source = new XmlConfigSource(filePath);
252 ReadAssetDetails(source);
253 }
254
255 m_plugin.CommitAssets();
256 }
257
258 protected void ReadAssetDetails(IConfigSource source)
259 {
260 AssetBase newAsset = null;
261 for (int i = 0; i < source.Configs.Count; i++)
262 {
263 newAsset = new AssetBase();
264 newAsset.FullID = new LLUUID(source.Configs[i].GetString("assetID", LLUUID.Random().ToStringHyphenated()));
265 newAsset.Name = source.Configs[i].GetString("name", "");
266 newAsset.Type = (sbyte)source.Configs[i].GetInt("assetType", 0);
267 newAsset.InvType = (sbyte)source.Configs[i].GetInt("inventoryType", 0);
268 string fileName = source.Configs[i].GetString("fileName", "");
269 if (fileName != "")
270 {
271 this.LoadAsset(newAsset, false, fileName);
272 m_plugin.CreateAsset(newAsset);
273 }
274 }
275 }
276
277 private void LoadAsset(AssetBase info, bool image, string filename)
278 {
279 //should request Asset from storage manager
280 //but for now read from file
281
282 string dataPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "assets"); //+ folder;
283 string fileName = Path.Combine(dataPath, filename);
284 FileInfo fInfo = new FileInfo(fileName);
285 long numBytes = fInfo.Length;
286 FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
287 byte[] idata = new byte[numBytes];
288 BinaryReader br = new BinaryReader(fStream);
289 idata = br.ReadBytes((int)numBytes);
290 br.Close();
291 fStream.Close();
292 info.Data = idata;
293 //info.loaded=true;
294 }
295 }
296
297}
diff --git a/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs b/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs
index 9138673..b53076c 100644
--- a/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs
+++ b/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs
@@ -34,13 +34,14 @@ using System.Data.SqlTypes;
34using Mono.Data.SqliteClient; 34using Mono.Data.SqliteClient;
35using OpenSim.Framework.Console; 35using OpenSim.Framework.Console;
36using OpenSim.Framework.Types; 36using OpenSim.Framework.Types;
37using OpenSim.Framework.Interfaces;
37 38
38namespace OpenSim.Framework.Data.SQLite 39namespace OpenSim.Framework.Data.SQLite
39{ 40{
40 /// <summary> 41 /// <summary>
41 /// A User storage interface for the DB4o database system 42 /// A User storage interface for the DB4o database system
42 /// </summary> 43 /// </summary>
43 public class SQLiteAssetData : SQLiteBase 44 public class SQLiteAssetData : SQLiteBase, IAssetProvider
44 { 45 {
45 /// <summary> 46 /// <summary>
46 /// The database manager 47 /// The database manager
@@ -64,7 +65,15 @@ namespace OpenSim.Framework.Data.SQLite
64 ds.Tables.Add(createAssetsTable()); 65 ds.Tables.Add(createAssetsTable());
65 66
66 setupAssetCommands(da, conn); 67 setupAssetCommands(da, conn);
67 da.Fill(ds.Tables["assets"]); 68 try
69 {
70 da.Fill(ds.Tables["assets"]);
71 }
72 catch (Exception)
73 {
74 MainLog.Instance.Verbose("AssetStorage", "Caught fill error on asset table");
75 }
76
68 77
69 return; 78 return;
70 } 79 }
@@ -172,7 +181,14 @@ namespace OpenSim.Framework.Data.SQLite
172 { 181 {
173 row["UUID"] = asset.FullID; 182 row["UUID"] = asset.FullID;
174 row["Name"] = asset.Name; 183 row["Name"] = asset.Name;
175 row["Description"] = asset.Description; 184 if (asset.Description != null)
185 {
186 row["Description"] = asset.Description;
187 }
188 else
189 {
190 row["Description"] = " ";
191 }
176 row["Type"] = asset.Type; 192 row["Type"] = asset.Type;
177 row["InvType"] = asset.InvType; 193 row["InvType"] = asset.InvType;
178 row["Local"] = asset.Local; 194 row["Local"] = asset.Local;
diff --git a/OpenSim/Framework/General/Interfaces/IAssetProvider.cs b/OpenSim/Framework/General/Interfaces/IAssetProvider.cs
new file mode 100644
index 0000000..a2ef826
--- /dev/null
+++ b/OpenSim/Framework/General/Interfaces/IAssetProvider.cs
@@ -0,0 +1,18 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using OpenSim.Framework.Types;
5using libsecondlife;
6
7namespace OpenSim.Framework.Interfaces
8{
9 public interface IAssetProvider
10 {
11 void Initialise(string dbfile, string dbname);
12 AssetBase FetchAsset(LLUUID uuid);
13 void CreateAsset(AssetBase asset);
14 void UpdateAsset(AssetBase asset);
15 bool ExistsAsset(LLUUID uuid);
16 void CommitAssets(); // force a sync to the database
17 }
18} \ No newline at end of file
diff --git a/OpenSim/Framework/General/Interfaces/IAssetServer.cs b/OpenSim/Framework/General/Interfaces/IAssetServer.cs
index cdce979..da3f61a 100644
--- a/OpenSim/Framework/General/Interfaces/IAssetServer.cs
+++ b/OpenSim/Framework/General/Interfaces/IAssetServer.cs
@@ -37,9 +37,9 @@ namespace OpenSim.Framework.Interfaces
37 public interface IAssetServer 37 public interface IAssetServer
38 { 38 {
39 void SetReceiver(IAssetReceiver receiver); 39 void SetReceiver(IAssetReceiver receiver);
40 void RequestAsset(LLUUID assetID, bool isTexture); 40 void FetchAsset(LLUUID assetID, bool isTexture);
41 void UpdateAsset(AssetBase asset); 41 void UpdateAsset(AssetBase asset);
42 void UploadNewAsset(AssetBase asset); 42 void CreateAsset(AssetBase asset);
43 void SetServerInfo(string ServerUrl, string ServerKey); 43 void SetServerInfo(string ServerUrl, string ServerKey);
44 void Close(); 44 void Close();
45 } 45 }
diff --git a/OpenSim/Framework/General/Types/AssetBase.cs b/OpenSim/Framework/General/Types/AssetBase.cs
index 71642a2..7d5ee7b 100644
--- a/OpenSim/Framework/General/Types/AssetBase.cs
+++ b/OpenSim/Framework/General/Types/AssetBase.cs
@@ -42,7 +42,8 @@ namespace OpenSim.Framework.Types
42 42
43 public AssetBase() 43 public AssetBase()
44 { 44 {
45 45 Name = " ";
46 Description = " ";
46 } 47 }
47 } 48 }
48} 49}