diff options
author | Sean Dague | 2007-08-21 22:01:30 +0000 |
---|---|---|
committer | Sean Dague | 2007-08-21 22:01:30 +0000 |
commit | 6f6432864df2e023815197ae35f546768c03e339 (patch) | |
tree | f93356c9870725d36a29715c0cd45a092da864c9 /OpenSim/Region/Storage | |
parent | Added OnRezScript event to Scene.EventManager.Which the script engine should ... (diff) | |
download | opensim-SC_OLD-6f6432864df2e023815197ae35f546768c03e339.zip opensim-SC_OLD-6f6432864df2e023815197ae35f546768c03e339.tar.gz opensim-SC_OLD-6f6432864df2e023815197ae35f546768c03e339.tar.bz2 opensim-SC_OLD-6f6432864df2e023815197ae35f546768c03e339.tar.xz |
auto create sqlite database if it doesn't exist. This works, but needs some
cleaning up prior to release. However this should make it easy for people
to start using sqlite storage.
Diffstat (limited to 'OpenSim/Region/Storage')
-rw-r--r-- | OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs | 246 |
1 files changed, 161 insertions, 85 deletions
diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs index b6c6c83..aa90eac 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs | |||
@@ -34,6 +34,8 @@ namespace OpenSim.DataStore.MonoSqliteStorage | |||
34 | public void Initialise(string dbfile, string dbname) | 34 | public void Initialise(string dbfile, string dbname) |
35 | { | 35 | { |
36 | string connectionString = "URI=file:" + dbfile + ",version=3"; | 36 | string connectionString = "URI=file:" + dbfile + ",version=3"; |
37 | |||
38 | ds = new DataSet(); | ||
37 | 39 | ||
38 | MainLog.Instance.Verbose("DATASTORE", "Sqlite - connecting: " + dbfile); | 40 | MainLog.Instance.Verbose("DATASTORE", "Sqlite - connecting: " + dbfile); |
39 | SqliteConnection conn = new SqliteConnection(connectionString); | 41 | SqliteConnection conn = new SqliteConnection(connectionString); |
@@ -46,12 +48,17 @@ namespace OpenSim.DataStore.MonoSqliteStorage | |||
46 | shapeDa = new SqliteDataAdapter(shapeSelectCmd); | 48 | shapeDa = new SqliteDataAdapter(shapeSelectCmd); |
47 | // SqliteCommandBuilder shapeCb = new SqliteCommandBuilder(shapeDa); | 49 | // SqliteCommandBuilder shapeCb = new SqliteCommandBuilder(shapeDa); |
48 | 50 | ||
49 | ds = new DataSet(); | ||
50 | 51 | ||
51 | // We fill the data set, now we've got copies in memory for the information | 52 | // We fill the data set, now we've got copies in memory for the information |
52 | // TODO: see if the linkage actually holds. | 53 | // TODO: see if the linkage actually holds. |
53 | // primDa.FillSchema(ds, SchemaType.Source, "PrimSchema"); | 54 | // primDa.FillSchema(ds, SchemaType.Source, "PrimSchema"); |
54 | primDa.Fill(ds, "prims"); | 55 | try { |
56 | primDa.Fill(ds, "prims"); | ||
57 | } catch (Mono.Data.SqliteClient.SqliteSyntaxException) { | ||
58 | InitDB(conn); | ||
59 | primDa.Fill(ds, "prims"); | ||
60 | } | ||
61 | |||
55 | shapeDa.Fill(ds, "primshapes"); | 62 | shapeDa.Fill(ds, "primshapes"); |
56 | ds.AcceptChanges(); | 63 | ds.AcceptChanges(); |
57 | 64 | ||
@@ -67,6 +74,17 @@ namespace OpenSim.DataStore.MonoSqliteStorage | |||
67 | return; | 74 | return; |
68 | } | 75 | } |
69 | 76 | ||
77 | ///<summary> | ||
78 | /// This is a convenience function that collapses 5 repetitive | ||
79 | /// lines for defining SqliteParameters to 2 parameters: | ||
80 | /// column name and database type. | ||
81 | /// | ||
82 | /// It assumes certain conventions like :param as the param | ||
83 | /// name to replace in parametrized queries, and that source | ||
84 | /// version is always current version, both of which are fine | ||
85 | /// for us. | ||
86 | ///</summary> | ||
87 | ///<returns>a built sqlite parameter</returns> | ||
70 | private SqliteParameter createSqliteParameter(string name, DbType type) | 88 | private SqliteParameter createSqliteParameter(string name, DbType type) |
71 | { | 89 | { |
72 | SqliteParameter param = new SqliteParameter(); | 90 | SqliteParameter param = new SqliteParameter(); |
@@ -77,89 +95,6 @@ namespace OpenSim.DataStore.MonoSqliteStorage | |||
77 | return param; | 95 | return param; |
78 | } | 96 | } |
79 | 97 | ||
80 | private Dictionary<string, DbType> createPrimDataDefs() | ||
81 | { | ||
82 | Dictionary<string, DbType> data = new Dictionary<string, DbType>(); | ||
83 | data.Add("UUID", DbType.String); | ||
84 | data.Add("ParentID", DbType.Int32); | ||
85 | data.Add("CreationDate", DbType.Int32); | ||
86 | data.Add("Name", DbType.String); | ||
87 | data.Add("SceneGroupID", DbType.String); | ||
88 | // various text fields | ||
89 | data.Add("Text", DbType.String); | ||
90 | data.Add("Description", DbType.String); | ||
91 | data.Add("SitName", DbType.String); | ||
92 | data.Add("TouchName", DbType.String); | ||
93 | // permissions | ||
94 | data.Add("CreatorID", DbType.String); | ||
95 | data.Add("OwnerID", DbType.String); | ||
96 | data.Add("GroupID", DbType.String); | ||
97 | data.Add("LastOwnerID", DbType.String); | ||
98 | data.Add("OwnerMask", DbType.Int32); | ||
99 | data.Add("NextOwnerMask", DbType.Int32); | ||
100 | data.Add("GroupMask", DbType.Int32); | ||
101 | data.Add("EveryoneMask", DbType.Int32); | ||
102 | data.Add("BaseMask", DbType.Int32); | ||
103 | // vectors | ||
104 | data.Add("PositionX", DbType.Double); | ||
105 | data.Add("PositionY", DbType.Double); | ||
106 | data.Add("PositionZ", DbType.Double); | ||
107 | data.Add("GroupPositionX", DbType.Double); | ||
108 | data.Add("GroupPositionY", DbType.Double); | ||
109 | data.Add("GroupPositionZ", DbType.Double); | ||
110 | data.Add("VelocityX", DbType.Double); | ||
111 | data.Add("VelocityY", DbType.Double); | ||
112 | data.Add("VelocityZ", DbType.Double); | ||
113 | data.Add("AngularVelocityX", DbType.Double); | ||
114 | data.Add("AngularVelocityY", DbType.Double); | ||
115 | data.Add("AngularVelocityZ", DbType.Double); | ||
116 | data.Add("AccelerationX", DbType.Double); | ||
117 | data.Add("AccelerationY", DbType.Double); | ||
118 | data.Add("AccelerationZ", DbType.Double); | ||
119 | // quaternions | ||
120 | data.Add("RotationX", DbType.Double); | ||
121 | data.Add("RotationY", DbType.Double); | ||
122 | data.Add("RotationZ", DbType.Double); | ||
123 | data.Add("RotationW", DbType.Double); | ||
124 | return data; | ||
125 | } | ||
126 | |||
127 | private Dictionary<string, DbType> createShapeDataDefs() | ||
128 | { | ||
129 | Dictionary<string, DbType> data = new Dictionary<string, DbType>(); | ||
130 | data.Add("UUID", DbType.String); | ||
131 | // shape is an enum | ||
132 | data.Add("Shape", DbType.Int32); | ||
133 | // vectors | ||
134 | data.Add("ScaleX", DbType.Double); | ||
135 | data.Add("ScaleY", DbType.Double); | ||
136 | data.Add("ScaleZ", DbType.Double); | ||
137 | // paths | ||
138 | data.Add("PCode", DbType.Int32); | ||
139 | data.Add("PathBegin", DbType.Int32); | ||
140 | data.Add("PathEnd", DbType.Int32); | ||
141 | data.Add("PathScaleX", DbType.Int32); | ||
142 | data.Add("PathScaleY", DbType.Int32); | ||
143 | data.Add("PathShearX", DbType.Int32); | ||
144 | data.Add("PathShearY", DbType.Int32); | ||
145 | data.Add("PathSkew", DbType.Int32); | ||
146 | data.Add("PathCurve", DbType.Int32); | ||
147 | data.Add("PathRadiusOffset", DbType.Int32); | ||
148 | data.Add("PathRevolutions", DbType.Int32); | ||
149 | data.Add("PathTaperX", DbType.Int32); | ||
150 | data.Add("PathTaperY", DbType.Int32); | ||
151 | data.Add("PathTwist", DbType.Int32); | ||
152 | data.Add("PathTwistBegin", DbType.Int32); | ||
153 | // profile | ||
154 | data.Add("ProfileBegin", DbType.Int32); | ||
155 | data.Add("ProfileEnd", DbType.Int32); | ||
156 | data.Add("ProfileCurve", DbType.Int32); | ||
157 | data.Add("ProfileHollow", DbType.Int32); | ||
158 | // text TODO: this isn't right, but I'm not sure the right | ||
159 | // way to specify this as a blob atm | ||
160 | data.Add("Texture", DbType.Binary); | ||
161 | return data; | ||
162 | } | ||
163 | 98 | ||
164 | private SqliteCommand createInsertCommand(string table, Dictionary<string, DbType> defs) | 99 | private SqliteCommand createInsertCommand(string table, Dictionary<string, DbType> defs) |
165 | { | 100 | { |
@@ -640,5 +575,146 @@ namespace OpenSim.DataStore.MonoSqliteStorage | |||
640 | return textureEntry; | 575 | return textureEntry; |
641 | } | 576 | } |
642 | } | 577 | } |
578 | |||
579 | private void InitDB(SqliteConnection conn) | ||
580 | { | ||
581 | string createPrims = defineTable("prims", "UUID", createPrimDataDefs()); | ||
582 | string createShapes = defineTable("primshapes", "UUID", createShapeDataDefs()); | ||
583 | |||
584 | SqliteCommand pcmd = new SqliteCommand(createPrims, conn); | ||
585 | SqliteCommand scmd = new SqliteCommand(createShapes, conn); | ||
586 | conn.Open(); | ||
587 | pcmd.ExecuteNonQuery(); | ||
588 | scmd.ExecuteNonQuery(); | ||
589 | conn.Close(); | ||
590 | } | ||
591 | |||
592 | private string defineTable(string name, string primkey, Dictionary<string, DbType> cols) | ||
593 | { | ||
594 | string sql = "create table " + name + "("; | ||
595 | string subsql = ""; | ||
596 | foreach (string key in cols.Keys) | ||
597 | { | ||
598 | if (subsql.Length > 0) | ||
599 | { // a map function would rock so much here | ||
600 | subsql += ",\n"; | ||
601 | } | ||
602 | subsql += key + " " + sqliteType(cols[key]); | ||
603 | if(key == primkey) | ||
604 | { | ||
605 | subsql += " primary key"; | ||
606 | } | ||
607 | } | ||
608 | sql += subsql; | ||
609 | sql += ")"; | ||
610 | return sql; | ||
611 | } | ||
612 | |||
613 | private string sqliteType(DbType type) | ||
614 | { | ||
615 | switch(type) { | ||
616 | case DbType.String: | ||
617 | return "varchar(255)"; | ||
618 | |||
619 | case DbType.Int32: | ||
620 | return "integer"; | ||
621 | |||
622 | case DbType.Double: | ||
623 | return "float"; | ||
624 | |||
625 | case DbType.Binary: | ||
626 | return "blob"; | ||
627 | |||
628 | default: | ||
629 | return "varchar(255)"; | ||
630 | } | ||
631 | } | ||
632 | |||
633 | /// Methods after this point are big data definition | ||
634 | /// methods, and aren't really interesting unless you are | ||
635 | /// adjusting the schema. | ||
636 | private Dictionary<string, DbType> createPrimDataDefs() | ||
637 | { | ||
638 | Dictionary<string, DbType> data = new Dictionary<string, DbType>(); | ||
639 | data.Add("UUID", DbType.String); | ||
640 | data.Add("ParentID", DbType.Int32); | ||
641 | data.Add("CreationDate", DbType.Int32); | ||
642 | data.Add("Name", DbType.String); | ||
643 | data.Add("SceneGroupID", DbType.String); | ||
644 | // various text fields | ||
645 | data.Add("Text", DbType.String); | ||
646 | data.Add("Description", DbType.String); | ||
647 | data.Add("SitName", DbType.String); | ||
648 | data.Add("TouchName", DbType.String); | ||
649 | // permissions | ||
650 | data.Add("CreatorID", DbType.String); | ||
651 | data.Add("OwnerID", DbType.String); | ||
652 | data.Add("GroupID", DbType.String); | ||
653 | data.Add("LastOwnerID", DbType.String); | ||
654 | data.Add("OwnerMask", DbType.Int32); | ||
655 | data.Add("NextOwnerMask", DbType.Int32); | ||
656 | data.Add("GroupMask", DbType.Int32); | ||
657 | data.Add("EveryoneMask", DbType.Int32); | ||
658 | data.Add("BaseMask", DbType.Int32); | ||
659 | // vectors | ||
660 | data.Add("PositionX", DbType.Double); | ||
661 | data.Add("PositionY", DbType.Double); | ||
662 | data.Add("PositionZ", DbType.Double); | ||
663 | data.Add("GroupPositionX", DbType.Double); | ||
664 | data.Add("GroupPositionY", DbType.Double); | ||
665 | data.Add("GroupPositionZ", DbType.Double); | ||
666 | data.Add("VelocityX", DbType.Double); | ||
667 | data.Add("VelocityY", DbType.Double); | ||
668 | data.Add("VelocityZ", DbType.Double); | ||
669 | data.Add("AngularVelocityX", DbType.Double); | ||
670 | data.Add("AngularVelocityY", DbType.Double); | ||
671 | data.Add("AngularVelocityZ", DbType.Double); | ||
672 | data.Add("AccelerationX", DbType.Double); | ||
673 | data.Add("AccelerationY", DbType.Double); | ||
674 | data.Add("AccelerationZ", DbType.Double); | ||
675 | // quaternions | ||
676 | data.Add("RotationX", DbType.Double); | ||
677 | data.Add("RotationY", DbType.Double); | ||
678 | data.Add("RotationZ", DbType.Double); | ||
679 | data.Add("RotationW", DbType.Double); | ||
680 | return data; | ||
681 | } | ||
682 | |||
683 | private Dictionary<string, DbType> createShapeDataDefs() | ||
684 | { | ||
685 | Dictionary<string, DbType> data = new Dictionary<string, DbType>(); | ||
686 | data.Add("UUID", DbType.String); | ||
687 | // shape is an enum | ||
688 | data.Add("Shape", DbType.Int32); | ||
689 | // vectors | ||
690 | data.Add("ScaleX", DbType.Double); | ||
691 | data.Add("ScaleY", DbType.Double); | ||
692 | data.Add("ScaleZ", DbType.Double); | ||
693 | // paths | ||
694 | data.Add("PCode", DbType.Int32); | ||
695 | data.Add("PathBegin", DbType.Int32); | ||
696 | data.Add("PathEnd", DbType.Int32); | ||
697 | data.Add("PathScaleX", DbType.Int32); | ||
698 | data.Add("PathScaleY", DbType.Int32); | ||
699 | data.Add("PathShearX", DbType.Int32); | ||
700 | data.Add("PathShearY", DbType.Int32); | ||
701 | data.Add("PathSkew", DbType.Int32); | ||
702 | data.Add("PathCurve", DbType.Int32); | ||
703 | data.Add("PathRadiusOffset", DbType.Int32); | ||
704 | data.Add("PathRevolutions", DbType.Int32); | ||
705 | data.Add("PathTaperX", DbType.Int32); | ||
706 | data.Add("PathTaperY", DbType.Int32); | ||
707 | data.Add("PathTwist", DbType.Int32); | ||
708 | data.Add("PathTwistBegin", DbType.Int32); | ||
709 | // profile | ||
710 | data.Add("ProfileBegin", DbType.Int32); | ||
711 | data.Add("ProfileEnd", DbType.Int32); | ||
712 | data.Add("ProfileCurve", DbType.Int32); | ||
713 | data.Add("ProfileHollow", DbType.Int32); | ||
714 | // text TODO: this isn't right, but I'm not sure the right | ||
715 | // way to specify this as a blob atm | ||
716 | data.Add("Texture", DbType.Binary); | ||
717 | return data; | ||
718 | } | ||
643 | } | 719 | } |
644 | } | 720 | } |