From 6ec523d5e6a3edfa665b9c2a7f1120b3aa3b1970 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Wed, 8 Aug 2007 19:48:11 +0000 Subject: [PATCH] moving to new namespace as this is mono only --- .../MonoSqliteDateStore.cs} | 0 .../SqliteDataStore.cs | 213 ++++++++++++++++++ 2 files changed, 213 insertions(+) rename OpenSim/Region/Storage/{OpenSim.DataStore.Sqlite/SqliteDataStore.cs => OpenSim.DataStore.MonoSqlite/MonoSqliteDateStore.cs} (100%) create mode 100644 OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/SqliteDataStore.cs diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.Sqlite/SqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDateStore.cs similarity index 100% rename from OpenSim/Region/Storage/OpenSim.DataStore.Sqlite/SqliteDataStore.cs rename to OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDateStore.cs diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/SqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/SqliteDataStore.cs new file mode 100644 index 0000000000..5c1762081a --- /dev/null +++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/SqliteDataStore.cs @@ -0,0 +1,213 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.LandManagement; +using OpenSim.Region.Environment; +using OpenSim.Region.Interfaces; +using OpenSim.Framework.Console; +using libsecondlife; + +using System.Data; +// Yes, this won't compile on MS, need to deal with that later +using Mono.Data.SqliteClient; +using Primitive = OpenSim.Region.Environment.Scenes.Primitive; + +namespace OpenSim.DataStore.SqliteStorage +{ + + public class SqliteDataStore : IRegionDataStore + { + private const string primSelect = "select * from prims"; + private const string shapeSelect = "select * from primshapes"; + + private DataSet ds; + private SqliteDataAdapter primDa; + private SqliteDataAdapter shapeDa; + + public void Initialise(string dbfile, string dbname) + { + // for us, dbfile will be the connect string + MainLog.Instance.Verbose("DATASTORE", "Sqlite - connecting: " + dbfile); + SqliteConnection conn = new SqliteConnection(dbfile); + + SqliteCommand primSelectCmd = new SqliteCommand(primSelect, conn); + primDa = new SqliteDataAdapter(primSelectCmd); + // SqliteCommandBuilder primCb = new SqliteCommandBuilder(primDa); + + SqliteCommand shapeSelectCmd = new SqliteCommand(shapeSelect, conn); + shapeDa = new SqliteDataAdapter(shapeSelectCmd); + // SqliteCommandBuilder shapeCb = new SqliteCommandBuilder(shapeDa); + + ds = new DataSet(); + + // We fill the data set, now we've got copies in memory for the information + // TODO: see if the linkage actually holds. + // primDa.FillSchema(ds, SchemaType.Source, "PrimSchema"); + primDa.Fill(ds, "prims"); + ds.AcceptChanges(); + + DataTable prims = ds.Tables["prims"]; + prims.PrimaryKey = new DataColumn[] { prims.Columns["UUID"] }; + setupPrimCommands(primDa, conn); + + // shapeDa.FillSchema(ds, SchemaType.Source, "ShapeSchema"); + shapeDa.Fill(ds, "primshapes"); + + return; + } + + private SqliteParameter createSqliteParameter(string name, DbType type) + { + SqliteParameter param = new SqliteParameter(); + param.ParameterName = ":" + name; + param.DbType = type; + param.SourceColumn = name; + param.SourceVersion = DataRowVersion.Current; + return param; + } + + private void setupPrimCommands(SqliteDataAdapter da, SqliteConnection conn) + { + SqliteParameter UUID = createSqliteParameter("UUID", DbType.String); + SqliteParameter Name = createSqliteParameter("Name", DbType.String); + SqliteParameter CreationDate = createSqliteParameter("CreationDate", DbType.Int32); + SqliteParameter PositionX = createSqliteParameter("PositionX", DbType.Double); + SqliteParameter PositionY = createSqliteParameter("PositionY", DbType.Double); + SqliteParameter PositionZ = createSqliteParameter("PositionZ", DbType.Double); + + + SqliteCommand delete = new SqliteCommand("delete from prims where UUID = :UUID"); + delete.Connection = conn; + + SqliteCommand insert = + new SqliteCommand("insert into prims(" + + "UUID, CreationDate, Name, PositionX, PositionY, PositionZ" + + ") values(:UUID, :CreationDate, :Name, :PositionX, :PositionY, :PositionZ)"); + insert.Connection = conn; + + SqliteCommand update = + new SqliteCommand("update prims set " + + "UUID = :UUID, CreationDate = :CreationDate, Name = :Name, PositionX = :PositionX, " + + "PositionY = :PositionY, PositionZ = :PositionZ where UUID = :UUID"); + update.Connection = conn; + + delete.Parameters.Add(UUID); + + insert.Parameters.Add(UUID); + insert.Parameters.Add(Name); + insert.Parameters.Add(CreationDate); + insert.Parameters.Add(PositionX); + insert.Parameters.Add(PositionY); + insert.Parameters.Add(PositionZ); + + update.Parameters.Add(UUID); + update.Parameters.Add(Name); + update.Parameters.Add(CreationDate); + update.Parameters.Add(PositionX); + update.Parameters.Add(PositionY); + update.Parameters.Add(PositionZ); + + da.DeleteCommand = delete; + da.InsertCommand = insert; + da.UpdateCommand = update; + } + + private void StoreSceneObject(SceneObject obj) + { + + } + + public void StoreObject(AllNewSceneObjectPart2 obj) + { + // TODO: Serializing code + DataTable prims = ds.Tables["prims"]; + DataTable shapes = ds.Tables["shapes"]; + + + + } + + private void fillPrimRow(DataRow row, Primitive prim) + { + row["UUID"] = prim.UUID; + row["CreationDate"] = prim.CreationDate; + row["Name"] = prim.Name; + row["PositionX"] = prim.Pos.X; + row["PositionY"] = prim.Pos.Y; + row["PositionZ"] = prim.Pos.Z; + } + + private void addPrim(Primitive prim) + { + DataTable prims = ds.Tables["prims"]; + DataTable shapes = ds.Tables["shapes"]; + + DataRow row = prims.Rows.Find(prim.UUID); + if (row == null) { + row = prims.NewRow(); + fillPrimRow(row, prim); + prims.Rows.Add(row); + } else { + fillPrimRow(row, prim); + } + } + + public void StoreObject(SceneObject obj) + { + foreach (Primitive prim in obj.Children.Values) + { + addPrim(prim); + } + + MainLog.Instance.Verbose("Attempting to do update...."); + primDa.Update(ds, "prims"); + MainLog.Instance.Verbose("Dump of prims:", ds.GetXml()); + } + + public void RemoveObject(LLUUID obj) + { + // TODO: remove code + } + + public List LoadObjects() + { + List retvals = new List(); + + MainLog.Instance.Verbose("DATASTORE", "Sqlite - LoadObjects found " + " objects"); + + return retvals; + } + + public void StoreTerrain(double[,] ter) + { + + } + + public double[,] LoadTerrain() + { + return null; + } + + public void RemoveLandObject(uint id) + { + + } + + public void StoreParcel(Land parcel) + { + + } + + public List LoadLandObjects() + { + return new List(); + } + + public void Shutdown() + { + // TODO: DataSet commit + } + } +}