aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Storage
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Storage')
-rw-r--r--OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs246
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}