From 6a45a1ce9c7be613ebc7f16372acf27c991a245e Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Fri, 7 Sep 2007 12:37:05 +0000 Subject: factor out common methods to SQLiteBase --- OpenSim/Framework/Data.SQLite/SQLiteBase.cs | 230 ++++++++++++++++++++++++ OpenSim/Framework/Data.SQLite/SQLiteUserData.cs | 170 +----------------- 2 files changed, 231 insertions(+), 169 deletions(-) create mode 100644 OpenSim/Framework/Data.SQLite/SQLiteBase.cs (limited to 'OpenSim') diff --git a/OpenSim/Framework/Data.SQLite/SQLiteBase.cs b/OpenSim/Framework/Data.SQLite/SQLiteBase.cs new file mode 100644 index 0000000..54bb719 --- /dev/null +++ b/OpenSim/Framework/Data.SQLite/SQLiteBase.cs @@ -0,0 +1,230 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.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.IO; +using libsecondlife; +using OpenSim.Framework.Utilities; +using System.Data; +using System.Data.SqlTypes; +using Mono.Data.SqliteClient; +using OpenSim.Framework.Console; + +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, System.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 = ""; + 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 = ""; + 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(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, System.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(System.String)) { + return DbType.String; + } else if (type == typeof(System.Int32)) { + return DbType.Int32; + } else if (type == typeof(System.UInt32)) { + return DbType.UInt32; + } else if (type == typeof(System.Int64)) { + return DbType.Int64; + } else if (type == typeof(System.UInt64)) { + return DbType.UInt64; + } else if (type == typeof(System.Double)) { + return DbType.Double; + } else if (type == typeof(System.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(System.String)) { + return "varchar(255)"; + } else if (type == typeof(System.Int32)) { + return "integer"; + } else if (type == typeof(System.UInt32)) { + return "integer"; + } else if (type == typeof(System.Int64)) { + return "varchar(255)"; + } else if (type == typeof(System.UInt64)) { + return "varchar(255)"; + } else if (type == typeof(System.Double)) { + return "float"; + } else if (type == typeof(System.Byte[])) { + return "blob"; + } else { + return "string"; + } + } + } +} diff --git a/OpenSim/Framework/Data.SQLite/SQLiteUserData.cs b/OpenSim/Framework/Data.SQLite/SQLiteUserData.cs index b09354d..26c832d 100644 --- a/OpenSim/Framework/Data.SQLite/SQLiteUserData.cs +++ b/OpenSim/Framework/Data.SQLite/SQLiteUserData.cs @@ -39,7 +39,7 @@ namespace OpenSim.Framework.Data.SQLite /// /// A User storage interface for the DB4o database system /// - public class SQLiteUserData : IUserData + public class SQLiteUserData : SQLiteBase, IUserData { /// /// The database manager @@ -284,12 +284,6 @@ namespace OpenSim.Framework.Data.SQLite * **********************************************************************/ - private void createCol(DataTable dt, string name, System.Type type) - { - DataColumn col = new DataColumn(name, type); - dt.Columns.Add(col); - } - private DataTable createUsersTable() { DataTable users = new DataTable("users"); @@ -477,98 +471,6 @@ namespace OpenSim.Framework.Data.SQLite /*********************************************************************** * - * 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 - * - **********************************************************************/ - - private 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; - } - - private SqliteCommand createUpdateCommand(string table, string pk, DataTable dt) - { - string sql = "update " + table + " set "; - string subsql = ""; - 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; - } - - - private string defineTable(DataTable dt) - { - string sql = "create table " + dt.TableName + "("; - string subsql = ""; - 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(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 @@ -576,27 +478,6 @@ namespace OpenSim.Framework.Data.SQLite * **********************************************************************/ - /// - /// 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 - private SqliteParameter createSqliteParameter(string name, System.Type type) - { - SqliteParameter param = new SqliteParameter(); - param.ParameterName = ":" + name; - param.DbType = dbtypeFromType(type); - param.SourceColumn = name; - param.SourceVersion = DataRowVersion.Current; - return param; - } - private void setupUserCommands(SqliteDataAdapter da, SqliteConnection conn) { da.InsertCommand = createInsertCommand("users", ds.Tables["users"]); @@ -634,54 +515,5 @@ namespace OpenSim.Framework.Data.SQLite return true; } - /*********************************************************************** - * - * Type conversion functions - * - **********************************************************************/ - - private DbType dbtypeFromType(Type type) - { - if (type == typeof(System.String)) { - return DbType.String; - } else if (type == typeof(System.Int32)) { - return DbType.Int32; - } else if (type == typeof(System.UInt32)) { - return DbType.UInt32; - } else if (type == typeof(System.Int64)) { - return DbType.Int64; - } else if (type == typeof(System.UInt64)) { - return DbType.UInt64; - } else if (type == typeof(System.Double)) { - return DbType.Double; - } else if (type == typeof(System.Byte[])) { - return DbType.Binary; - } else { - return DbType.String; - } - } - - // this is something we'll need to implement for each db - // slightly differently. - private string sqliteType(Type type) - { - if (type == typeof(System.String)) { - return "varchar(255)"; - } else if (type == typeof(System.Int32)) { - return "integer"; - } else if (type == typeof(System.UInt32)) { - return "integer"; - } else if (type == typeof(System.Int64)) { - return "varchar(255)"; - } else if (type == typeof(System.UInt64)) { - return "varchar(255)"; - } else if (type == typeof(System.Double)) { - return "float"; - } else if (type == typeof(System.Byte[])) { - return "blob"; - } else { - return "string"; - } - } } } -- cgit v1.1