From 8c901e93474af5fcd17a7f37acd711622c5286e0 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Fri, 28 Mar 2008 14:54:20 +0000 Subject: * Introduced common abstract AssetDataBase implementing IAssetProvider * changed the semantics of SQLiteBase to SQLiteUtils * Added abstract placeholder files for the other db providers --- OpenSim/Framework/Data.MSSQL/MSSQLAssetData.cs | 18 +- OpenSim/Framework/Data.MySQL/MySQLAssetData.cs | 18 +- OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs | 36 +-- OpenSim/Framework/Data.SQLite/SQLiteBase.cs | 269 --------------------- .../Framework/Data.SQLite/SQLiteInventoryStore.cs | 2 +- OpenSim/Framework/Data.SQLite/SQLiteManager.cs | 2 +- OpenSim/Framework/Data.SQLite/SQLiteUserData.cs | 2 +- OpenSim/Framework/Data.SQLite/SQLiteUtils.cs | 269 +++++++++++++++++++++ OpenSim/Framework/Data/AssetDataBase.cs | 20 ++ OpenSim/Framework/Data/DataStoreBase.cs | 10 + OpenSim/Framework/Data/GridDataBase.cs | 10 + OpenSim/Framework/Data/InventoryDataBase.cs | 10 + OpenSim/Framework/Data/UserDataBase.cs | 10 + 13 files changed, 368 insertions(+), 308 deletions(-) delete mode 100644 OpenSim/Framework/Data.SQLite/SQLiteBase.cs create mode 100644 OpenSim/Framework/Data.SQLite/SQLiteUtils.cs create mode 100644 OpenSim/Framework/Data/AssetDataBase.cs create mode 100644 OpenSim/Framework/Data/DataStoreBase.cs create mode 100644 OpenSim/Framework/Data/GridDataBase.cs create mode 100644 OpenSim/Framework/Data/InventoryDataBase.cs create mode 100644 OpenSim/Framework/Data/UserDataBase.cs (limited to 'OpenSim') diff --git a/OpenSim/Framework/Data.MSSQL/MSSQLAssetData.cs b/OpenSim/Framework/Data.MSSQL/MSSQLAssetData.cs index b8d57a7..059bb5e 100644 --- a/OpenSim/Framework/Data.MSSQL/MSSQLAssetData.cs +++ b/OpenSim/Framework/Data.MSSQL/MSSQLAssetData.cs @@ -34,7 +34,7 @@ using OpenSim.Framework.Console; namespace OpenSim.Framework.Data.MSSQL { - internal class MSSQLAssetData : IAssetProvider + internal class MSSQLAssetData : AssetDataBase { private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -66,7 +66,7 @@ namespace OpenSim.Framework.Data.MSSQL UpgradeAssetsTable(tableList["assets"]); } - public AssetBase FetchAsset(LLUUID assetID) + override public AssetBase FetchAsset(LLUUID assetID) { AssetBase asset = null; @@ -83,7 +83,7 @@ namespace OpenSim.Framework.Data.MSSQL return asset; } - public void CreateAsset(AssetBase asset) + override public void CreateAsset(AssetBase asset) { if (ExistsAsset((LLUUID) asset.FullID)) { @@ -129,7 +129,7 @@ namespace OpenSim.Framework.Data.MSSQL } - public void UpdateAsset(AssetBase asset) + override public void UpdateAsset(AssetBase asset) { SqlCommand command = new SqlCommand("UPDATE assets set id = @id, " + "name = @name, " + @@ -169,7 +169,7 @@ namespace OpenSim.Framework.Data.MSSQL } } - public bool ExistsAsset(LLUUID uuid) + override public bool ExistsAsset(LLUUID uuid) { if (FetchAsset(uuid) != null) { @@ -181,7 +181,7 @@ namespace OpenSim.Framework.Data.MSSQL /// /// All writes are immediately commited to the database, so this is a no-op /// - public void CommitAssets() + override public void CommitAssets() { } @@ -189,7 +189,7 @@ namespace OpenSim.Framework.Data.MSSQL #region IPlugin Members - public void Initialise() + override public void Initialise() { IniFile GridDataMySqlFile = new IniFile("mssql_connection.ini"); string settingDataSource = GridDataMySqlFile.ParseFileReadValue("data_source"); @@ -205,13 +205,13 @@ namespace OpenSim.Framework.Data.MSSQL TestTables(); } - public string Version + override public string Version { // get { return database.getVersion(); } get { return database.getVersion(); } } - public string Name + override public string Name { get { return "MSSQL Asset storage engine"; } } diff --git a/OpenSim/Framework/Data.MySQL/MySQLAssetData.cs b/OpenSim/Framework/Data.MySQL/MySQLAssetData.cs index b439582..79994ae 100644 --- a/OpenSim/Framework/Data.MySQL/MySQLAssetData.cs +++ b/OpenSim/Framework/Data.MySQL/MySQLAssetData.cs @@ -34,7 +34,7 @@ using OpenSim.Framework.Console; namespace OpenSim.Framework.Data.MySQL { - internal class MySQLAssetData : IAssetProvider + internal class MySQLAssetData : AssetDataBase, IPlugin { private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -66,7 +66,7 @@ namespace OpenSim.Framework.Data.MySQL UpgradeAssetsTable(tableList["assets"]); } - public AssetBase FetchAsset(LLUUID assetID) + override public AssetBase FetchAsset(LLUUID assetID) { AssetBase asset = null; lock (_dbConnection) @@ -108,7 +108,7 @@ namespace OpenSim.Framework.Data.MySQL return asset; } - public void CreateAsset(AssetBase asset) + override public void CreateAsset(AssetBase asset) { lock (_dbConnection) { @@ -147,12 +147,12 @@ namespace OpenSim.Framework.Data.MySQL } } - public void UpdateAsset(AssetBase asset) + override public void UpdateAsset(AssetBase asset) { CreateAsset(asset); } - public bool ExistsAsset(LLUUID uuid) + override public bool ExistsAsset(LLUUID uuid) { throw new Exception("The method or operation is not implemented."); } @@ -160,7 +160,7 @@ namespace OpenSim.Framework.Data.MySQL /// /// All writes are immediately commited to the database, so this is a no-op /// - public void CommitAssets() + override public void CommitAssets() { } @@ -168,7 +168,7 @@ namespace OpenSim.Framework.Data.MySQL #region IPlugin Members - public void Initialise() + override public void Initialise() { IniFile GridDataMySqlFile = new IniFile("mysql_connection.ini"); string hostname = GridDataMySqlFile.ParseFileReadValue("hostname"); @@ -183,12 +183,12 @@ namespace OpenSim.Framework.Data.MySQL TestTables(); } - public string Version + override public string Version { get { return _dbConnection.getVersion(); } } - public string Name + override public string Name { get { return "MySQL Asset storage engine"; } } diff --git a/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs b/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs index 0703e54..afa73b1 100644 --- a/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs +++ b/OpenSim/Framework/Data.SQLite/SQLiteAssetData.cs @@ -37,7 +37,7 @@ namespace OpenSim.Framework.Data.SQLite /// /// A User storage interface for the DB4o database system /// - public class SQLiteAssetData : SQLiteBase, IAssetProvider + public class SQLiteAssetData : AssetDataBase { private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -63,7 +63,7 @@ namespace OpenSim.Framework.Data.SQLite return; } - public AssetBase FetchAsset(LLUUID uuid) + override public AssetBase FetchAsset(LLUUID uuid) { using (SqliteCommand cmd = new SqliteCommand(SelectAssetSQL, m_conn)) @@ -86,7 +86,7 @@ namespace OpenSim.Framework.Data.SQLite } } - public void CreateAsset(AssetBase asset) + override public void CreateAsset(AssetBase asset) { m_log.Info("[SQLITE]: Creating Asset " + Util.ToRawUuidString(asset.FullID)); if (ExistsAsset(asset.FullID)) @@ -111,7 +111,7 @@ namespace OpenSim.Framework.Data.SQLite } } - public void UpdateAsset(AssetBase asset) + override public void UpdateAsset(AssetBase asset) { LogAssetLoad(asset); @@ -144,7 +144,7 @@ namespace OpenSim.Framework.Data.SQLite asset.InvType, temporary, local, assetLength)); } - public bool ExistsAsset(LLUUID uuid) + override public bool ExistsAsset(LLUUID uuid) { using (SqliteCommand cmd = new SqliteCommand(SelectAssetSQL, m_conn)) { @@ -175,7 +175,7 @@ namespace OpenSim.Framework.Data.SQLite } } - public void CommitAssets() // force a sync to the database + override public void CommitAssets() // force a sync to the database { m_log.Info("[SQLITE]: Attempting commit"); // lock (ds) @@ -197,14 +197,14 @@ namespace OpenSim.Framework.Data.SQLite { DataTable assets = new DataTable("assets"); - createCol(assets, "UUID", typeof (String)); - createCol(assets, "Name", typeof (String)); - createCol(assets, "Description", typeof (String)); - createCol(assets, "Type", typeof (Int32)); - createCol(assets, "InvType", typeof (Int32)); - createCol(assets, "Local", typeof (Boolean)); - createCol(assets, "Temporary", typeof (Boolean)); - createCol(assets, "Data", typeof (Byte[])); + SQLiteUtil.createCol(assets, "UUID", typeof (String)); + SQLiteUtil.createCol(assets, "Name", typeof (String)); + SQLiteUtil.createCol(assets, "Description", typeof (String)); + SQLiteUtil.createCol(assets, "Type", typeof (Int32)); + SQLiteUtil.createCol(assets, "InvType", typeof (Int32)); + SQLiteUtil.createCol(assets, "Local", typeof (Boolean)); + SQLiteUtil.createCol(assets, "Temporary", typeof (Boolean)); + SQLiteUtil.createCol(assets, "Data", typeof (Byte[])); // Add in contraints assets.PrimaryKey = new DataColumn[] {assets.Columns["UUID"]}; return assets; @@ -248,7 +248,7 @@ namespace OpenSim.Framework.Data.SQLite private void InitDB(SqliteConnection conn) { - string createAssets = defineTable(createAssetsTable()); + string createAssets = SQLiteUtil.defineTable(createAssetsTable()); SqliteCommand pcmd = new SqliteCommand(createAssets, conn); pcmd.ExecuteNonQuery(); } @@ -272,7 +272,7 @@ namespace OpenSim.Framework.Data.SQLite #region IPlugin interface - public string Version + override public string Version { get { @@ -286,12 +286,12 @@ namespace OpenSim.Framework.Data.SQLite } } - public void Initialise() + override public void Initialise() { Initialise("AssetStorage.db", ""); } - public string Name + override public string Name { get { return "SQLite Asset storage engine"; } } diff --git a/OpenSim/Framework/Data.SQLite/SQLiteBase.cs b/OpenSim/Framework/Data.SQLite/SQLiteBase.cs deleted file mode 100644 index 8997faa..0000000 --- a/OpenSim/Framework/Data.SQLite/SQLiteBase.cs +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSim Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Data; -using Mono.Data.SqliteClient; - -namespace OpenSim.Framework.Data.SQLite -{ - /// - /// A base class for methods needed by all SQLite database classes - /// - public class SQLiteBase - { - /*********************************************************************** - * - * Database Definition Functions - * - * This should be db agnostic as we define them in ADO.NET terms - * - **********************************************************************/ - - protected static void createCol(DataTable dt, string name, Type type) - { - DataColumn col = new DataColumn(name, type); - dt.Columns.Add(col); - } - - /*********************************************************************** - * - * SQL Statement Creation Functions - * - * These functions create SQL statements for update, insert, and create. - * They can probably be factored later to have a db independant - * portion and a db specific portion - * - **********************************************************************/ - - protected static SqliteCommand createInsertCommand(string table, DataTable dt) - { - /** - * This is subtle enough to deserve some commentary. - * Instead of doing *lots* and *lots of hardcoded strings - * for database definitions we'll use the fact that - * realistically all insert statements look like "insert - * into A(b, c) values(:b, :c) on the parameterized query - * front. If we just have a list of b, c, etc... we can - * generate these strings instead of typing them out. - */ - string[] cols = new string[dt.Columns.Count]; - for (int i = 0; i < dt.Columns.Count; i++) - { - DataColumn col = dt.Columns[i]; - cols[i] = col.ColumnName; - } - - string sql = "insert into " + table + "("; - sql += String.Join(", ", cols); - // important, the first ':' needs to be here, the rest get added in the join - sql += ") values (:"; - sql += String.Join(", :", cols); - sql += ")"; - SqliteCommand cmd = new SqliteCommand(sql); - - // this provides the binding for all our parameters, so - // much less code than it used to be - foreach (DataColumn col in dt.Columns) - { - cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType)); - } - return cmd; - } - - protected static SqliteCommand createUpdateCommand(string table, string pk, DataTable dt) - { - string sql = "update " + table + " set "; - string subsql = String.Empty; - foreach (DataColumn col in dt.Columns) - { - if (subsql.Length > 0) - { - // a map function would rock so much here - subsql += ", "; - } - subsql += col.ColumnName + "= :" + col.ColumnName; - } - sql += subsql; - sql += " where " + pk; - SqliteCommand cmd = new SqliteCommand(sql); - - // this provides the binding for all our parameters, so - // much less code than it used to be - - foreach (DataColumn col in dt.Columns) - { - cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType)); - } - return cmd; - } - - - protected static string defineTable(DataTable dt) - { - string sql = "create table " + dt.TableName + "("; - string subsql = String.Empty; - foreach (DataColumn col in dt.Columns) - { - if (subsql.Length > 0) - { - // a map function would rock so much here - subsql += ",\n"; - } - subsql += col.ColumnName + " " + sqliteType(col.DataType); - if (dt.PrimaryKey.Length > 0) - { - if (col == dt.PrimaryKey[0]) - { - subsql += " primary key"; - } - } - } - sql += subsql; - sql += ")"; - return sql; - } - - /*********************************************************************** - * - * Database Binding functions - * - * These will be db specific due to typing, and minor differences - * in databases. - * - **********************************************************************/ - - /// - /// This is a convenience function that collapses 5 repetitive - /// lines for defining SqliteParameters to 2 parameters: - /// column name and database type. - /// - /// It assumes certain conventions like :param as the param - /// name to replace in parametrized queries, and that source - /// version is always current version, both of which are fine - /// for us. - /// - ///a built sqlite parameter - protected static SqliteParameter createSqliteParameter(string name, Type type) - { - SqliteParameter param = new SqliteParameter(); - param.ParameterName = ":" + name; - param.DbType = dbtypeFromType(type); - param.SourceColumn = name; - param.SourceVersion = DataRowVersion.Current; - return param; - } - - /*********************************************************************** - * - * Type conversion functions - * - **********************************************************************/ - - protected static DbType dbtypeFromType(Type type) - { - if (type == typeof (String)) - { - return DbType.String; - } - else if (type == typeof (Int32)) - { - return DbType.Int32; - } - else if (type == typeof (UInt32)) - { - return DbType.UInt32; - } - else if (type == typeof (Int64)) - { - return DbType.Int64; - } - else if (type == typeof (UInt64)) - { - return DbType.UInt64; - } - else if (type == typeof (Double)) - { - return DbType.Double; - } - else if (type == typeof (Boolean)) - { - return DbType.Boolean; - } - else if (type == typeof (Byte[])) - { - return DbType.Binary; - } - else - { - return DbType.String; - } - } - - // this is something we'll need to implement for each db - // slightly differently. - protected static string sqliteType(Type type) - { - if (type == typeof (String)) - { - return "varchar(255)"; - } - else if (type == typeof (Int32)) - { - return "integer"; - } - else if (type == typeof (UInt32)) - { - return "integer"; - } - else if (type == typeof (Int64)) - { - return "varchar(255)"; - } - else if (type == typeof (UInt64)) - { - return "varchar(255)"; - } - else if (type == typeof (Double)) - { - return "float"; - } - else if (type == typeof (Boolean)) - { - return "integer"; - } - else if (type == typeof (Byte[])) - { - return "blob"; - } - else - { - return "string"; - } - } - } -} diff --git a/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs b/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs index 97fdc96..14a3e1a 100644 --- a/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs +++ b/OpenSim/Framework/Data.SQLite/SQLiteInventoryStore.cs @@ -35,7 +35,7 @@ using OpenSim.Framework.Console; namespace OpenSim.Framework.Data.SQLite { - public class SQLiteInventoryStore : SQLiteBase, IInventoryData + public class SQLiteInventoryStore : SQLiteUtil, IInventoryData { private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); diff --git a/OpenSim/Framework/Data.SQLite/SQLiteManager.cs b/OpenSim/Framework/Data.SQLite/SQLiteManager.cs index bec0cd8..b383b0d 100644 --- a/OpenSim/Framework/Data.SQLite/SQLiteManager.cs +++ b/OpenSim/Framework/Data.SQLite/SQLiteManager.cs @@ -35,7 +35,7 @@ using OpenSim.Framework.Console; namespace OpenSim.Framework.Data.SQLite { - internal class SQLiteManager : SQLiteBase + internal class SQLiteManager : SQLiteUtil { private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); diff --git a/OpenSim/Framework/Data.SQLite/SQLiteUserData.cs b/OpenSim/Framework/Data.SQLite/SQLiteUserData.cs index 0b2df9d..4a582ac 100644 --- a/OpenSim/Framework/Data.SQLite/SQLiteUserData.cs +++ b/OpenSim/Framework/Data.SQLite/SQLiteUserData.cs @@ -37,7 +37,7 @@ namespace OpenSim.Framework.Data.SQLite /// /// A User storage interface for the SQLite database system /// - public class SQLiteUserData : SQLiteBase, IUserData + public class SQLiteUserData : SQLiteUtil, IUserData { private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); diff --git a/OpenSim/Framework/Data.SQLite/SQLiteUtils.cs b/OpenSim/Framework/Data.SQLite/SQLiteUtils.cs new file mode 100644 index 0000000..1334e53 --- /dev/null +++ b/OpenSim/Framework/Data.SQLite/SQLiteUtils.cs @@ -0,0 +1,269 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Data; +using Mono.Data.SqliteClient; + +namespace OpenSim.Framework.Data.SQLite +{ + /// + /// A base class for methods needed by all SQLite database classes + /// + public class SQLiteUtil + { + /*********************************************************************** + * + * Database Definition Helper Functions + * + * This should be db agnostic as we define them in ADO.NET terms + * + **********************************************************************/ + + public static void createCol(DataTable dt, string name, Type type) + { + DataColumn col = new DataColumn(name, type); + dt.Columns.Add(col); + } + + /*********************************************************************** + * + * SQL Statement Creation Functions + * + * These functions create SQL statements for update, insert, and create. + * They can probably be factored later to have a db independant + * portion and a db specific portion + * + **********************************************************************/ + + public static SqliteCommand createInsertCommand(string table, DataTable dt) + { + /** + * This is subtle enough to deserve some commentary. + * Instead of doing *lots* and *lots of hardcoded strings + * for database definitions we'll use the fact that + * realistically all insert statements look like "insert + * into A(b, c) values(:b, :c) on the parameterized query + * front. If we just have a list of b, c, etc... we can + * generate these strings instead of typing them out. + */ + string[] cols = new string[dt.Columns.Count]; + for (int i = 0; i < dt.Columns.Count; i++) + { + DataColumn col = dt.Columns[i]; + cols[i] = col.ColumnName; + } + + string sql = "insert into " + table + "("; + sql += String.Join(", ", cols); + // important, the first ':' needs to be here, the rest get added in the join + sql += ") values (:"; + sql += String.Join(", :", cols); + sql += ")"; + SqliteCommand cmd = new SqliteCommand(sql); + + // this provides the binding for all our parameters, so + // much less code than it used to be + foreach (DataColumn col in dt.Columns) + { + cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType)); + } + return cmd; + } + + public static SqliteCommand createUpdateCommand(string table, string pk, DataTable dt) + { + string sql = "update " + table + " set "; + string subsql = String.Empty; + foreach (DataColumn col in dt.Columns) + { + if (subsql.Length > 0) + { + // a map function would rock so much here + subsql += ", "; + } + subsql += col.ColumnName + "= :" + col.ColumnName; + } + sql += subsql; + sql += " where " + pk; + SqliteCommand cmd = new SqliteCommand(sql); + + // this provides the binding for all our parameters, so + // much less code than it used to be + + foreach (DataColumn col in dt.Columns) + { + cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType)); + } + return cmd; + } + + + public static string defineTable(DataTable dt) + { + string sql = "create table " + dt.TableName + "("; + string subsql = String.Empty; + foreach (DataColumn col in dt.Columns) + { + if (subsql.Length > 0) + { + // a map function would rock so much here + subsql += ",\n"; + } + subsql += col.ColumnName + " " + sqliteType(col.DataType); + if (dt.PrimaryKey.Length > 0) + { + if (col == dt.PrimaryKey[0]) + { + subsql += " primary key"; + } + } + } + sql += subsql; + sql += ")"; + return sql; + } + + /*********************************************************************** + * + * Database Binding functions + * + * These will be db specific due to typing, and minor differences + * in databases. + * + **********************************************************************/ + + /// + /// This is a convenience function that collapses 5 repetitive + /// lines for defining SqliteParameters to 2 parameters: + /// column name and database type. + /// + /// It assumes certain conventions like :param as the param + /// name to replace in parametrized queries, and that source + /// version is always current version, both of which are fine + /// for us. + /// + ///a built sqlite parameter + public static SqliteParameter createSqliteParameter(string name, Type type) + { + SqliteParameter param = new SqliteParameter(); + param.ParameterName = ":" + name; + param.DbType = dbtypeFromType(type); + param.SourceColumn = name; + param.SourceVersion = DataRowVersion.Current; + return param; + } + + /*********************************************************************** + * + * Type conversion functions + * + **********************************************************************/ + + public static DbType dbtypeFromType(Type type) + { + if (type == typeof (String)) + { + return DbType.String; + } + else if (type == typeof (Int32)) + { + return DbType.Int32; + } + else if (type == typeof (UInt32)) + { + return DbType.UInt32; + } + else if (type == typeof (Int64)) + { + return DbType.Int64; + } + else if (type == typeof (UInt64)) + { + return DbType.UInt64; + } + else if (type == typeof (Double)) + { + return DbType.Double; + } + else if (type == typeof (Boolean)) + { + return DbType.Boolean; + } + else if (type == typeof (Byte[])) + { + return DbType.Binary; + } + else + { + return DbType.String; + } + } + + // this is something we'll need to implement for each db + // slightly differently. + public static string sqliteType(Type type) + { + if (type == typeof (String)) + { + return "varchar(255)"; + } + else if (type == typeof (Int32)) + { + return "integer"; + } + else if (type == typeof (UInt32)) + { + return "integer"; + } + else if (type == typeof (Int64)) + { + return "varchar(255)"; + } + else if (type == typeof (UInt64)) + { + return "varchar(255)"; + } + else if (type == typeof (Double)) + { + return "float"; + } + else if (type == typeof (Boolean)) + { + return "integer"; + } + else if (type == typeof (Byte[])) + { + return "blob"; + } + else + { + return "string"; + } + } + } +} diff --git a/OpenSim/Framework/Data/AssetDataBase.cs b/OpenSim/Framework/Data/AssetDataBase.cs new file mode 100644 index 0000000..2162358 --- /dev/null +++ b/OpenSim/Framework/Data/AssetDataBase.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; + +namespace OpenSim.Framework.Data +{ + public abstract class AssetDataBase : IAssetProvider + { + public abstract AssetBase FetchAsset(LLUUID uuid); + public abstract void CreateAsset(AssetBase asset); + public abstract void UpdateAsset(AssetBase asset); + public abstract bool ExistsAsset(LLUUID uuid); + public abstract void CommitAssets(); + + public abstract string Version { get; } + public abstract string Name { get; } + public abstract void Initialise(); + } +} diff --git a/OpenSim/Framework/Data/DataStoreBase.cs b/OpenSim/Framework/Data/DataStoreBase.cs new file mode 100644 index 0000000..671d0f0 --- /dev/null +++ b/OpenSim/Framework/Data/DataStoreBase.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework.Data +{ + public abstract class DataStoreBase + { + } +} diff --git a/OpenSim/Framework/Data/GridDataBase.cs b/OpenSim/Framework/Data/GridDataBase.cs new file mode 100644 index 0000000..e7333b4 --- /dev/null +++ b/OpenSim/Framework/Data/GridDataBase.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework.Data +{ + public abstract class GridDataBase + { + } +} diff --git a/OpenSim/Framework/Data/InventoryDataBase.cs b/OpenSim/Framework/Data/InventoryDataBase.cs new file mode 100644 index 0000000..d88acff --- /dev/null +++ b/OpenSim/Framework/Data/InventoryDataBase.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework.Data +{ + public abstract class InventoryDataBase + { + } +} diff --git a/OpenSim/Framework/Data/UserDataBase.cs b/OpenSim/Framework/Data/UserDataBase.cs new file mode 100644 index 0000000..a704ed4 --- /dev/null +++ b/OpenSim/Framework/Data/UserDataBase.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework.Data +{ + public abstract class UserDataBase + { + } +} -- cgit v1.1