aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Data/PGSQL
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Data/PGSQL/PGSQLAgentPreferencesData.cs64
-rw-r--r--OpenSim/Data/PGSQL/PGSQLAssetData.cs (renamed from OpenSim/Data/MSSQL/MSSQLAssetData.cs)137
-rw-r--r--OpenSim/Data/PGSQL/PGSQLAuthenticationData.cs (renamed from OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs)119
-rw-r--r--OpenSim/Data/PGSQL/PGSQLAvatarData.cs (renamed from OpenSim/Data/MSSQL/MSSQLAvatarData.cs)23
-rw-r--r--OpenSim/Data/PGSQL/PGSQLEstateData.cs (renamed from OpenSim/Data/MSSQL/MSSQLEstateData.cs)197
-rw-r--r--OpenSim/Data/PGSQL/PGSQLFramework.cs111
-rw-r--r--OpenSim/Data/PGSQL/PGSQLFriendsData.cs (renamed from OpenSim/Data/MSSQL/MSSQLFriendsData.cs)61
-rw-r--r--OpenSim/Data/PGSQL/PGSQLGenericTableHandler.cs (renamed from OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs)253
-rw-r--r--OpenSim/Data/PGSQL/PGSQLGridUserData.cs (renamed from OpenSim/Data/MSSQL/MSSQLGridUserData.cs)16
-rwxr-xr-xOpenSim/Data/PGSQL/PGSQLGroupsData.cs485
-rw-r--r--OpenSim/Data/PGSQL/PGSQLHGTravelData.cs80
-rw-r--r--OpenSim/Data/PGSQL/PGSQLInventoryData.cs (renamed from OpenSim/Data/MSSQL/MSSQLInventoryData.cs)212
-rw-r--r--OpenSim/Data/PGSQL/PGSQLManager.cs (renamed from OpenSim/Data/MSSQL/MSSQLManager.cs)185
-rw-r--r--OpenSim/Data/PGSQL/PGSQLMigration.cs (renamed from OpenSim/Data/MSSQL/MSSQLMigration.cs)23
-rw-r--r--OpenSim/Data/PGSQL/PGSQLOfflineIMData.cs56
-rwxr-xr-x[-rw-r--r--]OpenSim/Data/PGSQL/PGSQLPresenceData.cs (renamed from OpenSim/Data/MSSQL/MSSQLPresenceData.cs)39
-rw-r--r--OpenSim/Data/PGSQL/PGSQLRegionData.cs (renamed from OpenSim/Data/MSSQL/MSSQLRegionData.cs)193
-rw-r--r--OpenSim/Data/PGSQL/PGSQLSimulationData.cs (renamed from OpenSim/Data/MSSQL/MSSQLSimulationData.cs)960
-rw-r--r--OpenSim/Data/PGSQL/PGSQLUserAccountData.cs329
-rw-r--r--OpenSim/Data/PGSQL/PGSQLUserProfilesData.cs1064
-rw-r--r--OpenSim/Data/PGSQL/PGSQLXAssetData.cs587
-rw-r--r--OpenSim/Data/PGSQL/PGSQLXInventoryData.cs (renamed from OpenSim/Data/MSSQL/MSSQLXInventoryData.cs)117
-rw-r--r--OpenSim/Data/PGSQL/Properties/AssemblyInfo.cs (renamed from OpenSim/Data/MSSQL/Properties/AssemblyInfo.cs)8
-rw-r--r--OpenSim/Data/PGSQL/Resources/AssetStore.migrations99
-rw-r--r--OpenSim/Data/PGSQL/Resources/AuthStore.migrations32
-rw-r--r--OpenSim/Data/PGSQL/Resources/Avatar.migrations59
-rw-r--r--OpenSim/Data/PGSQL/Resources/EstateStore.migrations307
-rw-r--r--OpenSim/Data/PGSQL/Resources/FriendsStore.migrations44
-rw-r--r--OpenSim/Data/PGSQL/Resources/GridStore.migrations242
-rw-r--r--OpenSim/Data/PGSQL/Resources/GridUserStore.migrations60
-rw-r--r--OpenSim/Data/PGSQL/Resources/HGTravelStore.migrations17
-rw-r--r--OpenSim/Data/PGSQL/Resources/IM_Store.migrations45
-rw-r--r--OpenSim/Data/PGSQL/Resources/InventoryStore.migrations220
-rw-r--r--OpenSim/Data/PGSQL/Resources/LogStore.migrations16
-rwxr-xr-xOpenSim/Data/PGSQL/Resources/Presence.migrations42
-rw-r--r--OpenSim/Data/PGSQL/Resources/RegionStore.migrations1162
-rw-r--r--OpenSim/Data/PGSQL/Resources/UserAccount.migrations51
-rw-r--r--OpenSim/Data/PGSQL/Resources/UserProfiles.migrations155
-rw-r--r--OpenSim/Data/PGSQL/Resources/UserStore.migrations404
-rw-r--r--OpenSim/Data/PGSQL/Resources/XAssetStore.migrations80
-rw-r--r--OpenSim/Data/PGSQL/Resources/os_groups_Store.migrations211
41 files changed, 7536 insertions, 1029 deletions
diff --git a/OpenSim/Data/PGSQL/PGSQLAgentPreferencesData.cs b/OpenSim/Data/PGSQL/PGSQLAgentPreferencesData.cs
new file mode 100644
index 0000000..20612fe
--- /dev/null
+++ b/OpenSim/Data/PGSQL/PGSQLAgentPreferencesData.cs
@@ -0,0 +1,64 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using OpenMetaverse;
33using OpenSim.Framework;
34using Npgsql;
35
36namespace OpenSim.Data.PGSQL
37{
38 public class PGSQLAgentPreferencesData : PGSQLGenericTableHandler<AgentPreferencesData>, IAgentPreferencesData
39 {
40 public PGSQLAgentPreferencesData(string connectionString, string realm)
41 : base(connectionString, realm, "AgentPrefs")
42 {
43 }
44
45 public AgentPreferencesData GetPrefs(UUID agentID)
46 {
47 // Until someone sends in a table that works
48 return null;
49 //AgentPreferencesData[] ret = Get("PrincipalID", agentID.ToString());
50
51 //if (ret.Length == 0)
52 // return null;
53
54 //return ret[0];
55 }
56
57 public override bool Store(AgentPreferencesData row)
58 {
59 // Until someone sends in a table that works
60 return false;
61 }
62
63 }
64}
diff --git a/OpenSim/Data/MSSQL/MSSQLAssetData.cs b/OpenSim/Data/PGSQL/PGSQLAssetData.cs
index c7488d8..5d8b0a2 100644
--- a/OpenSim/Data/MSSQL/MSSQLAssetData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLAssetData.cs
@@ -27,19 +27,20 @@
27 27
28using System; 28using System;
29using System.Data; 29using System.Data;
30using System.Data.SqlClient;
31using System.Reflection; 30using System.Reflection;
32using System.Collections.Generic; 31using System.Collections.Generic;
33using OpenMetaverse; 32using OpenMetaverse;
34using log4net; 33using log4net;
35using OpenSim.Framework; 34using OpenSim.Framework;
35using Npgsql;
36using NpgsqlTypes;
36 37
37namespace OpenSim.Data.MSSQL 38namespace OpenSim.Data.PGSQL
38{ 39{
39 /// <summary> 40 /// <summary>
40 /// A MSSQL Interface for the Asset server 41 /// A PGSQL Interface for the Asset server
41 /// </summary> 42 /// </summary>
42 public class MSSQLAssetData : AssetDataBase 43 public class PGSQLAssetData : AssetDataBase
43 { 44 {
44 private const string _migrationStore = "AssetStore"; 45 private const string _migrationStore = "AssetStore";
45 46
@@ -48,9 +49,14 @@ namespace OpenSim.Data.MSSQL
48 /// <summary> 49 /// <summary>
49 /// Database manager 50 /// Database manager
50 /// </summary> 51 /// </summary>
51 private MSSQLManager m_database; 52 private PGSQLManager m_database;
52 private string m_connectionString; 53 private string m_connectionString;
53 54
55 protected virtual Assembly Assembly
56 {
57 get { return GetType().Assembly; }
58 }
59
54 #region IPlugin Members 60 #region IPlugin Members
55 61
56 override public void Dispose() { } 62 override public void Dispose() { }
@@ -61,7 +67,7 @@ namespace OpenSim.Data.MSSQL
61 // [Obsolete("Cannot be default-initialized!")] 67 // [Obsolete("Cannot be default-initialized!")]
62 override public void Initialise() 68 override public void Initialise()
63 { 69 {
64 m_log.Info("[MSSQLAssetData]: " + Name + " cannot be default-initialized!"); 70 m_log.Info("[PGSQLAssetData]: " + Name + " cannot be default-initialized!");
65 throw new PluginNotInitialisedException(Name); 71 throw new PluginNotInitialisedException(Name);
66 } 72 }
67 73
@@ -76,7 +82,7 @@ namespace OpenSim.Data.MSSQL
76 { 82 {
77 m_ticksToEpoch = new System.DateTime(1970, 1, 1).Ticks; 83 m_ticksToEpoch = new System.DateTime(1970, 1, 1).Ticks;
78 84
79 m_database = new MSSQLManager(connectionString); 85 m_database = new PGSQLManager(connectionString);
80 m_connectionString = connectionString; 86 m_connectionString = connectionString;
81 87
82 //New migration to check for DB changes 88 //New migration to check for DB changes
@@ -96,7 +102,7 @@ namespace OpenSim.Data.MSSQL
96 /// </summary> 102 /// </summary>
97 override public string Name 103 override public string Name
98 { 104 {
99 get { return "MSSQL Asset storage engine"; } 105 get { return "PGSQL Asset storage engine"; }
100 } 106 }
101 107
102 #endregion 108 #endregion
@@ -110,13 +116,13 @@ namespace OpenSim.Data.MSSQL
110 /// <returns></returns> 116 /// <returns></returns>
111 override public AssetBase GetAsset(UUID assetID) 117 override public AssetBase GetAsset(UUID assetID)
112 { 118 {
113 string sql = "SELECT * FROM assets WHERE id = @id"; 119 string sql = "SELECT * FROM assets WHERE id = :id";
114 using (SqlConnection conn = new SqlConnection(m_connectionString)) 120 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
115 using (SqlCommand cmd = new SqlCommand(sql, conn)) 121 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
116 { 122 {
117 cmd.Parameters.Add(m_database.CreateParameter("id", assetID)); 123 cmd.Parameters.Add(m_database.CreateParameter("id", assetID));
118 conn.Open(); 124 conn.Open();
119 using (SqlDataReader reader = cmd.ExecuteReader()) 125 using (NpgsqlDataReader reader = cmd.ExecuteReader())
120 { 126 {
121 if (reader.Read()) 127 if (reader.Read())
122 { 128 {
@@ -147,34 +153,38 @@ namespace OpenSim.Data.MSSQL
147 { 153 {
148 154
149 string sql = 155 string sql =
150 @"IF EXISTS(SELECT * FROM assets WHERE id=@id) 156 @"UPDATE assets set name = :name, description = :description, " + "\"assetType\" " + @" = :assetType,
151 UPDATE assets set name = @name, description = @description, assetType = @assetType, 157 local = :local, temporary = :temporary, creatorid = :creatorid, data = :data
152 local = @local, temporary = @temporary, creatorid = @creatorid, data = @data 158 WHERE id=:id;
153 WHERE id=@id 159
154 ELSE 160 INSERT INTO assets
155 INSERT INTO assets 161 (id, name, description, " + "\"assetType\" " + @", local,
156 ([id], [name], [description], [assetType], [local], 162 temporary, create_time, access_time, creatorid, asset_flags, data)
157 [temporary], [create_time], [access_time], [creatorid], [asset_flags], [data]) 163 Select :id, :name, :description, :assetType, :local,
158 VALUES 164 :temporary, :create_time, :access_time, :creatorid, :asset_flags, :data
159 (@id, @name, @description, @assetType, @local, 165 Where not EXISTS(SELECT * FROM assets WHERE id=:id)
160 @temporary, @create_time, @access_time, @creatorid, @asset_flags, @data)"; 166 ";
161 167
162 string assetName = asset.Name; 168 string assetName = asset.Name;
163 if (asset.Name.Length > 64) 169 if (asset.Name.Length > AssetBase.MAX_ASSET_NAME)
164 { 170 {
165 assetName = asset.Name.Substring(0, 64); 171 assetName = asset.Name.Substring(0, AssetBase.MAX_ASSET_NAME);
166 m_log.Warn("[ASSET DB]: Name field truncated from " + asset.Name.Length + " to " + assetName.Length + " characters on add"); 172 m_log.WarnFormat(
173 "[ASSET DB]: Name '{0}' for asset {1} truncated from {2} to {3} characters on add",
174 asset.Name, asset.ID, asset.Name.Length, assetName.Length);
167 } 175 }
168 176
169 string assetDescription = asset.Description; 177 string assetDescription = asset.Description;
170 if (asset.Description.Length > 64) 178 if (asset.Description.Length > AssetBase.MAX_ASSET_DESC)
171 { 179 {
172 assetDescription = asset.Description.Substring(0, 64); 180 assetDescription = asset.Description.Substring(0, AssetBase.MAX_ASSET_DESC);
173 m_log.Warn("[ASSET DB]: Description field truncated from " + asset.Description.Length + " to " + assetDescription.Length + " characters on add"); 181 m_log.WarnFormat(
182 "[ASSET DB]: Description '{0}' for asset {1} truncated from {2} to {3} characters on add",
183 asset.Description, asset.ID, asset.Description.Length, assetDescription.Length);
174 } 184 }
175 185
176 using (SqlConnection conn = new SqlConnection(m_connectionString)) 186 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
177 using (SqlCommand command = new SqlCommand(sql, conn)) 187 using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
178 { 188 {
179 int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000); 189 int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000);
180 command.Parameters.Add(m_database.CreateParameter("id", asset.FullID)); 190 command.Parameters.Add(m_database.CreateParameter("id", asset.FullID));
@@ -195,7 +205,7 @@ namespace OpenSim.Data.MSSQL
195 } 205 }
196 catch(Exception e) 206 catch(Exception e)
197 { 207 {
198 m_log.Error("[ASSET DB]: Error storing item :" + e.Message); 208 m_log.Error("[ASSET DB]: Error storing item :" + e.Message + " sql "+sql);
199 } 209 }
200 } 210 }
201 } 211 }
@@ -204,11 +214,11 @@ namespace OpenSim.Data.MSSQL
204// Commented out since currently unused - this probably should be called in GetAsset() 214// Commented out since currently unused - this probably should be called in GetAsset()
205// private void UpdateAccessTime(AssetBase asset) 215// private void UpdateAccessTime(AssetBase asset)
206// { 216// {
207// using (AutoClosingSqlCommand cmd = m_database.Query("UPDATE assets SET access_time = @access_time WHERE id=@id")) 217// using (AutoClosingSqlCommand cmd = m_database.Query("UPDATE assets SET access_time = :access_time WHERE id=:id"))
208// { 218// {
209// int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000); 219// int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000);
210// cmd.Parameters.AddWithValue("@id", asset.FullID.ToString()); 220// cmd.Parameters.AddWithValue(":id", asset.FullID.ToString());
211// cmd.Parameters.AddWithValue("@access_time", now); 221// cmd.Parameters.AddWithValue(":access_time", now);
212// try 222// try
213// { 223// {
214// cmd.ExecuteNonQuery(); 224// cmd.ExecuteNonQuery();
@@ -221,17 +231,38 @@ namespace OpenSim.Data.MSSQL
221// } 231// }
222 232
223 /// <summary> 233 /// <summary>
224 /// Check if asset exist in m_database 234 /// Check if the assets exist in the database.
225 /// </summary> 235 /// </summary>
226 /// <param name="uuid"></param> 236 /// <param name="uuids">The assets' IDs</param>
227 /// <returns>true if exist.</returns> 237 /// <returns>For each asset: true if it exists, false otherwise</returns>
228 override public bool ExistsAsset(UUID uuid) 238 public override bool[] AssetsExist(UUID[] uuids)
229 { 239 {
230 if (GetAsset(uuid) != null) 240 if (uuids.Length == 0)
241 return new bool[0];
242
243 HashSet<UUID> exist = new HashSet<UUID>();
244
245 string ids = "'" + string.Join("','", uuids) + "'";
246 string sql = string.Format("SELECT id FROM assets WHERE id IN ({0})", ids);
247
248 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
249 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
231 { 250 {
232 return true; 251 conn.Open();
252 using (NpgsqlDataReader reader = cmd.ExecuteReader())
253 {
254 while (reader.Read())
255 {
256 UUID id = DBGuid.FromDB(reader["id"]);
257 exist.Add(id);
258 }
259 }
233 } 260 }
234 return false; 261
262 bool[] results = new bool[uuids.Length];
263 for (int i = 0; i < uuids.Length; i++)
264 results[i] = exist.Contains(uuids[i]);
265 return results;
235 } 266 }
236 267
237 /// <summary> 268 /// <summary>
@@ -245,23 +276,19 @@ namespace OpenSim.Data.MSSQL
245 public override List<AssetMetadata> FetchAssetMetadataSet(int start, int count) 276 public override List<AssetMetadata> FetchAssetMetadataSet(int start, int count)
246 { 277 {
247 List<AssetMetadata> retList = new List<AssetMetadata>(count); 278 List<AssetMetadata> retList = new List<AssetMetadata>(count);
248 string sql = @"WITH OrderedAssets AS 279 string sql = @" SELECT id, name, description, " + "\"assetType\"" + @", temporary, creatorid
249 ( 280 FROM assets
250 SELECT id, name, description, assetType, temporary, creatorid, 281 order by id
251 RowNumber = ROW_NUMBER() OVER (ORDER BY id) 282 limit :stop
252 FROM assets 283 offset :start;";
253 )
254 SELECT *
255 FROM OrderedAssets
256 WHERE RowNumber BETWEEN @start AND @stop;";
257 284
258 using (SqlConnection conn = new SqlConnection(m_connectionString)) 285 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
259 using (SqlCommand cmd = new SqlCommand(sql, conn)) 286 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
260 { 287 {
261 cmd.Parameters.Add(m_database.CreateParameter("start", start)); 288 cmd.Parameters.Add(m_database.CreateParameter("start", start));
262 cmd.Parameters.Add(m_database.CreateParameter("stop", start + count - 1)); 289 cmd.Parameters.Add(m_database.CreateParameter("stop", start + count - 1));
263 conn.Open(); 290 conn.Open();
264 using (SqlDataReader reader = cmd.ExecuteReader()) 291 using (NpgsqlDataReader reader = cmd.ExecuteReader())
265 { 292 {
266 while (reader.Read()) 293 while (reader.Read())
267 { 294 {
diff --git a/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs b/OpenSim/Data/PGSQL/PGSQLAuthenticationData.cs
index 1ae78c4..d174112 100644
--- a/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLAuthenticationData.cs
@@ -1,4 +1,4 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
@@ -28,32 +28,38 @@
28using System; 28using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Data;
32using OpenMetaverse; 31using OpenMetaverse;
33using OpenSim.Framework; 32using OpenSim.Framework;
34using System.Data.SqlClient;
35using System.Reflection; 33using System.Reflection;
36using System.Text; 34using System.Text;
35using System.Data;
36using Npgsql;
37using NpgsqlTypes;
37 38
38namespace OpenSim.Data.MSSQL 39namespace OpenSim.Data.PGSQL
39{ 40{
40 public class MSSQLAuthenticationData : IAuthenticationData 41 public class PGSQLAuthenticationData : IAuthenticationData
41 { 42 {
42 private string m_Realm; 43 private string m_Realm;
43 private List<string> m_ColumnNames = null; 44 private List<string> m_ColumnNames = null;
44 private int m_LastExpire = 0; 45 private int m_LastExpire = 0;
45 private string m_ConnectionString; 46 private string m_ConnectionString;
46 private MSSQLManager m_database; 47 private PGSQLManager m_database;
48
49 protected virtual Assembly Assembly
50 {
51 get { return GetType().Assembly; }
52 }
47 53
48 public MSSQLAuthenticationData(string connectionString, string realm) 54 public PGSQLAuthenticationData(string connectionString, string realm)
49 { 55 {
50 m_Realm = realm; 56 m_Realm = realm;
51 m_ConnectionString = connectionString; 57 m_ConnectionString = connectionString;
52 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 58 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
53 { 59 {
54 conn.Open(); 60 conn.Open();
55 Migration m = new Migration(conn, GetType().Assembly, "AuthStore"); 61 Migration m = new Migration(conn, GetType().Assembly, "AuthStore");
56 m_database = new MSSQLManager(m_ConnectionString); 62 m_database = new PGSQLManager(m_ConnectionString);
57 m.Update(); 63 m.Update();
58 } 64 }
59 } 65 }
@@ -63,14 +69,14 @@ namespace OpenSim.Data.MSSQL
63 AuthenticationData ret = new AuthenticationData(); 69 AuthenticationData ret = new AuthenticationData();
64 ret.Data = new Dictionary<string, object>(); 70 ret.Data = new Dictionary<string, object>();
65 71
66 string sql = string.Format("select * from {0} where UUID = @principalID", m_Realm); 72 string sql = string.Format("select * from {0} where uuid = :principalID", m_Realm);
67 73
68 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 74 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
69 using (SqlCommand cmd = new SqlCommand(sql, conn)) 75 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
70 { 76 {
71 cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID)); 77 cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
72 conn.Open(); 78 conn.Open();
73 using (SqlDataReader result = cmd.ExecuteReader()) 79 using (NpgsqlDataReader result = cmd.ExecuteReader())
74 { 80 {
75 if (result.Read()) 81 if (result.Read())
76 { 82 {
@@ -87,7 +93,7 @@ namespace OpenSim.Data.MSSQL
87 93
88 foreach (string s in m_ColumnNames) 94 foreach (string s in m_ColumnNames)
89 { 95 {
90 if (s == "UUID") 96 if (s == "UUID"||s == "uuid")
91 continue; 97 continue;
92 98
93 ret.Data[s] = result[s].ToString(); 99 ret.Data[s] = result[s].ToString();
@@ -103,12 +109,31 @@ namespace OpenSim.Data.MSSQL
103 { 109 {
104 if (data.Data.ContainsKey("UUID")) 110 if (data.Data.ContainsKey("UUID"))
105 data.Data.Remove("UUID"); 111 data.Data.Remove("UUID");
112 if (data.Data.ContainsKey("uuid"))
113 data.Data.Remove("uuid");
114
115 /*
116 Dictionary<string, object> oAuth = new Dictionary<string, object>();
106 117
118 foreach (KeyValuePair<string, object> oDado in data.Data)
119 {
120 if (oDado.Key != oDado.Key.ToLower())
121 {
122 oAuth.Add(oDado.Key.ToLower(), oDado.Value);
123 }
124 }
125 foreach (KeyValuePair<string, object> oDado in data.Data)
126 {
127 if (!oAuth.ContainsKey(oDado.Key.ToLower())) {
128 oAuth.Add(oDado.Key.ToLower(), oDado.Value);
129 }
130 }
131 */
107 string[] fields = new List<string>(data.Data.Keys).ToArray(); 132 string[] fields = new List<string>(data.Data.Keys).ToArray();
108 StringBuilder updateBuilder = new StringBuilder(); 133 StringBuilder updateBuilder = new StringBuilder();
109 134
110 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 135 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
111 using (SqlCommand cmd = new SqlCommand()) 136 using (NpgsqlCommand cmd = new NpgsqlCommand())
112 { 137 {
113 updateBuilder.AppendFormat("update {0} set ", m_Realm); 138 updateBuilder.AppendFormat("update {0} set ", m_Realm);
114 139
@@ -117,27 +142,28 @@ namespace OpenSim.Data.MSSQL
117 { 142 {
118 if (!first) 143 if (!first)
119 updateBuilder.Append(", "); 144 updateBuilder.Append(", ");
120 updateBuilder.AppendFormat("{0} = @{0}",field); 145 updateBuilder.AppendFormat("\"{0}\" = :{0}",field);
121 146
122 first = false; 147 first = false;
123 cmd.Parameters.Add(m_database.CreateParameter("@" + field, data.Data[field])); 148
149 cmd.Parameters.Add(m_database.CreateParameter("" + field, data.Data[field]));
124 } 150 }
125 151
126 updateBuilder.Append(" where UUID = @principalID"); 152 updateBuilder.Append(" where uuid = :principalID");
127 153
128 cmd.CommandText = updateBuilder.ToString(); 154 cmd.CommandText = updateBuilder.ToString();
129 cmd.Connection = conn; 155 cmd.Connection = conn;
130 cmd.Parameters.Add(m_database.CreateParameter("@principalID", data.PrincipalID)); 156 cmd.Parameters.Add(m_database.CreateParameter("principalID", data.PrincipalID));
131 157
132 conn.Open(); 158 conn.Open();
133 if (cmd.ExecuteNonQuery() < 1) 159 if (cmd.ExecuteNonQuery() < 1)
134 { 160 {
135 StringBuilder insertBuilder = new StringBuilder(); 161 StringBuilder insertBuilder = new StringBuilder();
136 162
137 insertBuilder.AppendFormat("insert into {0} (UUID, ", m_Realm); 163 insertBuilder.AppendFormat("insert into {0} (uuid, \"", m_Realm);
138 insertBuilder.Append(String.Join(", ", fields)); 164 insertBuilder.Append(String.Join("\", \"", fields));
139 insertBuilder.Append(") values (@principalID, @"); 165 insertBuilder.Append("\") values (:principalID, :");
140 insertBuilder.Append(String.Join(", @", fields)); 166 insertBuilder.Append(String.Join(", :", fields));
141 insertBuilder.Append(")"); 167 insertBuilder.Append(")");
142 168
143 cmd.CommandText = insertBuilder.ToString(); 169 cmd.CommandText = insertBuilder.ToString();
@@ -153,11 +179,11 @@ namespace OpenSim.Data.MSSQL
153 179
154 public bool SetDataItem(UUID principalID, string item, string value) 180 public bool SetDataItem(UUID principalID, string item, string value)
155 { 181 {
156 string sql = string.Format("update {0} set {1} = @{1} where UUID = @UUID", m_Realm, item); 182 string sql = string.Format("update {0} set {1} = :{1} where uuid = :UUID", m_Realm, item);
157 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 183 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
158 using (SqlCommand cmd = new SqlCommand(sql, conn)) 184 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
159 { 185 {
160 cmd.Parameters.Add(m_database.CreateParameter("@" + item, value)); 186 cmd.Parameters.Add(m_database.CreateParameter("" + item, value));
161 conn.Open(); 187 conn.Open();
162 if (cmd.ExecuteNonQuery() > 0) 188 if (cmd.ExecuteNonQuery() > 0)
163 return true; 189 return true;
@@ -170,13 +196,13 @@ namespace OpenSim.Data.MSSQL
170 if (System.Environment.TickCount - m_LastExpire > 30000) 196 if (System.Environment.TickCount - m_LastExpire > 30000)
171 DoExpire(); 197 DoExpire();
172 198
173 string sql = "insert into tokens (UUID, token, validity) values (@principalID, @token, @lifetime)"; 199 string sql = "insert into tokens (uuid, token, validity) values (:principalID, :token, :lifetime)";
174 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 200 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
175 using (SqlCommand cmd = new SqlCommand(sql, conn)) 201 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
176 { 202 {
177 cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID)); 203 cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
178 cmd.Parameters.Add(m_database.CreateParameter("@token", token)); 204 cmd.Parameters.Add(m_database.CreateParameter("token", token));
179 cmd.Parameters.Add(m_database.CreateParameter("@lifetime", DateTime.Now.AddMinutes(lifetime))); 205 cmd.Parameters.Add(m_database.CreateParameter("lifetime", DateTime.Now.AddMinutes(lifetime)));
180 conn.Open(); 206 conn.Open();
181 207
182 if (cmd.ExecuteNonQuery() > 0) 208 if (cmd.ExecuteNonQuery() > 0)
@@ -193,13 +219,14 @@ namespace OpenSim.Data.MSSQL
193 DoExpire(); 219 DoExpire();
194 220
195 DateTime validDate = DateTime.Now.AddMinutes(lifetime); 221 DateTime validDate = DateTime.Now.AddMinutes(lifetime);
196 string sql = "update tokens set validity = @validDate where UUID = @principalID and token = @token and validity > GetDate()"; 222 string sql = "update tokens set validity = :validDate where uuid = :principalID and token = :token and validity > (CURRENT_DATE + CURRENT_TIME)";
197 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 223
198 using (SqlCommand cmd = new SqlCommand(sql, conn)) 224 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
225 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
199 { 226 {
200 cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID)); 227 cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
201 cmd.Parameters.Add(m_database.CreateParameter("@token", token)); 228 cmd.Parameters.Add(m_database.CreateParameter("token", token));
202 cmd.Parameters.Add(m_database.CreateParameter("@validDate", validDate)); 229 cmd.Parameters.Add(m_database.CreateParameter("validDate", validDate));
203 conn.Open(); 230 conn.Open();
204 231
205 if (cmd.ExecuteNonQuery() > 0) 232 if (cmd.ExecuteNonQuery() > 0)
@@ -213,12 +240,12 @@ namespace OpenSim.Data.MSSQL
213 private void DoExpire() 240 private void DoExpire()
214 { 241 {
215 DateTime currentDateTime = DateTime.Now; 242 DateTime currentDateTime = DateTime.Now;
216 string sql = "delete from tokens where validity < @currentDateTime"; 243 string sql = "delete from tokens where validity < :currentDateTime";
217 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 244 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
218 using (SqlCommand cmd = new SqlCommand(sql, conn)) 245 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
219 { 246 {
220 conn.Open(); 247 conn.Open();
221 cmd.Parameters.Add(m_database.CreateParameter("@currentDateTime", currentDateTime)); 248 cmd.Parameters.Add(m_database.CreateParameter("currentDateTime", currentDateTime));
222 cmd.ExecuteNonQuery(); 249 cmd.ExecuteNonQuery();
223 } 250 }
224 m_LastExpire = System.Environment.TickCount; 251 m_LastExpire = System.Environment.TickCount;
diff --git a/OpenSim/Data/MSSQL/MSSQLAvatarData.cs b/OpenSim/Data/PGSQL/PGSQLAvatarData.cs
index 301b424..d9c4905 100644
--- a/OpenSim/Data/MSSQL/MSSQLAvatarData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLAvatarData.cs
@@ -27,38 +27,39 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Data;
31using System.Reflection; 30using System.Reflection;
32using System.Threading; 31using System.Threading;
33using log4net; 32using log4net;
34using OpenMetaverse; 33using OpenMetaverse;
35using OpenSim.Framework; 34using OpenSim.Framework;
36using System.Data.SqlClient; 35using Npgsql;
36using NpgsqlTypes;
37 37
38namespace OpenSim.Data.MSSQL 38
39namespace OpenSim.Data.PGSQL
39{ 40{
40 /// <summary> 41 /// <summary>
41 /// A MSSQL Interface for Avatar Storage 42 /// A PGSQL Interface for Avatar Storage
42 /// </summary> 43 /// </summary>
43 public class MSSQLAvatarData : MSSQLGenericTableHandler<AvatarBaseData>, 44 public class PGSQLAvatarData : PGSQLGenericTableHandler<AvatarBaseData>,
44 IAvatarData 45 IAvatarData
45 { 46 {
46// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 47// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 48
48 public MSSQLAvatarData(string connectionString, string realm) : 49 public PGSQLAvatarData(string connectionString, string realm) :
49 base(connectionString, realm, "Avatar") 50 base(connectionString, realm, "Avatar")
50 { 51 {
51 } 52 }
52 53
53 public bool Delete(UUID principalID, string name) 54 public bool Delete(UUID principalID, string name)
54 { 55 {
55 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 56 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
56 using (SqlCommand cmd = new SqlCommand()) 57 using (NpgsqlCommand cmd = new NpgsqlCommand())
57 { 58 {
58 59
59 cmd.CommandText = String.Format("DELETE FROM {0} where [PrincipalID] = @PrincipalID and [Name] = @Name", m_Realm); 60 cmd.CommandText = String.Format("DELETE FROM {0} where \"PrincipalID\" = :PrincipalID and \"Name\" = :Name", m_Realm);
60 cmd.Parameters.Add(m_database.CreateParameter("@PrincipalID", principalID.ToString())); 61 cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
61 cmd.Parameters.Add(m_database.CreateParameter("@Name", name)); 62 cmd.Parameters.Add(m_database.CreateParameter("Name", name));
62 cmd.Connection = conn; 63 cmd.Connection = conn;
63 conn.Open(); 64 conn.Open();
64 if (cmd.ExecuteNonQuery() > 0) 65 if (cmd.ExecuteNonQuery() > 0)
diff --git a/OpenSim/Data/MSSQL/MSSQLEstateData.cs b/OpenSim/Data/PGSQL/PGSQLEstateData.cs
index 1faa249..b5ca235 100644
--- a/OpenSim/Data/MSSQL/MSSQLEstateData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLEstateData.cs
@@ -27,38 +27,44 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Data;
31using System.Data.SqlClient;
32using System.Reflection; 30using System.Reflection;
33using log4net; 31using log4net;
34using OpenMetaverse; 32using OpenMetaverse;
35using OpenSim.Framework; 33using OpenSim.Framework;
36using OpenSim.Region.Framework.Interfaces; 34using OpenSim.Region.Framework.Interfaces;
35using System.Data;
36using Npgsql;
37using NpgsqlTypes;
37 38
38namespace OpenSim.Data.MSSQL 39namespace OpenSim.Data.PGSQL
39{ 40{
40 public class MSSQLEstateStore : IEstateDataStore 41 public class PGSQLEstateStore : IEstateDataStore
41 { 42 {
42 private const string _migrationStore = "EstateStore"; 43 private const string _migrationStore = "EstateStore";
43 44
44 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 45 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45 46
46 private MSSQLManager _Database; 47 private PGSQLManager _Database;
47 private string m_connectionString; 48 private string m_connectionString;
48 private FieldInfo[] _Fields; 49 private FieldInfo[] _Fields;
49 private Dictionary<string, FieldInfo> _FieldMap = new Dictionary<string, FieldInfo>(); 50 private Dictionary<string, FieldInfo> _FieldMap = new Dictionary<string, FieldInfo>();
50 51
51 #region Public methods 52 #region Public methods
52 53
53 public MSSQLEstateStore() 54 public PGSQLEstateStore()
54 { 55 {
55 } 56 }
56 57
57 public MSSQLEstateStore(string connectionString) 58 public PGSQLEstateStore(string connectionString)
58 { 59 {
59 Initialise(connectionString); 60 Initialise(connectionString);
60 } 61 }
61 62
63 protected virtual Assembly Assembly
64 {
65 get { return GetType().Assembly; }
66 }
67
62 /// <summary> 68 /// <summary>
63 /// Initialises the estatedata class. 69 /// Initialises the estatedata class.
64 /// </summary> 70 /// </summary>
@@ -68,11 +74,11 @@ namespace OpenSim.Data.MSSQL
68 if (!string.IsNullOrEmpty(connectionString)) 74 if (!string.IsNullOrEmpty(connectionString))
69 { 75 {
70 m_connectionString = connectionString; 76 m_connectionString = connectionString;
71 _Database = new MSSQLManager(connectionString); 77 _Database = new PGSQLManager(connectionString);
72 } 78 }
73 79
74 //Migration settings 80 //Migration settings
75 using (SqlConnection conn = new SqlConnection(m_connectionString)) 81 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
76 { 82 {
77 conn.Open(); 83 conn.Open();
78 Migration m = new Migration(conn, GetType().Assembly, "EstateStore"); 84 Migration m = new Migration(conn, GetType().Assembly, "EstateStore");
@@ -101,15 +107,17 @@ namespace OpenSim.Data.MSSQL
101 { 107 {
102 EstateSettings es = new EstateSettings(); 108 EstateSettings es = new EstateSettings();
103 109
104 string sql = "select estate_settings." + String.Join(",estate_settings.", FieldList) + " from estate_map left join estate_settings on estate_map.EstateID = estate_settings.EstateID where estate_settings.EstateID is not null and RegionID = @RegionID"; 110 string sql = "select estate_settings.\"" + String.Join("\",estate_settings.\"", FieldList) +
111 "\" from estate_map left join estate_settings on estate_map.\"EstateID\" = estate_settings.\"EstateID\" " +
112 " where estate_settings.\"EstateID\" is not null and \"RegionID\" = :RegionID";
105 113
106 bool insertEstate = false; 114 bool insertEstate = false;
107 using (SqlConnection conn = new SqlConnection(m_connectionString)) 115 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
108 using (SqlCommand cmd = new SqlCommand(sql, conn)) 116 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
109 { 117 {
110 cmd.Parameters.Add(_Database.CreateParameter("@RegionID", regionID)); 118 cmd.Parameters.Add(_Database.CreateParameter("RegionID", regionID));
111 conn.Open(); 119 conn.Open();
112 using (SqlDataReader reader = cmd.ExecuteReader()) 120 using (NpgsqlDataReader reader = cmd.ExecuteReader())
113 { 121 {
114 if (reader.Read()) 122 if (reader.Read())
115 { 123 {
@@ -119,11 +127,15 @@ namespace OpenSim.Data.MSSQL
119 object v = reader[name]; 127 object v = reader[name];
120 if (f.FieldType == typeof(bool)) 128 if (f.FieldType == typeof(bool))
121 { 129 {
122 f.SetValue(es, Convert.ToInt32(v) != 0); 130 f.SetValue(es, v);
123 } 131 }
124 else if (f.FieldType == typeof(UUID)) 132 else if (f.FieldType == typeof(UUID))
125 { 133 {
126 f.SetValue(es, new UUID((Guid)v)); // uuid); 134 UUID estUUID = UUID.Zero;
135
136 UUID.TryParse(v.ToString(), out estUUID);
137
138 f.SetValue(es, estUUID);
127 } 139 }
128 else if (f.FieldType == typeof(string)) 140 else if (f.FieldType == typeof(string))
129 { 141 {
@@ -187,25 +199,37 @@ namespace OpenSim.Data.MSSQL
187 199
188 names.Remove("EstateID"); 200 names.Remove("EstateID");
189 201
190 string sql = string.Format("insert into estate_settings ({0}) values ( @{1})", String.Join(",", names.ToArray()), String.Join(", @", names.ToArray())); 202 string sql = string.Format("insert into estate_settings (\"{0}\") values ( :{1} )", String.Join("\",\"", names.ToArray()), String.Join(", :", names.ToArray()));
191 203
192 //_Log.Debug("[DB ESTATE]: SQL: " + sql); 204 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
193 using (SqlConnection conn = new SqlConnection(m_connectionString)) 205 using (NpgsqlCommand insertCommand = new NpgsqlCommand(sql, conn))
194 using (SqlCommand insertCommand = new SqlCommand(sql, conn))
195 { 206 {
196 insertCommand.CommandText = sql + " SET @ID = SCOPE_IDENTITY()"; 207 insertCommand.CommandText = sql;
197 208
198 foreach (string name in names) 209 foreach (string name in names)
199 { 210 {
200 insertCommand.Parameters.Add(_Database.CreateParameter("@" + name, _FieldMap[name].GetValue(es))); 211 insertCommand.Parameters.Add(_Database.CreateParameter("" + name, _FieldMap[name].GetValue(es)));
201 } 212 }
202 SqlParameter idParameter = new SqlParameter("@ID", SqlDbType.Int); 213 //NpgsqlParameter idParameter = new NpgsqlParameter("ID", SqlDbType.Int);
203 idParameter.Direction = ParameterDirection.Output; 214 //idParameter.Direction = ParameterDirection.Output;
204 insertCommand.Parameters.Add(idParameter); 215 //insertCommand.Parameters.Add(idParameter);
205 conn.Open(); 216 conn.Open();
206 insertCommand.ExecuteNonQuery();
207 217
208 es.EstateID = Convert.ToUInt32(idParameter.Value); 218 es.EstateID = 100;
219
220 if (insertCommand.ExecuteNonQuery() > 0)
221 {
222 insertCommand.CommandText = "Select cast(lastval() as int) as ID ;";
223
224 using (NpgsqlDataReader result = insertCommand.ExecuteReader())
225 {
226 if (result.Read())
227 {
228 es.EstateID = (uint)result.GetInt32(0);
229 }
230 }
231 }
232
209 } 233 }
210 234
211 //TODO check if this is needed?? 235 //TODO check if this is needed??
@@ -225,20 +249,20 @@ namespace OpenSim.Data.MSSQL
225 string sql = string.Format("UPDATE estate_settings SET "); 249 string sql = string.Format("UPDATE estate_settings SET ");
226 foreach (string name in names) 250 foreach (string name in names)
227 { 251 {
228 sql += name + " = @" + name + ", "; 252 sql += "\"" + name + "\" = :" + name + ", ";
229 } 253 }
230 sql = sql.Remove(sql.LastIndexOf(",")); 254 sql = sql.Remove(sql.LastIndexOf(","));
231 sql += " WHERE EstateID = @EstateID"; 255 sql += " WHERE \"EstateID\" = :EstateID";
232 256
233 using (SqlConnection conn = new SqlConnection(m_connectionString)) 257 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
234 using (SqlCommand cmd = new SqlCommand(sql, conn)) 258 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
235 { 259 {
236 foreach (string name in names) 260 foreach (string name in names)
237 { 261 {
238 cmd.Parameters.Add(_Database.CreateParameter("@" + name, _FieldMap[name].GetValue(es))); 262 cmd.Parameters.Add(_Database.CreateParameter("" + name, _FieldMap[name].GetValue(es)));
239 } 263 }
240 264
241 cmd.Parameters.Add(_Database.CreateParameter("@EstateID", es.EstateID)); 265 cmd.Parameters.Add(_Database.CreateParameter("EstateID", es.EstateID));
242 conn.Open(); 266 conn.Open();
243 cmd.ExecuteNonQuery(); 267 cmd.ExecuteNonQuery();
244 } 268 }
@@ -262,16 +286,16 @@ namespace OpenSim.Data.MSSQL
262 { 286 {
263 es.ClearBans(); 287 es.ClearBans();
264 288
265 string sql = "select bannedUUID from estateban where EstateID = @EstateID"; 289 string sql = "select \"bannedUUID\" from estateban where \"EstateID\" = :EstateID";
266 290
267 using (SqlConnection conn = new SqlConnection(m_connectionString)) 291 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
268 using (SqlCommand cmd = new SqlCommand(sql, conn)) 292 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
269 { 293 {
270 SqlParameter idParameter = new SqlParameter("@EstateID", SqlDbType.Int); 294 NpgsqlParameter idParameter = new NpgsqlParameter("EstateID", DbType.Int32);
271 idParameter.Value = es.EstateID; 295 idParameter.Value = es.EstateID;
272 cmd.Parameters.Add(idParameter); 296 cmd.Parameters.Add(idParameter);
273 conn.Open(); 297 conn.Open();
274 using (SqlDataReader reader = cmd.ExecuteReader()) 298 using (NpgsqlDataReader reader = cmd.ExecuteReader())
275 { 299 {
276 while (reader.Read()) 300 while (reader.Read())
277 { 301 {
@@ -290,14 +314,14 @@ namespace OpenSim.Data.MSSQL
290 { 314 {
291 List<UUID> uuids = new List<UUID>(); 315 List<UUID> uuids = new List<UUID>();
292 316
293 string sql = string.Format("select uuid from {0} where EstateID = @EstateID", table); 317 string sql = string.Format("select uuid from {0} where \"EstateID\" = :EstateID", table);
294 318
295 using (SqlConnection conn = new SqlConnection(m_connectionString)) 319 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
296 using (SqlCommand cmd = new SqlCommand(sql, conn)) 320 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
297 { 321 {
298 cmd.Parameters.Add(_Database.CreateParameter("@EstateID", estateID)); 322 cmd.Parameters.Add(_Database.CreateParameter("EstateID", estateID));
299 conn.Open(); 323 conn.Open();
300 using (SqlDataReader reader = cmd.ExecuteReader()) 324 using (NpgsqlDataReader reader = cmd.ExecuteReader())
301 { 325 {
302 while (reader.Read()) 326 while (reader.Read())
303 { 327 {
@@ -312,21 +336,21 @@ namespace OpenSim.Data.MSSQL
312 private void SaveBanList(EstateSettings es) 336 private void SaveBanList(EstateSettings es)
313 { 337 {
314 //Delete first 338 //Delete first
315 using (SqlConnection conn = new SqlConnection(m_connectionString)) 339 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
316 { 340 {
317 conn.Open(); 341 conn.Open();
318 using (SqlCommand cmd = conn.CreateCommand()) 342 using (NpgsqlCommand cmd = conn.CreateCommand())
319 { 343 {
320 cmd.CommandText = "delete from estateban where EstateID = @EstateID"; 344 cmd.CommandText = "delete from estateban where \"EstateID\" = :EstateID";
321 cmd.Parameters.AddWithValue("@EstateID", (int)es.EstateID); 345 cmd.Parameters.AddWithValue("EstateID", (int)es.EstateID);
322 cmd.ExecuteNonQuery(); 346 cmd.ExecuteNonQuery();
323 347
324 //Insert after 348 //Insert after
325 cmd.CommandText = "insert into estateban (EstateID, bannedUUID,bannedIp, bannedIpHostMask, bannedNameMask) values ( @EstateID, @bannedUUID, '','','' )"; 349 cmd.CommandText = "insert into estateban (\"EstateID\", \"bannedUUID\",\"bannedIp\", \"bannedIpHostMask\", \"bannedNameMask\") values ( :EstateID, :bannedUUID, '','','' )";
326 cmd.Parameters.AddWithValue("@bannedUUID", Guid.Empty); 350 cmd.Parameters.AddWithValue("bannedUUID", Guid.Empty);
327 foreach (EstateBan b in es.EstateBans) 351 foreach (EstateBan b in es.EstateBans)
328 { 352 {
329 cmd.Parameters["@bannedUUID"].Value = b.BannedUserID.Guid; 353 cmd.Parameters["bannedUUID"].Value = b.BannedUserID.Guid;
330 cmd.ExecuteNonQuery(); 354 cmd.ExecuteNonQuery();
331 } 355 }
332 } 356 }
@@ -335,20 +359,20 @@ namespace OpenSim.Data.MSSQL
335 359
336 private void SaveUUIDList(uint estateID, string table, UUID[] data) 360 private void SaveUUIDList(uint estateID, string table, UUID[] data)
337 { 361 {
338 using (SqlConnection conn = new SqlConnection(m_connectionString)) 362 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
339 { 363 {
340 conn.Open(); 364 conn.Open();
341 using (SqlCommand cmd = conn.CreateCommand()) 365 using (NpgsqlCommand cmd = conn.CreateCommand())
342 { 366 {
343 cmd.Parameters.AddWithValue("@EstateID", (int)estateID); 367 cmd.Parameters.AddWithValue("EstateID", (int)estateID);
344 cmd.CommandText = string.Format("delete from {0} where EstateID = @EstateID", table); 368 cmd.CommandText = string.Format("delete from {0} where \"EstateID\" = :EstateID", table);
345 cmd.ExecuteNonQuery(); 369 cmd.ExecuteNonQuery();
346 370
347 cmd.CommandText = string.Format("insert into {0} (EstateID, uuid) values ( @EstateID, @uuid )", table); 371 cmd.CommandText = string.Format("insert into {0} (\"EstateID\", uuid) values ( :EstateID, :uuid )", table);
348 cmd.Parameters.AddWithValue("@uuid", Guid.Empty); 372 cmd.Parameters.AddWithValue("uuid", Guid.Empty);
349 foreach (UUID uuid in data) 373 foreach (UUID uuid in data)
350 { 374 {
351 cmd.Parameters["@uuid"].Value = uuid.Guid; //.ToString(); //TODO check if this works 375 cmd.Parameters["uuid"].Value = uuid.Guid; //.ToString(); //TODO check if this works
352 cmd.ExecuteNonQuery(); 376 cmd.ExecuteNonQuery();
353 } 377 }
354 } 378 }
@@ -358,14 +382,14 @@ namespace OpenSim.Data.MSSQL
358 public EstateSettings LoadEstateSettings(int estateID) 382 public EstateSettings LoadEstateSettings(int estateID)
359 { 383 {
360 EstateSettings es = new EstateSettings(); 384 EstateSettings es = new EstateSettings();
361 string sql = "select estate_settings." + String.Join(",estate_settings.", FieldList) + " from estate_settings where EstateID = @EstateID"; 385 string sql = "select estate_settings.\"" + String.Join("\",estate_settings.\"", FieldList) + "\" from estate_settings where \"EstateID\" = :EstateID";
362 using (SqlConnection conn = new SqlConnection(m_connectionString)) 386 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
363 { 387 {
364 conn.Open(); 388 conn.Open();
365 using (SqlCommand cmd = new SqlCommand(sql, conn)) 389 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
366 { 390 {
367 cmd.Parameters.AddWithValue("@EstateID", (int)estateID); 391 cmd.Parameters.AddWithValue("EstateID", (int)estateID);
368 using (SqlDataReader reader = cmd.ExecuteReader()) 392 using (NpgsqlDataReader reader = cmd.ExecuteReader())
369 { 393 {
370 if (reader.Read()) 394 if (reader.Read())
371 { 395 {
@@ -428,13 +452,13 @@ namespace OpenSim.Data.MSSQL
428 public List<int> GetEstates(string search) 452 public List<int> GetEstates(string search)
429 { 453 {
430 List<int> result = new List<int>(); 454 List<int> result = new List<int>();
431 string sql = "select estateID from estate_settings where EstateName = @EstateName"; 455 string sql = "select \"EstateID\" from estate_settings where lower(\"EstateName\") = lower(:EstateName)";
432 using (SqlConnection conn = new SqlConnection(m_connectionString)) 456 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
433 { 457 {
434 conn.Open(); 458 conn.Open();
435 using (SqlCommand cmd = new SqlCommand(sql, conn)) 459 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
436 { 460 {
437 cmd.Parameters.AddWithValue("@EstateName", search); 461 cmd.Parameters.AddWithValue("EstateName", search);
438 462
439 using (IDataReader reader = cmd.ExecuteReader()) 463 using (IDataReader reader = cmd.ExecuteReader())
440 { 464 {
@@ -453,11 +477,11 @@ namespace OpenSim.Data.MSSQL
453 public List<int> GetEstatesAll() 477 public List<int> GetEstatesAll()
454 { 478 {
455 List<int> result = new List<int>(); 479 List<int> result = new List<int>();
456 string sql = "select estateID from estate_settings"; 480 string sql = "select \"EstateID\" from estate_settings";
457 using (SqlConnection conn = new SqlConnection(m_connectionString)) 481 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
458 { 482 {
459 conn.Open(); 483 conn.Open();
460 using (SqlCommand cmd = new SqlCommand(sql, conn)) 484 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
461 { 485 {
462 using (IDataReader reader = cmd.ExecuteReader()) 486 using (IDataReader reader = cmd.ExecuteReader())
463 { 487 {
@@ -476,13 +500,13 @@ namespace OpenSim.Data.MSSQL
476 public List<int> GetEstatesByOwner(UUID ownerID) 500 public List<int> GetEstatesByOwner(UUID ownerID)
477 { 501 {
478 List<int> result = new List<int>(); 502 List<int> result = new List<int>();
479 string sql = "select estateID from estate_settings where EstateOwner = @EstateOwner"; 503 string sql = "select \"EstateID\" from estate_settings where \"EstateOwner\" = :EstateOwner";
480 using (SqlConnection conn = new SqlConnection(m_connectionString)) 504 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
481 { 505 {
482 conn.Open(); 506 conn.Open();
483 using (SqlCommand cmd = new SqlCommand(sql, conn)) 507 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
484 { 508 {
485 cmd.Parameters.AddWithValue("@EstateOwner", ownerID); 509 cmd.Parameters.AddWithValue("EstateOwner", ownerID);
486 510
487 using (IDataReader reader = cmd.ExecuteReader()) 511 using (IDataReader reader = cmd.ExecuteReader())
488 { 512 {
@@ -500,28 +524,29 @@ namespace OpenSim.Data.MSSQL
500 524
501 public bool LinkRegion(UUID regionID, int estateID) 525 public bool LinkRegion(UUID regionID, int estateID)
502 { 526 {
503 string deleteSQL = "delete from estate_map where RegionID = @RegionID"; 527 string deleteSQL = "delete from estate_map where \"RegionID\" = :RegionID";
504 string insertSQL = "insert into estate_map values (@RegionID, @EstateID)"; 528 string insertSQL = "insert into estate_map values (:RegionID, :EstateID)";
505 using (SqlConnection conn = new SqlConnection(m_connectionString)) 529 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
506 { 530 {
507 conn.Open(); 531 conn.Open();
508 SqlTransaction transaction = conn.BeginTransaction(); 532
533 NpgsqlTransaction transaction = conn.BeginTransaction();
509 534
510 try 535 try
511 { 536 {
512 using (SqlCommand cmd = new SqlCommand(deleteSQL, conn)) 537 using (NpgsqlCommand cmd = new NpgsqlCommand(deleteSQL, conn))
513 { 538 {
514 cmd.Transaction = transaction; 539 cmd.Transaction = transaction;
515 cmd.Parameters.AddWithValue("@RegionID", regionID.Guid); 540 cmd.Parameters.AddWithValue("RegionID", regionID.Guid);
516 541
517 cmd.ExecuteNonQuery(); 542 cmd.ExecuteNonQuery();
518 } 543 }
519 544
520 using (SqlCommand cmd = new SqlCommand(insertSQL, conn)) 545 using (NpgsqlCommand cmd = new NpgsqlCommand(insertSQL, conn))
521 { 546 {
522 cmd.Transaction = transaction; 547 cmd.Transaction = transaction;
523 cmd.Parameters.AddWithValue("@RegionID", regionID.Guid); 548 cmd.Parameters.AddWithValue("RegionID", regionID.Guid);
524 cmd.Parameters.AddWithValue("@EstateID", estateID); 549 cmd.Parameters.AddWithValue("EstateID", estateID);
525 550
526 int ret = cmd.ExecuteNonQuery(); 551 int ret = cmd.ExecuteNonQuery();
527 552
@@ -545,13 +570,13 @@ namespace OpenSim.Data.MSSQL
545 public List<UUID> GetRegions(int estateID) 570 public List<UUID> GetRegions(int estateID)
546 { 571 {
547 List<UUID> result = new List<UUID>(); 572 List<UUID> result = new List<UUID>();
548 string sql = "select RegionID from estate_map where EstateID = @EstateID"; 573 string sql = "select \"RegionID\" from estate_map where \"EstateID\" = :EstateID";
549 using (SqlConnection conn = new SqlConnection(m_connectionString)) 574 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
550 { 575 {
551 conn.Open(); 576 conn.Open();
552 using (SqlCommand cmd = new SqlCommand(sql, conn)) 577 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
553 { 578 {
554 cmd.Parameters.AddWithValue("@EstateID", estateID); 579 cmd.Parameters.AddWithValue("EstateID", estateID);
555 580
556 using (IDataReader reader = cmd.ExecuteReader()) 581 using (IDataReader reader = cmd.ExecuteReader())
557 { 582 {
diff --git a/OpenSim/Data/PGSQL/PGSQLFramework.cs b/OpenSim/Data/PGSQL/PGSQLFramework.cs
new file mode 100644
index 0000000..1028e4e
--- /dev/null
+++ b/OpenSim/Data/PGSQL/PGSQLFramework.cs
@@ -0,0 +1,111 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using System.Reflection;
33using OpenMetaverse;
34using OpenSim.Framework;
35using Npgsql;
36
37namespace OpenSim.Data.PGSQL
38{
39 /// <summary>
40 /// A database interface class to a user profile storage system
41 /// </summary>
42 public class PGSqlFramework
43 {
44 private static readonly log4net.ILog m_log =
45 log4net.LogManager.GetLogger(
46 System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
47
48 protected string m_connectionString;
49 protected object m_dbLock = new object();
50
51 protected PGSqlFramework(string connectionString)
52 {
53 m_connectionString = connectionString;
54 InitializeMonoSecurity();
55 }
56
57 public void InitializeMonoSecurity()
58 {
59 if (!Util.IsPlatformMono)
60 {
61
62 if (AppDomain.CurrentDomain.GetData("MonoSecurityPostgresAdded") == null)
63 {
64 AppDomain.CurrentDomain.SetData("MonoSecurityPostgresAdded", "true");
65
66 AppDomain currentDomain = AppDomain.CurrentDomain;
67 currentDomain.AssemblyResolve += new ResolveEventHandler(ResolveEventHandlerMonoSec);
68 }
69 }
70 }
71
72 private System.Reflection.Assembly ResolveEventHandlerMonoSec(object sender, ResolveEventArgs args)
73 {
74 Assembly MyAssembly = null;
75
76 if (args.Name.Substring(0, args.Name.IndexOf(",")) == "Mono.Security")
77 {
78 MyAssembly = Assembly.LoadFrom("lib/NET/Mono.Security.dll");
79 }
80
81 //Return the loaded assembly.
82 return MyAssembly;
83 }
84 //////////////////////////////////////////////////////////////
85 //
86 // All non queries are funneled through one connection
87 // to increase performance a little
88 //
89 protected int ExecuteNonQuery(NpgsqlCommand cmd)
90 {
91 lock (m_dbLock)
92 {
93 using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
94 {
95 dbcon.Open();
96 cmd.Connection = dbcon;
97
98 try
99 {
100 return cmd.ExecuteNonQuery();
101 }
102 catch (Exception e)
103 {
104 m_log.Error(e.Message, e);
105 return 0;
106 }
107 }
108 }
109 }
110 }
111}
diff --git a/OpenSim/Data/MSSQL/MSSQLFriendsData.cs b/OpenSim/Data/PGSQL/PGSQLFriendsData.cs
index fef6978..a841353 100644
--- a/OpenSim/Data/MSSQL/MSSQLFriendsData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLFriendsData.cs
@@ -1,4 +1,4 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
@@ -31,18 +31,18 @@ using System.Collections.Generic;
31using System.Data; 31using System.Data;
32using OpenMetaverse; 32using OpenMetaverse;
33using OpenSim.Framework; 33using OpenSim.Framework;
34using System.Data.SqlClient;
35using System.Reflection; 34using System.Reflection;
36using System.Text; 35using System.Text;
36using Npgsql;
37 37
38namespace OpenSim.Data.MSSQL 38namespace OpenSim.Data.PGSQL
39{ 39{
40 public class MSSQLFriendsData : MSSQLGenericTableHandler<FriendsData>, IFriendsData 40 public class PGSQLFriendsData : PGSQLGenericTableHandler<FriendsData>, IFriendsData
41 { 41 {
42 public MSSQLFriendsData(string connectionString, string realm) 42 public PGSQLFriendsData(string connectionString, string realm)
43 : base(connectionString, realm, "FriendsStore") 43 : base(connectionString, realm, "FriendsStore")
44 { 44 {
45 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 45 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
46 { 46 {
47 conn.Open(); 47 conn.Open();
48 Migration m = new Migration(conn, GetType().Assembly, "FriendsStore"); 48 Migration m = new Migration(conn, GetType().Assembly, "FriendsStore");
@@ -50,19 +50,27 @@ namespace OpenSim.Data.MSSQL
50 } 50 }
51 } 51 }
52 52
53 public bool Delete(UUID principalID, string friend) 53
54 public override bool Delete(string principalID, string friend)
54 { 55 {
55 return Delete(principalID.ToString(), friend); 56 UUID princUUID = UUID.Zero;
57
58 bool ret = UUID.TryParse(principalID, out princUUID);
59
60 if (ret)
61 return Delete(princUUID, friend);
62 else
63 return false;
56 } 64 }
57 65
58 public bool Delete(string principalID, string friend) 66 public bool Delete(UUID principalID, string friend)
59 { 67 {
60 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 68 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
61 using (SqlCommand cmd = new SqlCommand()) 69 using (NpgsqlCommand cmd = new NpgsqlCommand())
62 { 70 {
63 cmd.CommandText = String.Format("delete from {0} where PrincipalID = @PrincipalID and Friend = @Friend", m_Realm); 71 cmd.CommandText = String.Format("delete from {0} where \"PrincipalID\" = :PrincipalID and \"Friend\" = :Friend", m_Realm);
64 cmd.Parameters.Add(m_database.CreateParameter("@PrincipalID", principalID.ToString())); 72 cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID.ToString()));
65 cmd.Parameters.Add(m_database.CreateParameter("@Friend", friend)); 73 cmd.Parameters.Add(m_database.CreateParameter("Friend", friend));
66 cmd.Connection = conn; 74 cmd.Connection = conn;
67 conn.Open(); 75 conn.Open();
68 cmd.ExecuteNonQuery(); 76 cmd.ExecuteNonQuery();
@@ -71,19 +79,28 @@ namespace OpenSim.Data.MSSQL
71 } 79 }
72 } 80 }
73 81
74 public FriendsData[] GetFriends(UUID principalID) 82 public FriendsData[] GetFriends(string principalID)
75 { 83 {
76 return GetFriends(principalID.ToString()); 84 UUID princUUID = UUID.Zero;
85
86 bool ret = UUID.TryParse(principalID, out princUUID);
87
88 if (ret)
89 return GetFriends(princUUID);
90 else
91 return new FriendsData[0];
77 } 92 }
78 93
79 public FriendsData[] GetFriends(string principalID) 94 public FriendsData[] GetFriends(UUID principalID)
80 { 95 {
81 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 96 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
82 using (SqlCommand cmd = new SqlCommand()) 97 using (NpgsqlCommand cmd = new NpgsqlCommand())
83 { 98 {
84 99
85 cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID = @PrincipalID", m_Realm); 100 cmd.CommandText = String.Format("select a.*,case when b.\"Flags\" is null then '-1' else b.\"Flags\" end as \"TheirFlags\" from {0} as a " +
86 cmd.Parameters.Add(m_database.CreateParameter("@PrincipalID", principalID.ToString())); 101 " left join {0} as b on a.\"PrincipalID\" = b.\"Friend\" and a.\"Friend\" = b.\"PrincipalID\" " +
102 " where a.\"PrincipalID\" = :PrincipalID", m_Realm);
103 cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID.ToString()));
87 cmd.Connection = conn; 104 cmd.Connection = conn;
88 conn.Open(); 105 conn.Open();
89 return DoQuery(cmd); 106 return DoQuery(cmd);
@@ -92,7 +109,7 @@ namespace OpenSim.Data.MSSQL
92 109
93 public FriendsData[] GetFriends(Guid principalID) 110 public FriendsData[] GetFriends(Guid principalID)
94 { 111 {
95 return GetFriends(principalID.ToString()); 112 return GetFriends(principalID);
96 } 113 }
97 114
98 } 115 }
diff --git a/OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs b/OpenSim/Data/PGSQL/PGSQLGenericTableHandler.cs
index 4145d95..826c6fc 100644
--- a/OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs
+++ b/OpenSim/Data/PGSQL/PGSQLGenericTableHandler.cs
@@ -30,30 +30,38 @@ using System.Collections.Generic;
30using System.Data; 30using System.Data;
31using System.Reflection; 31using System.Reflection;
32using log4net; 32using log4net;
33using System.Data.SqlClient;
34using OpenMetaverse; 33using OpenMetaverse;
35using OpenSim.Framework; 34using OpenSim.Framework;
36using OpenSim.Region.Framework.Interfaces; 35using OpenSim.Region.Framework.Interfaces;
37using System.Text; 36using System.Text;
37using Npgsql;
38 38
39namespace OpenSim.Data.MSSQL 39namespace OpenSim.Data.PGSQL
40{ 40{
41 public class MSSQLGenericTableHandler<T> where T : class, new() 41 public class PGSQLGenericTableHandler<T> : PGSqlFramework where T : class, new()
42 { 42 {
43// private static readonly ILog m_log = 43 private static readonly ILog m_log =
44// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 44 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45 45
46 protected string m_ConnectionString; 46 protected string m_ConnectionString;
47 protected MSSQLManager m_database; //used for parameter type translation 47 protected PGSQLManager m_database; //used for parameter type translation
48 protected Dictionary<string, FieldInfo> m_Fields = 48 protected Dictionary<string, FieldInfo> m_Fields =
49 new Dictionary<string, FieldInfo>(); 49 new Dictionary<string, FieldInfo>();
50 50
51 protected Dictionary<string, string> m_FieldTypes = new Dictionary<string, string>();
52
51 protected List<string> m_ColumnNames = null; 53 protected List<string> m_ColumnNames = null;
52 protected string m_Realm; 54 protected string m_Realm;
53 protected FieldInfo m_DataField = null; 55 protected FieldInfo m_DataField = null;
54 56
55 public MSSQLGenericTableHandler(string connectionString, 57 protected virtual Assembly Assembly
58 {
59 get { return GetType().Assembly; }
60 }
61
62 public PGSQLGenericTableHandler(string connectionString,
56 string realm, string storeName) 63 string realm, string storeName)
64 : base(connectionString)
57 { 65 {
58 m_Realm = realm; 66 m_Realm = realm;
59 67
@@ -61,7 +69,7 @@ namespace OpenSim.Data.MSSQL
61 69
62 if (storeName != String.Empty) 70 if (storeName != String.Empty)
63 { 71 {
64 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 72 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
65 { 73 {
66 conn.Open(); 74 conn.Open();
67 Migration m = new Migration(conn, GetType().Assembly, storeName); 75 Migration m = new Migration(conn, GetType().Assembly, storeName);
@@ -69,13 +77,15 @@ namespace OpenSim.Data.MSSQL
69 } 77 }
70 78
71 } 79 }
72 m_database = new MSSQLManager(m_ConnectionString); 80 m_database = new PGSQLManager(m_ConnectionString);
73 81
74 Type t = typeof(T); 82 Type t = typeof(T);
75 FieldInfo[] fields = t.GetFields(BindingFlags.Public | 83 FieldInfo[] fields = t.GetFields(BindingFlags.Public |
76 BindingFlags.Instance | 84 BindingFlags.Instance |
77 BindingFlags.DeclaredOnly); 85 BindingFlags.DeclaredOnly);
78 86
87 LoadFieldTypes();
88
79 if (fields.Length == 0) 89 if (fields.Length == 0)
80 return; 90 return;
81 91
@@ -89,7 +99,31 @@ namespace OpenSim.Data.MSSQL
89 99
90 } 100 }
91 101
92 private void CheckColumnNames(SqlDataReader reader) 102 private void LoadFieldTypes()
103 {
104 m_FieldTypes = new Dictionary<string, string>();
105
106 string query = string.Format(@"select column_name,data_type
107 from INFORMATION_SCHEMA.COLUMNS
108 where table_name = lower('{0}');
109
110 ", m_Realm);
111 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
112 using (NpgsqlCommand cmd = new NpgsqlCommand(query, conn))
113 {
114 conn.Open();
115 using (NpgsqlDataReader rdr = cmd.ExecuteReader())
116 {
117 while (rdr.Read())
118 {
119 // query produces 0 to many rows of single column, so always add the first item in each row
120 m_FieldTypes.Add((string)rdr[0], (string)rdr[1]);
121 }
122 }
123 }
124 }
125
126 private void CheckColumnNames(NpgsqlDataReader reader)
93 { 127 {
94 if (m_ColumnNames != null) 128 if (m_ColumnNames != null)
95 return; 129 return;
@@ -97,6 +131,7 @@ namespace OpenSim.Data.MSSQL
97 m_ColumnNames = new List<string>(); 131 m_ColumnNames = new List<string>();
98 132
99 DataTable schemaTable = reader.GetSchemaTable(); 133 DataTable schemaTable = reader.GetSchemaTable();
134
100 foreach (DataRow row in schemaTable.Rows) 135 foreach (DataRow row in schemaTable.Rows)
101 { 136 {
102 if (row["ColumnName"] != null && 137 if (row["ColumnName"] != null &&
@@ -106,21 +141,37 @@ namespace OpenSim.Data.MSSQL
106 } 141 }
107 } 142 }
108 143
144 // TODO GET CONSTRAINTS FROM POSTGRESQL
109 private List<string> GetConstraints() 145 private List<string> GetConstraints()
110 { 146 {
111 List<string> constraints = new List<string>(); 147 List<string> constraints = new List<string>();
112 string query = string.Format(@"SELECT 148 string query = string.Format(@"SELECT kcu.column_name
113 COL_NAME(ic.object_id,ic.column_id) AS column_name 149 FROM information_schema.table_constraints tc
114 FROM sys.indexes AS i 150 LEFT JOIN information_schema.key_column_usage kcu
115 INNER JOIN sys.index_columns AS ic 151 ON tc.constraint_catalog = kcu.constraint_catalog
116 ON i.object_id = ic.object_id AND i.index_id = ic.index_id 152 AND tc.constraint_schema = kcu.constraint_schema
117 WHERE i.is_primary_key = 1 153 AND tc.constraint_name = kcu.constraint_name
118 AND i.object_id = OBJECT_ID('{0}');", m_Realm); 154
119 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 155 LEFT JOIN information_schema.referential_constraints rc
120 using (SqlCommand cmd = new SqlCommand(query, conn)) 156 ON tc.constraint_catalog = rc.constraint_catalog
157 AND tc.constraint_schema = rc.constraint_schema
158 AND tc.constraint_name = rc.constraint_name
159
160 LEFT JOIN information_schema.constraint_column_usage ccu
161 ON rc.unique_constraint_catalog = ccu.constraint_catalog
162 AND rc.unique_constraint_schema = ccu.constraint_schema
163 AND rc.unique_constraint_name = ccu.constraint_name
164
165 where tc.table_name = lower('{0}')
166 and lower(tc.constraint_type) in ('primary key')
167 and kcu.column_name is not null
168 ;", m_Realm);
169
170 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
171 using (NpgsqlCommand cmd = new NpgsqlCommand(query, conn))
121 { 172 {
122 conn.Open(); 173 conn.Open();
123 using (SqlDataReader rdr = cmd.ExecuteReader()) 174 using (NpgsqlDataReader rdr = cmd.ExecuteReader())
124 { 175 {
125 while (rdr.Read()) 176 while (rdr.Read())
126 { 177 {
@@ -144,14 +195,18 @@ namespace OpenSim.Data.MSSQL
144 195
145 List<string> terms = new List<string>(); 196 List<string> terms = new List<string>();
146 197
147 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 198 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
148 using (SqlCommand cmd = new SqlCommand()) 199 using (NpgsqlCommand cmd = new NpgsqlCommand())
149 { 200 {
150 201
151 for (int i = 0; i < fields.Length; i++) 202 for (int i = 0; i < fields.Length; i++)
152 { 203 {
153 cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i])); 204 if ( m_FieldTypes.ContainsKey(fields[i]) )
154 terms.Add("[" + fields[i] + "] = @" + fields[i]); 205 cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i], m_FieldTypes[fields[i]]));
206 else
207 cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i]));
208
209 terms.Add(" \"" + fields[i] + "\" = :" + fields[i]);
155 } 210 }
156 211
157 string where = String.Join(" AND ", terms.ToArray()); 212 string where = String.Join(" AND ", terms.ToArray());
@@ -166,10 +221,18 @@ namespace OpenSim.Data.MSSQL
166 } 221 }
167 } 222 }
168 223
169 protected T[] DoQuery(SqlCommand cmd) 224 protected T[] DoQuery(NpgsqlCommand cmd)
170 { 225 {
171 List<T> result = new List<T>(); 226 List<T> result = new List<T>();
172 using (SqlDataReader reader = cmd.ExecuteReader()) 227 if (cmd.Connection == null)
228 {
229 cmd.Connection = new NpgsqlConnection(m_connectionString);
230 }
231 if (cmd.Connection.State == ConnectionState.Closed)
232 {
233 cmd.Connection.Open();
234 }
235 using (NpgsqlDataReader reader = cmd.ExecuteReader())
173 { 236 {
174 if (reader == null) 237 if (reader == null)
175 return new T[0]; 238 return new T[0];
@@ -213,6 +276,7 @@ namespace OpenSim.Data.MSSQL
213 foreach (string col in m_ColumnNames) 276 foreach (string col in m_ColumnNames)
214 { 277 {
215 data[col] = reader[col].ToString(); 278 data[col] = reader[col].ToString();
279
216 if (data[col] == null) 280 if (data[col] == null)
217 data[col] = String.Empty; 281 data[col] = String.Empty;
218 } 282 }
@@ -228,16 +292,34 @@ namespace OpenSim.Data.MSSQL
228 292
229 public virtual T[] Get(string where) 293 public virtual T[] Get(string where)
230 { 294 {
231 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 295 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
232 using (SqlCommand cmd = new SqlCommand()) 296 using (NpgsqlCommand cmd = new NpgsqlCommand())
233 { 297 {
234 298
235 string query = String.Format("SELECT * FROM {0} WHERE {1}", 299 string query = String.Format("SELECT * FROM {0} WHERE {1}",
236 m_Realm, where); 300 m_Realm, where);
237 cmd.Connection = conn; 301 cmd.Connection = conn;
238 cmd.CommandText = query; 302 cmd.CommandText = query;
303 //m_log.WarnFormat("[PGSQLGenericTable]: SELECT {0} WHERE {1}", m_Realm, where);
239 304
240 //m_log.WarnFormat("[MSSQLGenericTable]: SELECT {0} WHERE {1}", m_Realm, where); 305 conn.Open();
306 return DoQuery(cmd);
307 }
308 }
309
310 public virtual T[] Get(string where, NpgsqlParameter parameter)
311 {
312 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
313 using (NpgsqlCommand cmd = new NpgsqlCommand())
314 {
315
316 string query = String.Format("SELECT * FROM {0} WHERE {1}",
317 m_Realm, where);
318 cmd.Connection = conn;
319 cmd.CommandText = query;
320 //m_log.WarnFormat("[PGSQLGenericTable]: SELECT {0} WHERE {1}", m_Realm, where);
321
322 cmd.Parameters.Add(parameter);
241 323
242 conn.Open(); 324 conn.Open();
243 return DoQuery(cmd); 325 return DoQuery(cmd);
@@ -249,8 +331,8 @@ namespace OpenSim.Data.MSSQL
249 List<string> constraintFields = GetConstraints(); 331 List<string> constraintFields = GetConstraints();
250 List<KeyValuePair<string, string>> constraints = new List<KeyValuePair<string, string>>(); 332 List<KeyValuePair<string, string>> constraints = new List<KeyValuePair<string, string>>();
251 333
252 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 334 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
253 using (SqlCommand cmd = new SqlCommand()) 335 using (NpgsqlCommand cmd = new NpgsqlCommand())
254 { 336 {
255 337
256 StringBuilder query = new StringBuilder(); 338 StringBuilder query = new StringBuilder();
@@ -260,21 +342,24 @@ namespace OpenSim.Data.MSSQL
260 foreach (FieldInfo fi in m_Fields.Values) 342 foreach (FieldInfo fi in m_Fields.Values)
261 { 343 {
262 names.Add(fi.Name); 344 names.Add(fi.Name);
263 values.Add("@" + fi.Name); 345 values.Add(":" + fi.Name);
264 // Temporarily return more information about what field is unexpectedly null for 346 // Temporarily return more information about what field is unexpectedly null for
265 // http://opensimulator.org/mantis/view.php?id=5403. This might be due to a bug in the 347 // http://opensimulator.org/mantis/view.php?id=5403. This might be due to a bug in the
266 // InventoryTransferModule or we may be required to substitute a DBNull here. 348 // InventoryTransferModule or we may be required to substitute a DBNull here.
267 if (fi.GetValue(row) == null) 349 if (fi.GetValue(row) == null)
268 throw new NullReferenceException( 350 throw new NullReferenceException(
269 string.Format( 351 string.Format(
270 "[MSSQL GENERIC TABLE HANDLER]: Trying to store field {0} for {1} which is unexpectedly null", 352 "[PGSQL GENERIC TABLE HANDLER]: Trying to store field {0} for {1} which is unexpectedly null",
271 fi.Name, row)); 353 fi.Name, row));
272 354
273 if (constraintFields.Count > 0 && constraintFields.Contains(fi.Name)) 355 if (constraintFields.Count > 0 && constraintFields.Contains(fi.Name))
274 { 356 {
275 constraints.Add(new KeyValuePair<string, string>(fi.Name, fi.GetValue(row).ToString())); 357 constraints.Add(new KeyValuePair<string, string>(fi.Name, fi.GetValue(row).ToString() ));
276 } 358 }
277 cmd.Parameters.Add(m_database.CreateParameter(fi.Name, fi.GetValue(row).ToString())); 359 if (m_FieldTypes.ContainsKey(fi.Name))
360 cmd.Parameters.Add(m_database.CreateParameter(fi.Name, fi.GetValue(row), m_FieldTypes[fi.Name]));
361 else
362 cmd.Parameters.Add(m_database.CreateParameter(fi.Name, fi.GetValue(row)));
278 } 363 }
279 364
280 if (m_DataField != null) 365 if (m_DataField != null)
@@ -289,8 +374,12 @@ namespace OpenSim.Data.MSSQL
289 constraints.Add(new KeyValuePair<string, string>(kvp.Key, kvp.Key)); 374 constraints.Add(new KeyValuePair<string, string>(kvp.Key, kvp.Key));
290 } 375 }
291 names.Add(kvp.Key); 376 names.Add(kvp.Key);
292 values.Add("@" + kvp.Key); 377 values.Add(":" + kvp.Key);
293 cmd.Parameters.Add(m_database.CreateParameter("@" + kvp.Key, kvp.Value)); 378
379 if (m_FieldTypes.ContainsKey(kvp.Key))
380 cmd.Parameters.Add(m_database.CreateParameter("" + kvp.Key, kvp.Value, m_FieldTypes[kvp.Key]));
381 else
382 cmd.Parameters.Add(m_database.CreateParameter("" + kvp.Key, kvp.Value));
294 } 383 }
295 384
296 } 385 }
@@ -299,15 +388,15 @@ namespace OpenSim.Data.MSSQL
299 int i = 0; 388 int i = 0;
300 for (i = 0; i < names.Count - 1; i++) 389 for (i = 0; i < names.Count - 1; i++)
301 { 390 {
302 query.AppendFormat("[{0}] = {1}, ", names[i], values[i]); 391 query.AppendFormat("\"{0}\" = {1}, ", names[i], values[i]);
303 } 392 }
304 query.AppendFormat("[{0}] = {1} ", names[i], values[i]); 393 query.AppendFormat("\"{0}\" = {1} ", names[i], values[i]);
305 if (constraints.Count > 0) 394 if (constraints.Count > 0)
306 { 395 {
307 List<string> terms = new List<string>(); 396 List<string> terms = new List<string>();
308 for (int j = 0; j < constraints.Count; j++) 397 for (int j = 0; j < constraints.Count; j++)
309 { 398 {
310 terms.Add(" [" + constraints[j].Key + "] = @" + constraints[j].Key); 399 terms.Add(String.Format(" \"{0}\" = :{0}", constraints[j].Key));
311 } 400 }
312 string where = String.Join(" AND ", terms.ToArray()); 401 string where = String.Join(" AND ", terms.ToArray());
313 query.AppendFormat(" WHERE {0} ", where); 402 query.AppendFormat(" WHERE {0} ", where);
@@ -319,7 +408,7 @@ namespace OpenSim.Data.MSSQL
319 conn.Open(); 408 conn.Open();
320 if (cmd.ExecuteNonQuery() > 0) 409 if (cmd.ExecuteNonQuery() > 0)
321 { 410 {
322 //m_log.WarnFormat("[MSSQLGenericTable]: Updating {0}", m_Realm); 411 //m_log.WarnFormat("[PGSQLGenericTable]: Updating {0}", m_Realm);
323 return true; 412 return true;
324 } 413 }
325 else 414 else
@@ -327,12 +416,14 @@ namespace OpenSim.Data.MSSQL
327 // assume record has not yet been inserted 416 // assume record has not yet been inserted
328 417
329 query = new StringBuilder(); 418 query = new StringBuilder();
330 query.AppendFormat("INSERT INTO {0} ([", m_Realm); 419 query.AppendFormat("INSERT INTO {0} (\"", m_Realm);
331 query.Append(String.Join("],[", names.ToArray())); 420 query.Append(String.Join("\",\"", names.ToArray()));
332 query.Append("]) values (" + String.Join(",", values.ToArray()) + ")"); 421 query.Append("\") values (" + String.Join(",", values.ToArray()) + ")");
333 cmd.Connection = conn; 422 cmd.Connection = conn;
334 cmd.CommandText = query.ToString(); 423 cmd.CommandText = query.ToString();
335 //m_log.WarnFormat("[MSSQLGenericTable]: Inserting into {0}", m_Realm); 424
425 // m_log.WarnFormat("[PGSQLGenericTable]: Inserting into {0} sql {1}", m_Realm, cmd.CommandText);
426
336 if (conn.State != ConnectionState.Open) 427 if (conn.State != ConnectionState.Open)
337 conn.Open(); 428 conn.Open();
338 if (cmd.ExecuteNonQuery() > 0) 429 if (cmd.ExecuteNonQuery() > 0)
@@ -355,13 +446,17 @@ namespace OpenSim.Data.MSSQL
355 446
356 List<string> terms = new List<string>(); 447 List<string> terms = new List<string>();
357 448
358 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 449 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
359 using (SqlCommand cmd = new SqlCommand()) 450 using (NpgsqlCommand cmd = new NpgsqlCommand())
360 { 451 {
361 for (int i = 0; i < fields.Length; i++) 452 for (int i = 0; i < fields.Length; i++)
362 { 453 {
363 cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i])); 454 if (m_FieldTypes.ContainsKey(fields[i]))
364 terms.Add("[" + fields[i] + "] = @" + fields[i]); 455 cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i], m_FieldTypes[fields[i]]));
456 else
457 cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i]));
458
459 terms.Add(" \"" + fields[i] + "\" = :" + fields[i]);
365 } 460 }
366 461
367 string where = String.Join(" AND ", terms.ToArray()); 462 string where = String.Join(" AND ", terms.ToArray());
@@ -374,11 +469,69 @@ namespace OpenSim.Data.MSSQL
374 469
375 if (cmd.ExecuteNonQuery() > 0) 470 if (cmd.ExecuteNonQuery() > 0)
376 { 471 {
377 //m_log.Warn("[MSSQLGenericTable]: " + deleteCommand); 472 //m_log.Warn("[PGSQLGenericTable]: " + deleteCommand);
378 return true; 473 return true;
379 } 474 }
380 return false; 475 return false;
381 } 476 }
382 } 477 }
478 public long GetCount(string field, string key)
479 {
480 return GetCount(new string[] { field }, new string[] { key });
481 }
482
483 public long GetCount(string[] fields, string[] keys)
484 {
485 if (fields.Length != keys.Length)
486 return 0;
487
488 List<string> terms = new List<string>();
489
490 using (NpgsqlCommand cmd = new NpgsqlCommand())
491 {
492 for (int i = 0; i < fields.Length; i++)
493 {
494 cmd.Parameters.AddWithValue(fields[i], keys[i]);
495 terms.Add("\"" + fields[i] + "\" = :" + fields[i]);
496 }
497
498 string where = String.Join(" and ", terms.ToArray());
499
500 string query = String.Format("select count(*) from {0} where {1}",
501 m_Realm, where);
502
503 cmd.CommandText = query;
504
505 Object result = DoQueryScalar(cmd);
506
507 return Convert.ToInt64(result);
508 }
509 }
510
511 public long GetCount(string where)
512 {
513 using (NpgsqlCommand cmd = new NpgsqlCommand())
514 {
515 string query = String.Format("select count(*) from {0} where {1}",
516 m_Realm, where);
517
518 cmd.CommandText = query;
519
520 object result = DoQueryScalar(cmd);
521
522 return Convert.ToInt64(result);
523 }
524 }
525
526 public object DoQueryScalar(NpgsqlCommand cmd)
527 {
528 using (NpgsqlConnection dbcon = new NpgsqlConnection(m_ConnectionString))
529 {
530 dbcon.Open();
531 cmd.Connection = dbcon;
532
533 return cmd.ExecuteScalar();
534 }
535 }
383 } 536 }
384} 537}
diff --git a/OpenSim/Data/MSSQL/MSSQLGridUserData.cs b/OpenSim/Data/PGSQL/PGSQLGridUserData.cs
index 9e215f9..89319f3 100644
--- a/OpenSim/Data/MSSQL/MSSQLGridUserData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLGridUserData.cs
@@ -33,24 +33,23 @@ using System.Threading;
33using log4net; 33using log4net;
34using OpenMetaverse; 34using OpenMetaverse;
35using OpenSim.Framework; 35using OpenSim.Framework;
36using System.Data.SqlClient;
37 36
38namespace OpenSim.Data.MSSQL 37namespace OpenSim.Data.PGSQL
39{ 38{
40 /// <summary> 39 /// <summary>
41 /// A MSSQL Interface for Avatar Storage 40 /// A PGSQL Interface for Avatar Storage
42 /// </summary> 41 /// </summary>
43 public class MSSQLGridUserData : MSSQLGenericTableHandler<GridUserData>, 42 public class PGSQLGridUserData : PGSQLGenericTableHandler<GridUserData>,
44 IGridUserData 43 IGridUserData
45 { 44 {
46// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 45// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 46
48 public MSSQLGridUserData(string connectionString, string realm) : 47 public PGSQLGridUserData(string connectionString, string realm) :
49 base(connectionString, realm, "GridUserStore") 48 base(connectionString, realm, "GridUserStore")
50 { 49 {
51 } 50 }
52 51
53 public GridUserData Get(string userID) 52 public new GridUserData Get(string userID)
54 { 53 {
55 GridUserData[] ret = Get("UserID", userID); 54 GridUserData[] ret = Get("UserID", userID);
56 55
@@ -60,5 +59,10 @@ namespace OpenSim.Data.MSSQL
60 return ret[0]; 59 return ret[0];
61 } 60 }
62 61
62 public GridUserData[] GetAll(string userID)
63 {
64 return base.Get(String.Format("\"UserID\" LIKE '{0}%'", userID));
65 }
66
63 } 67 }
64} 68}
diff --git a/OpenSim/Data/PGSQL/PGSQLGroupsData.cs b/OpenSim/Data/PGSQL/PGSQLGroupsData.cs
new file mode 100755
index 0000000..e257e7c
--- /dev/null
+++ b/OpenSim/Data/PGSQL/PGSQLGroupsData.cs
@@ -0,0 +1,485 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Reflection;
32using OpenSim.Framework;
33using OpenMetaverse;
34using log4net;
35using Npgsql;
36
37namespace OpenSim.Data.PGSQL
38{
39 public class PGSQLGroupsData : IGroupsData
40 {
41 private PGSqlGroupsGroupsHandler m_Groups;
42 private PGSqlGroupsMembershipHandler m_Membership;
43 private PGSqlGroupsRolesHandler m_Roles;
44 private PGSqlGroupsRoleMembershipHandler m_RoleMembership;
45 private PGSqlGroupsInvitesHandler m_Invites;
46 private PGSqlGroupsNoticesHandler m_Notices;
47 private PGSqlGroupsPrincipalsHandler m_Principals;
48
49 public PGSQLGroupsData(string connectionString, string realm)
50 {
51 m_Groups = new PGSqlGroupsGroupsHandler(connectionString, realm + "_groups", realm + "_Store");
52 m_Membership = new PGSqlGroupsMembershipHandler(connectionString, realm + "_membership");
53 m_Roles = new PGSqlGroupsRolesHandler(connectionString, realm + "_roles");
54 m_RoleMembership = new PGSqlGroupsRoleMembershipHandler(connectionString, realm + "_rolemembership");
55 m_Invites = new PGSqlGroupsInvitesHandler(connectionString, realm + "_invites");
56 m_Notices = new PGSqlGroupsNoticesHandler(connectionString, realm + "_notices");
57 m_Principals = new PGSqlGroupsPrincipalsHandler(connectionString, realm + "_principals");
58 }
59
60 #region groups table
61 public bool StoreGroup(GroupData data)
62 {
63 return m_Groups.Store(data);
64 }
65
66 public GroupData RetrieveGroup(UUID groupID)
67 {
68 GroupData[] groups = m_Groups.Get("GroupID", groupID.ToString());
69 if (groups.Length > 0)
70 return groups[0];
71
72 return null;
73 }
74
75 public GroupData RetrieveGroup(string name)
76 {
77 GroupData[] groups = m_Groups.Get("Name", name);
78 if (groups.Length > 0)
79 return groups[0];
80
81 return null;
82 }
83
84 public GroupData[] RetrieveGroups(string pattern)
85 {
86
87 if (string.IsNullOrEmpty(pattern)) // True for where clause
88 {
89 pattern = " 1 ORDER BY lower(\"Name\") LIMIT 100";
90
91 return m_Groups.Get(pattern);
92 }
93 else
94 {
95 pattern = " \"ShowInList\" = 1 AND lower(\"Name\") LIKE lower('%" + pattern + "%') ORDER BY lower(\"Name\") LIMIT 100";
96
97 return m_Groups.Get(pattern, new NpgsqlParameter("pattern", pattern));
98 }
99 }
100
101 public bool DeleteGroup(UUID groupID)
102 {
103 return m_Groups.Delete("GroupID", groupID.ToString());
104 }
105
106 public int GroupsCount()
107 {
108 return (int)m_Groups.GetCount(" \"Location\" = \"\"");
109 }
110
111 #endregion
112
113 #region membership table
114 public MembershipData[] RetrieveMembers(UUID groupID)
115 {
116 return m_Membership.Get("GroupID", groupID.ToString());
117 }
118
119 public MembershipData RetrieveMember(UUID groupID, string pricipalID)
120 {
121 MembershipData[] m = m_Membership.Get(new string[] { "GroupID", "PrincipalID" },
122 new string[] { groupID.ToString(), pricipalID });
123 if (m != null && m.Length > 0)
124 return m[0];
125
126 return null;
127 }
128
129 public MembershipData[] RetrieveMemberships(string pricipalID)
130 {
131 return m_Membership.Get("PrincipalID", pricipalID.ToString());
132 }
133
134 public bool StoreMember(MembershipData data)
135 {
136 return m_Membership.Store(data);
137 }
138
139 public bool DeleteMember(UUID groupID, string pricipalID)
140 {
141 return m_Membership.Delete(new string[] { "GroupID", "PrincipalID" },
142 new string[] { groupID.ToString(), pricipalID });
143 }
144
145 public int MemberCount(UUID groupID)
146 {
147 return (int)m_Membership.GetCount("GroupID", groupID.ToString());
148 }
149 #endregion
150
151 #region roles table
152 public bool StoreRole(RoleData data)
153 {
154 return m_Roles.Store(data);
155 }
156
157 public RoleData RetrieveRole(UUID groupID, UUID roleID)
158 {
159 RoleData[] data = m_Roles.Get(new string[] { "GroupID", "RoleID" },
160 new string[] { groupID.ToString(), roleID.ToString() });
161
162 if (data != null && data.Length > 0)
163 return data[0];
164
165 return null;
166 }
167
168 public RoleData[] RetrieveRoles(UUID groupID)
169 {
170 //return m_Roles.RetrieveRoles(groupID);
171 return m_Roles.Get("GroupID", groupID.ToString());
172 }
173
174 public bool DeleteRole(UUID groupID, UUID roleID)
175 {
176 return m_Roles.Delete(new string[] { "GroupID", "RoleID" },
177 new string[] { groupID.ToString(), roleID.ToString() });
178 }
179
180 public int RoleCount(UUID groupID)
181 {
182 return (int)m_Roles.GetCount("GroupID", groupID.ToString());
183 }
184
185
186 #endregion
187
188 #region rolememberhip table
189 public RoleMembershipData[] RetrieveRolesMembers(UUID groupID)
190 {
191 RoleMembershipData[] data = m_RoleMembership.Get("GroupID", groupID.ToString());
192
193 return data;
194 }
195
196 public RoleMembershipData[] RetrieveRoleMembers(UUID groupID, UUID roleID)
197 {
198 RoleMembershipData[] data = m_RoleMembership.Get(new string[] { "GroupID", "RoleID" },
199 new string[] { groupID.ToString(), roleID.ToString() });
200
201 return data;
202 }
203
204 public RoleMembershipData[] RetrieveMemberRoles(UUID groupID, string principalID)
205 {
206 RoleMembershipData[] data = m_RoleMembership.Get(new string[] { "GroupID", "PrincipalID" },
207 new string[] { groupID.ToString(), principalID.ToString() });
208
209 return data;
210 }
211
212 public RoleMembershipData RetrieveRoleMember(UUID groupID, UUID roleID, string principalID)
213 {
214 RoleMembershipData[] data = m_RoleMembership.Get(new string[] { "GroupID", "RoleID", "PrincipalID" },
215 new string[] { groupID.ToString(), roleID.ToString(), principalID.ToString() });
216
217 if (data != null && data.Length > 0)
218 return data[0];
219
220 return null;
221 }
222
223 public int RoleMemberCount(UUID groupID, UUID roleID)
224 {
225 return (int)m_RoleMembership.GetCount(new string[] { "GroupID", "RoleID" },
226 new string[] { groupID.ToString(), roleID.ToString() });
227 }
228
229 public bool StoreRoleMember(RoleMembershipData data)
230 {
231 return m_RoleMembership.Store(data);
232 }
233
234 public bool DeleteRoleMember(RoleMembershipData data)
235 {
236 return m_RoleMembership.Delete(new string[] { "GroupID", "RoleID", "PrincipalID"},
237 new string[] { data.GroupID.ToString(), data.RoleID.ToString(), data.PrincipalID });
238 }
239
240 public bool DeleteMemberAllRoles(UUID groupID, string principalID)
241 {
242 return m_RoleMembership.Delete(new string[] { "GroupID", "PrincipalID" },
243 new string[] { groupID.ToString(), principalID });
244 }
245
246 #endregion
247
248 #region principals table
249 public bool StorePrincipal(PrincipalData data)
250 {
251 return m_Principals.Store(data);
252 }
253
254 public PrincipalData RetrievePrincipal(string principalID)
255 {
256 PrincipalData[] p = m_Principals.Get("PrincipalID", principalID);
257 if (p != null && p.Length > 0)
258 return p[0];
259
260 return null;
261 }
262
263 public bool DeletePrincipal(string principalID)
264 {
265 return m_Principals.Delete("PrincipalID", principalID);
266 }
267 #endregion
268
269 #region invites table
270
271 public bool StoreInvitation(InvitationData data)
272 {
273 return m_Invites.Store(data);
274 }
275
276 public InvitationData RetrieveInvitation(UUID inviteID)
277 {
278 InvitationData[] invites = m_Invites.Get("InviteID", inviteID.ToString());
279
280 if (invites != null && invites.Length > 0)
281 return invites[0];
282
283 return null;
284 }
285
286 public InvitationData RetrieveInvitation(UUID groupID, string principalID)
287 {
288 InvitationData[] invites = m_Invites.Get(new string[] { "GroupID", "PrincipalID" },
289 new string[] { groupID.ToString(), principalID });
290
291 if (invites != null && invites.Length > 0)
292 return invites[0];
293
294 return null;
295 }
296
297 public bool DeleteInvite(UUID inviteID)
298 {
299 return m_Invites.Delete("InviteID", inviteID.ToString());
300 }
301
302 public void DeleteOldInvites()
303 {
304 m_Invites.DeleteOld();
305 }
306
307 #endregion
308
309 #region notices table
310
311 public bool StoreNotice(NoticeData data)
312 {
313 return m_Notices.Store(data);
314 }
315
316 public NoticeData RetrieveNotice(UUID noticeID)
317 {
318 NoticeData[] notices = m_Notices.Get("NoticeID", noticeID.ToString());
319
320 if (notices != null && notices.Length > 0)
321 return notices[0];
322
323 return null;
324 }
325
326 public NoticeData[] RetrieveNotices(UUID groupID)
327 {
328 NoticeData[] notices = m_Notices.Get("GroupID", groupID.ToString());
329
330 return notices;
331 }
332
333 public bool DeleteNotice(UUID noticeID)
334 {
335 return m_Notices.Delete("NoticeID", noticeID.ToString());
336 }
337
338 public void DeleteOldNotices()
339 {
340 m_Notices.DeleteOld();
341 }
342
343 #endregion
344
345 #region combinations
346 public MembershipData RetrievePrincipalGroupMembership(string principalID, UUID groupID)
347 {
348 // TODO
349 return null;
350 }
351 public MembershipData[] RetrievePrincipalGroupMemberships(string principalID)
352 {
353 // TODO
354 return null;
355 }
356
357 #endregion
358 }
359
360 public class PGSqlGroupsGroupsHandler : PGSQLGenericTableHandler<GroupData>
361 {
362 protected override Assembly Assembly
363 {
364 // WARNING! Moving migrations to this assembly!!!
365 get { return GetType().Assembly; }
366 }
367
368 public PGSqlGroupsGroupsHandler(string connectionString, string realm, string store)
369 : base(connectionString, realm, store)
370 {
371 }
372
373 }
374
375 public class PGSqlGroupsMembershipHandler : PGSQLGenericTableHandler<MembershipData>
376 {
377 protected override Assembly Assembly
378 {
379 // WARNING! Moving migrations to this assembly!!!
380 get { return GetType().Assembly; }
381 }
382
383 public PGSqlGroupsMembershipHandler(string connectionString, string realm)
384 : base(connectionString, realm, string.Empty)
385 {
386 }
387
388 }
389
390 public class PGSqlGroupsRolesHandler : PGSQLGenericTableHandler<RoleData>
391 {
392 protected override Assembly Assembly
393 {
394 // WARNING! Moving migrations to this assembly!!!
395 get { return GetType().Assembly; }
396 }
397
398 public PGSqlGroupsRolesHandler(string connectionString, string realm)
399 : base(connectionString, realm, string.Empty)
400 {
401 }
402
403 }
404
405 public class PGSqlGroupsRoleMembershipHandler : PGSQLGenericTableHandler<RoleMembershipData>
406 {
407 protected override Assembly Assembly
408 {
409 // WARNING! Moving migrations to this assembly!!!
410 get { return GetType().Assembly; }
411 }
412
413 public PGSqlGroupsRoleMembershipHandler(string connectionString, string realm)
414 : base(connectionString, realm, string.Empty)
415 {
416 }
417
418 }
419
420 public class PGSqlGroupsInvitesHandler : PGSQLGenericTableHandler<InvitationData>
421 {
422 protected override Assembly Assembly
423 {
424 // WARNING! Moving migrations to this assembly!!!
425 get { return GetType().Assembly; }
426 }
427
428 public PGSqlGroupsInvitesHandler(string connectionString, string realm)
429 : base(connectionString, realm, string.Empty)
430 {
431 }
432
433 public void DeleteOld()
434 {
435
436 using (NpgsqlCommand cmd = new NpgsqlCommand())
437 {
438 cmd.CommandText = String.Format("delete from {0} where \"TMStamp\" < CURRENT_DATE - INTERVAL '2 week'", m_Realm);
439
440 ExecuteNonQuery(cmd);
441 }
442
443 }
444 }
445
446 public class PGSqlGroupsNoticesHandler : PGSQLGenericTableHandler<NoticeData>
447 {
448 protected override Assembly Assembly
449 {
450 // WARNING! Moving migrations to this assembly!!!
451 get { return GetType().Assembly; }
452 }
453
454 public PGSqlGroupsNoticesHandler(string connectionString, string realm)
455 : base(connectionString, realm, string.Empty)
456 {
457 }
458
459 public void DeleteOld()
460 {
461
462 using (NpgsqlCommand cmd = new NpgsqlCommand())
463 {
464 cmd.CommandText = String.Format("delete from {0} where \"TMStamp\" < CURRENT_DATE - INTERVAL '2 week'", m_Realm);
465
466 ExecuteNonQuery(cmd);
467 }
468
469 }
470 }
471
472 public class PGSqlGroupsPrincipalsHandler : PGSQLGenericTableHandler<PrincipalData>
473 {
474 protected override Assembly Assembly
475 {
476 // WARNING! Moving migrations to this assembly!!!
477 get { return GetType().Assembly; }
478 }
479
480 public PGSqlGroupsPrincipalsHandler(string connectionString, string realm)
481 : base(connectionString, realm, string.Empty)
482 {
483 }
484 }
485}
diff --git a/OpenSim/Data/PGSQL/PGSQLHGTravelData.cs b/OpenSim/Data/PGSQL/PGSQLHGTravelData.cs
new file mode 100644
index 0000000..c71b15f
--- /dev/null
+++ b/OpenSim/Data/PGSQL/PGSQLHGTravelData.cs
@@ -0,0 +1,80 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36using Npgsql;
37
38namespace OpenSim.Data.PGSQL
39{
40 /// <summary>
41 /// A PGSQL Interface for user grid data
42 /// </summary>
43 public class PGSQLHGTravelData : PGSQLGenericTableHandler<HGTravelingData>, IHGTravelingData
44 {
45// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
46
47 public PGSQLHGTravelData(string connectionString, string realm) : base(connectionString, realm, "HGTravelStore") { }
48
49 public HGTravelingData Get(UUID sessionID)
50 {
51 HGTravelingData[] ret = Get("SessionID", sessionID.ToString());
52
53 if (ret.Length == 0)
54 return null;
55
56 return ret[0];
57 }
58
59 public HGTravelingData[] GetSessions(UUID userID)
60 {
61 return base.Get("UserID", userID.ToString());
62 }
63
64 public bool Delete(UUID sessionID)
65 {
66 return Delete("SessionID", sessionID.ToString());
67 }
68
69 public void DeleteOld()
70 {
71 using (NpgsqlCommand cmd = new NpgsqlCommand())
72 {
73 cmd.CommandText = String.Format(@"delete from {0} where ""TMStamp"" < CURRENT_DATE - INTERVAL '2 day'", m_Realm);
74
75 ExecuteNonQuery(cmd);
76 }
77
78 }
79 }
80}
diff --git a/OpenSim/Data/MSSQL/MSSQLInventoryData.cs b/OpenSim/Data/PGSQL/PGSQLInventoryData.cs
index 961593f..c999433 100644
--- a/OpenSim/Data/MSSQL/MSSQLInventoryData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLInventoryData.cs
@@ -28,18 +28,18 @@
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Data; 30using System.Data;
31using System.Data.SqlClient;
32using System.Reflection; 31using System.Reflection;
33using log4net; 32using log4net;
34using OpenMetaverse; 33using OpenMetaverse;
35using OpenSim.Framework; 34using OpenSim.Framework;
35using Npgsql;
36 36
37namespace OpenSim.Data.MSSQL 37namespace OpenSim.Data.PGSQL
38{ 38{
39 /// <summary> 39 /// <summary>
40 /// A MSSQL interface for the inventory server 40 /// A PGSQL interface for the inventory server
41 /// </summary> 41 /// </summary>
42 public class MSSQLInventoryData : IInventoryDataPlugin 42 public class PGSQLInventoryData : IInventoryDataPlugin
43 { 43 {
44 private const string _migrationStore = "InventoryStore"; 44 private const string _migrationStore = "InventoryStore";
45 45
@@ -48,7 +48,7 @@ namespace OpenSim.Data.MSSQL
48 /// <summary> 48 /// <summary>
49 /// The database manager 49 /// The database manager
50 /// </summary> 50 /// </summary>
51 private MSSQLManager database; 51 private PGSQLManager database;
52 private string m_connectionString; 52 private string m_connectionString;
53 53
54 #region IPlugin members 54 #region IPlugin members
@@ -56,19 +56,19 @@ namespace OpenSim.Data.MSSQL
56 [Obsolete("Cannot be default-initialized!")] 56 [Obsolete("Cannot be default-initialized!")]
57 public void Initialise() 57 public void Initialise()
58 { 58 {
59 m_log.Info("[MSSQLInventoryData]: " + Name + " cannot be default-initialized!"); 59 m_log.Info("[PGSQLInventoryData]: " + Name + " cannot be default-initialized!");
60 throw new PluginNotInitialisedException(Name); 60 throw new PluginNotInitialisedException(Name);
61 } 61 }
62 62
63 /// <summary> 63 /// <summary>
64 /// Loads and initialises the MSSQL inventory storage interface 64 /// Loads and initialises the PGSQL inventory storage interface
65 /// </summary> 65 /// </summary>
66 /// <param name="connectionString">connect string</param> 66 /// <param name="connectionString">connect string</param>
67 /// <remarks>use mssql_connection.ini</remarks> 67 /// <remarks>use PGSQL_connection.ini</remarks>
68 public void Initialise(string connectionString) 68 public void Initialise(string connectionString)
69 { 69 {
70 m_connectionString = connectionString; 70 m_connectionString = connectionString;
71 database = new MSSQLManager(connectionString); 71 database = new PGSQLManager(connectionString);
72 72
73 //New migrations check of store 73 //New migrations check of store
74 database.CheckMigration(_migrationStore); 74 database.CheckMigration(_migrationStore);
@@ -80,7 +80,7 @@ namespace OpenSim.Data.MSSQL
80 /// <returns>A string containing the name of the DB provider</returns> 80 /// <returns>A string containing the name of the DB provider</returns>
81 public string Name 81 public string Name
82 { 82 {
83 get { return "MSSQL Inventory Data Interface"; } 83 get { return "PGSQL Inventory Data Interface"; }
84 } 84 }
85 85
86 /// <summary> 86 /// <summary>
@@ -158,13 +158,13 @@ namespace OpenSim.Data.MSSQL
158 /// <returns>A folder class</returns> 158 /// <returns>A folder class</returns>
159 public InventoryFolderBase getInventoryFolder(UUID folderID) 159 public InventoryFolderBase getInventoryFolder(UUID folderID)
160 { 160 {
161 string sql = "SELECT * FROM inventoryfolders WHERE folderID = @folderID"; 161 string sql = "SELECT * FROM inventoryfolders WHERE \"folderID\" = :folderID";
162 using (SqlConnection conn = new SqlConnection(m_connectionString)) 162 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
163 using (SqlCommand cmd = new SqlCommand(sql, conn)) 163 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
164 { 164 {
165 cmd.Parameters.Add(database.CreateParameter("folderID", folderID)); 165 cmd.Parameters.Add(database.CreateParameter("folderID", folderID));
166 conn.Open(); 166 conn.Open();
167 using (SqlDataReader reader = cmd.ExecuteReader()) 167 using (NpgsqlDataReader reader = cmd.ExecuteReader())
168 { 168 {
169 if (reader.Read()) 169 if (reader.Read())
170 { 170 {
@@ -200,11 +200,11 @@ namespace OpenSim.Data.MSSQL
200 if (parentID == UUID.Zero) 200 if (parentID == UUID.Zero)
201 return folders; 201 return folders;
202 202
203 string sql = "SELECT * FROM inventoryfolders WHERE parentFolderID = @parentID"; 203 string sql = "SELECT * FROM inventoryfolders WHERE \"parentFolderID\" = :parentID";
204 using (SqlConnection conn = new SqlConnection(m_connectionString)) 204 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
205 using (SqlCommand cmd = new SqlCommand(sql, conn)) 205 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
206 { 206 {
207 cmd.Parameters.Add(database.CreateParameter("@parentID", parentID)); 207 cmd.Parameters.Add(database.CreateParameter("parentID", parentID));
208 conn.Open(); 208 conn.Open();
209 folders.AddRange(getInventoryFolders(cmd)); 209 folders.AddRange(getInventoryFolders(cmd));
210 210
@@ -228,8 +228,8 @@ namespace OpenSim.Data.MSSQL
228 /// <param name="folder">Folder to create</param> 228 /// <param name="folder">Folder to create</param>
229 public void addInventoryFolder(InventoryFolderBase folder) 229 public void addInventoryFolder(InventoryFolderBase folder)
230 { 230 {
231 string sql = @"INSERT INTO inventoryfolders ([folderID], [agentID], [parentFolderID], [folderName], [type], [version]) 231 string sql = "INSERT INTO inventoryfolders (\"folderID\", \"agentID\", \"parentFolderID\", \"folderName\", type, version) " +
232 VALUES (@folderID, @agentID, @parentFolderID, @folderName, @type, @version);"; 232 " VALUES (:folderID, :agentID, :parentFolderID, :folderName, :type, :version);";
233 233
234 string folderName = folder.Name; 234 string folderName = folder.Name;
235 if (folderName.Length > 64) 235 if (folderName.Length > 64)
@@ -237,8 +237,8 @@ namespace OpenSim.Data.MSSQL
237 folderName = folderName.Substring(0, 64); 237 folderName = folderName.Substring(0, 64);
238 m_log.Warn("[INVENTORY DB]: Name field truncated from " + folder.Name.Length.ToString() + " to " + folderName.Length + " characters on add"); 238 m_log.Warn("[INVENTORY DB]: Name field truncated from " + folder.Name.Length.ToString() + " to " + folderName.Length + " characters on add");
239 } 239 }
240 using (SqlConnection conn = new SqlConnection(m_connectionString)) 240 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
241 using (SqlCommand cmd = new SqlCommand(sql, conn)) 241 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
242 { 242 {
243 cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID)); 243 cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
244 cmd.Parameters.Add(database.CreateParameter("agentID", folder.Owner)); 244 cmd.Parameters.Add(database.CreateParameter("agentID", folder.Owner));
@@ -264,12 +264,12 @@ namespace OpenSim.Data.MSSQL
264 /// <param name="folder">Folder to update</param> 264 /// <param name="folder">Folder to update</param>
265 public void updateInventoryFolder(InventoryFolderBase folder) 265 public void updateInventoryFolder(InventoryFolderBase folder)
266 { 266 {
267 string sql = @"UPDATE inventoryfolders SET agentID = @agentID, 267 string sql = @"UPDATE inventoryfolders SET ""agentID"" = :agentID,
268 parentFolderID = @parentFolderID, 268 ""parentFolderID"" = :parentFolderID,
269 folderName = @folderName, 269 ""folderName"" = :folderName,
270 type = @type, 270 type = :type,
271 version = @version 271 version = :version
272 WHERE folderID = @folderID"; 272 WHERE folderID = :folderID";
273 273
274 string folderName = folder.Name; 274 string folderName = folder.Name;
275 if (folderName.Length > 64) 275 if (folderName.Length > 64)
@@ -277,8 +277,8 @@ namespace OpenSim.Data.MSSQL
277 folderName = folderName.Substring(0, 64); 277 folderName = folderName.Substring(0, 64);
278 m_log.Warn("[INVENTORY DB]: Name field truncated from " + folder.Name.Length.ToString() + " to " + folderName.Length + " characters on update"); 278 m_log.Warn("[INVENTORY DB]: Name field truncated from " + folder.Name.Length.ToString() + " to " + folderName.Length + " characters on update");
279 } 279 }
280 using (SqlConnection conn = new SqlConnection(m_connectionString)) 280 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
281 using (SqlCommand cmd = new SqlCommand(sql, conn)) 281 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
282 { 282 {
283 cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID)); 283 cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
284 cmd.Parameters.Add(database.CreateParameter("agentID", folder.Owner)); 284 cmd.Parameters.Add(database.CreateParameter("agentID", folder.Owner));
@@ -304,9 +304,9 @@ namespace OpenSim.Data.MSSQL
304 /// <param name="folder">Folder to update</param> 304 /// <param name="folder">Folder to update</param>
305 public void moveInventoryFolder(InventoryFolderBase folder) 305 public void moveInventoryFolder(InventoryFolderBase folder)
306 { 306 {
307 string sql = @"UPDATE inventoryfolders SET parentFolderID = @parentFolderID WHERE folderID = @folderID"; 307 string sql = @"UPDATE inventoryfolders SET ""parentFolderID"" = :parentFolderID WHERE ""folderID"" = :folderID";
308 using (SqlConnection conn = new SqlConnection(m_connectionString)) 308 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
309 using (SqlCommand cmd = new SqlCommand(sql, conn)) 309 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
310 { 310 {
311 cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID)); 311 cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID));
312 cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID)); 312 cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
@@ -328,13 +328,13 @@ namespace OpenSim.Data.MSSQL
328 /// <param name="folderID">Id of folder to delete</param> 328 /// <param name="folderID">Id of folder to delete</param>
329 public void deleteInventoryFolder(UUID folderID) 329 public void deleteInventoryFolder(UUID folderID)
330 { 330 {
331 string sql = "SELECT * FROM inventoryfolders WHERE parentFolderID = @parentID"; 331 string sql = @"SELECT * FROM inventoryfolders WHERE ""parentFolderID"" = :parentID";
332 332
333 using (SqlConnection conn = new SqlConnection(m_connectionString)) 333 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
334 using (SqlCommand cmd = new SqlCommand(sql, conn)) 334 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
335 { 335 {
336 List<InventoryFolderBase> subFolders; 336 List<InventoryFolderBase> subFolders;
337 cmd.Parameters.Add(database.CreateParameter("@parentID", UUID.Zero)); 337 cmd.Parameters.Add(database.CreateParameter("parentID", UUID.Zero));
338 conn.Open(); 338 conn.Open();
339 subFolders = getFolderHierarchy(folderID, cmd); 339 subFolders = getFolderHierarchy(folderID, cmd);
340 340
@@ -363,15 +363,15 @@ namespace OpenSim.Data.MSSQL
363 /// <returns>A list containing inventory items</returns> 363 /// <returns>A list containing inventory items</returns>
364 public List<InventoryItemBase> getInventoryInFolder(UUID folderID) 364 public List<InventoryItemBase> getInventoryInFolder(UUID folderID)
365 { 365 {
366 string sql = "SELECT * FROM inventoryitems WHERE parentFolderID = @parentFolderID"; 366 string sql = @"SELECT * FROM inventoryitems WHERE ""parentFolderID"" = :parentFolderID";
367 using (SqlConnection conn = new SqlConnection(m_connectionString)) 367 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
368 using (SqlCommand cmd = new SqlCommand(sql, conn)) 368 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
369 { 369 {
370 cmd.Parameters.Add(database.CreateParameter("parentFolderID", folderID)); 370 cmd.Parameters.Add(database.CreateParameter("parentFolderID", folderID));
371 conn.Open(); 371 conn.Open();
372 List<InventoryItemBase> items = new List<InventoryItemBase>(); 372 List<InventoryItemBase> items = new List<InventoryItemBase>();
373 373
374 using (SqlDataReader reader = cmd.ExecuteReader()) 374 using (NpgsqlDataReader reader = cmd.ExecuteReader())
375 { 375 {
376 while (reader.Read()) 376 while (reader.Read())
377 { 377 {
@@ -389,13 +389,13 @@ namespace OpenSim.Data.MSSQL
389 /// <returns>An inventory item</returns> 389 /// <returns>An inventory item</returns>
390 public InventoryItemBase getInventoryItem(UUID itemID) 390 public InventoryItemBase getInventoryItem(UUID itemID)
391 { 391 {
392 string sql = "SELECT * FROM inventoryitems WHERE inventoryID = @inventoryID"; 392 string sql = @"SELECT * FROM inventoryitems WHERE ""inventoryID"" = :inventoryID";
393 using (SqlConnection conn = new SqlConnection(m_connectionString)) 393 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
394 using (SqlCommand cmd = new SqlCommand(sql, conn)) 394 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
395 { 395 {
396 cmd.Parameters.Add(database.CreateParameter("inventoryID", itemID)); 396 cmd.Parameters.Add(database.CreateParameter("inventoryID", itemID));
397 conn.Open(); 397 conn.Open();
398 using (SqlDataReader reader = cmd.ExecuteReader()) 398 using (NpgsqlDataReader reader = cmd.ExecuteReader())
399 { 399 {
400 if (reader.Read()) 400 if (reader.Read())
401 { 401 {
@@ -421,15 +421,15 @@ namespace OpenSim.Data.MSSQL
421 } 421 }
422 422
423 string sql = @"INSERT INTO inventoryitems 423 string sql = @"INSERT INTO inventoryitems
424 ([inventoryID], [assetID], [assetType], [parentFolderID], [avatarID], [inventoryName], 424 (""inventoryID"", ""assetID"", ""assetType"", ""parentFolderID"", ""avatarID"", ""inventoryName"",
425 [inventoryDescription], [inventoryNextPermissions], [inventoryCurrentPermissions], 425 ""inventoryDescription"", ""inventoryNextPermissions"", ""inventoryCurrentPermissions"",
426 [invType], [creatorID], [inventoryBasePermissions], [inventoryEveryOnePermissions], [inventoryGroupPermissions], 426 ""invType"", ""creatorID"", ""inventoryBasePermissions"", ""inventoryEveryOnePermissions"", ""inventoryGroupPermissions"",
427 [salePrice], [saleType], [creationDate], [groupID], [groupOwned], [flags]) 427 ""salePrice"", ""SaleType"", ""creationDate"", ""groupID"", ""groupOwned"", flags)
428 VALUES 428 VALUES
429 (@inventoryID, @assetID, @assetType, @parentFolderID, @avatarID, @inventoryName, @inventoryDescription, 429 (:inventoryID, :assetID, :assetType, :parentFolderID, :avatarID, :inventoryName, :inventoryDescription,
430 @inventoryNextPermissions, @inventoryCurrentPermissions, @invType, @creatorID, 430 :inventoryNextPermissions, :inventoryCurrentPermissions, :invType, :creatorID,
431 @inventoryBasePermissions, @inventoryEveryOnePermissions, @inventoryGroupPermissions, @salePrice, @saleType, 431 :inventoryBasePermissions, :inventoryEveryOnePermissions, :inventoryGroupPermissions, :SalePrice, :SaleType,
432 @creationDate, @groupID, @groupOwned, @flags)"; 432 :creationDate, :groupID, :groupOwned, :flags)";
433 433
434 string itemName = item.Name; 434 string itemName = item.Name;
435 if (item.Name.Length > 64) 435 if (item.Name.Length > 64)
@@ -445,8 +445,8 @@ namespace OpenSim.Data.MSSQL
445 m_log.Warn("[INVENTORY DB]: Description field truncated from " + item.Description.Length.ToString() + " to " + itemDesc.Length.ToString() + " characters"); 445 m_log.Warn("[INVENTORY DB]: Description field truncated from " + item.Description.Length.ToString() + " to " + itemDesc.Length.ToString() + " characters");
446 } 446 }
447 447
448 using (SqlConnection conn = new SqlConnection(m_connectionString)) 448 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
449 using (SqlCommand command = new SqlCommand(sql, conn)) 449 using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
450 { 450 {
451 command.Parameters.Add(database.CreateParameter("inventoryID", item.ID)); 451 command.Parameters.Add(database.CreateParameter("inventoryID", item.ID));
452 command.Parameters.Add(database.CreateParameter("assetID", item.AssetID)); 452 command.Parameters.Add(database.CreateParameter("assetID", item.AssetID));
@@ -462,8 +462,8 @@ namespace OpenSim.Data.MSSQL
462 command.Parameters.Add(database.CreateParameter("inventoryBasePermissions", item.BasePermissions)); 462 command.Parameters.Add(database.CreateParameter("inventoryBasePermissions", item.BasePermissions));
463 command.Parameters.Add(database.CreateParameter("inventoryEveryOnePermissions", item.EveryOnePermissions)); 463 command.Parameters.Add(database.CreateParameter("inventoryEveryOnePermissions", item.EveryOnePermissions));
464 command.Parameters.Add(database.CreateParameter("inventoryGroupPermissions", item.GroupPermissions)); 464 command.Parameters.Add(database.CreateParameter("inventoryGroupPermissions", item.GroupPermissions));
465 command.Parameters.Add(database.CreateParameter("salePrice", item.SalePrice)); 465 command.Parameters.Add(database.CreateParameter("SalePrice", item.SalePrice));
466 command.Parameters.Add(database.CreateParameter("saleType", item.SaleType)); 466 command.Parameters.Add(database.CreateParameter("SaleType", item.SaleType));
467 command.Parameters.Add(database.CreateParameter("creationDate", item.CreationDate)); 467 command.Parameters.Add(database.CreateParameter("creationDate", item.CreationDate));
468 command.Parameters.Add(database.CreateParameter("groupID", item.GroupID)); 468 command.Parameters.Add(database.CreateParameter("groupID", item.GroupID));
469 command.Parameters.Add(database.CreateParameter("groupOwned", item.GroupOwned)); 469 command.Parameters.Add(database.CreateParameter("groupOwned", item.GroupOwned));
@@ -479,9 +479,9 @@ namespace OpenSim.Data.MSSQL
479 } 479 }
480 } 480 }
481 481
482 sql = "UPDATE inventoryfolders SET version = version + 1 WHERE folderID = @folderID"; 482 sql = @"UPDATE inventoryfolders SET version = version + 1 WHERE ""folderID"" = @folderID";
483 using (SqlConnection conn = new SqlConnection(m_connectionString)) 483 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
484 using (SqlCommand command = new SqlCommand(sql, conn)) 484 using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
485 { 485 {
486 command.Parameters.Add(database.CreateParameter("folderID", item.Folder.ToString())); 486 command.Parameters.Add(database.CreateParameter("folderID", item.Folder.ToString()));
487 conn.Open(); 487 conn.Open();
@@ -502,26 +502,26 @@ namespace OpenSim.Data.MSSQL
502 /// <param name="item">Inventory item to update</param> 502 /// <param name="item">Inventory item to update</param>
503 public void updateInventoryItem(InventoryItemBase item) 503 public void updateInventoryItem(InventoryItemBase item)
504 { 504 {
505 string sql = @"UPDATE inventoryitems SET assetID = @assetID, 505 string sql = @"UPDATE inventoryitems SET ""assetID"" = :assetID,
506 assetType = @assetType, 506 ""assetType"" = :assetType,
507 parentFolderID = @parentFolderID, 507 ""parentFolderID"" = :parentFolderID,
508 avatarID = @avatarID, 508 ""avatarID"" = :avatarID,
509 inventoryName = @inventoryName, 509 ""inventoryName"" = :inventoryName,
510 inventoryDescription = @inventoryDescription, 510 ""inventoryDescription"" = :inventoryDescription,
511 inventoryNextPermissions = @inventoryNextPermissions, 511 ""inventoryNextPermissions"" = :inventoryNextPermissions,
512 inventoryCurrentPermissions = @inventoryCurrentPermissions, 512 ""inventoryCurrentPermissions"" = :inventoryCurrentPermissions,
513 invType = @invType, 513 ""invType"" = :invType,
514 creatorID = @creatorID, 514 ""creatorID"" = :creatorID,
515 inventoryBasePermissions = @inventoryBasePermissions, 515 ""inventoryBasePermissions"" = :inventoryBasePermissions,
516 inventoryEveryOnePermissions = @inventoryEveryOnePermissions, 516 ""inventoryEveryOnePermissions"" = :inventoryEveryOnePermissions,
517 inventoryGroupPermissions = @inventoryGroupPermissions, 517 ""inventoryGroupPermissions"" = :inventoryGroupPermissions,
518 salePrice = @salePrice, 518 ""salePrice"" = :SalePrice,
519 saleType = @saleType, 519 ""saleType"" = :SaleType,
520 creationDate = @creationDate, 520 ""creationDate"" = :creationDate,
521 groupID = @groupID, 521 ""groupID"" = :groupID,
522 groupOwned = @groupOwned, 522 ""groupOwned"" = :groupOwned,
523 flags = @flags 523 flags = :flags
524 WHERE inventoryID = @inventoryID"; 524 WHERE ""inventoryID"" = :inventoryID";
525 525
526 string itemName = item.Name; 526 string itemName = item.Name;
527 if (item.Name.Length > 64) 527 if (item.Name.Length > 64)
@@ -537,8 +537,8 @@ namespace OpenSim.Data.MSSQL
537 m_log.Warn("[INVENTORY DB]: Description field truncated from " + item.Description.Length.ToString() + " to " + itemDesc.Length.ToString() + " characters on update"); 537 m_log.Warn("[INVENTORY DB]: Description field truncated from " + item.Description.Length.ToString() + " to " + itemDesc.Length.ToString() + " characters on update");
538 } 538 }
539 539
540 using (SqlConnection conn = new SqlConnection(m_connectionString)) 540 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
541 using (SqlCommand command = new SqlCommand(sql, conn)) 541 using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
542 { 542 {
543 command.Parameters.Add(database.CreateParameter("inventoryID", item.ID)); 543 command.Parameters.Add(database.CreateParameter("inventoryID", item.ID));
544 command.Parameters.Add(database.CreateParameter("assetID", item.AssetID)); 544 command.Parameters.Add(database.CreateParameter("assetID", item.AssetID));
@@ -554,8 +554,8 @@ namespace OpenSim.Data.MSSQL
554 command.Parameters.Add(database.CreateParameter("inventoryBasePermissions", item.BasePermissions)); 554 command.Parameters.Add(database.CreateParameter("inventoryBasePermissions", item.BasePermissions));
555 command.Parameters.Add(database.CreateParameter("inventoryEveryOnePermissions", item.EveryOnePermissions)); 555 command.Parameters.Add(database.CreateParameter("inventoryEveryOnePermissions", item.EveryOnePermissions));
556 command.Parameters.Add(database.CreateParameter("inventoryGroupPermissions", item.GroupPermissions)); 556 command.Parameters.Add(database.CreateParameter("inventoryGroupPermissions", item.GroupPermissions));
557 command.Parameters.Add(database.CreateParameter("salePrice", item.SalePrice)); 557 command.Parameters.Add(database.CreateParameter("SalePrice", item.SalePrice));
558 command.Parameters.Add(database.CreateParameter("saleType", item.SaleType)); 558 command.Parameters.Add(database.CreateParameter("SaleType", item.SaleType));
559 command.Parameters.Add(database.CreateParameter("creationDate", item.CreationDate)); 559 command.Parameters.Add(database.CreateParameter("creationDate", item.CreationDate));
560 command.Parameters.Add(database.CreateParameter("groupID", item.GroupID)); 560 command.Parameters.Add(database.CreateParameter("groupID", item.GroupID));
561 command.Parameters.Add(database.CreateParameter("groupOwned", item.GroupOwned)); 561 command.Parameters.Add(database.CreateParameter("groupOwned", item.GroupOwned));
@@ -580,9 +580,9 @@ namespace OpenSim.Data.MSSQL
580 /// <param name="itemID">the item UUID</param> 580 /// <param name="itemID">the item UUID</param>
581 public void deleteInventoryItem(UUID itemID) 581 public void deleteInventoryItem(UUID itemID)
582 { 582 {
583 string sql = "DELETE FROM inventoryitems WHERE inventoryID=@inventoryID"; 583 string sql = @"DELETE FROM inventoryitems WHERE ""inventoryID""=:inventoryID";
584 using (SqlConnection conn = new SqlConnection(m_connectionString)) 584 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
585 using (SqlCommand cmd = new SqlCommand(sql, conn)) 585 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
586 { 586 {
587 cmd.Parameters.Add(database.CreateParameter("inventoryID", itemID)); 587 cmd.Parameters.Add(database.CreateParameter("inventoryID", itemID));
588 try 588 try
@@ -616,14 +616,14 @@ namespace OpenSim.Data.MSSQL
616 /// </returns> 616 /// </returns>
617 public List<InventoryItemBase> fetchActiveGestures(UUID avatarID) 617 public List<InventoryItemBase> fetchActiveGestures(UUID avatarID)
618 { 618 {
619 string sql = "SELECT * FROM inventoryitems WHERE avatarId = @uuid AND assetType = @assetType and flags = 1"; 619 string sql = @"SELECT * FROM inventoryitems WHERE ""avatarID"" = :uuid AND ""assetType"" = :assetType and flags = 1";
620 using (SqlConnection conn = new SqlConnection(m_connectionString)) 620 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
621 using (SqlCommand cmd = new SqlCommand(sql, conn)) 621 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
622 { 622 {
623 cmd.Parameters.Add(database.CreateParameter("uuid", avatarID)); 623 cmd.Parameters.Add(database.CreateParameter("uuid", avatarID));
624 cmd.Parameters.Add(database.CreateParameter("assetType", (int)AssetType.Gesture)); 624 cmd.Parameters.Add(database.CreateParameter("assetType", (int)AssetType.Gesture));
625 conn.Open(); 625 conn.Open();
626 using (SqlDataReader reader = cmd.ExecuteReader()) 626 using (NpgsqlDataReader reader = cmd.ExecuteReader())
627 { 627 {
628 List<InventoryItemBase> gestureList = new List<InventoryItemBase>(); 628 List<InventoryItemBase> gestureList = new List<InventoryItemBase>();
629 while (reader.Read()) 629 while (reader.Read())
@@ -644,9 +644,9 @@ namespace OpenSim.Data.MSSQL
644 /// </summary> 644 /// </summary>
645 /// <param name="folderID">the item ID</param> 645 /// <param name="folderID">the item ID</param>
646 /// <param name="connection">connection to the database</param> 646 /// <param name="connection">connection to the database</param>
647 private void DeleteItemsInFolder(UUID folderID, SqlConnection connection) 647 private void DeleteItemsInFolder(UUID folderID, NpgsqlConnection connection)
648 { 648 {
649 using (SqlCommand command = new SqlCommand("DELETE FROM inventoryitems WHERE folderID=@folderID", connection)) 649 using (NpgsqlCommand command = new NpgsqlCommand(@"DELETE FROM inventoryitems WHERE ""folderID""=:folderID", connection))
650 { 650 {
651 command.Parameters.Add(database.CreateParameter("folderID", folderID)); 651 command.Parameters.Add(database.CreateParameter("folderID", folderID));
652 652
@@ -667,9 +667,9 @@ namespace OpenSim.Data.MSSQL
667 /// <param name="parentID">parent ID.</param> 667 /// <param name="parentID">parent ID.</param>
668 /// <param name="command">SQL command/connection to database</param> 668 /// <param name="command">SQL command/connection to database</param>
669 /// <returns></returns> 669 /// <returns></returns>
670 private static List<InventoryFolderBase> getFolderHierarchy(UUID parentID, SqlCommand command) 670 private static List<InventoryFolderBase> getFolderHierarchy(UUID parentID, NpgsqlCommand command)
671 { 671 {
672 command.Parameters["@parentID"].Value = parentID.Guid; //.ToString(); 672 command.Parameters["parentID"].Value = parentID.Guid; //.ToString();
673 673
674 List<InventoryFolderBase> folders = getInventoryFolders(command); 674 List<InventoryFolderBase> folders = getInventoryFolders(command);
675 675
@@ -698,9 +698,9 @@ namespace OpenSim.Data.MSSQL
698 /// <returns></returns> 698 /// <returns></returns>
699 private List<InventoryFolderBase> getInventoryFolders(UUID parentID, UUID user) 699 private List<InventoryFolderBase> getInventoryFolders(UUID parentID, UUID user)
700 { 700 {
701 string sql = "SELECT * FROM inventoryfolders WHERE parentFolderID = @parentID AND agentID LIKE @uuid"; 701 string sql = @"SELECT * FROM inventoryfolders WHERE ""parentFolderID"" = :parentID AND ""agentID"" = :uuid";
702 using (SqlConnection conn = new SqlConnection(m_connectionString)) 702 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
703 using (SqlCommand command = new SqlCommand(sql, conn)) 703 using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
704 { 704 {
705 if (user == UUID.Zero) 705 if (user == UUID.Zero)
706 { 706 {
@@ -721,9 +721,9 @@ namespace OpenSim.Data.MSSQL
721 /// </summary> 721 /// </summary>
722 /// <param name="command">SQLcommand.</param> 722 /// <param name="command">SQLcommand.</param>
723 /// <returns></returns> 723 /// <returns></returns>
724 private static List<InventoryFolderBase> getInventoryFolders(SqlCommand command) 724 private static List<InventoryFolderBase> getInventoryFolders(NpgsqlCommand command)
725 { 725 {
726 using (SqlDataReader reader = command.ExecuteReader()) 726 using (NpgsqlDataReader reader = command.ExecuteReader())
727 { 727 {
728 728
729 List<InventoryFolderBase> items = new List<InventoryFolderBase>(); 729 List<InventoryFolderBase> items = new List<InventoryFolderBase>();
@@ -738,9 +738,9 @@ namespace OpenSim.Data.MSSQL
738 /// <summary> 738 /// <summary>
739 /// Reads a list of inventory folders returned by a query. 739 /// Reads a list of inventory folders returned by a query.
740 /// </summary> 740 /// </summary>
741 /// <param name="reader">A MSSQL Data Reader</param> 741 /// <param name="reader">A PGSQL Data Reader</param>
742 /// <returns>A List containing inventory folders</returns> 742 /// <returns>A List containing inventory folders</returns>
743 protected static InventoryFolderBase readInventoryFolder(SqlDataReader reader) 743 protected static InventoryFolderBase readInventoryFolder(NpgsqlDataReader reader)
744 { 744 {
745 try 745 try
746 { 746 {
@@ -796,7 +796,7 @@ namespace OpenSim.Data.MSSQL
796 796
797 return item; 797 return item;
798 } 798 }
799 catch (SqlException e) 799 catch (NpgsqlException e)
800 { 800 {
801 m_log.Error("[INVENTORY DB]: Error reading inventory item :" + e.Message); 801 m_log.Error("[INVENTORY DB]: Error reading inventory item :" + e.Message);
802 } 802 }
@@ -809,18 +809,18 @@ namespace OpenSim.Data.MSSQL
809 /// </summary> 809 /// </summary>
810 /// <param name="folderID">the folder UUID</param> 810 /// <param name="folderID">the folder UUID</param>
811 /// <param name="connection">connection to database</param> 811 /// <param name="connection">connection to database</param>
812 private void DeleteOneFolder(UUID folderID, SqlConnection connection) 812 private void DeleteOneFolder(UUID folderID, NpgsqlConnection connection)
813 { 813 {
814 try 814 try
815 { 815 {
816 using (SqlCommand command = new SqlCommand("DELETE FROM inventoryfolders WHERE folderID=@folderID and type=-1", connection)) 816 using (NpgsqlCommand command = new NpgsqlCommand(@"DELETE FROM inventoryfolders WHERE ""folderID""=:folderID and type=-1", connection))
817 { 817 {
818 command.Parameters.Add(database.CreateParameter("folderID", folderID)); 818 command.Parameters.Add(database.CreateParameter("folderID", folderID));
819 819
820 command.ExecuteNonQuery(); 820 command.ExecuteNonQuery();
821 } 821 }
822 } 822 }
823 catch (SqlException e) 823 catch (NpgsqlException e)
824 { 824 {
825 m_log.Error("[INVENTORY DB]: Error deleting folder :" + e.Message); 825 m_log.Error("[INVENTORY DB]: Error deleting folder :" + e.Message);
826 } 826 }
diff --git a/OpenSim/Data/MSSQL/MSSQLManager.cs b/OpenSim/Data/PGSQL/PGSQLManager.cs
index 9a0015c..46f835a 100644
--- a/OpenSim/Data/MSSQL/MSSQLManager.cs
+++ b/OpenSim/Data/PGSQL/PGSQLManager.cs
@@ -28,18 +28,20 @@
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Data; 30using System.Data;
31using System.Data.SqlClient;
32using System.IO; 31using System.IO;
33using System.Reflection; 32using System.Reflection;
33using OpenSim.Framework;
34using log4net; 34using log4net;
35using OpenMetaverse; 35using OpenMetaverse;
36using Npgsql;
37using NpgsqlTypes;
36 38
37namespace OpenSim.Data.MSSQL 39namespace OpenSim.Data.PGSQL
38{ 40{
39 /// <summary> 41 /// <summary>
40 /// A management class for the MS SQL Storage Engine 42 /// A management class for the MS SQL Storage Engine
41 /// </summary> 43 /// </summary>
42 public class MSSQLManager 44 public class PGSQLManager
43 { 45 {
44// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 46// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45 47
@@ -52,9 +54,37 @@ namespace OpenSim.Data.MSSQL
52 /// Initialize the manager and set the connectionstring 54 /// Initialize the manager and set the connectionstring
53 /// </summary> 55 /// </summary>
54 /// <param name="connection"></param> 56 /// <param name="connection"></param>
55 public MSSQLManager(string connection) 57 public PGSQLManager(string connection)
56 { 58 {
57 connectionString = connection; 59 connectionString = connection;
60 InitializeMonoSecurity();
61 }
62
63 public void InitializeMonoSecurity()
64 {
65 if (!Util.IsPlatformMono)
66 {
67 if (AppDomain.CurrentDomain.GetData("MonoSecurityPostgresAdded") == null)
68 {
69 AppDomain.CurrentDomain.SetData("MonoSecurityPostgresAdded", "true");
70
71 AppDomain currentDomain = AppDomain.CurrentDomain;
72 currentDomain.AssemblyResolve += new ResolveEventHandler(ResolveEventHandlerMonoSec);
73 }
74 }
75 }
76
77 private System.Reflection.Assembly ResolveEventHandlerMonoSec(object sender, ResolveEventArgs args)
78 {
79 Assembly MyAssembly = null;
80
81 if (args.Name.Substring(0, args.Name.IndexOf(",")) == "Mono.Security")
82 {
83 MyAssembly = Assembly.LoadFrom("lib/NET/Mono.Security.dll");
84 }
85
86 //Return the loaded assembly.
87 return MyAssembly;
58 } 88 }
59 89
60 /// <summary> 90 /// <summary>
@@ -62,54 +92,97 @@ namespace OpenSim.Data.MSSQL
62 /// </summary> 92 /// </summary>
63 /// <param name="type"></param> 93 /// <param name="type"></param>
64 /// <returns></returns> 94 /// <returns></returns>
65 internal SqlDbType DbtypeFromType(Type type) 95 internal NpgsqlDbType DbtypeFromType(Type type)
66 { 96 {
67 if (type == typeof(string)) 97 if (type == typeof(string))
68 { 98 {
69 return SqlDbType.VarChar; 99 return NpgsqlDbType.Varchar;
70 } 100 }
71 if (type == typeof(double)) 101 if (type == typeof(double))
72 { 102 {
73 return SqlDbType.Float; 103 return NpgsqlDbType.Double;
74 } 104 }
75 if (type == typeof(Single)) 105 if (type == typeof(Single))
76 { 106 {
77 return SqlDbType.Float; 107 return NpgsqlDbType.Double;
78 } 108 }
79 if (type == typeof(int)) 109 if (type == typeof(int))
80 { 110 {
81 return SqlDbType.Int; 111 return NpgsqlDbType.Integer;
82 } 112 }
83 if (type == typeof(bool)) 113 if (type == typeof(bool))
84 { 114 {
85 return SqlDbType.Bit; 115 return NpgsqlDbType.Boolean;
86 } 116 }
87 if (type == typeof(UUID)) 117 if (type == typeof(UUID))
88 { 118 {
89 return SqlDbType.UniqueIdentifier; 119 return NpgsqlDbType.Uuid;
120 }
121 if (type == typeof(byte))
122 {
123 return NpgsqlDbType.Smallint;
90 } 124 }
91 if (type == typeof(sbyte)) 125 if (type == typeof(sbyte))
92 { 126 {
93 return SqlDbType.Int; 127 return NpgsqlDbType.Integer;
94 } 128 }
95 if (type == typeof(Byte[])) 129 if (type == typeof(Byte[]))
96 { 130 {
97 return SqlDbType.Image; 131 return NpgsqlDbType.Bytea;
98 } 132 }
99 if (type == typeof(uint) || type == typeof(ushort)) 133 if (type == typeof(uint) || type == typeof(ushort))
100 { 134 {
101 return SqlDbType.Int; 135 return NpgsqlDbType.Integer;
102 } 136 }
103 if (type == typeof(ulong)) 137 if (type == typeof(ulong))
104 { 138 {
105 return SqlDbType.BigInt; 139 return NpgsqlDbType.Bigint;
106 } 140 }
107 if (type == typeof(DateTime)) 141 if (type == typeof(DateTime))
108 { 142 {
109 return SqlDbType.DateTime; 143 return NpgsqlDbType.Timestamp;
110 } 144 }
111 145
112 return SqlDbType.VarChar; 146 return NpgsqlDbType.Varchar;
147 }
148
149 internal NpgsqlDbType DbtypeFromString(Type type, string PGFieldType)
150 {
151 if (PGFieldType == "")
152 {
153 return DbtypeFromType(type);
154 }
155
156 if (PGFieldType == "character varying")
157 {
158 return NpgsqlDbType.Varchar;
159 }
160 if (PGFieldType == "double precision")
161 {
162 return NpgsqlDbType.Double;
163 }
164 if (PGFieldType == "integer")
165 {
166 return NpgsqlDbType.Integer;
167 }
168 if (PGFieldType == "smallint")
169 {
170 return NpgsqlDbType.Smallint;
171 }
172 if (PGFieldType == "boolean")
173 {
174 return NpgsqlDbType.Boolean;
175 }
176 if (PGFieldType == "uuid")
177 {
178 return NpgsqlDbType.Uuid;
179 }
180 if (PGFieldType == "bytea")
181 {
182 return NpgsqlDbType.Bytea;
183 }
184
185 return DbtypeFromType(type);
113 } 186 }
114 187
115 /// <summary> 188 /// <summary>
@@ -131,7 +204,7 @@ namespace OpenSim.Data.MSSQL
131 } 204 }
132 if (valueType == typeof(bool)) 205 if (valueType == typeof(bool))
133 { 206 {
134 return (bool)value ? 1 : 0; 207 return (bool)value;
135 } 208 }
136 if (valueType == typeof(Byte[])) 209 if (valueType == typeof(Byte[]))
137 { 210 {
@@ -145,12 +218,51 @@ namespace OpenSim.Data.MSSQL
145 } 218 }
146 219
147 /// <summary> 220 /// <summary>
221 /// Create value for parameter based on PGSQL Schema
222 /// </summary>
223 /// <param name="value"></param>
224 /// <param name="PGFieldType"></param>
225 /// <returns></returns>
226 internal static object CreateParameterValue(object value, string PGFieldType)
227 {
228 if (PGFieldType == "uuid")
229 {
230 UUID uidout;
231 UUID.TryParse(value.ToString(), out uidout);
232 return uidout;
233 }
234 if (PGFieldType == "integer")
235 {
236 int intout;
237 int.TryParse(value.ToString(), out intout);
238 return intout;
239 }
240 if (PGFieldType == "boolean")
241 {
242 return (value.ToString() == "true");
243 }
244 if (PGFieldType == "timestamp with time zone")
245 {
246 return (DateTime)value;
247 }
248 if (PGFieldType == "timestamp without time zone")
249 {
250 return (DateTime)value;
251 }
252 if (PGFieldType == "double precision")
253 {
254 return (Double)value;
255 }
256 return CreateParameterValue(value);
257 }
258
259 /// <summary>
148 /// Create a parameter for a command 260 /// Create a parameter for a command
149 /// </summary> 261 /// </summary>
150 /// <param name="parameterName">Name of the parameter.</param> 262 /// <param name="parameterName">Name of the parameter.</param>
151 /// <param name="parameterObject">parameter object.</param> 263 /// <param name="parameterObject">parameter object.</param>
152 /// <returns></returns> 264 /// <returns></returns>
153 internal SqlParameter CreateParameter(string parameterName, object parameterObject) 265 internal NpgsqlParameter CreateParameter(string parameterName, object parameterObject)
154 { 266 {
155 return CreateParameter(parameterName, parameterObject, false); 267 return CreateParameter(parameterName, parameterObject, false);
156 } 268 }
@@ -162,15 +274,15 @@ namespace OpenSim.Data.MSSQL
162 /// <param name="parameterObject">parameter object.</param> 274 /// <param name="parameterObject">parameter object.</param>
163 /// <param name="parameterOut">if set to <c>true</c> parameter is a output parameter</param> 275 /// <param name="parameterOut">if set to <c>true</c> parameter is a output parameter</param>
164 /// <returns></returns> 276 /// <returns></returns>
165 internal SqlParameter CreateParameter(string parameterName, object parameterObject, bool parameterOut) 277 internal NpgsqlParameter CreateParameter(string parameterName, object parameterObject, bool parameterOut)
166 { 278 {
167 //Tweak so we dont always have to add @ sign 279 //Tweak so we dont always have to add : sign
168 if (!parameterName.StartsWith("@")) parameterName = "@" + parameterName; 280 if (parameterName.StartsWith(":")) parameterName = parameterName.Replace(":","");
169 281
170 //HACK if object is null, it is turned into a string, there are no nullable type till now 282 //HACK if object is null, it is turned into a string, there are no nullable type till now
171 if (parameterObject == null) parameterObject = ""; 283 if (parameterObject == null) parameterObject = "";
172 284
173 SqlParameter parameter = new SqlParameter(parameterName, DbtypeFromType(parameterObject.GetType())); 285 NpgsqlParameter parameter = new NpgsqlParameter(parameterName, DbtypeFromType(parameterObject.GetType()));
174 286
175 if (parameterOut) 287 if (parameterOut)
176 { 288 {
@@ -186,16 +298,39 @@ namespace OpenSim.Data.MSSQL
186 } 298 }
187 299
188 /// <summary> 300 /// <summary>
301 /// Create a parameter with PGSQL schema type
302 /// </summary>
303 /// <param name="parameterName"></param>
304 /// <param name="parameterObject"></param>
305 /// <param name="PGFieldType"></param>
306 /// <returns></returns>
307 internal NpgsqlParameter CreateParameter(string parameterName, object parameterObject, string PGFieldType)
308 {
309 //Tweak so we dont always have to add : sign
310 if (parameterName.StartsWith(":")) parameterName = parameterName.Replace(":", "");
311
312 //HACK if object is null, it is turned into a string, there are no nullable type till now
313 if (parameterObject == null) parameterObject = "";
314
315 NpgsqlParameter parameter = new NpgsqlParameter(parameterName, DbtypeFromString(parameterObject.GetType(), PGFieldType));
316
317 parameter.Direction = ParameterDirection.Input;
318 parameter.Value = CreateParameterValue(parameterObject, PGFieldType);
319
320 return parameter;
321 }
322
323 /// <summary>
189 /// Checks if we need to do some migrations to the database 324 /// Checks if we need to do some migrations to the database
190 /// </summary> 325 /// </summary>
191 /// <param name="migrationStore">migrationStore.</param> 326 /// <param name="migrationStore">migrationStore.</param>
192 public void CheckMigration(string migrationStore) 327 public void CheckMigration(string migrationStore)
193 { 328 {
194 using (SqlConnection connection = new SqlConnection(connectionString)) 329 using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
195 { 330 {
196 connection.Open(); 331 connection.Open();
197 Assembly assem = GetType().Assembly; 332 Assembly assem = GetType().Assembly;
198 MSSQLMigration migration = new MSSQLMigration(connection, assem, migrationStore); 333 PGSQLMigration migration = new PGSQLMigration(connection, assem, migrationStore);
199 334
200 migration.Update(); 335 migration.Update();
201 } 336 }
diff --git a/OpenSim/Data/MSSQL/MSSQLMigration.cs b/OpenSim/Data/PGSQL/PGSQLMigration.cs
index c2fecef..709fde0 100644
--- a/OpenSim/Data/MSSQL/MSSQLMigration.cs
+++ b/OpenSim/Data/PGSQL/PGSQLMigration.cs
@@ -25,22 +25,22 @@
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28using Npgsql;
28using System; 29using System;
29using System.Data; 30using System.Data;
30using System.Data.Common; 31using System.Data.Common;
31using System.Reflection; 32using System.Reflection;
32using System.Data.SqlClient;
33 33
34namespace OpenSim.Data.MSSQL 34namespace OpenSim.Data.PGSQL
35{ 35{
36 public class MSSQLMigration : Migration 36 public class PGSQLMigration : Migration
37 { 37 {
38 public MSSQLMigration(DbConnection conn, Assembly assem, string type) 38 public PGSQLMigration(NpgsqlConnection conn, Assembly assem, string type)
39 : base(conn, assem, type) 39 : base(conn, assem, type)
40 { 40 {
41 } 41 }
42 42
43 public MSSQLMigration(DbConnection conn, Assembly assem, string subtype, string type) 43 public PGSQLMigration(NpgsqlConnection conn, Assembly assem, string subtype, string type)
44 : base(conn, assem, subtype, type) 44 : base(conn, assem, subtype, type)
45 { 45 {
46 } 46 }
@@ -48,12 +48,15 @@ namespace OpenSim.Data.MSSQL
48 protected override int FindVersion(DbConnection conn, string type) 48 protected override int FindVersion(DbConnection conn, string type)
49 { 49 {
50 int version = 0; 50 int version = 0;
51 using (DbCommand cmd = conn.CreateCommand()) 51 NpgsqlConnection lcConn = (NpgsqlConnection)conn;
52
53 using (NpgsqlCommand cmd = lcConn.CreateCommand())
52 { 54 {
53 try 55 try
54 { 56 {
55 cmd.CommandText = "select top 1 version from migrations where name = '" + type + "' order by version desc"; //Must be 57 cmd.CommandText = "select version from migrations where name = '" + type + "' " +
56 using (IDataReader reader = cmd.ExecuteReader()) 58 " order by version desc limit 1"; //Must be
59 using (NpgsqlDataReader reader = cmd.ExecuteReader())
57 { 60 {
58 if (reader.Read()) 61 if (reader.Read())
59 { 62 {
@@ -73,7 +76,7 @@ namespace OpenSim.Data.MSSQL
73 76
74 protected override void ExecuteScript(DbConnection conn, string[] script) 77 protected override void ExecuteScript(DbConnection conn, string[] script)
75 { 78 {
76 if (!(conn is SqlConnection)) 79 if (!(conn is NpgsqlConnection))
77 { 80 {
78 base.ExecuteScript(conn, script); 81 base.ExecuteScript(conn, script);
79 return; 82 return;
@@ -83,7 +86,7 @@ namespace OpenSim.Data.MSSQL
83 { 86 {
84 try 87 try
85 { 88 {
86 using (SqlCommand cmd = new SqlCommand(sql, (SqlConnection)conn)) 89 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, (NpgsqlConnection)conn))
87 { 90 {
88 cmd.ExecuteNonQuery(); 91 cmd.ExecuteNonQuery();
89 } 92 }
diff --git a/OpenSim/Data/PGSQL/PGSQLOfflineIMData.cs b/OpenSim/Data/PGSQL/PGSQLOfflineIMData.cs
new file mode 100644
index 0000000..82e5ed8
--- /dev/null
+++ b/OpenSim/Data/PGSQL/PGSQLOfflineIMData.cs
@@ -0,0 +1,56 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Reflection;
32using OpenSim.Framework;
33using OpenMetaverse;
34using Npgsql;
35
36namespace OpenSim.Data.PGSQL
37{
38 public class PGSQLOfflineIMData : PGSQLGenericTableHandler<OfflineIMData>, IOfflineIMData
39 {
40 public PGSQLOfflineIMData(string connectionString, string realm)
41 : base(connectionString, realm, "IM_Store")
42 {
43 }
44
45 public void DeleteOld()
46 {
47 using (NpgsqlCommand cmd = new NpgsqlCommand())
48 {
49 cmd.CommandText = String.Format("delete from {0} where \"TMStamp\" < CURRENT_DATE - INTERVAL '2 week'", m_Realm);
50
51 ExecuteNonQuery(cmd);
52 }
53
54 }
55 }
56}
diff --git a/OpenSim/Data/MSSQL/MSSQLPresenceData.cs b/OpenSim/Data/PGSQL/PGSQLPresenceData.cs
index 0c71e79..0376585 100644..100755
--- a/OpenSim/Data/MSSQL/MSSQLPresenceData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLPresenceData.cs
@@ -33,27 +33,26 @@ using System.Threading;
33using log4net; 33using log4net;
34using OpenMetaverse; 34using OpenMetaverse;
35using OpenSim.Framework; 35using OpenSim.Framework;
36using System.Data.SqlClient; 36using Npgsql;
37 37
38namespace OpenSim.Data.MSSQL 38namespace OpenSim.Data.PGSQL
39{ 39{
40 /// <summary> 40 /// <summary>
41 /// A MySQL Interface for the Presence Server 41 /// A PGSQL Interface for the Presence Server
42 /// </summary> 42 /// </summary>
43 public class MSSQLPresenceData : MSSQLGenericTableHandler<PresenceData>, 43 public class PGSQLPresenceData : PGSQLGenericTableHandler<PresenceData>,
44 IPresenceData 44 IPresenceData
45 { 45 {
46// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 46// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 47
48 public MSSQLPresenceData(string connectionString, string realm) : 48 public PGSQLPresenceData(string connectionString, string realm) :
49 base(connectionString, realm, "Presence") 49 base(connectionString, realm, "Presence")
50 { 50 {
51 } 51 }
52 52
53 public PresenceData Get(UUID sessionID) 53 public PresenceData Get(UUID sessionID)
54 { 54 {
55 PresenceData[] ret = Get("SessionID", 55 PresenceData[] ret = Get("SessionID", sessionID.ToString());
56 sessionID.ToString());
57 56
58 if (ret.Length == 0) 57 if (ret.Length == 0)
59 return null; 58 return null;
@@ -63,13 +62,13 @@ namespace OpenSim.Data.MSSQL
63 62
64 public void LogoutRegionAgents(UUID regionID) 63 public void LogoutRegionAgents(UUID regionID)
65 { 64 {
66 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 65 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
67 using (SqlCommand cmd = new SqlCommand()) 66 using (NpgsqlCommand cmd = new NpgsqlCommand())
68 { 67 {
69 68
70 cmd.CommandText = String.Format("DELETE FROM {0} WHERE [RegionID]=@RegionID", m_Realm); 69 cmd.CommandText = String.Format("DELETE FROM {0} WHERE \"RegionID\" = :regionID", m_Realm);
71 70
72 cmd.Parameters.Add(m_database.CreateParameter("@RegionID", regionID.ToString())); 71 cmd.Parameters.Add(m_database.CreateParameter("RegionID", regionID));
73 cmd.Connection = conn; 72 cmd.Connection = conn;
74 conn.Open(); 73 conn.Open();
75 cmd.ExecuteNonQuery(); 74 cmd.ExecuteNonQuery();
@@ -81,17 +80,18 @@ namespace OpenSim.Data.MSSQL
81 PresenceData[] pd = Get("SessionID", sessionID.ToString()); 80 PresenceData[] pd = Get("SessionID", sessionID.ToString());
82 if (pd.Length == 0) 81 if (pd.Length == 0)
83 return false; 82 return false;
83
84 if (regionID == UUID.Zero)
85 return false;
84 86
85 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 87 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
86 using (SqlCommand cmd = new SqlCommand()) 88 using (NpgsqlCommand cmd = new NpgsqlCommand())
87 { 89 {
88 90
89 cmd.CommandText = String.Format(@"UPDATE {0} SET 91 cmd.CommandText = String.Format("UPDATE {0} SET \"RegionID\" = :regionID, \"LastSeen\" = now() WHERE \"SessionID\" = :sessionID", m_Realm);
90 [RegionID] = @RegionID
91 WHERE [SessionID] = @SessionID", m_Realm);
92 92
93 cmd.Parameters.Add(m_database.CreateParameter("@SessionID", sessionID.ToString())); 93 cmd.Parameters.Add(m_database.CreateParameter("SessionID", sessionID));
94 cmd.Parameters.Add(m_database.CreateParameter("@RegionID", regionID.ToString())); 94 cmd.Parameters.Add(m_database.CreateParameter("RegionID", regionID));
95 cmd.Connection = conn; 95 cmd.Connection = conn;
96 conn.Open(); 96 conn.Open();
97 if (cmd.ExecuteNonQuery() == 0) 97 if (cmd.ExecuteNonQuery() == 0)
@@ -102,8 +102,7 @@ namespace OpenSim.Data.MSSQL
102 102
103 public bool VerifyAgent(UUID agentId, UUID secureSessionID) 103 public bool VerifyAgent(UUID agentId, UUID secureSessionID)
104 { 104 {
105 PresenceData[] ret = Get("SecureSessionID", 105 PresenceData[] ret = Get("SecureSessionID", secureSessionID.ToString());
106 secureSessionID.ToString());
107 106
108 if (ret.Length == 0) 107 if (ret.Length == 0)
109 return false; 108 return false;
diff --git a/OpenSim/Data/MSSQL/MSSQLRegionData.cs b/OpenSim/Data/PGSQL/PGSQLRegionData.cs
index 0d89706..b3076f0 100644
--- a/OpenSim/Data/MSSQL/MSSQLRegionData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLRegionData.cs
@@ -28,7 +28,6 @@
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Data; 30using System.Data;
31using System.Data.SqlClient;
32using System.Drawing; 31using System.Drawing;
33using System.IO; 32using System.IO;
34using System.Reflection; 33using System.Reflection;
@@ -38,45 +37,80 @@ using OpenSim.Framework;
38using OpenSim.Region.Framework.Interfaces; 37using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes; 38using OpenSim.Region.Framework.Scenes;
40using RegionFlags = OpenSim.Framework.RegionFlags; 39using RegionFlags = OpenSim.Framework.RegionFlags;
40using Npgsql;
41 41
42namespace OpenSim.Data.MSSQL 42namespace OpenSim.Data.PGSQL
43{ 43{
44 /// <summary> 44 /// <summary>
45 /// A MSSQL Interface for the Region Server. 45 /// A PGSQL Interface for the Region Server.
46 /// </summary> 46 /// </summary>
47 public class MSSQLRegionData : IRegionData 47 public class PGSQLRegionData : IRegionData
48 { 48 {
49 private string m_Realm; 49 private string m_Realm;
50 private List<string> m_ColumnNames = null; 50 private List<string> m_ColumnNames = null;
51 private string m_ConnectionString; 51 private string m_ConnectionString;
52 private MSSQLManager m_database; 52 private PGSQLManager m_database;
53 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 53 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
54 54
55 public MSSQLRegionData(string connectionString, string realm) 55 protected Dictionary<string, string> m_FieldTypes = new Dictionary<string, string>();
56
57 protected virtual Assembly Assembly
58 {
59 get { return GetType().Assembly; }
60 }
61
62 public PGSQLRegionData(string connectionString, string realm)
56 { 63 {
57 m_Realm = realm; 64 m_Realm = realm;
58 m_ConnectionString = connectionString; 65 m_ConnectionString = connectionString;
59 m_database = new MSSQLManager(connectionString); 66 m_database = new PGSQLManager(connectionString);
60 67
61 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 68 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
62 { 69 {
63 conn.Open(); 70 conn.Open();
64 Migration m = new Migration(conn, GetType().Assembly, "GridStore"); 71 Migration m = new Migration(conn, GetType().Assembly, "GridStore");
65 m.Update(); 72 m.Update();
66 } 73 }
74 LoadFieldTypes();
67 } 75 }
68 76
77 private void LoadFieldTypes()
78 {
79 m_FieldTypes = new Dictionary<string, string>();
80
81 string query = string.Format(@"select column_name,data_type
82 from INFORMATION_SCHEMA.COLUMNS
83 where table_name = lower('{0}');
84
85 ", m_Realm);
86 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
87 using (NpgsqlCommand cmd = new NpgsqlCommand(query, conn))
88 {
89 conn.Open();
90 using (NpgsqlDataReader rdr = cmd.ExecuteReader())
91 {
92 while (rdr.Read())
93 {
94 // query produces 0 to many rows of single column, so always add the first item in each row
95 m_FieldTypes.Add((string)rdr[0], (string)rdr[1]);
96 }
97 }
98 }
99 }
100
69 public List<RegionData> Get(string regionName, UUID scopeID) 101 public List<RegionData> Get(string regionName, UUID scopeID)
70 { 102 {
71 string sql = "select * from ["+m_Realm+"] where regionName like @regionName"; 103 string sql = "select * from "+m_Realm+" where lower(\"regionName\") like lower(:regionName) ";
72 if (scopeID != UUID.Zero) 104 if (scopeID != UUID.Zero)
73 sql += " and ScopeID = @scopeID"; 105 sql += " and \"ScopeID\" = :scopeID";
74 sql += " order by regionName"; 106 sql += " order by lower(\"regionName\")";
75 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 107
76 using (SqlCommand cmd = new SqlCommand(sql, conn)) 108 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
109 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
77 { 110 {
78 cmd.Parameters.Add(m_database.CreateParameter("@regionName", regionName)); 111 cmd.Parameters.Add(m_database.CreateParameter("regionName", regionName));
79 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID)); 112 if (scopeID != UUID.Zero)
113 cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
80 conn.Open(); 114 conn.Open();
81 return RunCommand(cmd); 115 return RunCommand(cmd);
82 } 116 }
@@ -84,16 +118,17 @@ namespace OpenSim.Data.MSSQL
84 118
85 public RegionData Get(int posX, int posY, UUID scopeID) 119 public RegionData Get(int posX, int posY, UUID scopeID)
86 { 120 {
87 string sql = "select * from ["+m_Realm+"] where locX = @posX and locY = @posY"; 121 string sql = "select * from "+m_Realm+" where \"locX\" = :posX and \"locY\" = :posY";
88 if (scopeID != UUID.Zero) 122 if (scopeID != UUID.Zero)
89 sql += " and ScopeID = @scopeID"; 123 sql += " and \"ScopeID\" = :scopeID";
90 124
91 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 125 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
92 using (SqlCommand cmd = new SqlCommand(sql, conn)) 126 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
93 { 127 {
94 cmd.Parameters.Add(m_database.CreateParameter("@posX", posX.ToString())); 128 cmd.Parameters.Add(m_database.CreateParameter("posX", posX));
95 cmd.Parameters.Add(m_database.CreateParameter("@posY", posY.ToString())); 129 cmd.Parameters.Add(m_database.CreateParameter("posY", posY));
96 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID)); 130 if (scopeID != UUID.Zero)
131 cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
97 conn.Open(); 132 conn.Open();
98 List<RegionData> ret = RunCommand(cmd); 133 List<RegionData> ret = RunCommand(cmd);
99 if (ret.Count == 0) 134 if (ret.Count == 0)
@@ -105,14 +140,15 @@ namespace OpenSim.Data.MSSQL
105 140
106 public RegionData Get(UUID regionID, UUID scopeID) 141 public RegionData Get(UUID regionID, UUID scopeID)
107 { 142 {
108 string sql = "select * from ["+m_Realm+"] where uuid = @regionID"; 143 string sql = "select * from "+m_Realm+" where uuid = :regionID";
109 if (scopeID != UUID.Zero) 144 if (scopeID != UUID.Zero)
110 sql += " and ScopeID = @scopeID"; 145 sql += " and \"ScopeID\" = :scopeID";
111 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 146 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
112 using (SqlCommand cmd = new SqlCommand(sql, conn)) 147 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
113 { 148 {
114 cmd.Parameters.Add(m_database.CreateParameter("@regionID", regionID)); 149 cmd.Parameters.Add(m_database.CreateParameter("regionID", regionID));
115 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID)); 150 if (scopeID != UUID.Zero)
151 cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
116 conn.Open(); 152 conn.Open();
117 List<RegionData> ret = RunCommand(cmd); 153 List<RegionData> ret = RunCommand(cmd);
118 if (ret.Count == 0) 154 if (ret.Count == 0)
@@ -124,28 +160,28 @@ namespace OpenSim.Data.MSSQL
124 160
125 public List<RegionData> Get(int startX, int startY, int endX, int endY, UUID scopeID) 161 public List<RegionData> Get(int startX, int startY, int endX, int endY, UUID scopeID)
126 { 162 {
127 string sql = "select * from ["+m_Realm+"] where locX between @startX and @endX and locY between @startY and @endY"; 163 string sql = "select * from "+m_Realm+" where \"locX\" between :startX and :endX and \"locY\" between :startY and :endY";
128 if (scopeID != UUID.Zero) 164 if (scopeID != UUID.Zero)
129 sql += " and ScopeID = @scopeID"; 165 sql += " and \"ScopeID\" = :scopeID";
130 166
131 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 167 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
132 using (SqlCommand cmd = new SqlCommand(sql, conn)) 168 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
133 { 169 {
134 cmd.Parameters.Add(m_database.CreateParameter("@startX", startX)); 170 cmd.Parameters.Add(m_database.CreateParameter("startX", startX));
135 cmd.Parameters.Add(m_database.CreateParameter("@startY", startY)); 171 cmd.Parameters.Add(m_database.CreateParameter("startY", startY));
136 cmd.Parameters.Add(m_database.CreateParameter("@endX", endX)); 172 cmd.Parameters.Add(m_database.CreateParameter("endX", endX));
137 cmd.Parameters.Add(m_database.CreateParameter("@endY", endY)); 173 cmd.Parameters.Add(m_database.CreateParameter("endY", endY));
138 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID)); 174 cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
139 conn.Open(); 175 conn.Open();
140 return RunCommand(cmd); 176 return RunCommand(cmd);
141 } 177 }
142 } 178 }
143 179
144 public List<RegionData> RunCommand(SqlCommand cmd) 180 public List<RegionData> RunCommand(NpgsqlCommand cmd)
145 { 181 {
146 List<RegionData> retList = new List<RegionData>(); 182 List<RegionData> retList = new List<RegionData>();
147 183
148 SqlDataReader result = cmd.ExecuteReader(); 184 NpgsqlDataReader result = cmd.ExecuteReader();
149 185
150 while (result.Read()) 186 while (result.Read())
151 { 187 {
@@ -217,43 +253,46 @@ namespace OpenSim.Data.MSSQL
217 253
218 string[] fields = new List<string>(data.Data.Keys).ToArray(); 254 string[] fields = new List<string>(data.Data.Keys).ToArray();
219 255
220 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 256 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
221 using (SqlCommand cmd = new SqlCommand()) 257 using (NpgsqlCommand cmd = new NpgsqlCommand())
222 { 258 {
223 259
224 string update = "update [" + m_Realm + "] set locX=@posX, locY=@posY, sizeX=@sizeX, sizeY=@sizeY "; 260 string update = "update " + m_Realm + " set \"locX\"=:posX, \"locY\"=:posY, \"sizeX\"=:sizeX, \"sizeY\"=:sizeY ";
225 261
226 foreach (string field in fields) 262 foreach (string field in fields)
227 { 263 {
228 264
229 update += ", "; 265 update += ", ";
230 update += "[" + field + "] = @" + field; 266 update += " \"" + field + "\" = :" + field;
231 267
232 cmd.Parameters.Add(m_database.CreateParameter("@" + field, data.Data[field])); 268 if (m_FieldTypes.ContainsKey(field))
269 cmd.Parameters.Add(m_database.CreateParameter(field, data.Data[field], m_FieldTypes[field]));
270 else
271 cmd.Parameters.Add(m_database.CreateParameter(field, data.Data[field]));
233 } 272 }
234 273
235 update += " where uuid = @regionID"; 274 update += " where uuid = :regionID";
236 275
237 if (data.ScopeID != UUID.Zero) 276 if (data.ScopeID != UUID.Zero)
238 update += " and ScopeID = @scopeID"; 277 update += " and \"ScopeID\" = :scopeID";
239 278
240 cmd.CommandText = update; 279 cmd.CommandText = update;
241 cmd.Connection = conn; 280 cmd.Connection = conn;
242 cmd.Parameters.Add(m_database.CreateParameter("@regionID", data.RegionID)); 281 cmd.Parameters.Add(m_database.CreateParameter("regionID", data.RegionID));
243 cmd.Parameters.Add(m_database.CreateParameter("@regionName", data.RegionName)); 282 cmd.Parameters.Add(m_database.CreateParameter("regionName", data.RegionName));
244 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", data.ScopeID)); 283 cmd.Parameters.Add(m_database.CreateParameter("scopeID", data.ScopeID));
245 cmd.Parameters.Add(m_database.CreateParameter("@posX", data.posX)); 284 cmd.Parameters.Add(m_database.CreateParameter("posX", data.posX));
246 cmd.Parameters.Add(m_database.CreateParameter("@posY", data.posY)); 285 cmd.Parameters.Add(m_database.CreateParameter("posY", data.posY));
247 cmd.Parameters.Add(m_database.CreateParameter("@sizeX", data.sizeX)); 286 cmd.Parameters.Add(m_database.CreateParameter("sizeX", data.sizeX));
248 cmd.Parameters.Add(m_database.CreateParameter("@sizeY", data.sizeY)); 287 cmd.Parameters.Add(m_database.CreateParameter("sizeY", data.sizeY));
249 conn.Open(); 288 conn.Open();
250 try 289 try
251 { 290 {
252 if (cmd.ExecuteNonQuery() < 1) 291 if (cmd.ExecuteNonQuery() < 1)
253 { 292 {
254 string insert = "insert into [" + m_Realm + "] ([uuid], [ScopeID], [locX], [locY], [sizeX], [sizeY], [regionName], [" + 293 string insert = "insert into " + m_Realm + " (uuid, \"ScopeID\", \"locX\", \"locY\", \"sizeX\", \"sizeY\", \"regionName\", \"" +
255 String.Join("], [", fields) + 294 String.Join("\", \"", fields) +
256 "]) values (@regionID, @scopeID, @posX, @posY, @sizeX, @sizeY, @regionName, @" + String.Join(", @", fields) + ")"; 295 "\") values (:regionID, :scopeID, :posX, :posY, :sizeX, :sizeY, :regionName, :" + String.Join(", :", fields) + ")";
257 296
258 cmd.CommandText = insert; 297 cmd.CommandText = insert;
259 298
@@ -266,13 +305,13 @@ namespace OpenSim.Data.MSSQL
266 } 305 }
267 catch (Exception ex) 306 catch (Exception ex)
268 { 307 {
269 m_log.Warn("[MSSQL Grid]: Error inserting into Regions table: " + ex.Message + ", INSERT sql: " + insert); 308 m_log.Warn("[PGSQL Grid]: Error inserting into Regions table: " + ex.Message + ", INSERT sql: " + insert);
270 } 309 }
271 } 310 }
272 } 311 }
273 catch (Exception ex) 312 catch (Exception ex)
274 { 313 {
275 m_log.Warn("[MSSQL Grid]: Error updating Regions table: " + ex.Message + ", UPDATE sql: " + update); 314 m_log.Warn("[PGSQL Grid]: Error updating Regions table: " + ex.Message + ", UPDATE sql: " + update);
276 } 315 }
277 } 316 }
278 317
@@ -281,13 +320,14 @@ namespace OpenSim.Data.MSSQL
281 320
282 public bool SetDataItem(UUID regionID, string item, string value) 321 public bool SetDataItem(UUID regionID, string item, string value)
283 { 322 {
284 string sql = "update [" + m_Realm + 323 string sql = "update " + m_Realm +
285 "] set [" + item + "] = @" + item + " where uuid = @UUID"; 324 " set \"" + item + "\" = :" + item + " where uuid = :UUID";
286 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 325
287 using (SqlCommand cmd = new SqlCommand(sql, conn)) 326 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
327 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
288 { 328 {
289 cmd.Parameters.Add(m_database.CreateParameter("@" + item, value)); 329 cmd.Parameters.Add(m_database.CreateParameter("" + item, value));
290 cmd.Parameters.Add(m_database.CreateParameter("@UUID", regionID)); 330 cmd.Parameters.Add(m_database.CreateParameter("UUID", regionID));
291 conn.Open(); 331 conn.Open();
292 if (cmd.ExecuteNonQuery() > 0) 332 if (cmd.ExecuteNonQuery() > 0)
293 return true; 333 return true;
@@ -297,12 +337,12 @@ namespace OpenSim.Data.MSSQL
297 337
298 public bool Delete(UUID regionID) 338 public bool Delete(UUID regionID)
299 { 339 {
300 string sql = "delete from [" + m_Realm + 340 string sql = "delete from " + m_Realm +
301 "] where uuid = @UUID"; 341 " where uuid = :UUID";
302 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 342 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
303 using (SqlCommand cmd = new SqlCommand(sql, conn)) 343 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
304 { 344 {
305 cmd.Parameters.Add(m_database.CreateParameter("@UUID", regionID)); 345 cmd.Parameters.Add(m_database.CreateParameter("UUID", regionID));
306 conn.Open(); 346 conn.Open();
307 if (cmd.ExecuteNonQuery() > 0) 347 if (cmd.ExecuteNonQuery() > 0)
308 return true; 348 return true;
@@ -315,6 +355,11 @@ namespace OpenSim.Data.MSSQL
315 return Get((int)RegionFlags.DefaultRegion, scopeID); 355 return Get((int)RegionFlags.DefaultRegion, scopeID);
316 } 356 }
317 357
358 public List<RegionData> GetDefaultHypergridRegions(UUID scopeID)
359 {
360 return Get((int)RegionFlags.DefaultHGRegion, scopeID);
361 }
362
318 public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y) 363 public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
319 { 364 {
320 List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID); 365 List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);
@@ -331,14 +376,14 @@ namespace OpenSim.Data.MSSQL
331 376
332 private List<RegionData> Get(int regionFlags, UUID scopeID) 377 private List<RegionData> Get(int regionFlags, UUID scopeID)
333 { 378 {
334 string sql = "SELECT * FROM [" + m_Realm + "] WHERE (flags & " + regionFlags.ToString() + ") <> 0"; 379 string sql = "SELECT * FROM " + m_Realm + " WHERE (\"flags\" & " + regionFlags.ToString() + ") <> 0";
335 if (scopeID != UUID.Zero) 380 if (scopeID != UUID.Zero)
336 sql += " AND ScopeID = @scopeID"; 381 sql += " AND \"ScopeID\" = :scopeID";
337 382
338 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 383 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
339 using (SqlCommand cmd = new SqlCommand(sql, conn)) 384 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
340 { 385 {
341 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID)); 386 cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
342 conn.Open(); 387 conn.Open();
343 return RunCommand(cmd); 388 return RunCommand(cmd);
344 } 389 }
diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/PGSQL/PGSQLSimulationData.cs
index 17f42e1..77d87d4 100644
--- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLSimulationData.cs
@@ -28,7 +28,6 @@
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Data; 30using System.Data;
31using System.Data.SqlClient;
32using System.Drawing; 31using System.Drawing;
33using System.IO; 32using System.IO;
34using System.Reflection; 33using System.Reflection;
@@ -37,15 +36,17 @@ using OpenMetaverse;
37using OpenSim.Framework; 36using OpenSim.Framework;
38using OpenSim.Region.Framework.Interfaces; 37using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes; 38using OpenSim.Region.Framework.Scenes;
39using Npgsql;
40 40
41namespace OpenSim.Data.MSSQL 41namespace OpenSim.Data.PGSQL
42{ 42{
43 /// <summary> 43 /// <summary>
44 /// A MSSQL Interface for the Region Server. 44 /// A PGSQL Interface for the Region Server.
45 /// </summary> 45 /// </summary>
46 public class MSSQLSimulationData : ISimulationDataStore 46 public class PGSQLSimulationData : ISimulationDataStore
47 { 47 {
48 private const string _migrationStore = "RegionStore"; 48 private const string _migrationStore = "RegionStore";
49 private const string LogHeader = "[REGION DB PGSQL]";
49 50
50 // private static FileSystemDataStore Instance = new FileSystemDataStore(); 51 // private static FileSystemDataStore Instance = new FileSystemDataStore();
51 private static readonly ILog _Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 52 private static readonly ILog _Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -53,18 +54,18 @@ namespace OpenSim.Data.MSSQL
53 /// <summary> 54 /// <summary>
54 /// The database manager 55 /// The database manager
55 /// </summary> 56 /// </summary>
56 private MSSQLManager _Database; 57 private PGSQLManager _Database;
57 private string m_connectionString; 58 private string m_connectionString;
58 protected virtual Assembly Assembly 59 protected virtual Assembly Assembly
59 { 60 {
60 get { return GetType().Assembly; } 61 get { return GetType().Assembly; }
61 } 62 }
62 63
63 public MSSQLSimulationData() 64 public PGSQLSimulationData()
64 { 65 {
65 } 66 }
66 67
67 public MSSQLSimulationData(string connectionString) 68 public PGSQLSimulationData(string connectionString)
68 { 69 {
69 Initialise(connectionString); 70 Initialise(connectionString);
70 } 71 }
@@ -76,9 +77,9 @@ namespace OpenSim.Data.MSSQL
76 public void Initialise(string connectionString) 77 public void Initialise(string connectionString)
77 { 78 {
78 m_connectionString = connectionString; 79 m_connectionString = connectionString;
79 _Database = new MSSQLManager(connectionString); 80 _Database = new PGSQLManager(connectionString);
80 81
81 using (SqlConnection conn = new SqlConnection(connectionString)) 82 using (NpgsqlConnection conn = new NpgsqlConnection(connectionString))
82 { 83 {
83 conn.Open(); 84 conn.Open();
84 //New Migration settings 85 //New Migration settings
@@ -107,19 +108,19 @@ namespace OpenSim.Data.MSSQL
107 Dictionary<UUID, SceneObjectGroup> objects = new Dictionary<UUID, SceneObjectGroup>(); 108 Dictionary<UUID, SceneObjectGroup> objects = new Dictionary<UUID, SceneObjectGroup>();
108 SceneObjectGroup grp = null; 109 SceneObjectGroup grp = null;
109 110
110 string sql = "SELECT *, " + 111 string sql = @"SELECT *,
111 "sort = CASE WHEN prims.UUID = prims.SceneGroupID THEN 0 ELSE 1 END " + 112 CASE WHEN prims.""UUID"" = prims.""SceneGroupID"" THEN 0 ELSE 1 END as sort
112 "FROM prims " + 113 FROM prims
113 "LEFT JOIN primshapes ON prims.UUID = primshapes.UUID " + 114 LEFT JOIN primshapes ON prims.""UUID"" = primshapes.""UUID""
114 "WHERE RegionUUID = @RegionUUID " + 115 WHERE ""RegionUUID"" = :RegionUUID
115 "ORDER BY SceneGroupID asc, sort asc, LinkNumber asc"; 116 ORDER BY ""SceneGroupID"" asc, sort asc, ""LinkNumber"" asc";
116 117
117 using (SqlConnection conn = new SqlConnection(m_connectionString)) 118 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
118 using (SqlCommand command = new SqlCommand(sql, conn)) 119 using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
119 { 120 {
120 command.Parameters.Add(_Database.CreateParameter("@regionUUID", regionUUID)); 121 command.Parameters.Add(_Database.CreateParameter("regionUUID", regionUUID));
121 conn.Open(); 122 conn.Open();
122 using (SqlDataReader reader = command.ExecuteReader()) 123 using (NpgsqlDataReader reader = command.ExecuteReader())
123 { 124 {
124 while (reader.Read()) 125 while (reader.Read())
125 { 126 {
@@ -179,12 +180,12 @@ namespace OpenSim.Data.MSSQL
179 // list from DB of all prims which have items and 180 // list from DB of all prims which have items and
180 // LoadItems only on those 181 // LoadItems only on those
181 List<SceneObjectPart> primsWithInventory = new List<SceneObjectPart>(); 182 List<SceneObjectPart> primsWithInventory = new List<SceneObjectPart>();
182 string qry = "select distinct primID from primitems"; 183 string qry = "select distinct \"primID\" from primitems";
183 using (SqlConnection conn = new SqlConnection(m_connectionString)) 184 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
184 using (SqlCommand command = new SqlCommand(qry, conn)) 185 using (NpgsqlCommand command = new NpgsqlCommand(qry, conn))
185 { 186 {
186 conn.Open(); 187 conn.Open();
187 using (SqlDataReader itemReader = command.ExecuteReader()) 188 using (NpgsqlDataReader itemReader = command.ExecuteReader())
188 { 189 {
189 while (itemReader.Read()) 190 while (itemReader.Read())
190 { 191 {
@@ -213,19 +214,19 @@ namespace OpenSim.Data.MSSQL
213 /// <param name="allPrims">all prims with inventory on a region</param> 214 /// <param name="allPrims">all prims with inventory on a region</param>
214 private void LoadItems(List<SceneObjectPart> allPrimsWithInventory) 215 private void LoadItems(List<SceneObjectPart> allPrimsWithInventory)
215 { 216 {
216 string sql = "SELECT * FROM primitems WHERE PrimID = @PrimID"; 217 string sql = @"SELECT * FROM primitems WHERE ""primID"" = :PrimID";
217 using (SqlConnection conn = new SqlConnection(m_connectionString)) 218 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
218 using (SqlCommand command = new SqlCommand(sql, conn)) 219 using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
219 { 220 {
220 conn.Open(); 221 conn.Open();
221 foreach (SceneObjectPart objectPart in allPrimsWithInventory) 222 foreach (SceneObjectPart objectPart in allPrimsWithInventory)
222 { 223 {
223 command.Parameters.Clear(); 224 command.Parameters.Clear();
224 command.Parameters.Add(_Database.CreateParameter("@PrimID", objectPart.UUID)); 225 command.Parameters.Add(_Database.CreateParameter("PrimID", objectPart.UUID));
225 226
226 List<TaskInventoryItem> inventory = new List<TaskInventoryItem>(); 227 List<TaskInventoryItem> inventory = new List<TaskInventoryItem>();
227 228
228 using (SqlDataReader reader = command.ExecuteReader()) 229 using (NpgsqlDataReader reader = command.ExecuteReader())
229 { 230 {
230 while (reader.Read()) 231 while (reader.Read())
231 { 232 {
@@ -257,43 +258,43 @@ namespace OpenSim.Data.MSSQL
257 if ((flags & (uint)PrimFlags.TemporaryOnRez) != 0) 258 if ((flags & (uint)PrimFlags.TemporaryOnRez) != 0)
258 return; 259 return;
259 260
260 _Log.DebugFormat("[MSSQL]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Parts.Length); 261 //_Log.DebugFormat("[PGSQL]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Parts.Length);
261 262
262 using (SqlConnection conn = new SqlConnection(m_connectionString)) 263 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
263 { 264 {
264 conn.Open(); 265 conn.Open();
265 SqlTransaction transaction = conn.BeginTransaction(); 266 NpgsqlTransaction transaction = conn.BeginTransaction();
266 267
267 try 268 try
268 { 269 {
269 foreach (SceneObjectPart sceneObjectPart in obj.Parts) 270 foreach (SceneObjectPart sceneObjectPart in obj.Parts)
270 { 271 {
271 //Update prim 272 //Update prim
272 using (SqlCommand sqlCommand = conn.CreateCommand()) 273 using (NpgsqlCommand sqlCommand = conn.CreateCommand())
273 { 274 {
274 sqlCommand.Transaction = transaction; 275 sqlCommand.Transaction = transaction;
275 try 276 try
276 { 277 {
277 StoreSceneObjectPrim(sceneObjectPart, sqlCommand, obj.UUID, regionUUID); 278 StoreSceneObjectPrim(sceneObjectPart, sqlCommand, obj.UUID, regionUUID);
278 } 279 }
279 catch (SqlException sqlEx) 280 catch (NpgsqlException sqlEx)
280 { 281 {
281 _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrim SQL error: {0} at line {1}", sqlEx.Message, sqlEx.LineNumber); 282 _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrim SQL error: {0} at line {1}", sqlEx.Message, sqlEx.Line);
282 throw; 283 throw;
283 } 284 }
284 } 285 }
285 286
286 //Update primshapes 287 //Update primshapes
287 using (SqlCommand sqlCommand = conn.CreateCommand()) 288 using (NpgsqlCommand sqlCommand = conn.CreateCommand())
288 { 289 {
289 sqlCommand.Transaction = transaction; 290 sqlCommand.Transaction = transaction;
290 try 291 try
291 { 292 {
292 StoreSceneObjectPrimShapes(sceneObjectPart, sqlCommand, obj.UUID, regionUUID); 293 StoreSceneObjectPrimShapes(sceneObjectPart, sqlCommand, obj.UUID, regionUUID);
293 } 294 }
294 catch (SqlException sqlEx) 295 catch (NpgsqlException sqlEx)
295 { 296 {
296 _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrimShapes SQL error: {0} at line {1}", sqlEx.Message, sqlEx.LineNumber); 297 _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrimShapes SQL error: {0} at line {1}", sqlEx.Message, sqlEx.Line);
297 throw; 298 throw;
298 } 299 }
299 } 300 }
@@ -325,60 +326,59 @@ namespace OpenSim.Data.MSSQL
325 /// <param name="sqlCommand">The SQL command with the transaction.</param> 326 /// <param name="sqlCommand">The SQL command with the transaction.</param>
326 /// <param name="sceneGroupID">The scenegroup UUID.</param> 327 /// <param name="sceneGroupID">The scenegroup UUID.</param>
327 /// <param name="regionUUID">The region UUID.</param> 328 /// <param name="regionUUID">The region UUID.</param>
328 private void StoreSceneObjectPrim(SceneObjectPart sceneObjectPart, SqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID) 329 private void StoreSceneObjectPrim(SceneObjectPart sceneObjectPart, NpgsqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID)
329 { 330 {
330 //Big query to update or insert a new prim. 331 //Big query to update or insert a new prim.
331 //Note for SQL Server 2008 this could be simplified 332
332 string queryPrims = @" 333 string queryPrims = @"
333IF EXISTS (SELECT UUID FROM prims WHERE UUID = @UUID)
334 BEGIN
335 UPDATE prims SET 334 UPDATE prims SET
336 CreationDate = @CreationDate, Name = @Name, Text = @Text, Description = @Description, SitName = @SitName, 335 ""CreationDate"" = :CreationDate, ""Name"" = :Name, ""Text"" = :Text, ""Description"" = :Description, ""SitName"" = :SitName,
337 TouchName = @TouchName, ObjectFlags = @ObjectFlags, OwnerMask = @OwnerMask, NextOwnerMask = @NextOwnerMask, GroupMask = @GroupMask, 336 ""TouchName"" = :TouchName, ""ObjectFlags"" = :ObjectFlags, ""OwnerMask"" = :OwnerMask, ""NextOwnerMask"" = :NextOwnerMask, ""GroupMask"" = :GroupMask,
338 EveryoneMask = @EveryoneMask, BaseMask = @BaseMask, PositionX = @PositionX, PositionY = @PositionY, PositionZ = @PositionZ, 337 ""EveryoneMask"" = :EveryoneMask, ""BaseMask"" = :BaseMask, ""PositionX"" = :PositionX, ""PositionY"" = :PositionY, ""PositionZ"" = :PositionZ,
339 GroupPositionX = @GroupPositionX, GroupPositionY = @GroupPositionY, GroupPositionZ = @GroupPositionZ, VelocityX = @VelocityX, 338 ""GroupPositionX"" = :GroupPositionX, ""GroupPositionY"" = :GroupPositionY, ""GroupPositionZ"" = :GroupPositionZ, ""VelocityX"" = :VelocityX,
340 VelocityY = @VelocityY, VelocityZ = @VelocityZ, AngularVelocityX = @AngularVelocityX, AngularVelocityY = @AngularVelocityY, 339 ""VelocityY"" = :VelocityY, ""VelocityZ"" = :VelocityZ, ""AngularVelocityX"" = :AngularVelocityX, ""AngularVelocityY"" = :AngularVelocityY,
341 AngularVelocityZ = @AngularVelocityZ, AccelerationX = @AccelerationX, AccelerationY = @AccelerationY, 340 ""AngularVelocityZ"" = :AngularVelocityZ, ""AccelerationX"" = :AccelerationX, ""AccelerationY"" = :AccelerationY,
342 AccelerationZ = @AccelerationZ, RotationX = @RotationX, RotationY = @RotationY, RotationZ = @RotationZ, RotationW = @RotationW, 341 ""AccelerationZ"" = :AccelerationZ, ""RotationX"" = :RotationX, ""RotationY"" = :RotationY, ""RotationZ"" = :RotationZ, ""RotationW"" = :RotationW,
343 SitTargetOffsetX = @SitTargetOffsetX, SitTargetOffsetY = @SitTargetOffsetY, SitTargetOffsetZ = @SitTargetOffsetZ, 342 ""SitTargetOffsetX"" = :SitTargetOffsetX, ""SitTargetOffsetY"" = :SitTargetOffsetY, ""SitTargetOffsetZ"" = :SitTargetOffsetZ,
344 SitTargetOrientW = @SitTargetOrientW, SitTargetOrientX = @SitTargetOrientX, SitTargetOrientY = @SitTargetOrientY, 343 ""SitTargetOrientW"" = :SitTargetOrientW, ""SitTargetOrientX"" = :SitTargetOrientX, ""SitTargetOrientY"" = :SitTargetOrientY,
345 SitTargetOrientZ = @SitTargetOrientZ, RegionUUID = @RegionUUID, CreatorID = @CreatorID, OwnerID = @OwnerID, GroupID = @GroupID, 344 ""SitTargetOrientZ"" = :SitTargetOrientZ, ""RegionUUID"" = :RegionUUID, ""CreatorID"" = :CreatorID, ""OwnerID"" = :OwnerID, ""GroupID"" = :GroupID,
346 LastOwnerID = @LastOwnerID, SceneGroupID = @SceneGroupID, PayPrice = @PayPrice, PayButton1 = @PayButton1, PayButton2 = @PayButton2, 345 ""LastOwnerID"" = :LastOwnerID, ""SceneGroupID"" = :SceneGroupID, ""PayPrice"" = :PayPrice, ""PayButton1"" = :PayButton1, ""PayButton2"" = :PayButton2,
347 PayButton3 = @PayButton3, PayButton4 = @PayButton4, LoopedSound = @LoopedSound, LoopedSoundGain = @LoopedSoundGain, 346 ""PayButton3"" = :PayButton3, ""PayButton4"" = :PayButton4, ""LoopedSound"" = :LoopedSound, ""LoopedSoundGain"" = :LoopedSoundGain,
348 TextureAnimation = @TextureAnimation, OmegaX = @OmegaX, OmegaY = @OmegaY, OmegaZ = @OmegaZ, CameraEyeOffsetX = @CameraEyeOffsetX, 347 ""TextureAnimation"" = :TextureAnimation, ""OmegaX"" = :OmegaX, ""OmegaY"" = :OmegaY, ""OmegaZ"" = :OmegaZ, ""CameraEyeOffsetX"" = :CameraEyeOffsetX,
349 CameraEyeOffsetY = @CameraEyeOffsetY, CameraEyeOffsetZ = @CameraEyeOffsetZ, CameraAtOffsetX = @CameraAtOffsetX, 348 ""CameraEyeOffsetY"" = :CameraEyeOffsetY, ""CameraEyeOffsetZ"" = :CameraEyeOffsetZ, ""CameraAtOffsetX"" = :CameraAtOffsetX,
350 CameraAtOffsetY = @CameraAtOffsetY, CameraAtOffsetZ = @CameraAtOffsetZ, ForceMouselook = @ForceMouselook, 349 ""CameraAtOffsetY"" = :CameraAtOffsetY, ""CameraAtOffsetZ"" = :CameraAtOffsetZ, ""ForceMouselook"" = :ForceMouselook,
351 ScriptAccessPin = @ScriptAccessPin, AllowedDrop = @AllowedDrop, DieAtEdge = @DieAtEdge, SalePrice = @SalePrice, 350 ""ScriptAccessPin"" = :ScriptAccessPin, ""AllowedDrop"" = :AllowedDrop, ""DieAtEdge"" = :DieAtEdge, ""SalePrice"" = :SalePrice,
352 SaleType = @SaleType, ColorR = @ColorR, ColorG = @ColorG, ColorB = @ColorB, ColorA = @ColorA, ParticleSystem = @ParticleSystem, 351 ""SaleType"" = :SaleType, ""ColorR"" = :ColorR, ""ColorG"" = :ColorG, ""ColorB"" = :ColorB, ""ColorA"" = :ColorA, ""ParticleSystem"" = :ParticleSystem,
353 ClickAction = @ClickAction, Material = @Material, CollisionSound = @CollisionSound, CollisionSoundVolume = @CollisionSoundVolume, PassTouches = @PassTouches, 352 ""ClickAction"" = :ClickAction, ""Material"" = :Material, ""CollisionSound"" = :CollisionSound, ""CollisionSoundVolume"" = :CollisionSoundVolume, ""PassTouches"" = :PassTouches,
354 LinkNumber = @LinkNumber, MediaURL = @MediaURL 353 ""LinkNumber"" = :LinkNumber, ""MediaURL"" = :MediaURL, ""DynAttrs"" = :DynAttrs,
355 WHERE UUID = @UUID 354 ""PhysicsShapeType"" = :PhysicsShapeType, ""Density"" = :Density, ""GravityModifier"" = :GravityModifier, ""Friction"" = :Friction, ""Restitution"" = :Restitution
356 END 355 WHERE ""UUID"" = :UUID ;
357ELSE 356
358 BEGIN
359 INSERT INTO 357 INSERT INTO
360 prims ( 358 prims (
361 UUID, CreationDate, Name, Text, Description, SitName, TouchName, ObjectFlags, OwnerMask, NextOwnerMask, GroupMask, 359 ""UUID"", ""CreationDate"", ""Name"", ""Text"", ""Description"", ""SitName"", ""TouchName"", ""ObjectFlags"", ""OwnerMask"", ""NextOwnerMask"", ""GroupMask"",
362 EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, 360 ""EveryoneMask"", ""BaseMask"", ""PositionX"", ""PositionY"", ""PositionZ"", ""GroupPositionX"", ""GroupPositionY"", ""GroupPositionZ"", ""VelocityX"",
363 VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, 361 ""VelocityY"", ""VelocityZ"", ""AngularVelocityX"", ""AngularVelocityY"", ""AngularVelocityZ"", ""AccelerationX"", ""AccelerationY"", ""AccelerationZ"",
364 RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, 362 ""RotationX"", ""RotationY"", ""RotationZ"", ""RotationW"", ""SitTargetOffsetX"", ""SitTargetOffsetY"", ""SitTargetOffsetZ"", ""SitTargetOrientW"",
365 SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, RegionUUID, CreatorID, OwnerID, GroupID, LastOwnerID, SceneGroupID, 363 ""SitTargetOrientX"", ""SitTargetOrientY"", ""SitTargetOrientZ"", ""RegionUUID"", ""CreatorID"", ""OwnerID"", ""GroupID"", ""LastOwnerID"", ""SceneGroupID"",
366 PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX, 364 ""PayPrice"", ""PayButton1"", ""PayButton2"", ""PayButton3"", ""PayButton4"", ""LoopedSound"", ""LoopedSoundGain"", ""TextureAnimation"", ""OmegaX"",
367 OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, 365 ""OmegaY"", ""OmegaZ"", ""CameraEyeOffsetX"", ""CameraEyeOffsetY"", ""CameraEyeOffsetZ"", ""CameraAtOffsetX"", ""CameraAtOffsetY"", ""CameraAtOffsetZ"",
368 ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, 366 ""ForceMouselook"", ""ScriptAccessPin"", ""AllowedDrop"", ""DieAtEdge"", ""SalePrice"", ""SaleType"", ""ColorR"", ""ColorG"", ""ColorB"", ""ColorA"",
369 ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, PassTouches, LinkNumber, MediaURL 367 ""ParticleSystem"", ""ClickAction"", ""Material"", ""CollisionSound"", ""CollisionSoundVolume"", ""PassTouches"", ""LinkNumber"", ""MediaURL"", ""DynAttrs"",
370 ) VALUES ( 368 ""PhysicsShapeType"", ""Density"", ""GravityModifier"", ""Friction"", ""Restitution""
371 @UUID, @CreationDate, @Name, @Text, @Description, @SitName, @TouchName, @ObjectFlags, @OwnerMask, @NextOwnerMask, @GroupMask, 369 ) Select
372 @EveryoneMask, @BaseMask, @PositionX, @PositionY, @PositionZ, @GroupPositionX, @GroupPositionY, @GroupPositionZ, @VelocityX, 370 :UUID, :CreationDate, :Name, :Text, :Description, :SitName, :TouchName, :ObjectFlags, :OwnerMask, :NextOwnerMask, :GroupMask,
373 @VelocityY, @VelocityZ, @AngularVelocityX, @AngularVelocityY, @AngularVelocityZ, @AccelerationX, @AccelerationY, @AccelerationZ, 371 :EveryoneMask, :BaseMask, :PositionX, :PositionY, :PositionZ, :GroupPositionX, :GroupPositionY, :GroupPositionZ, :VelocityX,
374 @RotationX, @RotationY, @RotationZ, @RotationW, @SitTargetOffsetX, @SitTargetOffsetY, @SitTargetOffsetZ, @SitTargetOrientW, 372 :VelocityY, :VelocityZ, :AngularVelocityX, :AngularVelocityY, :AngularVelocityZ, :AccelerationX, :AccelerationY, :AccelerationZ,
375 @SitTargetOrientX, @SitTargetOrientY, @SitTargetOrientZ, @RegionUUID, @CreatorID, @OwnerID, @GroupID, @LastOwnerID, @SceneGroupID, 373 :RotationX, :RotationY, :RotationZ, :RotationW, :SitTargetOffsetX, :SitTargetOffsetY, :SitTargetOffsetZ, :SitTargetOrientW,
376 @PayPrice, @PayButton1, @PayButton2, @PayButton3, @PayButton4, @LoopedSound, @LoopedSoundGain, @TextureAnimation, @OmegaX, 374 :SitTargetOrientX, :SitTargetOrientY, :SitTargetOrientZ, :RegionUUID, :CreatorID, :OwnerID, :GroupID, :LastOwnerID, :SceneGroupID,
377 @OmegaY, @OmegaZ, @CameraEyeOffsetX, @CameraEyeOffsetY, @CameraEyeOffsetZ, @CameraAtOffsetX, @CameraAtOffsetY, @CameraAtOffsetZ, 375 :PayPrice, :PayButton1, :PayButton2, :PayButton3, :PayButton4, :LoopedSound, :LoopedSoundGain, :TextureAnimation, :OmegaX,
378 @ForceMouselook, @ScriptAccessPin, @AllowedDrop, @DieAtEdge, @SalePrice, @SaleType, @ColorR, @ColorG, @ColorB, @ColorA, 376 :OmegaY, :OmegaZ, :CameraEyeOffsetX, :CameraEyeOffsetY, :CameraEyeOffsetZ, :CameraAtOffsetX, :CameraAtOffsetY, :CameraAtOffsetZ,
379 @ParticleSystem, @ClickAction, @Material, @CollisionSound, @CollisionSoundVolume, @PassTouches, @LinkNumber, @MediaURL 377 :ForceMouselook, :ScriptAccessPin, :AllowedDrop, :DieAtEdge, :SalePrice, :SaleType, :ColorR, :ColorG, :ColorB, :ColorA,
380 ) 378 :ParticleSystem, :ClickAction, :Material, :CollisionSound, :CollisionSoundVolume, :PassTouches, :LinkNumber, :MediaURL, :DynAttrs,
381 END"; 379 :PhysicsShapeType, :Density, :GravityModifier, :Friction, :Restitution
380 where not EXISTS (SELECT ""UUID"" FROM prims WHERE ""UUID"" = :UUID);
381 ";
382 382
383 //Set commandtext. 383 //Set commandtext.
384 sqlCommand.CommandText = queryPrims; 384 sqlCommand.CommandText = queryPrims;
@@ -396,35 +396,32 @@ ELSE
396 /// <param name="sqlCommand">The SQL command with the transaction.</param> 396 /// <param name="sqlCommand">The SQL command with the transaction.</param>
397 /// <param name="sceneGroupID">The scenegroup UUID.</param> 397 /// <param name="sceneGroupID">The scenegroup UUID.</param>
398 /// <param name="regionUUID">The region UUID.</param> 398 /// <param name="regionUUID">The region UUID.</param>
399 private void StoreSceneObjectPrimShapes(SceneObjectPart sceneObjectPart, SqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID) 399 private void StoreSceneObjectPrimShapes(SceneObjectPart sceneObjectPart, NpgsqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID)
400 { 400 {
401 //Big query to or insert or update primshapes 401 //Big query to or insert or update primshapes
402 //Note for SQL Server 2008 this can be simplified 402
403 string queryPrimShapes = @" 403 string queryPrimShapes = @"
404IF EXISTS (SELECT UUID FROM primshapes WHERE UUID = @UUID)
405 BEGIN
406 UPDATE primshapes SET 404 UPDATE primshapes SET
407 Shape = @Shape, ScaleX = @ScaleX, ScaleY = @ScaleY, ScaleZ = @ScaleZ, PCode = @PCode, PathBegin = @PathBegin, 405 ""Shape"" = :Shape, ""ScaleX"" = :ScaleX, ""ScaleY"" = :ScaleY, ""ScaleZ"" = :ScaleZ, ""PCode"" = :PCode, ""PathBegin"" = :PathBegin,
408 PathEnd = @PathEnd, PathScaleX = @PathScaleX, PathScaleY = @PathScaleY, PathShearX = @PathShearX, PathShearY = @PathShearY, 406 ""PathEnd"" = :PathEnd, ""PathScaleX"" = :PathScaleX, ""PathScaleY"" = :PathScaleY, ""PathShearX"" = :PathShearX, ""PathShearY"" = :PathShearY,
409 PathSkew = @PathSkew, PathCurve = @PathCurve, PathRadiusOffset = @PathRadiusOffset, PathRevolutions = @PathRevolutions, 407 ""PathSkew"" = :PathSkew, ""PathCurve"" = :PathCurve, ""PathRadiusOffset"" = :PathRadiusOffset, ""PathRevolutions"" = :PathRevolutions,
410 PathTaperX = @PathTaperX, PathTaperY = @PathTaperY, PathTwist = @PathTwist, PathTwistBegin = @PathTwistBegin, 408 ""PathTaperX"" = :PathTaperX, ""PathTaperY"" = :PathTaperY, ""PathTwist"" = :PathTwist, ""PathTwistBegin"" = :PathTwistBegin,
411 ProfileBegin = @ProfileBegin, ProfileEnd = @ProfileEnd, ProfileCurve = @ProfileCurve, ProfileHollow = @ProfileHollow, 409 ""ProfileBegin"" = :ProfileBegin, ""ProfileEnd"" = :ProfileEnd, ""ProfileCurve"" = :ProfileCurve, ""ProfileHollow"" = :ProfileHollow,
412 Texture = @Texture, ExtraParams = @ExtraParams, State = @State, Media = @Media 410 ""Texture"" = :Texture, ""ExtraParams"" = :ExtraParams, ""State"" = :State, ""Media"" = :Media
413 WHERE UUID = @UUID 411 WHERE ""UUID"" = :UUID ;
414 END 412
415ELSE
416 BEGIN
417 INSERT INTO 413 INSERT INTO
418 primshapes ( 414 primshapes (
419 UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, 415 ""UUID"", ""Shape"", ""ScaleX"", ""ScaleY"", ""ScaleZ"", ""PCode"", ""PathBegin"", ""PathEnd"", ""PathScaleX"", ""PathScaleY"", ""PathShearX"", ""PathShearY"",
420 PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, 416 ""PathSkew"", ""PathCurve"", ""PathRadiusOffset"", ""PathRevolutions"", ""PathTaperX"", ""PathTaperY"", ""PathTwist"", ""PathTwistBegin"", ""ProfileBegin"",
421 ProfileEnd, ProfileCurve, ProfileHollow, Texture, ExtraParams, State, Media 417 ""ProfileEnd"", ""ProfileCurve"", ""ProfileHollow"", ""Texture"", ""ExtraParams"", ""State"", ""Media""
422 ) VALUES ( 418 )
423 @UUID, @Shape, @ScaleX, @ScaleY, @ScaleZ, @PCode, @PathBegin, @PathEnd, @PathScaleX, @PathScaleY, @PathShearX, @PathShearY, 419 Select
424 @PathSkew, @PathCurve, @PathRadiusOffset, @PathRevolutions, @PathTaperX, @PathTaperY, @PathTwist, @PathTwistBegin, @ProfileBegin, 420 :UUID, :Shape, :ScaleX, :ScaleY, :ScaleZ, :PCode, :PathBegin, :PathEnd, :PathScaleX, :PathScaleY, :PathShearX, :PathShearY,
425 @ProfileEnd, @ProfileCurve, @ProfileHollow, @Texture, @ExtraParams, @State, @Media 421 :PathSkew, :PathCurve, :PathRadiusOffset, :PathRevolutions, :PathTaperX, :PathTaperY, :PathTwist, :PathTwistBegin, :ProfileBegin,
426 ) 422 :ProfileEnd, :ProfileCurve, :ProfileHollow, :Texture, :ExtraParams, :State, :Media
427 END"; 423 where not EXISTS (SELECT ""UUID"" FROM primshapes WHERE ""UUID"" = :UUID);
424 ";
428 425
429 //Set commandtext. 426 //Set commandtext.
430 sqlCommand.CommandText = queryPrimShapes; 427 sqlCommand.CommandText = queryPrimShapes;
@@ -445,18 +442,18 @@ ELSE
445 /// <param name="regionUUID">regionUUID (is this used anyway</param> 442 /// <param name="regionUUID">regionUUID (is this used anyway</param>
446 public void RemoveObject(UUID objectID, UUID regionUUID) 443 public void RemoveObject(UUID objectID, UUID regionUUID)
447 { 444 {
448 _Log.InfoFormat("[MSSQL]: Removing obj: {0} from region: {1}", objectID, regionUUID); 445 //_Log.InfoFormat("[PGSQL]: Removing obj: {0} from region: {1}", objectID, regionUUID);
449 446
450 //Remove from prims and primsitem table 447 //Remove from prims and primsitem table
451 string sqlPrims = "DELETE FROM PRIMS WHERE SceneGroupID = @objectID"; 448 string sqlPrims = @"DELETE FROM PRIMS WHERE ""SceneGroupID"" = :objectID";
452 string sqlPrimItems = "DELETE FROM PRIMITEMS WHERE primID in (SELECT UUID FROM PRIMS WHERE SceneGroupID = @objectID)"; 449 string sqlPrimItems = @"DELETE FROM PRIMITEMS WHERE ""primID"" in (SELECT ""UUID"" FROM PRIMS WHERE ""SceneGroupID"" = :objectID)";
453 string sqlPrimShapes = "DELETE FROM PRIMSHAPES WHERE uuid in (SELECT UUID FROM PRIMS WHERE SceneGroupID = @objectID)"; 450 string sqlPrimShapes = @"DELETE FROM PRIMSHAPES WHERE ""UUID"" in (SELECT ""UUID"" FROM PRIMS WHERE ""SceneGroupID"" = :objectID)";
454 451
455 lock (_Database) 452 lock (_Database)
456 { 453 {
457 //Using the non transaction mode. 454 //Using the non transaction mode.
458 using (SqlConnection conn = new SqlConnection(m_connectionString)) 455 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
459 using (SqlCommand cmd = new SqlCommand()) 456 using (NpgsqlCommand cmd = new NpgsqlCommand())
460 { 457 {
461 cmd.Connection = conn; 458 cmd.Connection = conn;
462 cmd.CommandText = sqlPrimShapes; 459 cmd.CommandText = sqlPrimShapes;
@@ -482,31 +479,31 @@ ELSE
482 { 479 {
483 //_Log.InfoFormat("[REGION DB: Persisting Prim Inventory with prim ID {0}", primID); 480 //_Log.InfoFormat("[REGION DB: Persisting Prim Inventory with prim ID {0}", primID);
484 481
485 //Statement from MySQL section! 482 //Statement from PGSQL section!
486 // For now, we're just going to crudely remove all the previous inventory items 483 // For now, we're just going to crudely remove all the previous inventory items
487 // no matter whether they have changed or not, and replace them with the current set. 484 // no matter whether they have changed or not, and replace them with the current set.
488 485
489 //Delete everything from PrimID 486 //Delete everything from PrimID
490 //TODO add index on PrimID in DB, if not already exist 487 //TODO add index on PrimID in DB, if not already exist
491 488
492 string sql = "DELETE PRIMITEMS WHERE primID = @primID"; 489 string sql = @"delete from primitems where ""primID"" = :primID";
493 using (SqlConnection conn = new SqlConnection(m_connectionString)) 490 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
494 using (SqlCommand cmd = new SqlCommand(sql, conn)) 491 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
495 { 492 {
496 cmd.Parameters.Add(_Database.CreateParameter("@primID", primID)); 493 cmd.Parameters.Add(_Database.CreateParameter("primID", primID));
497 conn.Open(); 494 conn.Open();
498 cmd.ExecuteNonQuery(); 495 cmd.ExecuteNonQuery();
499 } 496 }
500 497
501 sql = 498 sql =
502 @"INSERT INTO primitems ( 499 @"INSERT INTO primitems (
503 itemID,primID,assetID,parentFolderID,invType,assetType,name,description,creationDate,creatorID,ownerID,lastOwnerID,groupID, 500 ""itemID"",""primID"",""assetID"",""parentFolderID"",""invType"",""assetType"",""name"",""description"",""creationDate"",""creatorID"",""ownerID"",""lastOwnerID"",""groupID"",
504 nextPermissions,currentPermissions,basePermissions,everyonePermissions,groupPermissions,flags) 501 ""nextPermissions"",""currentPermissions"",""basePermissions"",""everyonePermissions"",""groupPermissions"",""flags"")
505 VALUES (@itemID,@primID,@assetID,@parentFolderID,@invType,@assetType,@name,@description,@creationDate,@creatorID,@ownerID, 502 VALUES (:itemID,:primID,:assetID,:parentFolderID,:invType,:assetType,:name,:description,:creationDate,:creatorID,:ownerID,
506 @lastOwnerID,@groupID,@nextPermissions,@currentPermissions,@basePermissions,@everyonePermissions,@groupPermissions,@flags)"; 503 :lastOwnerID,:groupID,:nextPermissions,:currentPermissions,:basePermissions,:everyonePermissions,:groupPermissions,:flags)";
507 504
508 using (SqlConnection conn = new SqlConnection(m_connectionString)) 505 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
509 using (SqlCommand cmd = new SqlCommand(sql, conn)) 506 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
510 { 507 {
511 conn.Open(); 508 conn.Open();
512 foreach (TaskInventoryItem taskItem in items) 509 foreach (TaskInventoryItem taskItem in items)
@@ -527,43 +524,54 @@ ELSE
527 /// <returns></returns> 524 /// <returns></returns>
528 public double[,] LoadTerrain(UUID regionID) 525 public double[,] LoadTerrain(UUID regionID)
529 { 526 {
530 double[,] terrain = new double[(int)Constants.RegionSize, (int)Constants.RegionSize]; 527 double[,] ret = null;
531 terrain.Initialize(); 528 TerrainData terrData = LoadTerrain(regionID, (int)Constants.RegionSize, (int)Constants.RegionSize, (int)Constants.RegionHeight);
529 if (terrData != null)
530 ret = terrData.GetDoubles();
531 return ret;
532 }
533
534 // Returns 'null' if region not found
535 public TerrainData LoadTerrain(UUID regionID, int pSizeX, int pSizeY, int pSizeZ)
536 {
537 TerrainData terrData = null;
532 538
533 string sql = "select top 1 RegionUUID, Revision, Heightfield from terrain where RegionUUID = @RegionUUID order by Revision desc"; 539 string sql = @"select ""RegionUUID"", ""Revision"", ""Heightfield"" from terrain
540 where ""RegionUUID"" = :RegionUUID order by ""Revision"" desc limit 1; ";
534 541
535 using (SqlConnection conn = new SqlConnection(m_connectionString)) 542 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
536 using (SqlCommand cmd = new SqlCommand(sql, conn))
537 { 543 {
538 // MySqlParameter param = new MySqlParameter(); 544 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
539 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
540 conn.Open();
541 using (SqlDataReader reader = cmd.ExecuteReader())
542 { 545 {
543 int rev; 546 // PGSqlParameter param = new PGSqlParameter();
544 if (reader.Read()) 547 cmd.Parameters.Add(_Database.CreateParameter("RegionUUID", regionID));
548 conn.Open();
549 using (NpgsqlDataReader reader = cmd.ExecuteReader())
545 { 550 {
546 MemoryStream str = new MemoryStream((byte[])reader["Heightfield"]); 551 int rev;
547 BinaryReader br = new BinaryReader(str); 552 if (reader.Read())
548 for (int x = 0; x < (int)Constants.RegionSize; x++)
549 { 553 {
550 for (int y = 0; y < (int)Constants.RegionSize; y++) 554 rev = Convert.ToInt32(reader["Revision"]);
551 { 555 byte[] blob = (byte[])reader["Heightfield"];
552 terrain[x, y] = br.ReadDouble(); 556 terrData = TerrainData.CreateFromDatabaseBlobFactory(pSizeX, pSizeY, pSizeZ, rev, blob);
553 }
554 } 557 }
555 rev = (int)reader["Revision"]; 558 else
556 } 559 {
557 else 560 _Log.Info("[REGION DB]: No terrain found for region");
558 { 561 return null;
559 _Log.Info("[REGION DB]: No terrain found for region"); 562 }
560 return null; 563 _Log.Info("[REGION DB]: Loaded terrain revision r" + rev);
561 } 564 }
562 _Log.Info("[REGION DB]: Loaded terrain revision r" + rev);
563 } 565 }
564 } 566 }
565 567
566 return terrain; 568 return terrData;
569 }
570
571 // Legacy entry point for when terrain was always a 256x256 heightmap
572 public void StoreTerrain(double[,] terrain, UUID regionID)
573 {
574 StoreTerrain(new HeightmapTerrainData(terrain), regionID);
567 } 575 }
568 576
569 /// <summary> 577 /// <summary>
@@ -571,33 +579,43 @@ ELSE
571 /// </summary> 579 /// </summary>
572 /// <param name="terrain">terrain map data.</param> 580 /// <param name="terrain">terrain map data.</param>
573 /// <param name="regionID">regionID.</param> 581 /// <param name="regionID">regionID.</param>
574 public void StoreTerrain(double[,] terrain, UUID regionID) 582 public void StoreTerrain(TerrainData terrData, UUID regionID)
575 { 583 {
576 int revision = Util.UnixTimeSinceEpoch();
577
578 //Delete old terrain map 584 //Delete old terrain map
579 string sql = "delete from terrain where RegionUUID=@RegionUUID"; 585 string sql = @"delete from terrain where ""RegionUUID""=:RegionUUID";
580 using (SqlConnection conn = new SqlConnection(m_connectionString)) 586 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
581 using (SqlCommand cmd = new SqlCommand(sql, conn))
582 { 587 {
583 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID)); 588 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
584 conn.Open(); 589 {
585 cmd.ExecuteNonQuery(); 590 cmd.Parameters.Add(_Database.CreateParameter("RegionUUID", regionID));
591 conn.Open();
592 cmd.ExecuteNonQuery();
593
594 _Log.InfoFormat("{0} Deleted terrain revision id = {1}", LogHeader, regionID);
595 }
586 } 596 }
587 597
588 sql = "insert into terrain(RegionUUID, Revision, Heightfield) values(@RegionUUID, @Revision, @Heightfield)"; 598 int terrainDBRevision;
599 Array terrainDBblob;
600 terrData.GetDatabaseBlob(out terrainDBRevision, out terrainDBblob);
601
602 sql = @"insert into terrain(""RegionUUID"", ""Revision"", ""Heightfield"") values(:RegionUUID, :Revision, :Heightfield)";
589 603
590 using (SqlConnection conn = new SqlConnection(m_connectionString)) 604 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
591 using (SqlCommand cmd = new SqlCommand(sql, conn))
592 { 605 {
593 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID)); 606 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
594 cmd.Parameters.Add(_Database.CreateParameter("@Revision", revision)); 607 {
595 cmd.Parameters.Add(_Database.CreateParameter("@Heightfield", serializeTerrain(terrain))); 608 cmd.Parameters.Add(_Database.CreateParameter("RegionUUID", regionID));
596 conn.Open(); 609 cmd.Parameters.Add(_Database.CreateParameter("Revision", terrainDBRevision));
597 cmd.ExecuteNonQuery(); 610 cmd.Parameters.Add(_Database.CreateParameter("Heightfield", terrainDBblob));
611 conn.Open();
612 cmd.ExecuteNonQuery();
613
614 _Log.InfoFormat("{0} Stored terrain id = {1}, terrainSize = <{2},{3}>",
615 LogHeader, regionID, terrData.SizeX, terrData.SizeY);
616 }
598 } 617 }
599 618
600 _Log.Info("[REGION DB]: Stored terrain revision r " + revision);
601 } 619 }
602 620
603 /// <summary> 621 /// <summary>
@@ -609,15 +627,15 @@ ELSE
609 { 627 {
610 List<LandData> LandDataForRegion = new List<LandData>(); 628 List<LandData> LandDataForRegion = new List<LandData>();
611 629
612 string sql = "select * from land where RegionUUID = @RegionUUID"; 630 string sql = @"select * from land where ""RegionUUID"" = :RegionUUID";
613 631
614 //Retrieve all land data from region 632 //Retrieve all land data from region
615 using (SqlConnection conn = new SqlConnection(m_connectionString)) 633 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
616 using (SqlCommand cmd = new SqlCommand(sql, conn)) 634 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
617 { 635 {
618 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionUUID)); 636 cmd.Parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID));
619 conn.Open(); 637 conn.Open();
620 using (SqlDataReader readerLandData = cmd.ExecuteReader()) 638 using (NpgsqlDataReader readerLandData = cmd.ExecuteReader())
621 { 639 {
622 while (readerLandData.Read()) 640 while (readerLandData.Read())
623 { 641 {
@@ -629,13 +647,13 @@ ELSE
629 //Retrieve all accesslist data for all landdata 647 //Retrieve all accesslist data for all landdata
630 foreach (LandData LandData in LandDataForRegion) 648 foreach (LandData LandData in LandDataForRegion)
631 { 649 {
632 sql = "select * from landaccesslist where LandUUID = @LandUUID"; 650 sql = @"select * from landaccesslist where ""LandUUID"" = :LandUUID";
633 using (SqlConnection conn = new SqlConnection(m_connectionString)) 651 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
634 using (SqlCommand cmd = new SqlCommand(sql, conn)) 652 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
635 { 653 {
636 cmd.Parameters.Add(_Database.CreateParameter("@LandUUID", LandData.GlobalID)); 654 cmd.Parameters.Add(_Database.CreateParameter("LandUUID", LandData.GlobalID));
637 conn.Open(); 655 conn.Open();
638 using (SqlDataReader readerAccessList = cmd.ExecuteReader()) 656 using (NpgsqlDataReader readerAccessList = cmd.ExecuteReader())
639 { 657 {
640 while (readerAccessList.Read()) 658 while (readerAccessList.Read())
641 { 659 {
@@ -656,29 +674,33 @@ ELSE
656 public void StoreLandObject(ILandObject parcel) 674 public void StoreLandObject(ILandObject parcel)
657 { 675 {
658 //As this is only one record in land table I just delete all and then add a new record. 676 //As this is only one record in land table I just delete all and then add a new record.
659 //As the delete landaccess is already in the mysql code 677 //As the delete landaccess is already in the pgsql code
660 678
661 //Delete old values 679 //Delete old values
662 RemoveLandObject(parcel.LandData.GlobalID); 680 RemoveLandObject(parcel.LandData.GlobalID);
663 681
664 //Insert new values 682 //Insert new values
665 string sql = @"INSERT INTO [land] 683 string sql = @"INSERT INTO land
666([UUID],[RegionUUID],[LocalLandID],[Bitmap],[Name],[Description],[OwnerUUID],[IsGroupOwned],[Area],[AuctionID],[Category],[ClaimDate],[ClaimPrice],[GroupUUID],[SalePrice],[LandStatus],[LandFlags],[LandingType],[MediaAutoScale],[MediaTextureUUID],[MediaURL],[MusicURL],[PassHours],[PassPrice],[SnapshotUUID],[UserLocationX],[UserLocationY],[UserLocationZ],[UserLookAtX],[UserLookAtY],[UserLookAtZ],[AuthbuyerID],[OtherCleanTime]) 684 (""UUID"",""RegionUUID"",""LocalLandID"",""Bitmap"",""Name"",""Description"",""OwnerUUID"",""IsGroupOwned"",""Area"",""AuctionID"",""Category"",""ClaimDate"",""ClaimPrice"",
667VALUES 685 ""GroupUUID"",""SalePrice"",""LandStatus"",""LandFlags"",""LandingType"",""MediaAutoScale"",""MediaTextureUUID"",""MediaURL"",""MusicURL"",""PassHours"",""PassPrice"",
668(@UUID,@RegionUUID,@LocalLandID,@Bitmap,@Name,@Description,@OwnerUUID,@IsGroupOwned,@Area,@AuctionID,@Category,@ClaimDate,@ClaimPrice,@GroupUUID,@SalePrice,@LandStatus,@LandFlags,@LandingType,@MediaAutoScale,@MediaTextureUUID,@MediaURL,@MusicURL,@PassHours,@PassPrice,@SnapshotUUID,@UserLocationX,@UserLocationY,@UserLocationZ,@UserLookAtX,@UserLookAtY,@UserLookAtZ,@AuthbuyerID,@OtherCleanTime)"; 686 ""SnapshotUUID"",""UserLocationX"",""UserLocationY"",""UserLocationZ"",""UserLookAtX"",""UserLookAtY"",""UserLookAtZ"",""AuthbuyerID"",""OtherCleanTime"")
669 687 VALUES
670 using (SqlConnection conn = new SqlConnection(m_connectionString)) 688 (:UUID,:RegionUUID,:LocalLandID,:Bitmap,:Name,:Description,:OwnerUUID,:IsGroupOwned,:Area,:AuctionID,:Category,:ClaimDate,:ClaimPrice,
671 using (SqlCommand cmd = new SqlCommand(sql, conn)) 689 :GroupUUID,:SalePrice,:LandStatus,:LandFlags,:LandingType,:MediaAutoScale,:MediaTextureUUID,:MediaURL,:MusicURL,:PassHours,:PassPrice,
690 :SnapshotUUID,:UserLocationX,:UserLocationY,:UserLocationZ,:UserLookAtX,:UserLookAtY,:UserLookAtZ,:AuthbuyerID,:OtherCleanTime)";
691
692 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
693 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
672 { 694 {
673 cmd.Parameters.AddRange(CreateLandParameters(parcel.LandData, parcel.RegionUUID)); 695 cmd.Parameters.AddRange(CreateLandParameters(parcel.LandData, parcel.RegionUUID));
674 conn.Open(); 696 conn.Open();
675 cmd.ExecuteNonQuery(); 697 cmd.ExecuteNonQuery();
676 } 698 }
677 699
678 sql = "INSERT INTO [landaccesslist] ([LandUUID],[AccessUUID],[Flags],[Expires]) VALUES (@LandUUID,@AccessUUID,@Flags,@Expires)"; 700 sql = @"INSERT INTO landaccesslist (""LandUUID"",""AccessUUID"",""LandFlags"",""Expires"") VALUES (:LandUUID,:AccessUUID,:Flags,:Expires)";
679 701
680 using (SqlConnection conn = new SqlConnection(m_connectionString)) 702 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
681 using (SqlCommand cmd = new SqlCommand(sql, conn)) 703 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
682 { 704 {
683 conn.Open(); 705 conn.Open();
684 foreach (LandAccessEntry parcelAccessEntry in parcel.LandData.ParcelAccessList) 706 foreach (LandAccessEntry parcelAccessEntry in parcel.LandData.ParcelAccessList)
@@ -697,19 +719,19 @@ VALUES
697 /// <param name="globalID">UUID of landobject</param> 719 /// <param name="globalID">UUID of landobject</param>
698 public void RemoveLandObject(UUID globalID) 720 public void RemoveLandObject(UUID globalID)
699 { 721 {
700 string sql = "delete from land where UUID=@UUID"; 722 string sql = @"delete from land where ""UUID""=:UUID";
701 using (SqlConnection conn = new SqlConnection(m_connectionString)) 723 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
702 using (SqlCommand cmd = new SqlCommand(sql, conn)) 724 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
703 { 725 {
704 cmd.Parameters.Add(_Database.CreateParameter("@UUID", globalID)); 726 cmd.Parameters.Add(_Database.CreateParameter("UUID", globalID));
705 conn.Open(); 727 conn.Open();
706 cmd.ExecuteNonQuery(); 728 cmd.ExecuteNonQuery();
707 } 729 }
708 sql = "delete from landaccesslist where LandUUID=@UUID"; 730 sql = @"delete from landaccesslist where ""LandUUID""=:UUID";
709 using (SqlConnection conn = new SqlConnection(m_connectionString)) 731 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
710 using (SqlCommand cmd = new SqlCommand(sql, conn)) 732 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
711 { 733 {
712 cmd.Parameters.Add(_Database.CreateParameter("@UUID", globalID)); 734 cmd.Parameters.Add(_Database.CreateParameter("UUID", globalID));
713 conn.Open(); 735 conn.Open();
714 cmd.ExecuteNonQuery(); 736 cmd.ExecuteNonQuery();
715 } 737 }
@@ -718,13 +740,15 @@ VALUES
718 { 740 {
719 RegionLightShareData nWP = new RegionLightShareData(); 741 RegionLightShareData nWP = new RegionLightShareData();
720 nWP.OnSave += StoreRegionWindlightSettings; 742 nWP.OnSave += StoreRegionWindlightSettings;
721 string sql = "select * from [regionwindlight] where region_id = @regionID"; 743
722 using (SqlConnection conn = new SqlConnection(m_connectionString)) 744 string sql = @"select * from regionwindlight where ""region_id"" = :regionID";
723 using (SqlCommand cmd = new SqlCommand(sql, conn)) 745
746 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
747 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
724 { 748 {
725 cmd.Parameters.Add(_Database.CreateParameter("@regionID", regionUUID)); 749 cmd.Parameters.Add(_Database.CreateParameter("regionID", regionUUID.ToString() ));
726 conn.Open(); 750 conn.Open();
727 using (SqlDataReader result = cmd.ExecuteReader()) 751 using (NpgsqlDataReader result = cmd.ExecuteReader())
728 { 752 {
729 if (!result.Read()) 753 if (!result.Read())
730 { 754 {
@@ -807,27 +831,28 @@ VALUES
807 831
808 public void RemoveRegionWindlightSettings(UUID regionID) 832 public void RemoveRegionWindlightSettings(UUID regionID)
809 { 833 {
810 string sql = "delete from [regionwindlight] where region_id = @region_id"; 834 string sql = @"delete from regionwindlight where ""region_id"" = :region_id";
811 using (SqlConnection conn = new SqlConnection(m_connectionString)) 835 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
812 using (SqlCommand cmd = new SqlCommand(sql, conn)) 836 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
813 { 837 {
814 conn.Open(); 838 conn.Open();
815 cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionID)); 839 cmd.Parameters.Add(_Database.CreateParameter("region_id", regionID.ToString()));
816 cmd.ExecuteNonQuery(); 840 cmd.ExecuteNonQuery();
817 } 841 }
818 } 842 }
819 843
820 public void StoreRegionWindlightSettings(RegionLightShareData wl) 844 public void StoreRegionWindlightSettings(RegionLightShareData wl)
821 { 845 {
822 string sql = "select count (region_id) from regionwindlight where region_id = @region_id"; 846 string sql = @"select region_id from regionwindlight where ""region_id"" = :region_id limit 1;";
823 bool exists = false; 847 bool exists = false;
824 using (SqlConnection conn = new SqlConnection(m_connectionString)) 848 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
825 { 849 {
826 conn.Open(); 850 conn.Open();
827 using (SqlCommand cmd = new SqlCommand(sql, conn)) 851 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
828 { 852 {
829 cmd.Parameters.Add(_Database.CreateParameter("@region_id", wl.regionID)); 853 cmd.Parameters.Add(_Database.CreateParameter("region_id", wl.regionID.ToString() ));
830 exists = (int)cmd.ExecuteScalar() > 0; 854 NpgsqlDataReader dr = cmd.ExecuteReader();
855 exists = dr.Read();
831 } 856 }
832 } 857 }
833 if (exists) 858 if (exists)
@@ -836,140 +861,141 @@ VALUES
836 } 861 }
837 862
838 // sql insert 863 // sql insert
839 sql = @"INSERT INTO [regionwindlight] 864 sql = @"INSERT INTO regionwindlight
840 ([region_id] 865 (region_id
841 ,[water_color_r] 866 ,water_color_r
842 ,[water_color_g] 867 ,water_color_g
843 ,[water_color_b] 868 ,water_color_b
844 ,[water_fog_density_exponent] 869 ,water_fog_density_exponent
845 ,[underwater_fog_modifier] 870 ,underwater_fog_modifier
846 ,[reflection_wavelet_scale_1] 871 ,reflection_wavelet_scale_1
847 ,[reflection_wavelet_scale_2] 872 ,reflection_wavelet_scale_2
848 ,[reflection_wavelet_scale_3] 873 ,reflection_wavelet_scale_3
849 ,[fresnel_scale] 874 ,fresnel_scale
850 ,[fresnel_offset] 875 ,fresnel_offset
851 ,[refract_scale_above] 876 ,refract_scale_above
852 ,[refract_scale_below] 877 ,refract_scale_below
853 ,[blur_multiplier] 878 ,blur_multiplier
854 ,[big_wave_direction_x] 879 ,big_wave_direction_x
855 ,[big_wave_direction_y] 880 ,big_wave_direction_y
856 ,[little_wave_direction_x] 881 ,little_wave_direction_x
857 ,[little_wave_direction_y] 882 ,little_wave_direction_y
858 ,[normal_map_texture] 883 ,normal_map_texture
859 ,[horizon_r] 884 ,horizon_r
860 ,[horizon_g] 885 ,horizon_g
861 ,[horizon_b] 886 ,horizon_b
862 ,[horizon_i] 887 ,horizon_i
863 ,[haze_horizon] 888 ,haze_horizon
864 ,[blue_density_r] 889 ,blue_density_r
865 ,[blue_density_g] 890 ,blue_density_g
866 ,[blue_density_b] 891 ,blue_density_b
867 ,[blue_density_i] 892 ,blue_density_i
868 ,[haze_density] 893 ,haze_density
869 ,[density_multiplier] 894 ,density_multiplier
870 ,[distance_multiplier] 895 ,distance_multiplier
871 ,[max_altitude] 896 ,max_altitude
872 ,[sun_moon_color_r] 897 ,sun_moon_color_r
873 ,[sun_moon_color_g] 898 ,sun_moon_color_g
874 ,[sun_moon_color_b] 899 ,sun_moon_color_b
875 ,[sun_moon_color_i] 900 ,sun_moon_color_i
876 ,[sun_moon_position] 901 ,sun_moon_position
877 ,[ambient_r] 902 ,ambient_r
878 ,[ambient_g] 903 ,ambient_g
879 ,[ambient_b] 904 ,ambient_b
880 ,[ambient_i] 905 ,ambient_i
881 ,[east_angle] 906 ,east_angle
882 ,[sun_glow_focus] 907 ,sun_glow_focus
883 ,[sun_glow_size] 908 ,sun_glow_size
884 ,[scene_gamma] 909 ,scene_gamma
885 ,[star_brightness] 910 ,star_brightness
886 ,[cloud_color_r] 911 ,cloud_color_r
887 ,[cloud_color_g] 912 ,cloud_color_g
888 ,[cloud_color_b] 913 ,cloud_color_b
889 ,[cloud_color_i] 914 ,cloud_color_i
890 ,[cloud_x] 915 ,cloud_x
891 ,[cloud_y] 916 ,cloud_y
892 ,[cloud_density] 917 ,cloud_density
893 ,[cloud_coverage] 918 ,cloud_coverage
894 ,[cloud_scale] 919 ,cloud_scale
895 ,[cloud_detail_x] 920 ,cloud_detail_x
896 ,[cloud_detail_y] 921 ,cloud_detail_y
897 ,[cloud_detail_density] 922 ,cloud_detail_density
898 ,[cloud_scroll_x] 923 ,cloud_scroll_x
899 ,[cloud_scroll_x_lock] 924 ,cloud_scroll_x_lock
900 ,[cloud_scroll_y] 925 ,cloud_scroll_y
901 ,[cloud_scroll_y_lock] 926 ,cloud_scroll_y_lock
902 ,[draw_classic_clouds]) 927 ,draw_classic_clouds)
903 VALUES 928 VALUES
904 (@region_id 929 (:region_id
905 ,@water_color_r 930 ,:water_color_r
906 ,@water_color_g 931 ,:water_color_g
907 ,@water_color_b 932 ,:water_color_b
908 ,@water_fog_density_exponent 933 ,:water_fog_density_exponent
909 ,@underwater_fog_modifier 934 ,:underwater_fog_modifier
910 ,@reflection_wavelet_scale_1 935 ,:reflection_wavelet_scale_1
911 ,@reflection_wavelet_scale_2 936 ,:reflection_wavelet_scale_2
912 ,@reflection_wavelet_scale_3 937 ,:reflection_wavelet_scale_3
913 ,@fresnel_scale 938 ,:fresnel_scale
914 ,@fresnel_offset 939 ,:fresnel_offset
915 ,@refract_scale_above 940 ,:refract_scale_above
916 ,@refract_scale_below 941 ,:refract_scale_below
917 ,@blur_multiplier 942 ,:blur_multiplier
918 ,@big_wave_direction_x 943 ,:big_wave_direction_x
919 ,@big_wave_direction_y 944 ,:big_wave_direction_y
920 ,@little_wave_direction_x 945 ,:little_wave_direction_x
921 ,@little_wave_direction_y 946 ,:little_wave_direction_y
922 ,@normal_map_texture 947 ,:normal_map_texture
923 ,@horizon_r 948 ,:horizon_r
924 ,@horizon_g 949 ,:horizon_g
925 ,@horizon_b 950 ,:horizon_b
926 ,@horizon_i 951 ,:horizon_i
927 ,@haze_horizon 952 ,:haze_horizon
928 ,@blue_density_r 953 ,:blue_density_r
929 ,@blue_density_g 954 ,:blue_density_g
930 ,@blue_density_b 955 ,:blue_density_b
931 ,@blue_density_i 956 ,:blue_density_i
932 ,@haze_density 957 ,:haze_density
933 ,@density_multiplier 958 ,:density_multiplier
934 ,@distance_multiplier 959 ,:distance_multiplier
935 ,@max_altitude 960 ,:max_altitude
936 ,@sun_moon_color_r 961 ,:sun_moon_color_r
937 ,@sun_moon_color_g 962 ,:sun_moon_color_g
938 ,@sun_moon_color_b 963 ,:sun_moon_color_b
939 ,@sun_moon_color_i 964 ,:sun_moon_color_i
940 ,@sun_moon_position 965 ,:sun_moon_position
941 ,@ambient_r 966 ,:ambient_r
942 ,@ambient_g 967 ,:ambient_g
943 ,@ambient_b 968 ,:ambient_b
944 ,@ambient_i 969 ,:ambient_i
945 ,@east_angle 970 ,:east_angle
946 ,@sun_glow_focus 971 ,:sun_glow_focus
947 ,@sun_glow_size 972 ,:sun_glow_size
948 ,@scene_gamma 973 ,:scene_gamma
949 ,@star_brightness 974 ,:star_brightness
950 ,@cloud_color_r 975 ,:cloud_color_r
951 ,@cloud_color_g 976 ,:cloud_color_g
952 ,@cloud_color_b 977 ,:cloud_color_b
953 ,@cloud_color_i 978 ,:cloud_color_i
954 ,@cloud_x 979 ,:cloud_x
955 ,@cloud_y 980 ,:cloud_y
956 ,@cloud_density 981 ,:cloud_density
957 ,@cloud_coverage 982 ,:cloud_coverage
958 ,@cloud_scale 983 ,:cloud_scale
959 ,@cloud_detail_x 984 ,:cloud_detail_x
960 ,@cloud_detail_y 985 ,:cloud_detail_y
961 ,@cloud_detail_density 986 ,:cloud_detail_density
962 ,@cloud_scroll_x 987 ,:cloud_scroll_x
963 ,@cloud_scroll_x_lock 988 ,:cloud_scroll_x_lock
964 ,@cloud_scroll_y 989 ,:cloud_scroll_y
965 ,@cloud_scroll_y_lock 990 ,:cloud_scroll_y_lock
966 ,@draw_classic_clouds)"; 991 ,:draw_classic_clouds);";
967 using (SqlConnection conn = new SqlConnection(m_connectionString)) 992
993 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
968 { 994 {
969 conn.Open(); 995 conn.Open();
970 using (SqlCommand cmd = new SqlCommand(sql, conn)) 996 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
971 { 997 {
972 cmd.Parameters.Add(_Database.CreateParameter("region_id", wl.regionID)); 998 cmd.Parameters.Add(_Database.CreateParameter("region_id", wl.regionID.ToString()));
973 cmd.Parameters.Add(_Database.CreateParameter("water_color_r", wl.waterColor.X)); 999 cmd.Parameters.Add(_Database.CreateParameter("water_color_r", wl.waterColor.X));
974 cmd.Parameters.Add(_Database.CreateParameter("water_color_g", wl.waterColor.Y)); 1000 cmd.Parameters.Add(_Database.CreateParameter("water_color_g", wl.waterColor.Y));
975 cmd.Parameters.Add(_Database.CreateParameter("water_color_b", wl.waterColor.Z)); 1001 cmd.Parameters.Add(_Database.CreateParameter("water_color_b", wl.waterColor.Z));
@@ -987,7 +1013,7 @@ VALUES
987 cmd.Parameters.Add(_Database.CreateParameter("big_wave_direction_y", wl.bigWaveDirection.Y)); 1013 cmd.Parameters.Add(_Database.CreateParameter("big_wave_direction_y", wl.bigWaveDirection.Y));
988 cmd.Parameters.Add(_Database.CreateParameter("little_wave_direction_x", wl.littleWaveDirection.X)); 1014 cmd.Parameters.Add(_Database.CreateParameter("little_wave_direction_x", wl.littleWaveDirection.X));
989 cmd.Parameters.Add(_Database.CreateParameter("little_wave_direction_y", wl.littleWaveDirection.Y)); 1015 cmd.Parameters.Add(_Database.CreateParameter("little_wave_direction_y", wl.littleWaveDirection.Y));
990 cmd.Parameters.Add(_Database.CreateParameter("normal_map_texture", wl.normalMapTexture)); 1016 cmd.Parameters.Add(_Database.CreateParameter("normal_map_texture", wl.normalMapTexture.ToString()));
991 cmd.Parameters.Add(_Database.CreateParameter("horizon_r", wl.horizon.X)); 1017 cmd.Parameters.Add(_Database.CreateParameter("horizon_r", wl.horizon.X));
992 cmd.Parameters.Add(_Database.CreateParameter("horizon_g", wl.horizon.Y)); 1018 cmd.Parameters.Add(_Database.CreateParameter("horizon_g", wl.horizon.Y));
993 cmd.Parameters.Add(_Database.CreateParameter("horizon_b", wl.horizon.Z)); 1019 cmd.Parameters.Add(_Database.CreateParameter("horizon_b", wl.horizon.Z));
@@ -1185,13 +1211,13 @@ VALUES
1185 #region Environment Settings 1211 #region Environment Settings
1186 public string LoadRegionEnvironmentSettings(UUID regionUUID) 1212 public string LoadRegionEnvironmentSettings(UUID regionUUID)
1187 { 1213 {
1188 string sql = "select * from [regionenvironment] where region_id = @region_id"; 1214 string sql = "select * from regionenvironment where region_id = :region_id";
1189 using (SqlConnection conn = new SqlConnection(m_connectionString)) 1215 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
1190 using (SqlCommand cmd = new SqlCommand(sql, conn)) 1216 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
1191 { 1217 {
1192 cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); 1218 cmd.Parameters.Add(_Database.CreateParameter("region_id", regionUUID));
1193 conn.Open(); 1219 conn.Open();
1194 using (SqlDataReader result = cmd.ExecuteReader()) 1220 using (NpgsqlDataReader result = cmd.ExecuteReader())
1195 { 1221 {
1196 if (!result.Read()) 1222 if (!result.Read())
1197 { 1223 {
@@ -1208,24 +1234,23 @@ VALUES
1208 public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings) 1234 public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings)
1209 { 1235 {
1210 { 1236 {
1211 string sql = "DELETE FROM [regionenvironment] WHERE region_id = @region_id"; 1237 string sql = "DELETE FROM regionenvironment WHERE region_id = :region_id ;";
1212 using (SqlConnection conn = new SqlConnection(m_connectionString)) 1238
1213 1239 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
1214 using (SqlCommand cmd = new SqlCommand(sql, conn)) 1240 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
1215 { 1241 {
1216 cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); 1242 cmd.Parameters.Add(_Database.CreateParameter("region_id", regionUUID));
1217 conn.Open(); 1243 conn.Open();
1218 cmd.ExecuteNonQuery(); 1244 cmd.ExecuteNonQuery();
1219 } 1245 }
1220 1246
1221 sql = "INSERT INTO [regionenvironment] (region_id, llsd_settings) VALUES (@region_id, @llsd_settings)"; 1247 sql = "INSERT INTO regionenvironment (region_id, llsd_settings) VALUES (:region_id, :llsd_settings) ;";
1222
1223 using (SqlConnection conn = new SqlConnection(m_connectionString))
1224 1248
1225 using (SqlCommand cmd = new SqlCommand(sql, conn)) 1249 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
1250 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
1226 { 1251 {
1227 cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); 1252 cmd.Parameters.Add(_Database.CreateParameter("region_id", regionUUID));
1228 cmd.Parameters.Add(_Database.CreateParameter("@llsd_settings", settings)); 1253 cmd.Parameters.Add(_Database.CreateParameter("llsd_settings", settings));
1229 1254
1230 conn.Open(); 1255 conn.Open();
1231 cmd.ExecuteNonQuery(); 1256 cmd.ExecuteNonQuery();
@@ -1235,11 +1260,11 @@ VALUES
1235 1260
1236 public void RemoveRegionEnvironmentSettings(UUID regionUUID) 1261 public void RemoveRegionEnvironmentSettings(UUID regionUUID)
1237 { 1262 {
1238 string sql = "delete from [regionenvironment] where region_id = @region_id"; 1263 string sql = "delete from regionenvironment where region_id = :region_id ;";
1239 using (SqlConnection conn = new SqlConnection(m_connectionString)) 1264 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
1240 using (SqlCommand cmd = new SqlCommand(sql, conn)) 1265 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
1241 { 1266 {
1242 cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID)); 1267 cmd.Parameters.Add(_Database.CreateParameter("region_id", regionUUID));
1243 1268
1244 conn.Open(); 1269 conn.Open();
1245 cmd.ExecuteNonQuery(); 1270 cmd.ExecuteNonQuery();
@@ -1254,14 +1279,14 @@ VALUES
1254 /// <returns></returns> 1279 /// <returns></returns>
1255 public RegionSettings LoadRegionSettings(UUID regionUUID) 1280 public RegionSettings LoadRegionSettings(UUID regionUUID)
1256 { 1281 {
1257 string sql = "select * from regionsettings where regionUUID = @regionUUID"; 1282 string sql = @"select * from regionsettings where ""regionUUID"" = :regionUUID";
1258 RegionSettings regionSettings; 1283 RegionSettings regionSettings;
1259 using (SqlConnection conn = new SqlConnection(m_connectionString)) 1284 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
1260 using (SqlCommand cmd = new SqlCommand(sql, conn)) 1285 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
1261 { 1286 {
1262 cmd.Parameters.Add(_Database.CreateParameter("@regionUUID", regionUUID)); 1287 cmd.Parameters.Add(_Database.CreateParameter("regionUUID", regionUUID));
1263 conn.Open(); 1288 conn.Open();
1264 using (SqlDataReader reader = cmd.ExecuteReader()) 1289 using (NpgsqlDataReader reader = cmd.ExecuteReader())
1265 { 1290 {
1266 if (reader.Read()) 1291 if (reader.Read())
1267 { 1292 {
@@ -1294,11 +1319,11 @@ VALUES
1294 { 1319 {
1295 //Little check if regionUUID already exist in DB 1320 //Little check if regionUUID already exist in DB
1296 string regionUUID; 1321 string regionUUID;
1297 string sql = "SELECT regionUUID FROM regionsettings WHERE regionUUID = @regionUUID"; 1322 string sql = @"SELECT ""regionUUID"" FROM regionsettings WHERE ""regionUUID"" = :regionUUID";
1298 using (SqlConnection conn = new SqlConnection(m_connectionString)) 1323 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
1299 using (SqlCommand cmd = new SqlCommand(sql, conn)) 1324 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
1300 { 1325 {
1301 cmd.Parameters.Add(_Database.CreateParameter("@regionUUID", regionSettings.RegionUUID)); 1326 cmd.Parameters.Add(_Database.CreateParameter("regionUUID", regionSettings.RegionUUID));
1302 conn.Open(); 1327 conn.Open();
1303 regionUUID = cmd.ExecuteScalar().ToString(); 1328 regionUUID = cmd.ExecuteScalar().ToString();
1304 } 1329 }
@@ -1311,20 +1336,22 @@ VALUES
1311 { 1336 {
1312 //This method only updates region settings!!! First call LoadRegionSettings to create new region settings in DB 1337 //This method only updates region settings!!! First call LoadRegionSettings to create new region settings in DB
1313 sql = 1338 sql =
1314 @"UPDATE [regionsettings] SET [block_terraform] = @block_terraform ,[block_fly] = @block_fly ,[allow_damage] = @allow_damage 1339 @"UPDATE regionsettings SET block_terraform = :block_terraform ,block_fly = :block_fly ,allow_damage = :allow_damage
1315,[restrict_pushing] = @restrict_pushing ,[allow_land_resell] = @allow_land_resell ,[allow_land_join_divide] = @allow_land_join_divide 1340,restrict_pushing = :restrict_pushing ,allow_land_resell = :allow_land_resell ,allow_land_join_divide = :allow_land_join_divide
1316,[block_show_in_search] = @block_show_in_search ,[agent_limit] = @agent_limit ,[object_bonus] = @object_bonus ,[maturity] = @maturity 1341,block_show_in_search = :block_show_in_search ,agent_limit = :agent_limit ,object_bonus = :object_bonus ,maturity = :maturity
1317,[disable_scripts] = @disable_scripts ,[disable_collisions] = @disable_collisions ,[disable_physics] = @disable_physics 1342,disable_scripts = :disable_scripts ,disable_collisions = :disable_collisions ,disable_physics = :disable_physics
1318,[terrain_texture_1] = @terrain_texture_1 ,[terrain_texture_2] = @terrain_texture_2 ,[terrain_texture_3] = @terrain_texture_3 1343,terrain_texture_1 = :terrain_texture_1 ,terrain_texture_2 = :terrain_texture_2 ,terrain_texture_3 = :terrain_texture_3
1319,[terrain_texture_4] = @terrain_texture_4 ,[elevation_1_nw] = @elevation_1_nw ,[elevation_2_nw] = @elevation_2_nw 1344,terrain_texture_4 = :terrain_texture_4 ,elevation_1_nw = :elevation_1_nw ,elevation_2_nw = :elevation_2_nw
1320,[elevation_1_ne] = @elevation_1_ne ,[elevation_2_ne] = @elevation_2_ne ,[elevation_1_se] = @elevation_1_se ,[elevation_2_se] = @elevation_2_se 1345,elevation_1_ne = :elevation_1_ne ,elevation_2_ne = :elevation_2_ne ,elevation_1_se = :elevation_1_se ,elevation_2_se = :elevation_2_se
1321,[elevation_1_sw] = @elevation_1_sw ,[elevation_2_sw] = @elevation_2_sw ,[water_height] = @water_height ,[terrain_raise_limit] = @terrain_raise_limit 1346,elevation_1_sw = :elevation_1_sw ,elevation_2_sw = :elevation_2_sw ,water_height = :water_height ,terrain_raise_limit = :terrain_raise_limit
1322,[terrain_lower_limit] = @terrain_lower_limit ,[use_estate_sun] = @use_estate_sun ,[fixed_sun] = @fixed_sun ,[sun_position] = @sun_position 1347,terrain_lower_limit = :terrain_lower_limit ,use_estate_sun = :use_estate_sun ,fixed_sun = :fixed_sun ,sun_position = :sun_position
1323,[covenant] = @covenant ,[covenant_datetime] = @covenant_datetime, [sunvectorx] = @sunvectorx, [sunvectory] = @sunvectory, [sunvectorz] = @sunvectorz, [Sandbox] = @Sandbox, [loaded_creation_datetime] = @loaded_creation_datetime, [loaded_creation_id] = @loaded_creation_id, [map_tile_id] = @TerrainImageID, [telehubobject] = @telehubobject, [parcel_tile_id] = @ParcelImageID 1348,covenant = :covenant ,covenant_datetime = :covenant_datetime, sunvectorx = :sunvectorx, sunvectory = :sunvectory, sunvectorz = :sunvectorz,
1324 WHERE [regionUUID] = @regionUUID"; 1349""Sandbox"" = :Sandbox, loaded_creation_datetime = :loaded_creation_datetime, loaded_creation_id = :loaded_creation_id, ""map_tile_ID"" = :TerrainImageID,
1325 1350""TelehubObject"" = :telehubobject, ""parcel_tile_ID"" = :ParcelImageID
1326 using (SqlConnection conn = new SqlConnection(m_connectionString)) 1351 WHERE ""regionUUID"" = :regionUUID";
1327 using (SqlCommand cmd = new SqlCommand(sql, conn)) 1352
1353 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
1354 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
1328 { 1355 {
1329 cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings)); 1356 cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
1330 conn.Open(); 1357 conn.Open();
@@ -1342,51 +1369,29 @@ VALUES
1342 #region Private Methods 1369 #region Private Methods
1343 1370
1344 /// <summary> 1371 /// <summary>
1345 /// Serializes the terrain data for storage in DB.
1346 /// </summary>
1347 /// <param name="val">terrain data</param>
1348 /// <returns></returns>
1349 private static Array serializeTerrain(double[,] val)
1350 {
1351 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) * sizeof(double));
1352 BinaryWriter bw = new BinaryWriter(str);
1353
1354 // TODO: COMPATIBILITY - Add byte-order conversions
1355 for (int x = 0; x < (int)Constants.RegionSize; x++)
1356 for (int y = 0; y < (int)Constants.RegionSize; y++)
1357 {
1358 double height = val[x, y];
1359 if (height == 0.0)
1360 height = double.Epsilon;
1361
1362 bw.Write(height);
1363 }
1364
1365 return str.ToArray();
1366 }
1367
1368 /// <summary>
1369 /// Stores new regionsettings. 1372 /// Stores new regionsettings.
1370 /// </summary> 1373 /// </summary>
1371 /// <param name="regionSettings">The region settings.</param> 1374 /// <param name="regionSettings">The region settings.</param>
1372 private void StoreNewRegionSettings(RegionSettings regionSettings) 1375 private void StoreNewRegionSettings(RegionSettings regionSettings)
1373 { 1376 {
1374 string sql = @"INSERT INTO [regionsettings] 1377 string sql = @"INSERT INTO regionsettings
1375 ([regionUUID],[block_terraform],[block_fly],[allow_damage],[restrict_pushing],[allow_land_resell],[allow_land_join_divide], 1378 (""regionUUID"",block_terraform,block_fly,allow_damage,restrict_pushing,allow_land_resell,allow_land_join_divide,
1376 [block_show_in_search],[agent_limit],[object_bonus],[maturity],[disable_scripts],[disable_collisions],[disable_physics], 1379 block_show_in_search,agent_limit,object_bonus,maturity,disable_scripts,disable_collisions,disable_physics,
1377 [terrain_texture_1],[terrain_texture_2],[terrain_texture_3],[terrain_texture_4],[elevation_1_nw],[elevation_2_nw],[elevation_1_ne], 1380 terrain_texture_1,terrain_texture_2,terrain_texture_3,terrain_texture_4,elevation_1_nw,elevation_2_nw,elevation_1_ne,
1378 [elevation_2_ne],[elevation_1_se],[elevation_2_se],[elevation_1_sw],[elevation_2_sw],[water_height],[terrain_raise_limit], 1381 elevation_2_ne,elevation_1_se,elevation_2_se,elevation_1_sw,elevation_2_sw,water_height,terrain_raise_limit,
1379 [terrain_lower_limit],[use_estate_sun],[fixed_sun],[sun_position],[covenant],[covenant_datetime],[sunvectorx], [sunvectory], [sunvectorz],[Sandbox], [loaded_creation_datetime], [loaded_creation_id] 1382 terrain_lower_limit,use_estate_sun,fixed_sun,sun_position,covenant,covenant_datetime,sunvectorx, sunvectory, sunvectorz,
1380 ) 1383 ""Sandbox"", loaded_creation_datetime, loaded_creation_id
1384 )
1381 VALUES 1385 VALUES
1382 (@regionUUID,@block_terraform,@block_fly,@allow_damage,@restrict_pushing,@allow_land_resell,@allow_land_join_divide, 1386 (:regionUUID,:block_terraform,:block_fly,:allow_damage,:restrict_pushing,:allow_land_resell,:allow_land_join_divide,
1383 @block_show_in_search,@agent_limit,@object_bonus,@maturity,@disable_scripts,@disable_collisions,@disable_physics, 1387 :block_show_in_search,:agent_limit,:object_bonus,:maturity,:disable_scripts,:disable_collisions,:disable_physics,
1384 @terrain_texture_1,@terrain_texture_2,@terrain_texture_3,@terrain_texture_4,@elevation_1_nw,@elevation_2_nw,@elevation_1_ne, 1388 :terrain_texture_1,:terrain_texture_2,:terrain_texture_3,:terrain_texture_4,:elevation_1_nw,:elevation_2_nw,:elevation_1_ne,
1385 @elevation_2_ne,@elevation_1_se,@elevation_2_se,@elevation_1_sw,@elevation_2_sw,@water_height,@terrain_raise_limit, 1389 :elevation_2_ne,:elevation_1_se,:elevation_2_se,:elevation_1_sw,:elevation_2_sw,:water_height,:terrain_raise_limit,
1386 @terrain_lower_limit,@use_estate_sun,@fixed_sun,@sun_position,@covenant, @covenant_datetime, @sunvectorx,@sunvectory, @sunvectorz, @Sandbox, @loaded_creation_datetime, @loaded_creation_id)"; 1390 :terrain_lower_limit,:use_estate_sun,:fixed_sun,:sun_position,:covenant, :covenant_datetime, :sunvectorx,:sunvectory,
1387 1391 :sunvectorz, :Sandbox, :loaded_creation_datetime, :loaded_creation_id )";
1388 using (SqlConnection conn = new SqlConnection(m_connectionString)) 1392
1389 using (SqlCommand cmd = new SqlCommand(sql, conn)) 1393 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
1394 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
1390 { 1395 {
1391 cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings)); 1396 cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
1392 conn.Open(); 1397 conn.Open();
@@ -1578,8 +1583,8 @@ VALUES
1578 prim.TouchName = (string)primRow["TouchName"]; 1583 prim.TouchName = (string)primRow["TouchName"];
1579 // permissions 1584 // permissions
1580 prim.Flags = (PrimFlags)Convert.ToUInt32(primRow["ObjectFlags"]); 1585 prim.Flags = (PrimFlags)Convert.ToUInt32(primRow["ObjectFlags"]);
1581 //prim.CreatorID = new UUID((Guid)primRow["CreatorID"]); 1586 //prim.creatorID = new UUID((Guid)primRow["creatorID"]);
1582 prim.CreatorIdentification = (string)primRow["CreatorID"]; 1587 prim.CreatorIdentification = (string)primRow["CreatorID"].ToString();
1583 prim.OwnerID = new UUID((Guid)primRow["OwnerID"]); 1588 prim.OwnerID = new UUID((Guid)primRow["OwnerID"]);
1584 prim.GroupID = new UUID((Guid)primRow["GroupID"]); 1589 prim.GroupID = new UUID((Guid)primRow["GroupID"]);
1585 prim.LastOwnerID = new UUID((Guid)primRow["LastOwnerID"]); 1590 prim.LastOwnerID = new UUID((Guid)primRow["LastOwnerID"]);
@@ -1685,13 +1690,23 @@ VALUES
1685 1690
1686 prim.CollisionSound = new UUID((Guid)primRow["CollisionSound"]); 1691 prim.CollisionSound = new UUID((Guid)primRow["CollisionSound"]);
1687 prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]); 1692 prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]);
1688 if (Convert.ToInt16(primRow["PassTouches"]) != 0) 1693
1689 prim.PassTouches = true; 1694 prim.PassTouches = (bool)primRow["PassTouches"];
1690 prim.LinkNum = Convert.ToInt32(primRow["LinkNumber"]);
1691 1695
1692 if (!(primRow["MediaURL"] is System.DBNull)) 1696 if (!(primRow["MediaURL"] is System.DBNull))
1693 prim.MediaUrl = (string)primRow["MediaURL"]; 1697 prim.MediaUrl = (string)primRow["MediaURL"];
1694 1698
1699 if (!(primRow["DynAttrs"] is System.DBNull) && (string)primRow["DynAttrs"] != "")
1700 prim.DynAttrs = DAMap.FromXml((string)primRow["DynAttrs"]);
1701 else
1702 prim.DynAttrs = new DAMap();
1703
1704 prim.PhysicsShapeType = Convert.ToByte(primRow["PhysicsShapeType"]);
1705 prim.Density = Convert.ToSingle(primRow["Density"]);
1706 prim.GravityModifier = Convert.ToSingle(primRow["GravityModifier"]);
1707 prim.Friction = Convert.ToSingle(primRow["Friction"]);
1708 prim.Restitution = Convert.ToSingle(primRow["Restitution"]);
1709
1695 return prim; 1710 return prim;
1696 } 1711 }
1697 1712
@@ -1749,7 +1764,6 @@ VALUES
1749 baseShape.Media = PrimitiveBaseShape.MediaList.FromXml((string)shapeRow["Media"]); 1764 baseShape.Media = PrimitiveBaseShape.MediaList.FromXml((string)shapeRow["Media"]);
1750 } 1765 }
1751 1766
1752
1753 return baseShape; 1767 return baseShape;
1754 } 1768 }
1755 1769
@@ -1773,8 +1787,8 @@ VALUES
1773 taskItem.Name = (string)inventoryRow["name"]; 1787 taskItem.Name = (string)inventoryRow["name"];
1774 taskItem.Description = (string)inventoryRow["description"]; 1788 taskItem.Description = (string)inventoryRow["description"];
1775 taskItem.CreationDate = Convert.ToUInt32(inventoryRow["creationDate"]); 1789 taskItem.CreationDate = Convert.ToUInt32(inventoryRow["creationDate"]);
1776 //taskItem.CreatorID = new UUID((Guid)inventoryRow["creatorID"]); 1790 //taskItem.creatorID = new UUID((Guid)inventoryRow["creatorID"]);
1777 taskItem.CreatorIdentification = (string)inventoryRow["creatorID"]; 1791 taskItem.CreatorIdentification = (string)inventoryRow["creatorID"].ToString();
1778 taskItem.OwnerID = new UUID((Guid)inventoryRow["ownerID"]); 1792 taskItem.OwnerID = new UUID((Guid)inventoryRow["ownerID"]);
1779 taskItem.LastOwnerID = new UUID((Guid)inventoryRow["lastOwnerID"]); 1793 taskItem.LastOwnerID = new UUID((Guid)inventoryRow["lastOwnerID"]);
1780 taskItem.GroupID = new UUID((Guid)inventoryRow["groupID"]); 1794 taskItem.GroupID = new UUID((Guid)inventoryRow["groupID"]);
@@ -1798,9 +1812,9 @@ VALUES
1798 /// </summary> 1812 /// </summary>
1799 /// <param name="taskItem">item in inventory.</param> 1813 /// <param name="taskItem">item in inventory.</param>
1800 /// <returns></returns> 1814 /// <returns></returns>
1801 private SqlParameter[] CreatePrimInventoryParameters(TaskInventoryItem taskItem) 1815 private NpgsqlParameter[] CreatePrimInventoryParameters(TaskInventoryItem taskItem)
1802 { 1816 {
1803 List<SqlParameter> parameters = new List<SqlParameter>(); 1817 List<NpgsqlParameter> parameters = new List<NpgsqlParameter>();
1804 1818
1805 parameters.Add(_Database.CreateParameter("itemID", taskItem.ItemID)); 1819 parameters.Add(_Database.CreateParameter("itemID", taskItem.ItemID));
1806 parameters.Add(_Database.CreateParameter("primID", taskItem.ParentPartID)); 1820 parameters.Add(_Database.CreateParameter("primID", taskItem.ParentPartID));
@@ -1831,9 +1845,9 @@ VALUES
1831 /// </summary> 1845 /// </summary>
1832 /// <param name="settings">regionsettings.</param> 1846 /// <param name="settings">regionsettings.</param>
1833 /// <returns></returns> 1847 /// <returns></returns>
1834 private SqlParameter[] CreateRegionSettingParameters(RegionSettings settings) 1848 private NpgsqlParameter[] CreateRegionSettingParameters(RegionSettings settings)
1835 { 1849 {
1836 List<SqlParameter> parameters = new List<SqlParameter>(); 1850 List<NpgsqlParameter> parameters = new List<NpgsqlParameter>();
1837 1851
1838 parameters.Add(_Database.CreateParameter("regionUUID", settings.RegionUUID)); 1852 parameters.Add(_Database.CreateParameter("regionUUID", settings.RegionUUID));
1839 parameters.Add(_Database.CreateParameter("block_terraform", settings.BlockTerraform)); 1853 parameters.Add(_Database.CreateParameter("block_terraform", settings.BlockTerraform));
@@ -1888,9 +1902,9 @@ VALUES
1888 /// <param name="land">land parameters.</param> 1902 /// <param name="land">land parameters.</param>
1889 /// <param name="regionUUID">region UUID.</param> 1903 /// <param name="regionUUID">region UUID.</param>
1890 /// <returns></returns> 1904 /// <returns></returns>
1891 private SqlParameter[] CreateLandParameters(LandData land, UUID regionUUID) 1905 private NpgsqlParameter[] CreateLandParameters(LandData land, UUID regionUUID)
1892 { 1906 {
1893 List<SqlParameter> parameters = new List<SqlParameter>(); 1907 List<NpgsqlParameter> parameters = new List<NpgsqlParameter>();
1894 1908
1895 parameters.Add(_Database.CreateParameter("UUID", land.GlobalID)); 1909 parameters.Add(_Database.CreateParameter("UUID", land.GlobalID));
1896 parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID)); 1910 parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID));
@@ -1912,8 +1926,8 @@ VALUES
1912 parameters.Add(_Database.CreateParameter("SalePrice", land.SalePrice)); 1926 parameters.Add(_Database.CreateParameter("SalePrice", land.SalePrice));
1913 parameters.Add(_Database.CreateParameter("LandStatus", (int)land.Status)); //Enum. libsecondlife.Parcel.ParcelStatus 1927 parameters.Add(_Database.CreateParameter("LandStatus", (int)land.Status)); //Enum. libsecondlife.Parcel.ParcelStatus
1914 parameters.Add(_Database.CreateParameter("LandFlags", land.Flags)); 1928 parameters.Add(_Database.CreateParameter("LandFlags", land.Flags));
1915 parameters.Add(_Database.CreateParameter("LandingType", land.LandingType)); 1929 parameters.Add(_Database.CreateParameter("LandingType", Convert.ToInt32( land.LandingType) ));
1916 parameters.Add(_Database.CreateParameter("MediaAutoScale", land.MediaAutoScale)); 1930 parameters.Add(_Database.CreateParameter("MediaAutoScale", Convert.ToInt32( land.MediaAutoScale )));
1917 parameters.Add(_Database.CreateParameter("MediaTextureUUID", land.MediaID)); 1931 parameters.Add(_Database.CreateParameter("MediaTextureUUID", land.MediaID));
1918 parameters.Add(_Database.CreateParameter("MediaURL", land.MediaURL)); 1932 parameters.Add(_Database.CreateParameter("MediaURL", land.MediaURL));
1919 parameters.Add(_Database.CreateParameter("MusicURL", land.MusicURL)); 1933 parameters.Add(_Database.CreateParameter("MusicURL", land.MusicURL));
@@ -1938,9 +1952,9 @@ VALUES
1938 /// <param name="parcelAccessEntry">parcel access entry.</param> 1952 /// <param name="parcelAccessEntry">parcel access entry.</param>
1939 /// <param name="parcelID">parcel ID.</param> 1953 /// <param name="parcelID">parcel ID.</param>
1940 /// <returns></returns> 1954 /// <returns></returns>
1941 private SqlParameter[] CreateLandAccessParameters(LandAccessEntry parcelAccessEntry, UUID parcelID) 1955 private NpgsqlParameter[] CreateLandAccessParameters(LandAccessEntry parcelAccessEntry, UUID parcelID)
1942 { 1956 {
1943 List<SqlParameter> parameters = new List<SqlParameter>(); 1957 List<NpgsqlParameter> parameters = new List<NpgsqlParameter>();
1944 1958
1945 parameters.Add(_Database.CreateParameter("LandUUID", parcelID)); 1959 parameters.Add(_Database.CreateParameter("LandUUID", parcelID));
1946 parameters.Add(_Database.CreateParameter("AccessUUID", parcelAccessEntry.AgentID)); 1960 parameters.Add(_Database.CreateParameter("AccessUUID", parcelAccessEntry.AgentID));
@@ -1957,9 +1971,9 @@ VALUES
1957 /// <param name="sceneGroupID">The scenegroup ID.</param> 1971 /// <param name="sceneGroupID">The scenegroup ID.</param>
1958 /// <param name="regionUUID">The region ID.</param> 1972 /// <param name="regionUUID">The region ID.</param>
1959 /// <returns></returns> 1973 /// <returns></returns>
1960 private SqlParameter[] CreatePrimParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID) 1974 private NpgsqlParameter[] CreatePrimParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
1961 { 1975 {
1962 List<SqlParameter> parameters = new List<SqlParameter>(); 1976 List<NpgsqlParameter> parameters = new List<NpgsqlParameter>();
1963 1977
1964 parameters.Add(_Database.CreateParameter("UUID", prim.UUID)); 1978 parameters.Add(_Database.CreateParameter("UUID", prim.UUID));
1965 parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID)); 1979 parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID));
@@ -2080,12 +2094,22 @@ VALUES
2080 2094
2081 parameters.Add(_Database.CreateParameter("CollisionSound", prim.CollisionSound)); 2095 parameters.Add(_Database.CreateParameter("CollisionSound", prim.CollisionSound));
2082 parameters.Add(_Database.CreateParameter("CollisionSoundVolume", prim.CollisionSoundVolume)); 2096 parameters.Add(_Database.CreateParameter("CollisionSoundVolume", prim.CollisionSoundVolume));
2083 if (prim.PassTouches) 2097
2084 parameters.Add(_Database.CreateParameter("PassTouches", 1)); 2098 parameters.Add(_Database.CreateParameter("PassTouches", prim.PassTouches));
2085 else 2099
2086 parameters.Add(_Database.CreateParameter("PassTouches", 0));
2087 parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum)); 2100 parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum));
2088 parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl)); 2101 parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl));
2102
2103 if (prim.DynAttrs.CountNamespaces > 0)
2104 parameters.Add(_Database.CreateParameter("DynAttrs", prim.DynAttrs.ToXml()));
2105 else
2106 parameters.Add(_Database.CreateParameter("DynAttrs", null));
2107
2108 parameters.Add(_Database.CreateParameter("PhysicsShapeType", prim.PhysicsShapeType));
2109 parameters.Add(_Database.CreateParameter("Density", (double)prim.Density));
2110 parameters.Add(_Database.CreateParameter("GravityModifier", (double)prim.GravityModifier));
2111 parameters.Add(_Database.CreateParameter("Friction", (double)prim.Friction));
2112 parameters.Add(_Database.CreateParameter("Restitution", (double)prim.Restitution));
2089 2113
2090 return parameters.ToArray(); 2114 return parameters.ToArray();
2091 } 2115 }
@@ -2097,9 +2121,9 @@ VALUES
2097 /// <param name="sceneGroupID">The scene group ID.</param> 2121 /// <param name="sceneGroupID">The scene group ID.</param>
2098 /// <param name="regionUUID">The region UUID.</param> 2122 /// <param name="regionUUID">The region UUID.</param>
2099 /// <returns></returns> 2123 /// <returns></returns>
2100 private SqlParameter[] CreatePrimShapeParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID) 2124 private NpgsqlParameter[] CreatePrimShapeParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
2101 { 2125 {
2102 List<SqlParameter> parameters = new List<SqlParameter>(); 2126 List<NpgsqlParameter> parameters = new List<NpgsqlParameter>();
2103 2127
2104 PrimitiveBaseShape s = prim.Shape; 2128 PrimitiveBaseShape s = prim.Shape;
2105 parameters.Add(_Database.CreateParameter("UUID", prim.UUID)); 2129 parameters.Add(_Database.CreateParameter("UUID", prim.UUID));
@@ -2143,7 +2167,6 @@ VALUES
2143 parameters.Add(_Database.CreateParameter("Media", s.Media.ToXml())); 2167 parameters.Add(_Database.CreateParameter("Media", s.Media.ToXml()));
2144 } 2168 }
2145 2169
2146
2147 return parameters.ToArray(); 2170 return parameters.ToArray();
2148 } 2171 }
2149 2172
@@ -2155,13 +2178,14 @@ VALUES
2155 { 2178 {
2156 rs.ClearSpawnPoints(); 2179 rs.ClearSpawnPoints();
2157 2180
2158 string sql = "SELECT Yaw, Pitch, Distance FROM spawn_points WHERE RegionUUID = @RegionUUID"; 2181 string sql = @"SELECT ""Yaw"", ""Pitch"", ""Distance"" FROM spawn_points WHERE ""RegionUUID"" = :RegionUUID";
2159 using (SqlConnection conn = new SqlConnection(m_connectionString)) 2182
2160 using (SqlCommand cmd = new SqlCommand(sql, conn)) 2183 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
2184 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
2161 { 2185 {
2162 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", rs.RegionUUID.ToString())); 2186 cmd.Parameters.Add(_Database.CreateParameter("RegionUUID", rs.RegionUUID));
2163 conn.Open(); 2187 conn.Open();
2164 using (SqlDataReader reader = cmd.ExecuteReader()) 2188 using (NpgsqlDataReader reader = cmd.ExecuteReader())
2165 { 2189 {
2166 if (reader.Read()) 2190 if (reader.Read())
2167 { 2191 {
@@ -2179,24 +2203,24 @@ VALUES
2179 2203
2180 private void SaveSpawnPoints(RegionSettings rs) 2204 private void SaveSpawnPoints(RegionSettings rs)
2181 { 2205 {
2182 string sql = "DELETE FROM spawn_points WHERE RegionUUID = @RegionUUID"; 2206 string sql = @"DELETE FROM spawn_points WHERE ""RegionUUID"" = :RegionUUID";
2183 using (SqlConnection conn = new SqlConnection(m_connectionString)) 2207 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
2184 using (SqlCommand cmd = new SqlCommand(sql, conn)) 2208 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
2185 { 2209 {
2186 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", rs.RegionUUID)); 2210 cmd.Parameters.Add(_Database.CreateParameter("RegionUUID", rs.RegionUUID));
2187 conn.Open(); 2211 conn.Open();
2188 cmd.ExecuteNonQuery(); 2212 cmd.ExecuteNonQuery();
2189 } 2213 }
2190 foreach (SpawnPoint p in rs.SpawnPoints()) 2214 foreach (SpawnPoint p in rs.SpawnPoints())
2191 { 2215 {
2192 sql = "INSERT INTO spawn_points (RegionUUID, Yaw, Pitch, Distance) VALUES (@RegionUUID, @Yaw, @Pitch, @Distance)"; 2216 sql = @"INSERT INTO spawn_points (""RegionUUID"", ""Yaw"", ""Pitch"", ""Distance"") VALUES (:RegionUUID, :Yaw, :Pitch, :Distance)";
2193 using (SqlConnection conn = new SqlConnection(m_connectionString)) 2217 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
2194 using (SqlCommand cmd = new SqlCommand(sql, conn)) 2218 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
2195 { 2219 {
2196 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", rs.RegionUUID)); 2220 cmd.Parameters.Add(_Database.CreateParameter("RegionUUID", rs.RegionUUID));
2197 cmd.Parameters.Add(_Database.CreateParameter("@Yaw", p.Yaw)); 2221 cmd.Parameters.Add(_Database.CreateParameter("Yaw", p.Yaw));
2198 cmd.Parameters.Add(_Database.CreateParameter("@Pitch", p.Pitch)); 2222 cmd.Parameters.Add(_Database.CreateParameter("Pitch", p.Pitch));
2199 cmd.Parameters.Add(_Database.CreateParameter("@Distance", p.Distance)); 2223 cmd.Parameters.Add(_Database.CreateParameter("Distance", p.Distance));
2200 conn.Open(); 2224 conn.Open();
2201 cmd.ExecuteNonQuery(); 2225 cmd.ExecuteNonQuery();
2202 } 2226 }
diff --git a/OpenSim/Data/PGSQL/PGSQLUserAccountData.cs b/OpenSim/Data/PGSQL/PGSQLUserAccountData.cs
new file mode 100644
index 0000000..0a68b23
--- /dev/null
+++ b/OpenSim/Data/PGSQL/PGSQLUserAccountData.cs
@@ -0,0 +1,329 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ''AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using OpenMetaverse;
33using OpenSim.Framework;
34using System.Text;
35using Npgsql;
36using log4net;
37using System.Reflection;
38
39namespace OpenSim.Data.PGSQL
40{
41 public class PGSQLUserAccountData : PGSQLGenericTableHandler<UserAccountData>,IUserAccountData
42 {
43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44
45
46 public PGSQLUserAccountData(string connectionString, string realm) :
47 base(connectionString, realm, "UserAccount")
48 {
49 }
50
51 /*
52 private string m_Realm;
53 private List<string> m_ColumnNames = null;
54 private PGSQLManager m_database;
55
56 public PGSQLUserAccountData(string connectionString, string realm) :
57 base(connectionString, realm, "UserAccount")
58 {
59 m_Realm = realm;
60 m_ConnectionString = connectionString;
61 m_database = new PGSQLManager(connectionString);
62
63 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
64 {
65 conn.Open();
66 Migration m = new Migration(conn, GetType().Assembly, "UserAccount");
67 m.Update();
68 }
69 }
70 */
71 /*
72 public List<UserAccountData> Query(UUID principalID, UUID scopeID, string query)
73 {
74 return null;
75 }
76 */
77 /*
78 public override UserAccountData[] Get(string[] fields, string[] keys)
79 {
80 UserAccountData[] retUA = base.Get(fields,keys);
81
82 if (retUA.Length > 0)
83 {
84 Dictionary<string, string> data = retUA[0].Data;
85 Dictionary<string, string> data2 = new Dictionary<string, string>();
86
87 foreach (KeyValuePair<string,string> chave in data)
88 {
89 string s2 = chave.Key;
90
91 data2[s2] = chave.Value;
92
93 if (!m_FieldTypes.ContainsKey(chave.Key))
94 {
95 string tipo = "";
96 m_FieldTypes.TryGetValue(chave.Key, out tipo);
97 m_FieldTypes.Add(s2, tipo);
98 }
99 }
100 foreach (KeyValuePair<string, string> chave in data2)
101 {
102 if (!retUA[0].Data.ContainsKey(chave.Key))
103 retUA[0].Data.Add(chave.Key, chave.Value);
104 }
105 }
106
107 return retUA;
108 }
109 */
110 /*
111 public UserAccountData Get(UUID principalID, UUID scopeID)
112 {
113 UserAccountData ret = new UserAccountData();
114 ret.Data = new Dictionary<string, string>();
115
116 string sql = string.Format(@"select * from {0} where ""PrincipalID"" = :principalID", m_Realm);
117 if (scopeID != UUID.Zero)
118 sql += @" and ""ScopeID"" = :scopeID";
119
120 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
121 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
122 {
123 cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
124 cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
125
126 conn.Open();
127 using (NpgsqlDataReader result = cmd.ExecuteReader())
128 {
129 if (result.Read())
130 {
131 ret.PrincipalID = principalID;
132 UUID scope;
133 UUID.TryParse(result["scopeid"].ToString(), out scope);
134 ret.ScopeID = scope;
135
136 if (m_ColumnNames == null)
137 {
138 m_ColumnNames = new List<string>();
139
140 DataTable schemaTable = result.GetSchemaTable();
141 foreach (DataRow row in schemaTable.Rows)
142 m_ColumnNames.Add(row["ColumnName"].ToString());
143 }
144
145 foreach (string s in m_ColumnNames)
146 {
147 string s2 = s;
148 if (s2 == "uuid")
149 continue;
150 if (s2 == "scopeid")
151 continue;
152
153 ret.Data[s] = result[s].ToString();
154 }
155 return ret;
156 }
157 }
158 }
159 return null;
160 }
161
162
163 public override bool Store(UserAccountData data)
164 {
165 if (data.Data.ContainsKey("PrincipalID"))
166 data.Data.Remove("PrincipalID");
167 if (data.Data.ContainsKey("ScopeID"))
168 data.Data.Remove("ScopeID");
169
170 string[] fields = new List<string>(data.Data.Keys).ToArray();
171
172 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
173 using (NpgsqlCommand cmd = new NpgsqlCommand())
174 {
175 m_log.DebugFormat("[USER]: Try to update user {0} {1}", data.FirstName, data.LastName);
176
177 StringBuilder updateBuilder = new StringBuilder();
178 updateBuilder.AppendFormat("update {0} set ", m_Realm);
179 bool first = true;
180 foreach (string field in fields)
181 {
182 if (!first)
183 updateBuilder.Append(", ");
184 updateBuilder.AppendFormat("\"{0}\" = :{0}", field);
185
186 first = false;
187 if (m_FieldTypes.ContainsKey(field))
188 cmd.Parameters.Add(m_database.CreateParameter("" + field, data.Data[field], m_FieldTypes[field]));
189 else
190 cmd.Parameters.Add(m_database.CreateParameter("" + field, data.Data[field]));
191 }
192
193 updateBuilder.Append(" where \"PrincipalID\" = :principalID");
194
195 if (data.ScopeID != UUID.Zero)
196 updateBuilder.Append(" and \"ScopeID\" = :scopeID");
197
198 cmd.CommandText = updateBuilder.ToString();
199 cmd.Connection = conn;
200 cmd.Parameters.Add(m_database.CreateParameter("principalID", data.PrincipalID));
201 cmd.Parameters.Add(m_database.CreateParameter("scopeID", data.ScopeID));
202
203 m_log.DebugFormat("[USER]: SQL update user {0} ", cmd.CommandText);
204
205 conn.Open();
206
207 m_log.DebugFormat("[USER]: CON opened update user {0} ", cmd.CommandText);
208
209 int conta = 0;
210 try
211 {
212 conta = cmd.ExecuteNonQuery();
213 }
214 catch (Exception e){
215 m_log.ErrorFormat("[USER]: ERROR opened update user {0} ", e.Message);
216 }
217
218
219 if (conta < 1)
220 {
221 m_log.DebugFormat("[USER]: Try to insert user {0} {1}", data.FirstName, data.LastName);
222
223 StringBuilder insertBuilder = new StringBuilder();
224 insertBuilder.AppendFormat(@"insert into {0} (""PrincipalID"", ""ScopeID"", ""FirstName"", ""LastName"", """, m_Realm);
225 insertBuilder.Append(String.Join(@""", """, fields));
226 insertBuilder.Append(@""") values (:principalID, :scopeID, :FirstName, :LastName, :");
227 insertBuilder.Append(String.Join(", :", fields));
228 insertBuilder.Append(");");
229
230 cmd.Parameters.Add(m_database.CreateParameter("FirstName", data.FirstName));
231 cmd.Parameters.Add(m_database.CreateParameter("LastName", data.LastName));
232
233 cmd.CommandText = insertBuilder.ToString();
234
235 if (cmd.ExecuteNonQuery() < 1)
236 {
237 return false;
238 }
239 }
240 else
241 m_log.DebugFormat("[USER]: User {0} {1} exists", data.FirstName, data.LastName);
242 }
243 return true;
244 }
245
246
247 public bool Store(UserAccountData data, UUID principalID, string token)
248 {
249 return false;
250 }
251
252
253 public bool SetDataItem(UUID principalID, string item, string value)
254 {
255 string sql = string.Format(@"update {0} set {1} = :{1} where ""UUID"" = :UUID", m_Realm, item);
256 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
257 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
258 {
259 if (m_FieldTypes.ContainsKey(item))
260 cmd.Parameters.Add(m_database.CreateParameter("" + item, value, m_FieldTypes[item]));
261 else
262 cmd.Parameters.Add(m_database.CreateParameter("" + item, value));
263
264 cmd.Parameters.Add(m_database.CreateParameter("UUID", principalID));
265 conn.Open();
266
267 if (cmd.ExecuteNonQuery() > 0)
268 return true;
269 }
270 return false;
271 }
272 */
273 /*
274 public UserAccountData[] Get(string[] keys, string[] vals)
275 {
276 return null;
277 }
278 */
279
280 public UserAccountData[] GetUsers(UUID scopeID, string query)
281 {
282 string[] words = query.Split(new char[] { ' ' });
283
284 for (int i = 0; i < words.Length; i++)
285 {
286 if (words[i].Length < 3)
287 {
288 if (i != words.Length - 1)
289 Array.Copy(words, i + 1, words, i, words.Length - i - 1);
290 Array.Resize(ref words, words.Length - 1);
291 }
292 }
293
294 if (words.Length == 0)
295 return new UserAccountData[0];
296
297 if (words.Length > 2)
298 return new UserAccountData[0];
299
300 string sql = "";
301 UUID scope_id;
302 UUID.TryParse(scopeID.ToString(), out scope_id);
303
304 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
305 using (NpgsqlCommand cmd = new NpgsqlCommand())
306 {
307 if (words.Length == 1)
308 {
309 sql = String.Format(@"select * from {0} where (""ScopeID""=:ScopeID or ""ScopeID""=:UUIDZero) and (""FirstName"" ilike :search or ""LastName"" ilike :search)", m_Realm);
310 cmd.Parameters.Add(m_database.CreateParameter("scopeID", (UUID)scope_id));
311 cmd.Parameters.Add (m_database.CreateParameter("UUIDZero", (UUID)UUID.Zero));
312 cmd.Parameters.Add(m_database.CreateParameter("search", "%" + words[0] + "%"));
313 }
314 else
315 {
316 sql = String.Format(@"select * from {0} where (""ScopeID""=:ScopeID or ""ScopeID""=:UUIDZero) and (""FirstName"" ilike :searchFirst or ""LastName"" ilike :searchLast)", m_Realm);
317 cmd.Parameters.Add(m_database.CreateParameter("searchFirst", "%" + words[0] + "%"));
318 cmd.Parameters.Add(m_database.CreateParameter("searchLast", "%" + words[1] + "%"));
319 cmd.Parameters.Add (m_database.CreateParameter("UUIDZero", (UUID)UUID.Zero));
320 cmd.Parameters.Add(m_database.CreateParameter("ScopeID", (UUID)scope_id));
321 }
322 cmd.Connection = conn;
323 cmd.CommandText = sql;
324 conn.Open();
325 return DoQuery(cmd);
326 }
327 }
328 }
329}
diff --git a/OpenSim/Data/PGSQL/PGSQLUserProfilesData.cs b/OpenSim/Data/PGSQL/PGSQLUserProfilesData.cs
new file mode 100644
index 0000000..f166976
--- /dev/null
+++ b/OpenSim/Data/PGSQL/PGSQLUserProfilesData.cs
@@ -0,0 +1,1064 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Data;
30using System.Reflection;
31using OpenSim.Data;
32using OpenSim.Framework;
33using OpenMetaverse;
34using OpenMetaverse.StructuredData;
35using log4net;
36using Npgsql;
37
38namespace OpenSim.Data.PGSQL
39{
40 public class UserProfilesData : IProfilesData
41 {
42 static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
43
44 protected PGSQLManager m_database;
45
46 #region Properites
47 string ConnectionString
48 {
49 get;
50 set;
51 }
52
53 protected virtual Assembly Assembly
54 {
55 get { return GetType().Assembly; }
56 }
57
58 #endregion Properties
59
60 #region class Member Functions
61 public UserProfilesData(string connectionString)
62 {
63 ConnectionString = connectionString;
64 Init();
65 }
66
67 void Init()
68 {
69 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
70 {
71 dbcon.Open();
72
73 Migration m = new Migration(dbcon, Assembly, "UserProfiles");
74 m.Update();
75 m_database = new PGSQLManager(ConnectionString);
76 }
77 }
78 #endregion Member Functions
79
80 #region Classifieds Queries
81 /// <summary>
82 /// Gets the classified records.
83 /// </summary>
84 /// <returns>
85 /// Array of classified records
86 /// </returns>
87 /// <param name='creatorId'>
88 /// Creator identifier.
89 /// </param>
90 public OSDArray GetClassifiedRecords(UUID creatorId)
91 {
92 OSDArray data = new OSDArray();
93
94 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
95 {
96 string query = @"SELECT classifieduuid, name FROM classifieds WHERE creatoruuid = :Id";
97 dbcon.Open();
98 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
99 {
100 cmd.Parameters.Add(m_database.CreateParameter("Id", creatorId));
101 using (NpgsqlDataReader reader = cmd.ExecuteReader(CommandBehavior.Default))
102 {
103 if (reader.HasRows)
104 {
105 while (reader.Read())
106 {
107 OSDMap n = new OSDMap();
108 UUID Id = UUID.Zero;
109
110 string Name = null;
111 try
112 {
113 Id = DBGuid.FromDB(reader["classifieduuid"]);
114 Name = Convert.ToString(reader["name"]);
115 }
116 catch (Exception e)
117 {
118 m_log.Error("[PROFILES_DATA]: UserAccount exception ", e);
119 }
120
121 n.Add("classifieduuid", OSD.FromUUID(Id));
122 n.Add("name", OSD.FromString(Name));
123 data.Add(n);
124 }
125 }
126 }
127 }
128 }
129 return data;
130 }
131
132 public bool UpdateClassifiedRecord(UserClassifiedAdd ad, ref string result)
133 {
134 string query = string.Empty;
135
136 query = @"WITH upsert AS (
137 UPDATE classifieds SET
138 classifieduuid = :ClassifiedId, creatoruuid = :CreatorId, creationdate = :CreatedDate,
139 expirationdate = :ExpirationDate,category =:Category, name = :Name, description = :Description,
140 parceluuid = :ParcelId, parentestate = :ParentEstate, snapshotuuid = :SnapshotId,
141 simname = :SimName, posglobal = :GlobalPos, parcelname = :ParcelName, classifiedflags = :Flags,
142 priceforlisting = :ListingPrice
143 RETURNING * )
144 INSERT INTO classifieds (classifieduuid,creatoruuid,creationdate,expirationdate,category,name,
145 description,parceluuid,parentestate,snapshotuuid,simname,posglobal,parcelname,classifiedflags,
146 priceforlisting)
147 SELECT
148 :ClassifiedId,:CreatorId,:CreatedDate,:ExpirationDate,:Category,:Name,:Description,
149 :ParcelId,:ParentEstate,:SnapshotId,:SimName,:GlobalPos,:ParcelName,:Flags,:ListingPrice
150 WHERE NOT EXISTS (
151 SELECT * FROM upsert )";
152
153 if (string.IsNullOrEmpty(ad.ParcelName))
154 ad.ParcelName = "Unknown";
155 if (ad.ParcelId == null)
156 ad.ParcelId = UUID.Zero;
157 if (string.IsNullOrEmpty(ad.Description))
158 ad.Description = "No Description";
159
160 DateTime epoch = new DateTime(1970, 1, 1);
161 DateTime now = DateTime.Now;
162 TimeSpan epochnow = now - epoch;
163 TimeSpan duration;
164 DateTime expiration;
165 TimeSpan epochexp;
166
167 if (ad.Flags == 2)
168 {
169 duration = new TimeSpan(7, 0, 0, 0);
170 expiration = now.Add(duration);
171 epochexp = expiration - epoch;
172 }
173 else
174 {
175 duration = new TimeSpan(365, 0, 0, 0);
176 expiration = now.Add(duration);
177 epochexp = expiration - epoch;
178 }
179 ad.CreationDate = (int)epochnow.TotalSeconds;
180 ad.ExpirationDate = (int)epochexp.TotalSeconds;
181
182 try
183 {
184 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
185 {
186 dbcon.Open();
187 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
188 {
189 cmd.Parameters.Add(m_database.CreateParameter("ClassifiedId", ad.ClassifiedId));
190 cmd.Parameters.Add(m_database.CreateParameter("CreatorId", ad.CreatorId));
191 cmd.Parameters.Add(m_database.CreateParameter("CreatedDate", (int)ad.CreationDate));
192 cmd.Parameters.Add(m_database.CreateParameter("ExpirationDate", (int)ad.ExpirationDate));
193 cmd.Parameters.Add(m_database.CreateParameter("Category", ad.Category.ToString()));
194 cmd.Parameters.Add(m_database.CreateParameter("Name", ad.Name.ToString()));
195 cmd.Parameters.Add(m_database.CreateParameter("Description", ad.Description.ToString()));
196 cmd.Parameters.Add(m_database.CreateParameter("ParcelId", ad.ParcelId));
197 cmd.Parameters.Add(m_database.CreateParameter("ParentEstate", (int)ad.ParentEstate));
198 cmd.Parameters.Add(m_database.CreateParameter("SnapshotId", ad.SnapshotId));
199 cmd.Parameters.Add(m_database.CreateParameter("SimName", ad.SimName.ToString()));
200 cmd.Parameters.Add(m_database.CreateParameter("GlobalPos", ad.GlobalPos.ToString()));
201 cmd.Parameters.Add(m_database.CreateParameter("ParcelName", ad.ParcelName.ToString()));
202 cmd.Parameters.Add(m_database.CreateParameter("Flags", (int)Convert.ToInt32(ad.Flags)));
203 cmd.Parameters.Add(m_database.CreateParameter("ListingPrice", (int)Convert.ToInt32(ad.Price)));
204
205 cmd.ExecuteNonQuery();
206 }
207 }
208 }
209 catch (Exception e)
210 {
211 m_log.Error("[PROFILES_DATA]: ClassifiedsUpdate exception ", e);
212 result = e.Message;
213 return false;
214 }
215
216 return true;
217 }
218
219 public bool DeleteClassifiedRecord(UUID recordId)
220 {
221 string query = string.Empty;
222
223 query = @"DELETE FROM classifieds WHERE classifieduuid = :ClassifiedId ;";
224
225 try
226 {
227 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
228 {
229 dbcon.Open();
230
231 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
232 {
233 cmd.Parameters.Add(m_database.CreateParameter("ClassifiedId", recordId));
234 cmd.ExecuteNonQuery();
235 }
236 }
237 }
238 catch (Exception e)
239 {
240 m_log.Error("[PROFILES_DATA]: DeleteClassifiedRecord exception ", e);
241 return false;
242 }
243
244 return true;
245 }
246
247 public bool GetClassifiedInfo(ref UserClassifiedAdd ad, ref string result)
248 {
249 string query = string.Empty;
250
251 query += "SELECT * FROM classifieds WHERE ";
252 query += "classifieduuid = :AdId";
253
254 try
255 {
256 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
257 {
258 dbcon.Open();
259 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
260 {
261 cmd.Parameters.Add(m_database.CreateParameter("AdId", ad.ClassifiedId));
262
263 using (NpgsqlDataReader reader = cmd.ExecuteReader())
264 {
265 if (reader.Read())
266 {
267 ad.CreatorId = DBGuid.FromDB(reader["creatoruuid"]);
268 ad.ParcelId = DBGuid.FromDB(reader["parceluuid"]);
269 ad.SnapshotId = DBGuid.FromDB(reader["snapshotuuid"]);
270 ad.CreationDate = Convert.ToInt32(reader["creationdate"]);
271 ad.ExpirationDate = Convert.ToInt32(reader["expirationdate"]);
272 ad.ParentEstate = Convert.ToInt32(reader["parentestate"]);
273 ad.Flags = (byte)Convert.ToInt16(reader["classifiedflags"]);
274 ad.Category = Convert.ToInt32(reader["category"]);
275 ad.Price = Convert.ToInt16(reader["priceforlisting"]);
276 ad.Name = reader["name"].ToString();
277 ad.Description = reader["description"].ToString();
278 ad.SimName = reader["simname"].ToString();
279 ad.GlobalPos = reader["posglobal"].ToString();
280 ad.ParcelName = reader["parcelname"].ToString();
281 }
282 }
283 }
284 dbcon.Close();
285 }
286 }
287 catch (Exception e)
288 {
289 m_log.Error("[PROFILES_DATA]: GetClassifiedInfo exception ", e);
290 }
291
292 return true;
293 }
294
295 public static UUID GetUUID(object uuidValue)
296 {
297
298 UUID ret = UUID.Zero;
299
300 UUID.TryParse(uuidValue.ToString(), out ret);
301
302 return ret;
303 }
304
305 #endregion Classifieds Queries
306
307 #region Picks Queries
308 public OSDArray GetAvatarPicks(UUID avatarId)
309 {
310 string query = string.Empty;
311
312 query += "SELECT pickuuid, name FROM userpicks WHERE ";
313 query += "creatoruuid = :Id";
314 OSDArray data = new OSDArray();
315
316 try
317 {
318 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
319 {
320 dbcon.Open();
321 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
322 {
323 cmd.Parameters.Add(m_database.CreateParameter("Id", avatarId));
324
325 using (NpgsqlDataReader reader = cmd.ExecuteReader())
326 {
327 if (reader.HasRows)
328 {
329 while (reader.Read())
330 {
331 OSDMap record = new OSDMap();
332
333 record.Add("pickuuid", OSD.FromUUID(DBGuid.FromDB(reader["pickuuid"])));
334 record.Add("name", OSD.FromString((string)reader["name"]));
335 data.Add(record);
336 }
337 }
338 }
339 }
340 }
341 }
342 catch (Exception e)
343 {
344 m_log.Error("[PROFILES_DATA]: GetAvatarPicks exception ", e);
345 }
346
347 return data;
348 }
349
350 public UserProfilePick GetPickInfo(UUID avatarId, UUID pickId)
351 {
352 string query = string.Empty;
353 UserProfilePick pick = new UserProfilePick();
354
355 query += "SELECT * FROM userpicks WHERE ";
356 query += "creatoruuid = :CreatorId AND ";
357 query += "pickuuid = :PickId";
358
359 try
360 {
361 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
362 {
363 dbcon.Open();
364 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
365 {
366 cmd.Parameters.Add(m_database.CreateParameter("CreatorId", avatarId));
367 cmd.Parameters.Add(m_database.CreateParameter("PickId", pickId));
368
369 using (NpgsqlDataReader reader = cmd.ExecuteReader())
370 {
371 if (reader.HasRows)
372 {
373 reader.Read();
374
375 string description = (string)reader["description"];
376
377 if (string.IsNullOrEmpty(description))
378 description = "No description given.";
379
380 pick.PickId = DBGuid.FromDB(reader["pickuuid"]);
381 pick.CreatorId = DBGuid.FromDB(reader["creatoruuid"]);
382 pick.ParcelId = DBGuid.FromDB(reader["parceluuid"]);
383 pick.SnapshotId = DBGuid.FromDB(reader["snapshotuuid"]);
384 pick.GlobalPos = (string)reader["posglobal"].ToString();
385 pick.TopPick = Convert.ToBoolean(reader["toppick"]);
386 pick.Enabled = Convert.ToBoolean(reader["enabled"]);
387 pick.Name = reader["name"].ToString();
388 pick.Desc = reader["description"].ToString();
389 pick.ParcelName = reader["user"].ToString();
390 pick.OriginalName = reader["originalname"].ToString();
391 pick.SimName = reader["simname"].ToString();
392 pick.SortOrder = (int)reader["sortorder"];
393 }
394 }
395 }
396 dbcon.Close();
397 }
398 }
399 catch (Exception e)
400 {
401 m_log.Error("[PROFILES_DATA]: GetPickInfo exception ", e);
402 }
403
404 return pick;
405 }
406
407 public bool UpdatePicksRecord(UserProfilePick pick)
408 {
409 string query = string.Empty;
410
411
412 query = @"WITH upsert AS (
413 UPDATE userpicks SET
414 pickuuid = :PickId, creatoruuid = :CreatorId, toppick = :TopPick, parceluuid = :ParcelId,
415 name = :Name, description = :Desc, snapshotuuid = :SnapshotId, ""user"" = :User,
416 originalname = :Original, simname = :SimName, posglobal = :GlobalPos,
417 sortorder = :SortOrder, enabled = :Enabled
418 RETURNING * )
419 INSERT INTO userpicks (pickuuid,creatoruuid,toppick,parceluuid,name,description,
420 snapshotuuid,""user"",originalname,simname,posglobal,sortorder,enabled)
421 SELECT
422 :PickId,:CreatorId,:TopPick,:ParcelId,:Name,:Desc,:SnapshotId,:User,
423 :Original,:SimName,:GlobalPos,:SortOrder,:Enabled
424 WHERE NOT EXISTS (
425 SELECT * FROM upsert )";
426
427 try
428 {
429 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
430 {
431 dbcon.Open();
432 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
433 {
434 cmd.Parameters.Add(m_database.CreateParameter("PickId", pick.PickId));
435 cmd.Parameters.Add(m_database.CreateParameter("CreatorId", pick.CreatorId));
436 cmd.Parameters.Add(m_database.CreateParameter("TopPick", pick.TopPick));
437 cmd.Parameters.Add(m_database.CreateParameter("ParcelId", pick.ParcelId));
438 cmd.Parameters.Add(m_database.CreateParameter("Name", pick.Name));
439 cmd.Parameters.Add(m_database.CreateParameter("Desc", pick.Desc));
440 cmd.Parameters.Add(m_database.CreateParameter("SnapshotId", pick.SnapshotId));
441 cmd.Parameters.Add(m_database.CreateParameter("User", pick.ParcelName));
442 cmd.Parameters.Add(m_database.CreateParameter("Original", pick.OriginalName));
443 cmd.Parameters.Add(m_database.CreateParameter("SimName", pick.SimName));
444 cmd.Parameters.Add(m_database.CreateParameter("GlobalPos", pick.GlobalPos));
445 cmd.Parameters.Add(m_database.CreateParameter("SortOrder", pick.SortOrder));
446 cmd.Parameters.Add(m_database.CreateParameter("Enabled", pick.Enabled));
447
448 cmd.ExecuteNonQuery();
449 }
450 }
451 }
452 catch (Exception e)
453 {
454 m_log.Error("[PROFILES_DATA]: UpdateAvatarNotes exception ", e);
455 return false;
456 }
457
458 return true;
459 }
460
461 public bool DeletePicksRecord(UUID pickId)
462 {
463 string query = string.Empty;
464
465 query += "DELETE FROM userpicks WHERE ";
466 query += "pickuuid = :PickId";
467
468 try
469 {
470 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
471 {
472 dbcon.Open();
473
474 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
475 {
476 cmd.Parameters.Add(m_database.CreateParameter("PickId", pickId));
477
478 cmd.ExecuteNonQuery();
479 }
480 }
481 }
482 catch (Exception e)
483 {
484 m_log.Error("[PROFILES_DATA]: DeleteUserPickRecord exception ", e);
485 return false;
486 }
487
488 return true;
489 }
490
491 #endregion Picks Queries
492
493 #region Avatar Notes Queries
494
495 public bool GetAvatarNotes(ref UserProfileNotes notes)
496 { // WIP
497 string query = string.Empty;
498
499 query += "SELECT notes FROM usernotes WHERE ";
500 query += "useruuid = :Id AND ";
501 query += "targetuuid = :TargetId";
502 OSDArray data = new OSDArray();
503
504 try
505 {
506 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
507 {
508 dbcon.Open();
509 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
510 {
511 cmd.Parameters.Add(m_database.CreateParameter("Id", notes.UserId));
512 cmd.Parameters.Add(m_database.CreateParameter("TargetId", notes.TargetId));
513
514 using (NpgsqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
515 {
516 if (reader.HasRows)
517 {
518 reader.Read();
519 notes.Notes = OSD.FromString((string)reader["notes"]);
520 }
521 }
522 }
523 }
524 }
525 catch (Exception e)
526 {
527 m_log.Error("[PROFILES_DATA]: GetAvatarNotes exception ", e);
528 }
529
530 return true;
531 }
532
533 public bool UpdateAvatarNotes(ref UserProfileNotes note, ref string result)
534 {
535 string query = string.Empty;
536 bool remove;
537
538 if (string.IsNullOrEmpty(note.Notes))
539 {
540 remove = true;
541 query += "DELETE FROM usernotes WHERE ";
542 query += "useruuid=:UserId AND ";
543 query += "targetuuid=:TargetId";
544 }
545 else
546 {
547 remove = false;
548
549 query = @"WITH upsert AS (
550 UPDATE usernotes SET notes = :Notes, useruuid = :UserId, targetuuid = :TargetId RETURNING * )
551 INSERT INTO usernotes (notes,useruuid,targetuuid)
552 SELECT :Notes,:UserId,:TargetId
553 WHERE NOT EXISTS (
554 SELECT * FROM upsert
555 )";
556 }
557
558 try
559 {
560 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
561 {
562 dbcon.Open();
563 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
564 {
565 if (!remove)
566 cmd.Parameters.Add(m_database.CreateParameter("Notes", note.Notes));
567
568 cmd.Parameters.Add(m_database.CreateParameter("TargetId", note.TargetId));
569 cmd.Parameters.Add(m_database.CreateParameter("UserId", note.UserId));
570
571 cmd.ExecuteNonQuery();
572 }
573 }
574 }
575 catch (Exception e)
576 {
577 m_log.Error("[PROFILES_DATA]: UpdateAvatarNotes exception ", e);
578 return false;
579 }
580
581 return true;
582 }
583
584 #endregion Avatar Notes Queries
585
586 #region Avatar Properties
587
588 public bool GetAvatarProperties(ref UserProfileProperties props, ref string result)
589 {
590 string query = string.Empty;
591
592 query += "SELECT * FROM userprofile WHERE ";
593 query += "useruuid = :Id";
594
595 try
596 {
597 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
598 {
599 dbcon.Open();
600 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
601 {
602 cmd.Parameters.Add(m_database.CreateParameter("Id", props.UserId));
603
604 using (NpgsqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
605 {
606 if (reader.HasRows)
607 {
608 // m_log.DebugFormat("[PROFILES_DATA]" +
609 // ": Getting data for {0}.", props.UserId);
610 reader.Read();
611 props.WebUrl = (string)reader["profileURL"].ToString();
612 props.ImageId = DBGuid.FromDB(reader["profileImage"]);
613 props.AboutText = (string)reader["profileAboutText"];
614 props.FirstLifeImageId = DBGuid.FromDB(reader["profileFirstImage"]);
615 props.FirstLifeText = (string)reader["profileFirstText"];
616 props.PartnerId = DBGuid.FromDB(reader["profilePartner"]);
617 props.WantToMask = (int)reader["profileWantToMask"];
618 props.WantToText = (string)reader["profileWantToText"];
619 props.SkillsMask = (int)reader["profileSkillsMask"];
620 props.SkillsText = (string)reader["profileSkillsText"];
621 props.Language = (string)reader["profileLanguages"];
622 }
623 else
624 {
625 //m_log.DebugFormat("[PROFILES_DATA]" +
626 // ": No data for {0}", props.UserId);
627
628 props.WebUrl = string.Empty;
629 props.ImageId = UUID.Zero;
630 props.AboutText = string.Empty;
631 props.FirstLifeImageId = UUID.Zero;
632 props.FirstLifeText = string.Empty;
633 props.PartnerId = UUID.Zero;
634 props.WantToMask = 0;
635 props.WantToText = string.Empty;
636 props.SkillsMask = 0;
637 props.SkillsText = string.Empty;
638 props.Language = string.Empty;
639 props.PublishProfile = false;
640 props.PublishMature = false;
641
642 query = "INSERT INTO userprofile (";
643 query += "useruuid, ";
644 query += "\"profilePartner\", ";
645 query += "\"profileAllowPublish\", ";
646 query += "\"profileMaturePublish\", ";
647 query += "\"profileURL\", ";
648 query += "\"profileWantToMask\", ";
649 query += "\"profileWantToText\", ";
650 query += "\"profileSkillsMask\", ";
651 query += "\"profileSkillsText\", ";
652 query += "\"profileLanguages\", ";
653 query += "\"profileImage\", ";
654 query += "\"profileAboutText\", ";
655 query += "\"profileFirstImage\", ";
656 query += "\"profileFirstText\") VALUES (";
657 query += ":userId, ";
658 query += ":profilePartner, ";
659 query += ":profileAllowPublish, ";
660 query += ":profileMaturePublish, ";
661 query += ":profileURL, ";
662 query += ":profileWantToMask, ";
663 query += ":profileWantToText, ";
664 query += ":profileSkillsMask, ";
665 query += ":profileSkillsText, ";
666 query += ":profileLanguages, ";
667 query += ":profileImage, ";
668 query += ":profileAboutText, ";
669 query += ":profileFirstImage, ";
670 query += ":profileFirstText)";
671
672 dbcon.Close();
673 dbcon.Open();
674
675 using (NpgsqlCommand put = new NpgsqlCommand(query, dbcon))
676 {
677 //m_log.DebugFormat("[PROFILES_DATA]" +
678 // ": Adding new data for {0}", props.UserId);
679
680 put.Parameters.Add(m_database.CreateParameter("userId", props.UserId));
681 put.Parameters.Add(m_database.CreateParameter("profilePartner", props.PartnerId));
682 put.Parameters.Add(m_database.CreateParameter("profileAllowPublish", props.PublishProfile));
683 put.Parameters.Add(m_database.CreateParameter("profileMaturePublish", props.PublishMature));
684 put.Parameters.Add(m_database.CreateParameter("profileURL", props.WebUrl));
685 put.Parameters.Add(m_database.CreateParameter("profileWantToMask", props.WantToMask));
686 put.Parameters.Add(m_database.CreateParameter("profileWantToText", props.WantToText));
687 put.Parameters.Add(m_database.CreateParameter("profileSkillsMask", props.SkillsMask));
688 put.Parameters.Add(m_database.CreateParameter("profileSkillsText", props.SkillsText));
689 put.Parameters.Add(m_database.CreateParameter("profileLanguages", props.Language));
690 put.Parameters.Add(m_database.CreateParameter("profileImage", props.ImageId));
691 put.Parameters.Add(m_database.CreateParameter("profileAboutText", props.AboutText));
692 put.Parameters.Add(m_database.CreateParameter("profileFirstImage", props.FirstLifeImageId));
693 put.Parameters.Add(m_database.CreateParameter("profileFirstText", props.FirstLifeText));
694
695 put.ExecuteNonQuery();
696 }
697 }
698 }
699 }
700 }
701 }
702 catch (Exception e)
703 {
704 m_log.Error("[PROFILES_DATA]: GetAvatarProperties exception ", e);
705 result = e.Message;
706 return false;
707 }
708
709 return true;
710 }
711
712 public bool UpdateAvatarProperties(ref UserProfileProperties props, ref string result)
713 {
714 string query = string.Empty;
715
716 query += "UPDATE userprofile SET ";
717 query += "\"profileURL\"=:profileURL, ";
718 query += "\"profileImage\"=:image, ";
719 query += "\"profileAboutText\"=:abouttext,";
720 query += "\"profileFirstImage\"=:firstlifeimage,";
721 query += "\"profileFirstText\"=:firstlifetext ";
722 query += "WHERE \"useruuid\"=:uuid";
723
724 try
725 {
726 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
727 {
728 dbcon.Open();
729 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
730 {
731 cmd.Parameters.Add(m_database.CreateParameter("profileURL", props.WebUrl));
732 cmd.Parameters.Add(m_database.CreateParameter("image", props.ImageId));
733 cmd.Parameters.Add(m_database.CreateParameter("abouttext", props.AboutText));
734 cmd.Parameters.Add(m_database.CreateParameter("firstlifeimage", props.FirstLifeImageId));
735 cmd.Parameters.Add(m_database.CreateParameter("firstlifetext", props.FirstLifeText));
736 cmd.Parameters.Add(m_database.CreateParameter("uuid", props.UserId));
737
738 cmd.ExecuteNonQuery();
739 }
740 }
741 }
742 catch (Exception e)
743 {
744 m_log.Error("[PROFILES_DATA]: AgentPropertiesUpdate exception ", e);
745 return false;
746 }
747
748 return true;
749 }
750
751 #endregion Avatar Properties
752
753 #region Avatar Interests
754
755 public bool UpdateAvatarInterests(UserProfileProperties up, ref string result)
756 {
757 string query = string.Empty;
758
759 query += "UPDATE userprofile SET ";
760 query += "\"profileWantToMask\"=:WantMask, ";
761 query += "\"profileWantToText\"=:WantText,";
762 query += "\"profileSkillsMask\"=:SkillsMask,";
763 query += "\"profileSkillsText\"=:SkillsText, ";
764 query += "\"profileLanguages\"=:Languages ";
765 query += "WHERE \"useruuid\"=:uuid";
766
767 try
768 {
769 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
770 {
771 dbcon.Open();
772 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
773 {
774 cmd.Parameters.Add(m_database.CreateParameter("WantMask", up.WantToMask));
775 cmd.Parameters.Add(m_database.CreateParameter("WantText", up.WantToText));
776 cmd.Parameters.Add(m_database.CreateParameter("SkillsMask", up.SkillsMask));
777 cmd.Parameters.Add(m_database.CreateParameter("SkillsText", up.SkillsText));
778 cmd.Parameters.Add(m_database.CreateParameter("Languages", up.Language));
779 cmd.Parameters.Add(m_database.CreateParameter("uuid", up.UserId));
780
781 cmd.ExecuteNonQuery();
782 }
783 }
784 }
785 catch (Exception e)
786 {
787 m_log.Error("[PROFILES_DATA]: UpdateAvatarInterests exception ", e);
788 result = e.Message;
789 return false;
790 }
791
792 return true;
793 }
794
795 #endregion Avatar Interests
796
797 public OSDArray GetUserImageAssets(UUID avatarId)
798 {
799 OSDArray data = new OSDArray();
800 string query = "SELECT \"snapshotuuid\" FROM {0} WHERE \"creatoruuid\" = :Id";
801
802 try
803 {
804 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
805 {
806 dbcon.Open();
807
808 using (NpgsqlCommand cmd = new NpgsqlCommand(string.Format(query, "\"classifieds\""), dbcon))
809 {
810 cmd.Parameters.Add(m_database.CreateParameter("Id", avatarId));
811
812 using (NpgsqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
813 {
814 if (reader.HasRows)
815 {
816 while (reader.Read())
817 {
818 data.Add(new OSDString(reader["snapshotuuid"].ToString()));
819 }
820 }
821 }
822 }
823
824 dbcon.Close();
825 dbcon.Open();
826
827 using (NpgsqlCommand cmd = new NpgsqlCommand(string.Format(query, "\"userpicks\""), dbcon))
828 {
829 cmd.Parameters.Add(m_database.CreateParameter("Id", avatarId));
830
831 using (NpgsqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
832 {
833 if (reader.HasRows)
834 {
835 while (reader.Read())
836 {
837 data.Add(new OSDString(reader["snapshotuuid"].ToString()));
838 }
839 }
840 }
841 }
842
843 dbcon.Close();
844 dbcon.Open();
845
846 query = "SELECT \"profileImage\", \"profileFirstImage\" FROM \"userprofile\" WHERE \"useruuid\" = :Id";
847
848 using (NpgsqlCommand cmd = new NpgsqlCommand(string.Format(query, "\"userpicks\""), dbcon))
849 {
850 cmd.Parameters.Add(m_database.CreateParameter("Id", avatarId));
851
852 using (NpgsqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
853 {
854 if (reader.HasRows)
855 {
856 while (reader.Read())
857 {
858 data.Add(new OSDString(reader["profileImage"].ToString()));
859 data.Add(new OSDString(reader["profileFirstImage"].ToString()));
860 }
861 }
862 }
863 }
864 }
865 }
866 catch (Exception e)
867 {
868 m_log.Error("[PROFILES_DATA]: GetUserImageAssets exception ", e);
869 }
870
871 return data;
872 }
873
874 #region User Preferences
875
876 public bool GetUserPreferences(ref UserPreferences pref, ref string result)
877 {
878 string query = string.Empty;
879
880 query += "SELECT imviaemail::VARCHAR,visible::VARCHAR,email FROM ";
881 query += "usersettings WHERE ";
882 query += "useruuid = :Id";
883
884 OSDArray data = new OSDArray();
885
886 try
887 {
888 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
889 {
890 dbcon.Open();
891 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
892 {
893 cmd.Parameters.Add(m_database.CreateParameter("Id", pref.UserId));
894
895 using (NpgsqlDataReader reader = cmd.ExecuteReader())
896 {
897 if (reader.HasRows)
898 {
899 reader.Read();
900 bool.TryParse((string)reader["imviaemail"], out pref.IMViaEmail);
901 bool.TryParse((string)reader["visible"], out pref.Visible);
902 pref.EMail = (string)reader["email"];
903 }
904 else
905 {
906 using (NpgsqlCommand put = new NpgsqlCommand(query, dbcon))
907 {
908 put.Parameters.Add(m_database.CreateParameter("Id", pref.UserId));
909 query = "INSERT INTO usersettings VALUES ";
910 query += "(:Id,'false','false', '')";
911
912 put.ExecuteNonQuery();
913 }
914 }
915 }
916 }
917 }
918 }
919 catch (Exception e)
920 {
921 m_log.Error("[PROFILES_DATA]: GetUserPreferences exception ", e);
922 result = e.Message;
923 }
924
925 return true;
926 }
927
928 public bool UpdateUserPreferences(ref UserPreferences pref, ref string result)
929 {
930 string query = string.Empty;
931
932 query += "UPDATE usersettings SET ";
933 query += "imviaemail=:ImViaEmail, ";
934 query += "visible=:Visible, ";
935 query += "email=:Email ";
936 query += "WHERE useruuid=:uuid";
937
938 try
939 {
940 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
941 {
942 dbcon.Open();
943 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
944 {
945 cmd.Parameters.Add(m_database.CreateParameter("ImViaEmail", pref.IMViaEmail));
946 cmd.Parameters.Add(m_database.CreateParameter("Visible", pref.Visible));
947 cmd.Parameters.Add(m_database.CreateParameter("EMail", pref.EMail.ToString().ToLower()));
948 cmd.Parameters.Add(m_database.CreateParameter("uuid", pref.UserId));
949
950 cmd.ExecuteNonQuery();
951 }
952 }
953 }
954 catch (Exception e)
955 {
956 m_log.Error("[PROFILES_DATA]: UpdateUserPreferences exception ", e);
957 result = e.Message;
958 return false;
959 }
960
961 return true;
962 }
963
964 #endregion User Preferences
965
966 #region Integration
967
968 public bool GetUserAppData(ref UserAppData props, ref string result)
969 {
970 string query = string.Empty;
971
972 query += "SELECT * FROM userdata WHERE ";
973 query += "\"UserId\" = :Id AND ";
974 query += "\"TagId\" = :TagId";
975
976 try
977 {
978 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
979 {
980 dbcon.Open();
981 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
982 {
983 cmd.Parameters.Add(m_database.CreateParameter("Id", props.UserId));
984 cmd.Parameters.Add(m_database.CreateParameter("TagId", props.TagId));
985
986 using (NpgsqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
987 {
988 if (reader.HasRows)
989 {
990 reader.Read();
991 props.DataKey = (string)reader["DataKey"];
992 props.DataVal = (string)reader["DataVal"];
993 }
994 else
995 {
996 query += "INSERT INTO userdata VALUES ( ";
997 query += ":UserId,";
998 query += ":TagId,";
999 query += ":DataKey,";
1000 query += ":DataVal) ";
1001
1002 using (NpgsqlCommand put = new NpgsqlCommand(query, dbcon))
1003 {
1004 put.Parameters.Add(m_database.CreateParameter("UserId", props.UserId));
1005 put.Parameters.Add(m_database.CreateParameter("TagId", props.TagId));
1006 put.Parameters.Add(m_database.CreateParameter("DataKey", props.DataKey.ToString()));
1007 put.Parameters.Add(m_database.CreateParameter("DataVal", props.DataVal.ToString()));
1008
1009 put.ExecuteNonQuery();
1010 }
1011 }
1012 }
1013 }
1014 }
1015 }
1016 catch (Exception e)
1017 {
1018 m_log.Error("[PROFILES_DATA]: GetUserAppData exception ", e);
1019 result = e.Message;
1020 return false;
1021 }
1022
1023 return true;
1024 }
1025
1026 public bool SetUserAppData(UserAppData props, ref string result)
1027 {
1028 string query = string.Empty;
1029
1030 query += "UPDATE userdata SET ";
1031 query += "\"TagId\" = :TagId, ";
1032 query += "\"DataKey\" = :DataKey, ";
1033 query += "\"DataVal\" = :DataVal WHERE ";
1034 query += "\"UserId\" = :UserId AND ";
1035 query += "\"TagId\" = :TagId";
1036
1037 try
1038 {
1039 using (NpgsqlConnection dbcon = new NpgsqlConnection(ConnectionString))
1040 {
1041 dbcon.Open();
1042 using (NpgsqlCommand cmd = new NpgsqlCommand(query, dbcon))
1043 {
1044 cmd.Parameters.Add(m_database.CreateParameter("UserId", props.UserId.ToString()));
1045 cmd.Parameters.Add(m_database.CreateParameter("TagId", props.TagId.ToString()));
1046 cmd.Parameters.Add(m_database.CreateParameter("DataKey", props.DataKey.ToString()));
1047 cmd.Parameters.Add(m_database.CreateParameter("DataVal", props.DataKey.ToString()));
1048
1049 cmd.ExecuteNonQuery();
1050 }
1051 }
1052 }
1053 catch (Exception e)
1054 {
1055 m_log.Error("[PROFILES_DATA]: SetUserData exception ", e);
1056 return false;
1057 }
1058
1059 return true;
1060 }
1061
1062 #endregion Integration
1063 }
1064} \ No newline at end of file
diff --git a/OpenSim/Data/PGSQL/PGSQLXAssetData.cs b/OpenSim/Data/PGSQL/PGSQLXAssetData.cs
new file mode 100644
index 0000000..4f682f0
--- /dev/null
+++ b/OpenSim/Data/PGSQL/PGSQLXAssetData.cs
@@ -0,0 +1,587 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.IO;
32using System.IO.Compression;
33using System.Reflection;
34using System.Security.Cryptography;
35using System.Text;
36using log4net;
37using OpenMetaverse;
38using OpenSim.Framework;
39using OpenSim.Data;
40using Npgsql;
41
42namespace OpenSim.Data.PGSQL
43{
44 public class PGSQLXAssetData : IXAssetDataPlugin
45 {
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 protected virtual Assembly Assembly
49 {
50 get { return GetType().Assembly; }
51 }
52
53 /// <summary>
54 /// Number of days that must pass before we update the access time on an asset when it has been fetched.
55 /// </summary>
56 private const int DaysBetweenAccessTimeUpdates = 30;
57
58 private bool m_enableCompression = false;
59 private PGSQLManager m_database;
60 private string m_connectionString;
61 private object m_dbLock = new object();
62
63 /// <summary>
64 /// We can reuse this for all hashing since all methods are single-threaded through m_dbBLock
65 /// </summary>
66 private HashAlgorithm hasher = new SHA256CryptoServiceProvider();
67
68 #region IPlugin Members
69
70 public string Version { get { return "1.0.0.0"; } }
71
72 /// <summary>
73 /// <para>Initialises Asset interface</para>
74 /// <para>
75 /// <list type="bullet">
76 /// <item>Loads and initialises the PGSQL storage plugin.</item>
77 /// <item>Warns and uses the obsolete pgsql_connection.ini if connect string is empty.</item>
78 /// <item>Check for migration</item>
79 /// </list>
80 /// </para>
81 /// </summary>
82 /// <param name="connect">connect string</param>
83 public void Initialise(string connect)
84 {
85 m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
86 m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
87 m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
88 m_log.ErrorFormat("[PGSQL XASSETDATA]: THIS PLUGIN IS STRICTLY EXPERIMENTAL.");
89 m_log.ErrorFormat("[PGSQL XASSETDATA]: DO NOT USE FOR ANY DATA THAT YOU DO NOT MIND LOSING.");
90 m_log.ErrorFormat("[PGSQL XASSETDATA]: DATABASE TABLES CAN CHANGE AT ANY TIME, CAUSING EXISTING DATA TO BE LOST.");
91 m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
92 m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
93 m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
94
95 m_connectionString = connect;
96 m_database = new PGSQLManager(m_connectionString);
97
98 using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
99 {
100 dbcon.Open();
101 Migration m = new Migration(dbcon, Assembly, "XAssetStore");
102 m.Update();
103 }
104 }
105
106 public void Initialise()
107 {
108 throw new NotImplementedException();
109 }
110
111 public void Dispose() { }
112
113 /// <summary>
114 /// The name of this DB provider
115 /// </summary>
116 public string Name
117 {
118 get { return "PGSQL XAsset storage engine"; }
119 }
120
121 #endregion
122
123 #region IAssetDataPlugin Members
124
125 /// <summary>
126 /// Fetch Asset <paramref name="assetID"/> from database
127 /// </summary>
128 /// <param name="assetID">Asset UUID to fetch</param>
129 /// <returns>Return the asset</returns>
130 /// <remarks>On failure : throw an exception and attempt to reconnect to database</remarks>
131 public AssetBase GetAsset(UUID assetID)
132 {
133// m_log.DebugFormat("[PGSQL XASSET DATA]: Looking for asset {0}", assetID);
134
135 AssetBase asset = null;
136 lock (m_dbLock)
137 {
138 using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
139 {
140 dbcon.Open();
141
142 using (NpgsqlCommand cmd = new NpgsqlCommand(
143 @"SELECT name, description, access_time, ""AssetType"", local, temporary, asset_flags, creatorid, data
144 FROM XAssetsMeta
145 JOIN XAssetsData ON XAssetsMeta.hash = XAssetsData.Hash WHERE id=:ID",
146 dbcon))
147 {
148 cmd.Parameters.Add(m_database.CreateParameter("ID", assetID));
149
150 try
151 {
152 using (NpgsqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
153 {
154 if (dbReader.Read())
155 {
156 asset = new AssetBase(
157 assetID,
158 (string)dbReader["name"],
159 Convert.ToSByte(dbReader["AssetType"]),
160 dbReader["creatorid"].ToString());
161
162 asset.Data = (byte[])dbReader["data"];
163 asset.Description = (string)dbReader["description"];
164
165 string local = dbReader["local"].ToString();
166 if (local.Equals("1") || local.Equals("true", StringComparison.InvariantCultureIgnoreCase))
167 asset.Local = true;
168 else
169 asset.Local = false;
170
171 asset.Temporary = Convert.ToBoolean(dbReader["temporary"]);
172 asset.Flags = (AssetFlags)Convert.ToInt32(dbReader["asset_flags"]);
173
174 if (m_enableCompression)
175 {
176 using (GZipStream decompressionStream = new GZipStream(new MemoryStream(asset.Data), CompressionMode.Decompress))
177 {
178 MemoryStream outputStream = new MemoryStream();
179 WebUtil.CopyStream(decompressionStream, outputStream, int.MaxValue);
180 // int compressedLength = asset.Data.Length;
181 asset.Data = outputStream.ToArray();
182
183 // m_log.DebugFormat(
184 // "[XASSET DB]: Decompressed {0} {1} to {2} bytes from {3}",
185 // asset.ID, asset.Name, asset.Data.Length, compressedLength);
186 }
187 }
188
189 UpdateAccessTime(asset.Metadata, (int)dbReader["access_time"]);
190 }
191 }
192 }
193 catch (Exception e)
194 {
195 m_log.Error(string.Format("[PGSQL XASSET DATA]: Failure fetching asset {0}", assetID), e);
196 }
197 }
198 }
199 }
200
201 return asset;
202 }
203
204 /// <summary>
205 /// Create an asset in database, or update it if existing.
206 /// </summary>
207 /// <param name="asset">Asset UUID to create</param>
208 /// <remarks>On failure : Throw an exception and attempt to reconnect to database</remarks>
209 public void StoreAsset(AssetBase asset)
210 {
211// m_log.DebugFormat("[XASSETS DB]: Storing asset {0} {1}", asset.Name, asset.ID);
212
213 lock (m_dbLock)
214 {
215 using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
216 {
217 dbcon.Open();
218
219 using (NpgsqlTransaction transaction = dbcon.BeginTransaction())
220 {
221 string assetName = asset.Name;
222 if (asset.Name.Length > 64)
223 {
224 assetName = asset.Name.Substring(0, 64);
225 m_log.WarnFormat(
226 "[XASSET DB]: Name '{0}' for asset {1} truncated from {2} to {3} characters on add",
227 asset.Name, asset.ID, asset.Name.Length, assetName.Length);
228 }
229
230 string assetDescription = asset.Description;
231 if (asset.Description.Length > 64)
232 {
233 assetDescription = asset.Description.Substring(0, 64);
234 m_log.WarnFormat(
235 "[XASSET DB]: Description '{0}' for asset {1} truncated from {2} to {3} characters on add",
236 asset.Description, asset.ID, asset.Description.Length, assetDescription.Length);
237 }
238
239 if (m_enableCompression)
240 {
241 MemoryStream outputStream = new MemoryStream();
242
243 using (GZipStream compressionStream = new GZipStream(outputStream, CompressionMode.Compress, false))
244 {
245 // Console.WriteLine(WebUtil.CopyTo(new MemoryStream(asset.Data), compressionStream, int.MaxValue));
246 // We have to close the compression stream in order to make sure it writes everything out to the underlying memory output stream.
247 compressionStream.Close();
248 byte[] compressedData = outputStream.ToArray();
249 asset.Data = compressedData;
250 }
251 }
252
253 byte[] hash = hasher.ComputeHash(asset.Data);
254
255 UUID asset_id;
256 UUID.TryParse(asset.ID, out asset_id);
257
258// m_log.DebugFormat(
259// "[XASSET DB]: Compressed data size for {0} {1}, hash {2} is {3}",
260// asset.ID, asset.Name, hash, compressedData.Length);
261
262 try
263 {
264 using (NpgsqlCommand cmd =
265 new NpgsqlCommand(
266 @"insert INTO XAssetsMeta(id, hash, name, description, ""AssetType"", local, temporary, create_time, access_time, asset_flags, creatorid)
267 Select :ID, :Hash, :Name, :Description, :AssetType, :Local, :Temporary, :CreateTime, :AccessTime, :AssetFlags, :CreatorID
268 where not exists( Select id from XAssetsMeta where id = :ID);
269
270 update XAssetsMeta
271 set id = :ID, hash = :Hash, name = :Name, description = :Description,
272 ""AssetType"" = :AssetType, local = :Local, temporary = :Temporary, create_time = :CreateTime,
273 access_time = :AccessTime, asset_flags = :AssetFlags, creatorid = :CreatorID
274 where id = :ID;
275 ",
276 dbcon))
277 {
278
279 // create unix epoch time
280 int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow);
281 cmd.Parameters.Add(m_database.CreateParameter("ID", asset_id));
282 cmd.Parameters.Add(m_database.CreateParameter("Hash", hash));
283 cmd.Parameters.Add(m_database.CreateParameter("Name", assetName));
284 cmd.Parameters.Add(m_database.CreateParameter("Description", assetDescription));
285 cmd.Parameters.Add(m_database.CreateParameter("AssetType", asset.Type));
286 cmd.Parameters.Add(m_database.CreateParameter("Local", asset.Local));
287 cmd.Parameters.Add(m_database.CreateParameter("Temporary", asset.Temporary));
288 cmd.Parameters.Add(m_database.CreateParameter("CreateTime", now));
289 cmd.Parameters.Add(m_database.CreateParameter("AccessTime", now));
290 cmd.Parameters.Add(m_database.CreateParameter("CreatorID", asset.Metadata.CreatorID));
291 cmd.Parameters.Add(m_database.CreateParameter("AssetFlags", (int)asset.Flags));
292
293 cmd.ExecuteNonQuery();
294 }
295 }
296 catch (Exception e)
297 {
298 m_log.ErrorFormat("[ASSET DB]: PGSQL failure creating asset metadata {0} with name \"{1}\". Error: {2}",
299 asset.FullID, asset.Name, e.Message);
300
301 transaction.Rollback();
302
303 return;
304 }
305
306 if (!ExistsData(dbcon, transaction, hash))
307 {
308 try
309 {
310 using (NpgsqlCommand cmd =
311 new NpgsqlCommand(
312 @"INSERT INTO XAssetsData(hash, data) VALUES(:Hash, :Data)",
313 dbcon))
314 {
315 cmd.Parameters.Add(m_database.CreateParameter("Hash", hash));
316 cmd.Parameters.Add(m_database.CreateParameter("Data", asset.Data));
317 cmd.ExecuteNonQuery();
318 }
319 }
320 catch (Exception e)
321 {
322 m_log.ErrorFormat("[XASSET DB]: PGSQL failure creating asset data {0} with name \"{1}\". Error: {2}",
323 asset.FullID, asset.Name, e.Message);
324
325 transaction.Rollback();
326
327 return;
328 }
329 }
330
331 transaction.Commit();
332 }
333 }
334 }
335 }
336
337 /// <summary>
338 /// Updates the access time of the asset if it was accessed above a given threshhold amount of time.
339 /// </summary>
340 /// <remarks>
341 /// This gives us some insight into assets which haven't ben accessed for a long period. This is only done
342 /// over the threshold time to avoid excessive database writes as assets are fetched.
343 /// </remarks>
344 /// <param name='asset'></param>
345 /// <param name='accessTime'></param>
346 private void UpdateAccessTime(AssetMetadata assetMetadata, int accessTime)
347 {
348 DateTime now = DateTime.UtcNow;
349
350 if ((now - Utils.UnixTimeToDateTime(accessTime)).TotalDays < DaysBetweenAccessTimeUpdates)
351 return;
352
353 lock (m_dbLock)
354 {
355 using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
356 {
357 dbcon.Open();
358 NpgsqlCommand cmd =
359 new NpgsqlCommand(@"update XAssetsMeta set access_time=:AccessTime where id=:ID", dbcon);
360
361 try
362 {
363 UUID asset_id;
364 UUID.TryParse(assetMetadata.ID, out asset_id);
365
366 using (cmd)
367 {
368 // create unix epoch time
369 cmd.Parameters.Add(m_database.CreateParameter("id", asset_id));
370 cmd.Parameters.Add(m_database.CreateParameter("access_time", (int)Utils.DateTimeToUnixTime(now)));
371 cmd.ExecuteNonQuery();
372 }
373 }
374 catch (Exception e)
375 {
376 m_log.ErrorFormat(
377 "[XASSET PGSQL DB]: Failure updating access_time for asset {0} with name {1} : {2}",
378 assetMetadata.ID, assetMetadata.Name, e.Message);
379 }
380 }
381 }
382 }
383
384 /// <summary>
385 /// We assume we already have the m_dbLock.
386 /// </summary>
387 /// TODO: need to actually use the transaction.
388 /// <param name="dbcon"></param>
389 /// <param name="transaction"></param>
390 /// <param name="hash"></param>
391 /// <returns></returns>
392 private bool ExistsData(NpgsqlConnection dbcon, NpgsqlTransaction transaction, byte[] hash)
393 {
394// m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid);
395
396 bool exists = false;
397
398 using (NpgsqlCommand cmd = new NpgsqlCommand(@"SELECT hash FROM XAssetsData WHERE hash=:Hash", dbcon))
399 {
400 cmd.Parameters.Add(m_database.CreateParameter("Hash", hash));
401
402 try
403 {
404 using (NpgsqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
405 {
406 if (dbReader.Read())
407 {
408// m_log.DebugFormat("[ASSETS DB]: Found asset {0}", uuid);
409 exists = true;
410 }
411 }
412 }
413 catch (Exception e)
414 {
415 m_log.ErrorFormat(
416 "[XASSETS DB]: PGSql failure in ExistsData fetching hash {0}. Exception {1}{2}",
417 hash, e.Message, e.StackTrace);
418 }
419 }
420
421 return exists;
422 }
423
424 /// <summary>
425 /// Check if the assets exist in the database.
426 /// </summary>
427 /// <param name="uuids">The assets' IDs</param>
428 /// <returns>For each asset: true if it exists, false otherwise</returns>
429 public bool[] AssetsExist(UUID[] uuids)
430 {
431 if (uuids.Length == 0)
432 return new bool[0];
433
434 HashSet<UUID> exist = new HashSet<UUID>();
435
436 string ids = "'" + string.Join("','", uuids) + "'";
437 string sql = string.Format(@"SELECT id FROM XAssetsMeta WHERE id IN ({0})", ids);
438
439 using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
440 {
441 conn.Open();
442 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
443 {
444 using (NpgsqlDataReader reader = cmd.ExecuteReader())
445 {
446 while (reader.Read())
447 {
448 UUID id = DBGuid.FromDB(reader["id"]);
449 exist.Add(id);
450 }
451 }
452 }
453 }
454
455 bool[] results = new bool[uuids.Length];
456 for (int i = 0; i < uuids.Length; i++)
457 results[i] = exist.Contains(uuids[i]);
458 return results;
459 }
460
461 /// <summary>
462 /// Check if the asset exists in the database
463 /// </summary>
464 /// <param name="uuid">The asset UUID</param>
465 /// <returns>true if it exists, false otherwise.</returns>
466 public bool ExistsAsset(UUID uuid)
467 {
468// m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid);
469
470 bool assetExists = false;
471
472 lock (m_dbLock)
473 {
474 using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
475 {
476 dbcon.Open();
477 using (NpgsqlCommand cmd = new NpgsqlCommand(@"SELECT id FROM XAssetsMeta WHERE id=:ID", dbcon))
478 {
479 cmd.Parameters.Add(m_database.CreateParameter("id", uuid));
480
481 try
482 {
483 using (NpgsqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
484 {
485 if (dbReader.Read())
486 {
487// m_log.DebugFormat("[ASSETS DB]: Found asset {0}", uuid);
488 assetExists = true;
489 }
490 }
491 }
492 catch (Exception e)
493 {
494 m_log.Error(string.Format("[XASSETS DB]: PGSql failure fetching asset {0}", uuid), e);
495 }
496 }
497 }
498 }
499
500 return assetExists;
501 }
502
503
504 /// <summary>
505 /// Returns a list of AssetMetadata objects. The list is a subset of
506 /// the entire data set offset by <paramref name="start" /> containing
507 /// <paramref name="count" /> elements.
508 /// </summary>
509 /// <param name="start">The number of results to discard from the total data set.</param>
510 /// <param name="count">The number of rows the returned list should contain.</param>
511 /// <returns>A list of AssetMetadata objects.</returns>
512 public List<AssetMetadata> FetchAssetMetadataSet(int start, int count)
513 {
514 List<AssetMetadata> retList = new List<AssetMetadata>(count);
515
516 lock (m_dbLock)
517 {
518 using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
519 {
520 dbcon.Open();
521 NpgsqlCommand cmd = new NpgsqlCommand( @"SELECT name, description, access_time, ""AssetType"", temporary, id, asset_flags, creatorid
522 FROM XAssetsMeta
523 LIMIT :start, :count", dbcon);
524 cmd.Parameters.Add(m_database.CreateParameter("start", start));
525 cmd.Parameters.Add(m_database.CreateParameter("count", count));
526
527 try
528 {
529 using (NpgsqlDataReader dbReader = cmd.ExecuteReader())
530 {
531 while (dbReader.Read())
532 {
533 AssetMetadata metadata = new AssetMetadata();
534 metadata.Name = (string)dbReader["name"];
535 metadata.Description = (string)dbReader["description"];
536 metadata.Type = Convert.ToSByte(dbReader["AssetType"]);
537 metadata.Temporary = Convert.ToBoolean(dbReader["temporary"]);
538 metadata.Flags = (AssetFlags)Convert.ToInt32(dbReader["asset_flags"]);
539 metadata.FullID = DBGuid.FromDB(dbReader["id"]);
540 metadata.CreatorID = dbReader["creatorid"].ToString();
541
542 // We'll ignore this for now - it appears unused!
543// metadata.SHA1 = dbReader["hash"]);
544
545 UpdateAccessTime(metadata, (int)dbReader["access_time"]);
546
547 retList.Add(metadata);
548 }
549 }
550 }
551 catch (Exception e)
552 {
553 m_log.Error("[XASSETS DB]: PGSql failure fetching asset set" + Environment.NewLine + e.ToString());
554 }
555 }
556 }
557
558 return retList;
559 }
560
561 public bool Delete(string id)
562 {
563// m_log.DebugFormat("[XASSETS DB]: Deleting asset {0}", id);
564
565 lock (m_dbLock)
566 {
567 using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
568 {
569 dbcon.Open();
570
571 using (NpgsqlCommand cmd = new NpgsqlCommand(@"delete from XAssetsMeta where id=:ID", dbcon))
572 {
573 cmd.Parameters.Add(m_database.CreateParameter(id, id));
574 cmd.ExecuteNonQuery();
575 }
576
577 // TODO: How do we deal with data from deleted assets? Probably not easily reapable unless we
578 // keep a reference count (?)
579 }
580 }
581
582 return true;
583 }
584
585 #endregion
586 }
587}
diff --git a/OpenSim/Data/MSSQL/MSSQLXInventoryData.cs b/OpenSim/Data/PGSQL/PGSQLXInventoryData.cs
index 9164ffe..a22b882 100644
--- a/OpenSim/Data/MSSQL/MSSQLXInventoryData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLXInventoryData.cs
@@ -1,4 +1,4 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
@@ -31,29 +31,39 @@ using System.Collections.Generic;
31using System.Data; 31using System.Data;
32using OpenMetaverse; 32using OpenMetaverse;
33using OpenSim.Framework; 33using OpenSim.Framework;
34using System.Data.SqlClient;
35using System.Reflection; 34using System.Reflection;
36using System.Text; 35using System.Text;
37using log4net; 36using log4net;
37using Npgsql;
38using NpgsqlTypes;
38 39
39namespace OpenSim.Data.MSSQL 40namespace OpenSim.Data.PGSQL
40{ 41{
41 public class MSSQLXInventoryData : IXInventoryData 42 public class PGSQLXInventoryData : IXInventoryData
42 { 43 {
43// private static readonly ILog m_log = LogManager.GetLogger( 44// private static readonly ILog m_log = LogManager.GetLogger(
44// MethodBase.GetCurrentMethod().DeclaringType); 45// MethodBase.GetCurrentMethod().DeclaringType);
45 46
46 private MSSQLFolderHandler m_Folders; 47 private PGSQLFolderHandler m_Folders;
47 private MSSQLItemHandler m_Items; 48 private PGSQLItemHandler m_Items;
48 49
49 public MSSQLXInventoryData(string conn, string realm) 50 public PGSQLXInventoryData(string conn, string realm)
50 { 51 {
51 m_Folders = new MSSQLFolderHandler( 52 m_Folders = new PGSQLFolderHandler(
52 conn, "inventoryfolders", "InventoryStore"); 53 conn, "inventoryfolders", "InventoryStore");
53 m_Items = new MSSQLItemHandler( 54 m_Items = new PGSQLItemHandler(
54 conn, "inventoryitems", String.Empty); 55 conn, "inventoryitems", String.Empty);
55 } 56 }
56 57
58 public static UUID str2UUID(string strUUID)
59 {
60 UUID newUUID = UUID.Zero;
61
62 UUID.TryParse(strUUID, out newUUID);
63
64 return newUUID;
65 }
66
57 public XInventoryFolder[] GetFolders(string[] fields, string[] vals) 67 public XInventoryFolder[] GetFolders(string[] fields, string[] vals)
58 { 68 {
59 return m_Folders.Get(fields, vals); 69 return m_Folders.Get(fields, vals);
@@ -113,7 +123,7 @@ namespace OpenSim.Data.MSSQL
113 123
114 public XInventoryItem[] GetActiveGestures(UUID principalID) 124 public XInventoryItem[] GetActiveGestures(UUID principalID)
115 { 125 {
116 return m_Items.GetActiveGestures(principalID); 126 return m_Items.GetActiveGestures(principalID.ToString());
117 } 127 }
118 128
119 public int GetAssetPermissions(UUID principalID, UUID assetID) 129 public int GetAssetPermissions(UUID principalID, UUID assetID)
@@ -122,9 +132,9 @@ namespace OpenSim.Data.MSSQL
122 } 132 }
123 } 133 }
124 134
125 public class MSSQLItemHandler : MSSQLInventoryHandler<XInventoryItem> 135 public class PGSQLItemHandler : PGSQLInventoryHandler<XInventoryItem>
126 { 136 {
127 public MSSQLItemHandler(string c, string t, string m) : 137 public PGSQLItemHandler(string c, string t, string m) :
128 base(c, t, m) 138 base(c, t, m)
129 { 139 {
130 } 140 }
@@ -137,14 +147,13 @@ namespace OpenSim.Data.MSSQL
137 147
138 UUID oldParent = retrievedItems[0].parentFolderID; 148 UUID oldParent = retrievedItems[0].parentFolderID;
139 149
140 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 150 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
141 { 151 {
142 using (SqlCommand cmd = new SqlCommand()) 152 using (NpgsqlCommand cmd = new NpgsqlCommand())
143 { 153 {
144 154 cmd.CommandText = String.Format(@"update {0} set ""parentFolderID"" = :ParentFolderID where ""inventoryID"" = :InventoryID", m_Realm);
145 cmd.CommandText = String.Format("update {0} set parentFolderID = @ParentFolderID where inventoryID = @InventoryID", m_Realm); 155 cmd.Parameters.Add(m_database.CreateParameter("ParentFolderID", newParent));
146 cmd.Parameters.Add(m_database.CreateParameter("@ParentFolderID", newParent)); 156 cmd.Parameters.Add(m_database.CreateParameter("InventoryID", id ));
147 cmd.Parameters.Add(m_database.CreateParameter("@InventoryID", id));
148 cmd.Connection = conn; 157 cmd.Connection = conn;
149 conn.Open(); 158 conn.Open();
150 159
@@ -159,16 +168,19 @@ namespace OpenSim.Data.MSSQL
159 return true; 168 return true;
160 } 169 }
161 170
162 public XInventoryItem[] GetActiveGestures(UUID principalID) 171 public XInventoryItem[] GetActiveGestures(string principalID)
163 { 172 {
164 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 173 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
165 { 174 {
166 using (SqlCommand cmd = new SqlCommand()) 175 using (NpgsqlCommand cmd = new NpgsqlCommand())
167 { 176 {
168 cmd.CommandText = String.Format("select * from inventoryitems where avatarId = @uuid and assetType = @type and flags = 1", m_Realm); 177 cmd.CommandText = String.Format(@"select * from inventoryitems where ""avatarID"" = :uuid and ""assetType"" = :type and ""flags"" = 1", m_Realm);
178
179 UUID princID = UUID.Zero;
180 UUID.TryParse(principalID, out princID);
169 181
170 cmd.Parameters.Add(m_database.CreateParameter("@uuid", principalID.ToString())); 182 cmd.Parameters.Add(m_database.CreateParameter("uuid", principalID));
171 cmd.Parameters.Add(m_database.CreateParameter("@type", (int)AssetType.Gesture)); 183 cmd.Parameters.Add(m_database.CreateParameter("type", (int)AssetType.Gesture));
172 cmd.Connection = conn; 184 cmd.Connection = conn;
173 conn.Open(); 185 conn.Open();
174 return DoQuery(cmd); 186 return DoQuery(cmd);
@@ -178,16 +190,21 @@ namespace OpenSim.Data.MSSQL
178 190
179 public int GetAssetPermissions(UUID principalID, UUID assetID) 191 public int GetAssetPermissions(UUID principalID, UUID assetID)
180 { 192 {
181 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 193 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
182 { 194 {
183 using (SqlCommand cmd = new SqlCommand()) 195 using (NpgsqlCommand cmd = new NpgsqlCommand())
184 { 196 {
185 cmd.CommandText = String.Format("select bit_or(inventoryCurrentPermissions) as inventoryCurrentPermissions from inventoryitems where avatarID = @PrincipalID and assetID = @AssetID group by assetID", m_Realm); 197 cmd.CommandText = String.Format(@"select bit_or(""inventoryCurrentPermissions"") as ""inventoryCurrentPermissions""
186 cmd.Parameters.Add(m_database.CreateParameter("@PrincipalID", principalID.ToString())); 198 from inventoryitems
187 cmd.Parameters.Add(m_database.CreateParameter("@AssetID", assetID.ToString())); 199 where ""avatarID"" = :PrincipalID
200 and ""assetID"" = :AssetID
201 group by ""assetID"" ", m_Realm);
202
203 cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
204 cmd.Parameters.Add(m_database.CreateParameter("AssetID", assetID));
188 cmd.Connection = conn; 205 cmd.Connection = conn;
189 conn.Open(); 206 conn.Open();
190 using (SqlDataReader reader = cmd.ExecuteReader()) 207 using (NpgsqlDataReader reader = cmd.ExecuteReader())
191 { 208 {
192 209
193 int perms = 0; 210 int perms = 0;
@@ -215,9 +232,9 @@ namespace OpenSim.Data.MSSQL
215 } 232 }
216 } 233 }
217 234
218 public class MSSQLFolderHandler : MSSQLInventoryHandler<XInventoryFolder> 235 public class PGSQLFolderHandler : PGSQLInventoryHandler<XInventoryFolder>
219 { 236 {
220 public MSSQLFolderHandler(string c, string t, string m) : 237 public PGSQLFolderHandler(string c, string t, string m) :
221 base(c, t, m) 238 base(c, t, m)
222 { 239 {
223 } 240 }
@@ -231,14 +248,19 @@ namespace OpenSim.Data.MSSQL
231 248
232 UUID oldParentFolderUUID = folders[0].parentFolderID; 249 UUID oldParentFolderUUID = folders[0].parentFolderID;
233 250
234 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 251 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
235 { 252 {
236 using (SqlCommand cmd = new SqlCommand()) 253 using (NpgsqlCommand cmd = new NpgsqlCommand())
237 { 254 {
255 UUID foldID = UUID.Zero;
256 UUID.TryParse(id, out foldID);
257
258 UUID newPar = UUID.Zero;
259 UUID.TryParse(newParentFolderID, out newPar);
238 260
239 cmd.CommandText = String.Format("update {0} set parentFolderID = @ParentFolderID where folderID = @folderID", m_Realm); 261 cmd.CommandText = String.Format(@"update {0} set ""parentFolderID"" = :ParentFolderID where ""folderID"" = :folderID", m_Realm);
240 cmd.Parameters.Add(m_database.CreateParameter("@ParentFolderID", newParentFolderID)); 262 cmd.Parameters.Add(m_database.CreateParameter("ParentFolderID", newPar));
241 cmd.Parameters.Add(m_database.CreateParameter("@folderID", id)); 263 cmd.Parameters.Add(m_database.CreateParameter("folderID", foldID));
242 cmd.Connection = conn; 264 cmd.Connection = conn;
243 conn.Open(); 265 conn.Open();
244 266
@@ -264,9 +286,9 @@ namespace OpenSim.Data.MSSQL
264 } 286 }
265 } 287 }
266 288
267 public class MSSQLInventoryHandler<T> : MSSQLGenericTableHandler<T> where T: class, new() 289 public class PGSQLInventoryHandler<T> : PGSQLGenericTableHandler<T> where T: class, new()
268 { 290 {
269 public MSSQLInventoryHandler(string c, string t, string m) : base(c, t, m) {} 291 public PGSQLInventoryHandler(string c, string t, string m) : base(c, t, m) {}
270 292
271 protected bool IncrementFolderVersion(UUID folderID) 293 protected bool IncrementFolderVersion(UUID folderID)
272 { 294 {
@@ -275,18 +297,21 @@ namespace OpenSim.Data.MSSQL
275 297
276 protected bool IncrementFolderVersion(string folderID) 298 protected bool IncrementFolderVersion(string folderID)
277 { 299 {
278// m_log.DebugFormat("[MYSQL ITEM HANDLER]: Incrementing version on folder {0}", folderID); 300// m_log.DebugFormat("[PGSQL ITEM HANDLER]: Incrementing version on folder {0}", folderID);
279// Util.PrintCallStack(); 301// Util.PrintCallStack();
280 302
281 string sql = "update inventoryfolders set version=version+1 where folderID = ?folderID"; 303 string sql = @"update inventoryfolders set version=version+1 where ""folderID"" = :folderID";
282 304
283 using (SqlConnection conn = new SqlConnection(m_ConnectionString)) 305 using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
284 { 306 {
285 using (SqlCommand cmd = new SqlCommand(sql, conn)) 307 using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
286 { 308 {
309 UUID foldID = UUID.Zero;
310 UUID.TryParse(folderID, out foldID);
311
287 conn.Open(); 312 conn.Open();
288 313
289 cmd.Parameters.AddWithValue("@folderID", folderID); 314 cmd.Parameters.Add( m_database.CreateParameter("folderID", foldID) );
290 315
291 try 316 try
292 { 317 {
@@ -302,4 +327,4 @@ namespace OpenSim.Data.MSSQL
302 return true; 327 return true;
303 } 328 }
304 } 329 }
305} \ No newline at end of file 330}
diff --git a/OpenSim/Data/MSSQL/Properties/AssemblyInfo.cs b/OpenSim/Data/PGSQL/Properties/AssemblyInfo.cs
index 1a67e70..1e88b2c 100644
--- a/OpenSim/Data/MSSQL/Properties/AssemblyInfo.cs
+++ b/OpenSim/Data/PGSQL/Properties/AssemblyInfo.cs
@@ -32,11 +32,11 @@ using System.Runtime.InteropServices;
32// set of attributes. Change these attribute values to modify the information 32// set of attributes. Change these attribute values to modify the information
33// associated with an assembly. 33// associated with an assembly.
34 34
35[assembly : AssemblyTitle("OpenSim.Data.MSSQL")] 35[assembly : AssemblyTitle("OpenSim.Data.PGSQL")]
36[assembly : AssemblyDescription("")] 36[assembly : AssemblyDescription("")]
37[assembly : AssemblyConfiguration("")] 37[assembly : AssemblyConfiguration("")]
38[assembly : AssemblyCompany("http://opensimulator.org")] 38[assembly : AssemblyCompany("http://opensimulator.org")]
39[assembly : AssemblyProduct("OpenSim.Data.MSSQL")] 39[assembly : AssemblyProduct("OpenSim.Data.PGSQL")]
40[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] 40[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")]
41[assembly : AssemblyTrademark("")] 41[assembly : AssemblyTrademark("")]
42[assembly : AssemblyCulture("")] 42[assembly : AssemblyCulture("")]
@@ -61,5 +61,5 @@ using System.Runtime.InteropServices;
61// You can specify all the values or you can default the Revision and Build Numbers 61// You can specify all the values or you can default the Revision and Build Numbers
62// by using the '*' as shown below: 62// by using the '*' as shown below:
63 63
64[assembly : AssemblyVersion("0.7.5.*")] 64[assembly : AssemblyVersion("0.8.2.*")]
65[assembly : AssemblyFileVersion("0.6.5.0")] 65
diff --git a/OpenSim/Data/PGSQL/Resources/AssetStore.migrations b/OpenSim/Data/PGSQL/Resources/AssetStore.migrations
new file mode 100644
index 0000000..7a858b4
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/AssetStore.migrations
@@ -0,0 +1,99 @@
1:VERSION 1
2
3CREATE TABLE assets (
4 "id" varchar(36) NOT NULL PRIMARY KEY,
5 "name" varchar(64) NOT NULL,
6 "description" varchar(64) NOT NULL,
7 "assetType" smallint NOT NULL,
8 "local" smallint NOT NULL,
9 "temporary" smallint NOT NULL,
10 "data" bytea NOT NULL
11) ;
12
13:VERSION 2
14
15BEGIN TRANSACTION;
16
17CREATE TABLE Tmp_assets
18 (
19 "id" varchar(36) NOT NULL,
20 "name" varchar(64) NOT NULL,
21 "description" varchar(64) NOT NULL,
22 "assetType" smallint NOT NULL,
23 "local" boolean NOT NULL,
24 "temporary" boolean NOT NULL,
25 "data" bytea NOT NULL
26 ) ;
27
28INSERT INTO Tmp_assets ("id", "name", "description", "assetType", "local", "temporary", "data")
29 SELECT "id", "name", "description", "assetType", case when "local" = 1 then true else false end, case when "temporary" = 1 then true else false end, "data"
30 FROM assets ;
31
32DROP TABLE assets;
33
34Alter table Tmp_assets
35 rename to assets;
36
37ALTER TABLE assets ADD PRIMARY KEY ("id");
38
39COMMIT;
40
41
42:VERSION 3
43
44BEGIN TRANSACTION;
45
46ALTER TABLE assets add "create_time" integer default 0;
47ALTER TABLE assets add "access_time" integer default 0;
48
49COMMIT;
50
51
52:VERSION 4
53
54BEGIN TRANSACTION;
55
56CREATE TABLE Tmp_assets
57 (
58 "id" uuid NOT NULL,
59 "name" varchar(64) NOT NULL,
60 "description" varchar(64) NOT NULL,
61 "assetType" smallint NOT NULL,
62 "local" boolean NOT NULL,
63 "temporary" boolean NOT NULL,
64 "data" bytea NOT NULL,
65 "create_time" int NULL,
66 "access_time" int NULL
67 ) ;
68
69
70INSERT INTO Tmp_assets ("id", "name", "description", "assetType", "local", "temporary", "data", "create_time", "access_time")
71 SELECT cast("id" as uuid), "name", "description", "assetType", "local", "temporary", "data", "create_time", "access_time"
72 FROM assets ;
73
74DROP TABLE assets;
75
76Alter table Tmp_assets
77 rename to assets;
78
79 ALTER TABLE assets ADD PRIMARY KEY ("id");
80
81COMMIT;
82
83
84:VERSION 5
85
86DELETE FROM assets WHERE "id" = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621';
87
88:VERSION 6
89
90ALTER TABLE assets ADD "asset_flags" INTEGER NOT NULL DEFAULT 0;
91
92:VERSION 7
93
94alter table assets add "creatorid" varchar(36) not null default '';
95
96:VERSION 8
97
98BEGIN TRANSACTION;
99COMMIT;
diff --git a/OpenSim/Data/PGSQL/Resources/AuthStore.migrations b/OpenSim/Data/PGSQL/Resources/AuthStore.migrations
new file mode 100644
index 0000000..a1f5b61
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/AuthStore.migrations
@@ -0,0 +1,32 @@
1:VERSION 1
2
3BEGIN TRANSACTION;
4
5CREATE TABLE auth (
6 uuid uuid NOT NULL default '00000000-0000-0000-0000-000000000000',
7 "passwordHash" varchar(32) NOT NULL,
8 "passwordSalt" varchar(32) NOT NULL,
9 "webLoginKey" varchar(255) NOT NULL,
10 "accountType" VARCHAR(32) NOT NULL DEFAULT 'UserAccount'
11) ;
12
13CREATE TABLE tokens (
14 uuid uuid NOT NULL default '00000000-0000-0000-0000-000000000000',
15 token varchar(255) NOT NULL,
16 validity TIMESTAMP NOT NULL )
17 ;
18
19COMMIT;
20
21:VERSION 2
22
23BEGIN TRANSACTION;
24
25 INSERT INTO auth (uuid, "passwordHash", "passwordSalt", "webLoginKey", "accountType")
26 SELECT uuid AS UUID, passwordHash AS passwordHash, passwordSalt AS passwordSalt, webLoginKey AS webLoginKey, 'UserAccount' as accountType
27 FROM users
28 where exists ( Select * from information_schema.tables where table_name = 'users' )
29 ;
30
31COMMIT;
32
diff --git a/OpenSim/Data/PGSQL/Resources/Avatar.migrations b/OpenSim/Data/PGSQL/Resources/Avatar.migrations
new file mode 100644
index 0000000..160086d
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/Avatar.migrations
@@ -0,0 +1,59 @@
1:VERSION 1
2
3BEGIN TRANSACTION;
4
5CREATE TABLE Avatars (
6"PrincipalID" uuid NOT NULL PRIMARY KEY,
7"Name" varchar(32) NOT NULL,
8"Value" varchar(255) NOT NULL DEFAULT ''
9);
10
11
12COMMIT;
13
14:VERSION 2
15
16BEGIN TRANSACTION;
17
18CREATE TABLE Tmp_Avatars
19 (
20 "PrincipalID" uuid NOT NULL,
21 "Name" varchar(32) NOT NULL,
22 "Value" text NOT NULL DEFAULT ''
23 ) ;
24
25 INSERT INTO Tmp_Avatars ("PrincipalID", "Name", "Value")
26 SELECT "PrincipalID", cast("Name" as text), "Value"
27 FROM Avatars ;
28
29DROP TABLE Avatars;
30
31Alter table Tmp_Avatars
32 rename to Avatars;
33
34COMMIT;
35
36:VERSION 3
37
38BEGIN TRANSACTION;
39
40CREATE TABLE Tmp_Avatars
41 (
42 "PrincipalID" uuid NOT NULL,
43 "Name" varchar(32) NOT NULL,
44 "Value" text NOT NULL DEFAULT ''
45);
46
47ALTER TABLE Tmp_Avatars ADD PRIMARY KEY ("PrincipalID", "Name");
48
49
50INSERT INTO Tmp_Avatars ("PrincipalID", "Name", "Value")
51 SELECT "PrincipalID", "Name", cast("Value" as text) FROM Avatars ;
52
53DROP TABLE Avatars;
54
55Alter table Tmp_Avatars
56 rename to Avatars;
57
58COMMIT;
59
diff --git a/OpenSim/Data/PGSQL/Resources/EstateStore.migrations b/OpenSim/Data/PGSQL/Resources/EstateStore.migrations
new file mode 100644
index 0000000..59270f8
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/EstateStore.migrations
@@ -0,0 +1,307 @@
1:VERSION 1
2
3BEGIN TRANSACTION;
4
5CREATE TABLE estate_managers(
6 "EstateID" int NOT NULL Primary Key,
7 uuid varchar(36) NOT NULL
8 );
9
10CREATE TABLE estate_groups(
11 "EstateID" int NOT NULL,
12 uuid varchar(36) NOT NULL
13 );
14
15
16CREATE TABLE estate_users(
17 "EstateID" int NOT NULL,
18 uuid varchar(36) NOT NULL
19 );
20
21
22CREATE TABLE estateban(
23 "EstateID" int NOT NULL,
24 "bannedUUID" varchar(36) NOT NULL,
25 "bannedIp" varchar(16) NOT NULL,
26 "bannedIpHostMask" varchar(16) NOT NULL,
27 "bannedNameMask" varchar(64) NULL DEFAULT NULL
28 );
29
30Create Sequence estate_settings_id increment by 100 start with 100;
31
32CREATE TABLE estate_settings(
33 "EstateID" integer DEFAULT nextval('estate_settings_id') NOT NULL,
34 "EstateName" varchar(64) NULL DEFAULT (NULL),
35 "AbuseEmailToEstateOwner" boolean NOT NULL,
36 "DenyAnonymous" boolean NOT NULL,
37 "ResetHomeOnTeleport" boolean NOT NULL,
38 "FixedSun" boolean NOT NULL,
39 "DenyTransacted" boolean NOT NULL,
40 "BlockDwell" boolean NOT NULL,
41 "DenyIdentified" boolean NOT NULL,
42 "AllowVoice" boolean NOT NULL,
43 "UseGlobalTime" boolean NOT NULL,
44 "PricePerMeter" int NOT NULL,
45 "TaxFree" boolean NOT NULL,
46 "AllowDirectTeleport" boolean NOT NULL,
47 "RedirectGridX" int NOT NULL,
48 "RedirectGridY" int NOT NULL,
49 "ParentEstateID" int NOT NULL,
50 "SunPosition" double precision NOT NULL,
51 "EstateSkipScripts" boolean NOT NULL,
52 "BillableFactor" double precision NOT NULL,
53 "PublicAccess" boolean NOT NULL,
54 "AbuseEmail" varchar(255) NOT NULL,
55 "EstateOwner" varchar(36) NOT NULL,
56 "DenyMinors" boolean NOT NULL
57 );
58
59
60CREATE TABLE estate_map(
61 "RegionID" varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
62 "EstateID" int NOT NULL
63 );
64
65COMMIT;
66
67:VERSION 2
68
69BEGIN TRANSACTION;
70
71CREATE INDEX IX_estate_managers ON estate_managers
72 (
73 "EstateID"
74 );
75
76
77CREATE INDEX IX_estate_groups ON estate_groups
78 (
79 "EstateID"
80 );
81
82
83CREATE INDEX IX_estate_users ON estate_users
84 (
85 "EstateID"
86 );
87
88COMMIT;
89
90:VERSION 3
91
92BEGIN TRANSACTION;
93
94CREATE TABLE Tmp_estateban
95 (
96 "EstateID" int NOT NULL,
97 "bannedUUID" varchar(36) NOT NULL,
98 "bannedIp" varchar(16) NULL,
99 "bannedIpHostMask" varchar(16) NULL,
100 "bannedNameMask" varchar(64) NULL
101 );
102
103 INSERT INTO Tmp_estateban ("EstateID", "bannedUUID", "bannedIp", "bannedIpHostMask", "bannedNameMask")
104 SELECT "EstateID", "bannedUUID", "bannedIp", "bannedIpHostMask", "bannedNameMask" FROM estateban;
105
106DROP TABLE estateban;
107
108Alter table Tmp_estateban
109 rename to estateban;
110
111CREATE INDEX IX_estateban ON estateban
112 (
113 "EstateID"
114 );
115
116COMMIT;
117
118
119:VERSION 4
120
121BEGIN TRANSACTION;
122
123CREATE TABLE Tmp_estate_managers
124 (
125 "EstateID" int NOT NULL,
126 uuid uuid NOT NULL
127 );
128
129INSERT INTO Tmp_estate_managers ("EstateID", uuid)
130 SELECT "EstateID", cast(uuid as uuid) FROM estate_managers;
131
132DROP TABLE estate_managers;
133
134Alter table Tmp_estate_managers
135 rename to estate_managers;
136
137CREATE INDEX IX_estate_managers ON estate_managers
138 (
139 "EstateID"
140 );
141
142COMMIT;
143
144
145:VERSION 5
146
147BEGIN TRANSACTION;
148
149CREATE TABLE Tmp_estate_groups
150 (
151 "EstateID" int NOT NULL,
152 uuid uuid NOT NULL
153 ) ;
154
155 INSERT INTO Tmp_estate_groups ("EstateID", uuid)
156 SELECT "EstateID", cast(uuid as uuid) FROM estate_groups;
157
158DROP TABLE estate_groups;
159
160Alter table Tmp_estate_groups
161 rename to estate_groups;
162
163CREATE INDEX IX_estate_groups ON estate_groups
164 (
165 "EstateID"
166 );
167
168COMMIT;
169
170
171:VERSION 6
172
173BEGIN TRANSACTION;
174
175CREATE TABLE Tmp_estate_users
176 (
177 "EstateID" int NOT NULL,
178 uuid uuid NOT NULL
179 );
180
181INSERT INTO Tmp_estate_users ("EstateID", uuid)
182 SELECT "EstateID", cast(uuid as uuid) FROM estate_users ;
183
184DROP TABLE estate_users;
185
186Alter table Tmp_estate_users
187 rename to estate_users;
188
189CREATE INDEX IX_estate_users ON estate_users
190 (
191 "EstateID"
192 );
193
194COMMIT;
195
196
197:VERSION 7
198
199BEGIN TRANSACTION;
200
201CREATE TABLE Tmp_estateban
202 (
203 "EstateID" int NOT NULL,
204 "bannedUUID" uuid NOT NULL,
205 "bannedIp" varchar(16) NULL,
206 "bannedIpHostMask" varchar(16) NULL,
207 "bannedNameMask" varchar(64) NULL
208 );
209
210INSERT INTO Tmp_estateban ("EstateID", "bannedUUID", "bannedIp", "bannedIpHostMask", "bannedNameMask")
211 SELECT "EstateID", cast("bannedUUID" as uuid), "bannedIp", "bannedIpHostMask", "bannedNameMask" FROM estateban ;
212
213DROP TABLE estateban;
214
215Alter table Tmp_estateban
216 rename to estateban;
217
218CREATE INDEX IX_estateban ON estateban
219 (
220 "EstateID"
221 );
222
223COMMIT;
224
225
226:VERSION 8
227
228BEGIN TRANSACTION;
229
230CREATE TABLE Tmp_estate_settings
231 (
232 "EstateID" integer default nextval('estate_settings_id') NOT NULL,
233 "EstateName" varchar(64) NULL DEFAULT (NULL),
234 "AbuseEmailToEstateOwner" boolean NOT NULL,
235 "DenyAnonymous" boolean NOT NULL,
236 "ResetHomeOnTeleport" boolean NOT NULL,
237 "FixedSun" boolean NOT NULL,
238 "DenyTransacted" boolean NOT NULL,
239 "BlockDwell" boolean NOT NULL,
240 "DenyIdentified" boolean NOT NULL,
241 "AllowVoice" boolean NOT NULL,
242 "UseGlobalTime" boolean NOT NULL,
243 "PricePerMeter" int NOT NULL,
244 "TaxFree" boolean NOT NULL,
245 "AllowDirectTeleport" boolean NOT NULL,
246 "RedirectGridX" int NOT NULL,
247 "RedirectGridY" int NOT NULL,
248 "ParentEstateID" int NOT NULL,
249 "SunPosition" double precision NOT NULL,
250 "EstateSkipScripts" boolean NOT NULL,
251 "BillableFactor" double precision NOT NULL,
252 "PublicAccess" boolean NOT NULL,
253 "AbuseEmail" varchar(255) NOT NULL,
254 "EstateOwner" uuid NOT NULL,
255 "DenyMinors" boolean NOT NULL
256 );
257
258INSERT INTO Tmp_estate_settings ("EstateID", "EstateName", "AbuseEmailToEstateOwner", "DenyAnonymous", "ResetHomeOnTeleport", "FixedSun", "DenyTransacted", "BlockDwell", "DenyIdentified", "AllowVoice", "UseGlobalTime", "PricePerMeter", "TaxFree", "AllowDirectTeleport", "RedirectGridX", "RedirectGridY", "ParentEstateID", "SunPosition", "EstateSkipScripts", "BillableFactor", "PublicAccess", "AbuseEmail", "EstateOwner", "DenyMinors")
259 SELECT "EstateID", "EstateName", "AbuseEmailToEstateOwner", "DenyAnonymous", "ResetHomeOnTeleport", "FixedSun", "DenyTransacted", "BlockDwell", "DenyIdentified", "AllowVoice", "UseGlobalTime", "PricePerMeter", "TaxFree", "AllowDirectTeleport", "RedirectGridX", "RedirectGridY", "ParentEstateID", "SunPosition", "EstateSkipScripts", "BillableFactor", "PublicAccess", "AbuseEmail", cast("EstateOwner" as uuid), "DenyMinors" FROM estate_settings ;
260
261DROP TABLE estate_settings;
262
263
264Alter table Tmp_estate_settings
265 rename to estate_settings;
266
267
268Create index on estate_settings (lower("EstateName"));
269
270COMMIT;
271
272
273:VERSION 9
274
275BEGIN TRANSACTION;
276
277CREATE TABLE Tmp_estate_map
278 (
279 "RegionID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
280 "EstateID" int NOT NULL
281 );
282
283INSERT INTO Tmp_estate_map ("RegionID", "EstateID")
284 SELECT cast("RegionID" as uuid), "EstateID" FROM estate_map ;
285
286DROP TABLE estate_map;
287
288Alter table Tmp_estate_map
289 rename to estate_map;
290
291COMMIT;
292
293:VERSION 10
294
295BEGIN TRANSACTION;
296ALTER TABLE estate_settings ADD COLUMN "AllowLandmark" boolean NOT NULL default true;
297ALTER TABLE estate_settings ADD COLUMN "AllowParcelChanges" boolean NOT NULL default true;
298ALTER TABLE estate_settings ADD COLUMN "AllowSetHome" boolean NOT NULL default true;
299COMMIT;
300
301:VERSION 11
302
303Begin transaction;
304
305
306Commit;
307
diff --git a/OpenSim/Data/PGSQL/Resources/FriendsStore.migrations b/OpenSim/Data/PGSQL/Resources/FriendsStore.migrations
new file mode 100644
index 0000000..a87199b
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/FriendsStore.migrations
@@ -0,0 +1,44 @@
1:VERSION 1
2
3BEGIN TRANSACTION;
4
5CREATE TABLE Friends (
6"PrincipalID" uuid NOT NULL,
7"Friend" varchar(255) NOT NULL,
8"Flags" char(16) NOT NULL DEFAULT '0',
9"Offered" varchar(32) NOT NULL DEFAULT 0);
10
11
12COMMIT;
13
14:VERSION 2
15
16BEGIN TRANSACTION;
17
18INSERT INTO Friends ("PrincipalID", "Friend", "Flags", "Offered")
19SELECT "ownerID", "friendID", "friendPerms", 0 FROM userfriends;
20
21COMMIT;
22
23:VERSION 3
24
25BEGIN TRANSACTION;
26
27CREATE TABLE Tmp_Friends
28 ("PrincipalID" varchar(255) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
29 "Friend" varchar(255) NOT NULL,
30 "Flags" char(16) NOT NULL DEFAULT '0',
31 "Offered" varchar(32) NOT NULL DEFAULT 0) ;
32
33INSERT INTO Tmp_Friends ("PrincipalID", "Friend", "Flags", "Offered")
34 SELECT cast("PrincipalID" as varchar(255)), "Friend", "Flags", "Offered" FROM Friends ;
35
36DROP TABLE Friends;
37
38Alter table Tmp_Friends
39 rename to Friends;
40
41ALTER TABLE Friends ADD PRIMARY KEY("PrincipalID", "Friend");
42
43
44COMMIT;
diff --git a/OpenSim/Data/PGSQL/Resources/GridStore.migrations b/OpenSim/Data/PGSQL/Resources/GridStore.migrations
new file mode 100644
index 0000000..0ab8d2b
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/GridStore.migrations
@@ -0,0 +1,242 @@
1:VERSION 1
2
3BEGIN TRANSACTION;
4
5CREATE TABLE regions(
6 "regionHandle" varchar(255) NULL,
7 "regionName" varchar(255) NULL,
8 uuid varchar(255) NOT NULL PRIMARY KEY,
9 "regionRecvKey" varchar(255) NULL,
10 "regionSecret" varchar(255) NULL,
11 "regionSendKey" varchar(255) NULL,
12 "regionDataURI" varchar(255) NULL,
13 "serverIP" varchar(255) NULL,
14 "serverPort" varchar(255) NULL,
15 "serverURI" varchar(255) NULL,
16 "locX" varchar(255) NULL,
17 "locY" varchar(255) NULL,
18 "locZ" varchar(255) NULL,
19 "eastOverrideHandle" varchar(255) NULL,
20 "westOverrideHandle" varchar(255) NULL,
21 "southOverrideHandle" varchar(255) NULL,
22 "northOverrideHandle" varchar(255) NULL,
23 "regionAssetURI" varchar(255) NULL,
24 "regionAssetRecvKey" varchar(255) NULL,
25 "regionAssetSendKey" varchar(255) NULL,
26 "regionUserURI" varchar(255) NULL,
27 "regionUserRecvKey" varchar(255) NULL,
28 "regionUserSendKey" varchar(255) NULL,
29 "regionMapTexture" varchar(255) NULL,
30 "serverHttpPort" varchar(255) NULL,
31 "serverRemotingPort" varchar(255) NULL,
32 "owner_uuid" varchar(36) NULL
33);
34
35COMMIT;
36
37
38:VERSION 2
39
40BEGIN TRANSACTION;
41
42CREATE TABLE Tmp_regions
43 (
44 uuid varchar(36) NOT NULL,
45 "regionHandle" bigint NULL,
46 "regionName" varchar(20) NULL,
47 "regionRecvKey" varchar(128) NULL,
48 "regionSendKey" varchar(128) NULL,
49 "regionSecret" varchar(128) NULL,
50 "regionDataURI" varchar(128) NULL,
51 "serverIP" varchar(64) NULL,
52 "serverPort" int NULL,
53 "serverURI" varchar(255) NULL,
54 "locX" int NULL,
55 "locY" int NULL,
56 "locZ" int NULL,
57 "eastOverrideHandle" bigint NULL,
58 "westOverrideHandle" bigint NULL,
59 "southOverrideHandle" bigint NULL,
60 "northOverrideHandle" bigint NULL,
61 "regionAssetURI" varchar(255) NULL,
62 "regionAssetRecvKey" varchar(128) NULL,
63 "regionAssetSendKey" varchar(128) NULL,
64 "regionUserURI" varchar(255) NULL,
65 "regionUserRecvKey" varchar(128) NULL,
66 "regionUserSendKey" varchar(128) NULL,
67 "regionMapTexture" varchar(36) NULL,
68 "serverHttpPort" int NULL,
69 "serverRemotingPort" int NULL,
70 "owner_uuid" varchar(36) NULL,
71 "originUUID" varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000')
72 );
73
74INSERT INTO Tmp_regions (uuid, "regionHandle", "regionName", "regionRecvKey", "regionSendKey", "regionSecret", "regionDataURI", "serverIP", "serverPort", "serverURI", "locX", "locY", "locZ", "eastOverrideHandle", "westOverrideHandle", "southOverrideHandle", "northOverrideHandle", "regionAssetURI", "regionAssetRecvKey", "regionAssetSendKey", "regionUserURI", "regionUserRecvKey", "regionUserSendKey", "regionMapTexture", "serverHttpPort", "serverRemotingPort", "owner_uuid")
75 SELECT cast(uuid as varchar(36)), cast("regionHandle" as bigint), cast("regionName" as varchar(20)), cast("regionRecvKey" as varchar(128)), cast("regionSendKey" as varchar(128)), cast("regionSecret" as varchar(128)), cast("regionDataURI" as varchar(128)), cast("serverIP" as varchar(64)), cast("serverPort" as int), "serverURI", cast("locX" as int), cast("locY" as int), cast("locZ" as int), cast("eastOverrideHandle" as bigint), cast("westOverrideHandle" as bigint),
76 cast("southOverrideHandle" as bigint), cast("northOverrideHandle" as bigint), "regionAssetURI", cast("regionAssetRecvKey" as varchar(128)), cast("regionAssetSendKey" as varchar(128)), "regionUserURI", cast("regionUserRecvKey" as varchar(128)), cast("regionUserSendKey" as varchar(128)), cast("regionMapTexture" as varchar(36)),
77 cast("serverHttpPort" as int), cast("serverRemotingPort" as int), "owner_uuid"
78 FROM regions;
79
80DROP TABLE regions;
81
82alter table Tmp_regions
83 rename to regions;
84
85COMMIT;
86
87:VERSION 3
88
89BEGIN TRANSACTION;
90
91CREATE INDEX IX_regions_name ON regions
92 (
93 "regionName"
94 );
95
96CREATE INDEX IX_regions_handle ON regions
97 (
98 "regionHandle"
99 );
100
101
102CREATE INDEX IX_regions_override ON regions
103 (
104 "eastOverrideHandle",
105 "westOverrideHandle",
106 "southOverrideHandle",
107 "northOverrideHandle"
108 );
109
110COMMIT;
111
112
113:VERSION 4
114
115/* To prevent any potential data loss issues, you should review this script in detail before running it outside the cotext of the database designer.*/
116BEGIN TRANSACTION;
117
118CREATE TABLE Tmp_regions
119 (
120 uuid uuid NOT NULL,
121 "regionHandle" bigint NULL,
122 "regionName" varchar(20) NULL,
123 "regionRecvKey" varchar(128) NULL,
124 "regionSendKey" varchar(128) NULL,
125 "regionSecret" varchar(128) NULL,
126 "regionDataURI" varchar(128) NULL,
127 "serverIP" varchar(64) NULL,
128 "serverPort" int NULL,
129 "serverURI" varchar(255) NULL,
130 "locX" int NULL,
131 "locY" int NULL,
132 "locZ" int NULL,
133 "eastOverrideHandle" bigint NULL,
134 "westOverrideHandle" bigint NULL,
135 "southOverrideHandle" bigint NULL,
136 "northOverrideHandle" bigint NULL,
137 "regionAssetURI" varchar(255) NULL,
138 "regionAssetRecvKey" varchar(128) NULL,
139 "regionAssetSendKey" varchar(128) NULL,
140 "regionUserURI" varchar(255) NULL,
141 "regionUserRecvKey" varchar(128) NULL,
142 "regionUserSendKey" varchar(128) NULL,
143 "regionMapTexture" uuid NULL,
144 "serverHttpPort" int NULL,
145 "serverRemotingPort" int NULL,
146 "owner_uuid" uuid NOT NULL,
147 "originUUID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000')
148 );
149
150
151INSERT INTO Tmp_regions (uuid, "regionHandle", "regionName", "regionRecvKey", "regionSendKey", "regionSecret", "regionDataURI", "serverIP", "serverPort", "serverURI", "locX", "locY", "locZ", "eastOverrideHandle", "westOverrideHandle", "southOverrideHandle", "northOverrideHandle", "regionAssetURI", "regionAssetRecvKey", "regionAssetSendKey", "regionUserURI", "regionUserRecvKey", "regionUserSendKey", "regionMapTexture", "serverHttpPort", "serverRemotingPort", "owner_uuid", "originUUID")
152 SELECT cast(uuid as uuid), "regionHandle", "regionName", "regionRecvKey", "regionSendKey", "regionSecret", "regionDataURI", "serverIP", "serverPort", "serverURI", "locX", "locY", "locZ", "eastOverrideHandle", "westOverrideHandle", "southOverrideHandle", "northOverrideHandle", "regionAssetURI", "regionAssetRecvKey", "regionAssetSendKey", "regionUserURI", "regionUserRecvKey", "regionUserSendKey", cast("regionMapTexture" as uuid), "serverHttpPort", "serverRemotingPort", cast( "owner_uuid" as uuid), cast("originUUID" as uuid) FROM regions ;
153
154
155DROP TABLE regions;
156
157alter table Tmp_regions rename to regions;
158
159ALTER TABLE regions ADD CONSTRAINT
160 PK__regions__uuid PRIMARY KEY
161 (
162 uuid
163 );
164
165CREATE INDEX IX_regions_name ON regions
166 (
167 "regionName"
168 );
169
170CREATE INDEX IX_regions_handle ON regions
171 (
172 "regionHandle"
173 );
174
175CREATE INDEX IX_regions_override ON regions
176 (
177 "eastOverrideHandle",
178 "westOverrideHandle",
179 "southOverrideHandle",
180 "northOverrideHandle"
181 );
182
183COMMIT;
184
185
186:VERSION 5
187
188BEGIN TRANSACTION;
189
190ALTER TABLE regions ADD access int default 0;
191
192COMMIT;
193
194
195:VERSION 6
196
197BEGIN TRANSACTION;
198
199ALTER TABLE regions ADD "ScopeID" uuid default '00000000-0000-0000-0000-000000000000';
200ALTER TABLE regions alter column "owner_uuid" set DEFAULT ('00000000-0000-0000-0000-000000000000');
201ALTER TABLE regions ADD "sizeX" integer not null default 0;
202ALTER TABLE regions ADD "sizeY" integer not null default 0;
203
204COMMIT;
205
206
207:VERSION 7
208
209BEGIN TRANSACTION;
210
211ALTER TABLE regions ADD "flags" integer NOT NULL DEFAULT 0;
212CREATE INDEX flags ON regions("flags");
213ALTER TABLE regions ADD "last_seen" integer NOT NULL DEFAULT 0;
214ALTER TABLE regions ADD "PrincipalID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
215ALTER TABLE regions ADD "Token" varchar(255) NOT NULL DEFAULT 0;
216
217COMMIT;
218
219:VERSION 8
220
221BEGIN TRANSACTION;
222ALTER TABLE regions ALTER COLUMN "regionName" type VarChar(128) ;
223
224DROP INDEX IX_regions_name;
225ALTER TABLE regions ALTER COLUMN "regionName" type VarChar(128),
226 ALTER COLUMN "regionName" SET NOT NULL;
227
228CREATE INDEX IX_regions_name ON regions
229 (
230 "regionName"
231 );
232
233COMMIT;
234
235:VERSION 9
236
237BEGIN TRANSACTION;
238
239ALTER TABLE regions ADD "parcelMapTexture" uuid NULL;
240
241COMMIT;
242
diff --git a/OpenSim/Data/PGSQL/Resources/GridUserStore.migrations b/OpenSim/Data/PGSQL/Resources/GridUserStore.migrations
new file mode 100644
index 0000000..d37c4f6d
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/GridUserStore.migrations
@@ -0,0 +1,60 @@
1:VERSION 1 # --------------------------
2
3BEGIN TRANSACTION;
4
5CREATE TABLE GridUser (
6 "UserID" VARCHAR(255) NOT NULL Primary Key,
7 "HomeRegionID" CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
8 "HomePosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
9 "HomeLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
10 "LastRegionID" CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
11 "LastPosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
12 "LastLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
13 "Online" CHAR(5) NOT NULL DEFAULT 'false',
14 "Login" CHAR(16) NOT NULL DEFAULT '0',
15 "Logout" CHAR(16) NOT NULL DEFAULT '0'
16) ;
17
18COMMIT;
19
20:VERSION 2 # --------------------------
21
22BEGIN TRANSACTION;
23
24CREATE TABLE GridUser_tmp (
25 "UserID" VARCHAR(255) NOT NULL PRIMARY KEY,
26 "HomeRegionID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
27 "HomePosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
28 "HomeLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
29 "LastRegionID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
30 "LastPosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
31 "LastLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
32 "Online" CHAR(5) NOT NULL DEFAULT 'false',
33 "Login" CHAR(16) NOT NULL DEFAULT '0',
34 "Logout" CHAR(16) NOT NULL DEFAULT '0'
35 );
36
37COMMIT;
38
39
40INSERT INTO GridUser_tmp ("UserID"
41 ,"HomeRegionID"
42 ,"HomePosition"
43 ,"HomeLookAt"
44 ,"LastRegionID"
45 ,"LastPosition"
46 ,"LastLookAt"
47 ,"Online"
48 ,"Login"
49 ,"Logout")
50 SELECT "UserID", cast("HomeRegionID" as uuid), "HomePosition" ,"HomeLookAt" , cast("LastRegionID" as uuid),
51 "LastPosition"
52 ,"LastLookAt"
53 ,"Online"
54 ,"Login"
55 ,"Logout" FROM GridUser;
56
57DROP TABLE GridUser;
58
59alter table GridUser_tmp rename to GridUser;
60
diff --git a/OpenSim/Data/PGSQL/Resources/HGTravelStore.migrations b/OpenSim/Data/PGSQL/Resources/HGTravelStore.migrations
new file mode 100644
index 0000000..adf126d
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/HGTravelStore.migrations
@@ -0,0 +1,17 @@
1:VERSION 1 # --------------------------
2
3BEGIN;
4
5CREATE TABLE hg_traveling_data (
6 "SessionID" VARCHAR(36) NOT NULL Primary Key,
7 "UserID" VARCHAR(36) NOT NULL,
8 "GridExternalName" VARCHAR(255) NOT NULL DEFAULT '',
9 "ServiceToken" VARCHAR(255) NOT NULL DEFAULT '',
10 "ClientIPAddress" VARCHAR(16) NOT NULL DEFAULT '',
11 "MyIPAddress" VARCHAR(16) NOT NULL DEFAULT '',
12 "TMStamp" timestamp NOT NULL default now()
13);
14
15
16COMMIT;
17
diff --git a/OpenSim/Data/PGSQL/Resources/IM_Store.migrations b/OpenSim/Data/PGSQL/Resources/IM_Store.migrations
new file mode 100644
index 0000000..eb97824
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/IM_Store.migrations
@@ -0,0 +1,45 @@
1:VERSION 1 # --------------------------
2
3BEGIN Transaction;
4
5Create Sequence im_offiline_id increment by 1 start with 1;
6
7CREATE TABLE im_offline (
8 "ID" integer PRIMARY KEY NOT NULL DEFAULT nextval('im_offiline_id') ,
9 "PrincipalID" char(36) NOT NULL default '',
10 "Message" text NOT NULL,
11 "TMStamp" timestamp NOT NULL default now()
12);
13
14COMMIT;
15
16:VERSION 2 # --------------------------
17
18BEGIN;
19
20/*
21INSERT INTO `im_offline` SELECT * from `diva_im_offline`;
22DROP TABLE `diva_im_offline`;
23DELETE FROM `migrations` WHERE name='diva_im_Store';
24*/
25
26COMMIT;
27
28:VERSION 3 # --------------------------
29
30BEGIN;
31
32-- dropping the table here as there most likely is only one record in the table at the time of migration
33
34DROP TABLE IF EXISTS "public"."im_offline";
35CREATE TABLE "public"."im_offline" (
36 "ID" serial,
37 "PrincipalID" uuid NOT NULL,
38 "Message" text NOT NULL COLLATE "default",
39 "TMStamp" timestamp(6) NOT NULL DEFAULT clock_timestamp(),
40 "FromID" uuid NOT NULL
41)
42WITH (OIDS=FALSE);
43ALTER TABLE "public"."im_offline" ADD PRIMARY KEY ("ID","PrincipalID","FromID") NOT DEFERRABLE INITIALLY IMMEDIATE;
44
45COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/PGSQL/Resources/InventoryStore.migrations b/OpenSim/Data/PGSQL/Resources/InventoryStore.migrations
new file mode 100644
index 0000000..8f7982a
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/InventoryStore.migrations
@@ -0,0 +1,220 @@
1:VERSION 1
2
3BEGIN TRANSACTION;
4
5CREATE TABLE inventoryfolders (
6 "folderID" varchar(36) NOT NULL default '' PRIMARY KEY,
7 "agentID" varchar(36) default NULL,
8 "parentFolderID" varchar(36) default NULL,
9 "folderName" varchar(64) default NULL,
10 "type" smallint NOT NULL default 0,
11 "version" int NOT NULL default 0
12);
13
14
15CREATE INDEX owner ON inventoryfolders
16(
17 "agentID" ASC
18);
19
20CREATE INDEX parent ON inventoryfolders
21(
22 "parentFolderID" ASC
23);
24
25
26CREATE TABLE inventoryitems (
27 "inventoryID" varchar(36) NOT NULL default '' Primary Key,
28 "assetID" varchar(36) default NULL,
29 "assetType" int default NULL,
30 "parentFolderID" varchar(36) default NULL,
31 "avatarID" varchar(36) default NULL,
32 "inventoryName" varchar(64) default NULL,
33 "inventoryDescription" varchar(128) default NULL,
34 "inventoryNextPermissions" int default NULL,
35 "inventoryCurrentPermissions" int default NULL,
36 "invType" int default NULL,
37 "creatorID" varchar(36) default NULL,
38 "inventoryBasePermissions" int NOT NULL default 0,
39 "inventoryEveryOnePermissions" int NOT NULL default 0,
40 "salePrice" int default NULL,
41 "saleType" smallint default NULL,
42 "creationDate" int default NULL,
43 "groupID" varchar(36) default NULL,
44 "groupOwned" boolean default NULL,
45 "flags" int default NULL
46);
47
48
49CREATE INDEX ii_owner ON inventoryitems
50(
51 "avatarID" ASC
52);
53
54CREATE INDEX ii_folder ON inventoryitems
55(
56 "parentFolderID" ASC
57);
58
59COMMIT;
60
61
62:VERSION 2
63
64BEGIN TRANSACTION;
65
66ALTER TABLE inventoryitems ADD "inventoryGroupPermissions" INTEGER NOT NULL default 0;
67
68COMMIT;
69
70:VERSION 3
71
72/* To prevent any potential data loss issues, you should review this script in detail before running it outside the cotext of the database designer.*/
73BEGIN TRANSACTION;
74
75CREATE TABLE Tmp_inventoryfolders
76 (
77 "folderID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
78 "agentID" uuid NULL DEFAULT (NULL),
79 "parentFolderID" uuid NULL DEFAULT (NULL),
80 "folderName" varchar(64) NULL DEFAULT (NULL),
81 "type" smallint NOT NULL DEFAULT ((0)),
82 "version" int NOT NULL DEFAULT ((0))
83 );
84
85 INSERT INTO Tmp_inventoryfolders ("folderID", "agentID", "parentFolderID", "folderName", type, version)
86 SELECT cast("folderID" as uuid), cast("agentID" as uuid), cast("parentFolderID" as uuid), "folderName", "type", "version"
87 FROM inventoryfolders;
88
89DROP TABLE inventoryfolders;
90
91alter table Tmp_inventoryfolders rename to inventoryfolders;
92
93ALTER TABLE inventoryfolders ADD CONSTRAINT
94 PK__inventor__C2FABFB3173876EA PRIMARY KEY
95 (
96 "folderID"
97 );
98
99CREATE INDEX owner ON inventoryfolders
100 (
101 "agentID"
102 );
103
104CREATE INDEX parent ON inventoryfolders
105 (
106 "parentFolderID"
107 );
108
109COMMIT;
110
111
112:VERSION 4
113
114BEGIN TRANSACTION;
115
116CREATE TABLE Tmp_inventoryitems
117 (
118 "inventoryID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
119 "assetID" uuid NULL DEFAULT (NULL),
120 "assetType" int NULL DEFAULT (NULL),
121 "parentFolderID" uuid NULL DEFAULT (NULL),
122 "avatarID" uuid NULL DEFAULT (NULL),
123 "inventoryName" varchar(64) NULL DEFAULT (NULL),
124 "inventoryDescription" varchar(128) NULL DEFAULT (NULL),
125 "inventoryNextPermissions" int NULL DEFAULT (NULL),
126 "inventoryCurrentPermissions" int NULL DEFAULT (NULL),
127 "invType" int NULL DEFAULT (NULL),
128 "creatorID" uuid NULL DEFAULT (NULL),
129 "inventoryBasePermissions" int NOT NULL DEFAULT ((0)),
130 "inventoryEveryOnePermissions" int NOT NULL DEFAULT ((0)),
131 "salePrice" int NULL DEFAULT (NULL),
132 "SaleType" smallint NULL DEFAULT (NULL),
133 "creationDate" int NULL DEFAULT (NULL),
134 "groupID" uuid NULL DEFAULT (NULL),
135 "groupOwned" boolean NULL DEFAULT (NULL),
136 "flags" int NULL DEFAULT (NULL),
137 "inventoryGroupPermissions" int NOT NULL DEFAULT ((0))
138 );
139
140
141 INSERT INTO Tmp_inventoryitems ("inventoryID", "assetID", "assetType", "parentFolderID", "avatarID", "inventoryName", "inventoryDescription", "inventoryNextPermissions", "inventoryCurrentPermissions", "invType", "creatorID", "inventoryBasePermissions", "inventoryEveryOnePermissions", "salePrice", "SaleType", "creationDate", "groupID", "groupOwned", "flags", "inventoryGroupPermissions")
142 SELECT cast("inventoryID" as uuid), cast("assetID" as uuid), "assetType", cast("parentFolderID" as uuid), cast("avatarID" as uuid), "inventoryName", "inventoryDescription", "inventoryNextPermissions", "inventoryCurrentPermissions", "invType", cast("creatorID" as uuid), "inventoryBasePermissions", "inventoryEveryOnePermissions", "salePrice", "SaleType", "creationDate", cast("groupID" as uuid), "groupOwned", "flags", "inventoryGroupPermissions"
143 FROM inventoryitems ;
144
145DROP TABLE inventoryitems;
146
147alter table Tmp_inventoryitems rename to inventoryitems;
148
149ALTER TABLE inventoryitems ADD CONSTRAINT
150 PK__inventor__C4B7BC2220C1E124 PRIMARY KEY
151 (
152 "inventoryID"
153 );
154
155
156CREATE INDEX ii2_owner ON inventoryitems
157 (
158 "avatarID"
159 );
160
161CREATE INDEX ii2_folder ON inventoryitems
162 (
163 "parentFolderID"
164 );
165
166COMMIT;
167
168:VERSION 5
169
170
171BEGIN TRANSACTION;
172
173-- # Restoring defaults:
174-- # NOTE: "inventoryID" does NOT need one: it's NOT NULL PK and a unique Guid must be provided every time anyway!
175
176alter table inventoryitems
177 alter column "inventoryBasePermissions" set default 0;
178alter table inventoryitems
179 alter column "inventoryEveryOnePermissions" set default 0;
180alter table inventoryitems
181 alter column "inventoryGroupPermissions" set default 0 ;
182
183COMMIT ;
184
185:VERSION 7
186
187BEGIN TRANSACTION;
188
189-- # "creatorID" goes back to VARCHAR(36) (???)
190
191alter table inventoryitems
192 alter column "creatorID" type varchar(36);
193
194COMMIT ;
195
196:VERSION 8
197
198ALTER TABLE inventoryitems
199 alter column "creatorID" set DEFAULT '00000000-0000-0000-0000-000000000000';
200
201
202:VERSION 9
203
204BEGIN TRANSACTION;
205
206--# "creatorID" goes up to VARCHAR(255)
207
208alter table inventoryitems
209 alter column "creatorID" type varchar(255);
210
211Commit;
212
213:VERSION 10
214
215BEGIN TRANSACTION;
216
217Alter table inventoryitems Rename Column "SaleType" to "saleType";
218
219Commit;
220
diff --git a/OpenSim/Data/PGSQL/Resources/LogStore.migrations b/OpenSim/Data/PGSQL/Resources/LogStore.migrations
new file mode 100644
index 0000000..83727c6
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/LogStore.migrations
@@ -0,0 +1,16 @@
1:VERSION 1
2
3BEGIN TRANSACTION;
4
5CREATE TABLE logs (
6 "logID" int NOT NULL Primary Key,
7 "target" varchar(36) default NULL,
8 "server" varchar(64) default NULL,
9 "method" varchar(64) default NULL,
10 "arguments" varchar(255) default NULL,
11 "priority" int default NULL,
12 "message" text
13);
14
15COMMIT;
16
diff --git a/OpenSim/Data/PGSQL/Resources/Presence.migrations b/OpenSim/Data/PGSQL/Resources/Presence.migrations
new file mode 100755
index 0000000..5184034
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/Presence.migrations
@@ -0,0 +1,42 @@
1:VERSION 1
2
3BEGIN TRANSACTION;
4
5CREATE TABLE Presence (
6"UserID" varchar(255) NOT NULL,
7"RegionID" uuid NOT NULL,
8"SessionID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
9"SecureSessionID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'
10);
11
12
13COMMIT;
14
15:VERSION 2
16
17BEGIN TRANSACTION;
18
19CREATE UNIQUE INDEX SessionID ON Presence("SessionID");
20CREATE INDEX UserID ON Presence("UserID");
21
22ALTER TABLE Presence ADD "LastSeen" Timestamp;
23
24COMMIT;
25
26:VERSION 3 # --------------------------
27
28BEGIN;
29
30CREATE INDEX RegionID ON Presence("RegionID");
31
32COMMIT;
33
34:VERSION 4 # Making sure LastSeen is actually defined in the table as it most likely erred in the double version 2 migration above
35
36BEGIN;
37
38ALTER TABLE Presence
39DROP COLUMN IF EXISTS "LastSeen",
40ADD COLUMN "LastSeen" Timestamp;
41
42COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/PGSQL/Resources/RegionStore.migrations b/OpenSim/Data/PGSQL/Resources/RegionStore.migrations
new file mode 100644
index 0000000..1284ce0
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/RegionStore.migrations
@@ -0,0 +1,1162 @@
1begin transaction ;
2:VERSION 1
3
4CREATE TABLE prims(
5 "UUID" varchar(255) NOT NULL Primary key,
6 "RegionUUID" varchar(255) NULL,
7 "ParentID" int NULL,
8 "CreationDate" int NULL,
9 "Name" varchar(255) NULL,
10 "SceneGroupID" varchar(255) NULL,
11 "Text" varchar(255) NULL,
12 "Description" varchar(255) NULL,
13 "SitName" varchar(255) NULL,
14 "TouchName" varchar(255) NULL,
15 "ObjectFlags" int NULL,
16 "CreatorID" varchar(255) NULL,
17 "OwnerID" varchar(255) NULL,
18 "GroupID" varchar(255) NULL,
19 "LastOwnerID" varchar(255) NULL,
20 "OwnerMask" int NULL,
21 "NextOwnerMask" int NULL,
22 "GroupMask" int NULL,
23 "EveryoneMask" int NULL,
24 "BaseMask" int NULL,
25 "PositionX" double precision NULL,
26 "PositionY" double precision NULL,
27 "PositionZ" double precision NULL,
28 "GroupPositionX" double precision NULL,
29 "GroupPositionY" double precision NULL,
30 "GroupPositionZ" double precision NULL,
31 "VelocityX" double precision NULL,
32 "VelocityY" double precision NULL,
33 "VelocityZ" double precision NULL,
34 "AngularVelocityX" double precision NULL,
35 "AngularVelocityY" double precision NULL,
36 "AngularVelocityZ" double precision NULL,
37 "AccelerationX" double precision NULL,
38 "AccelerationY" double precision NULL,
39 "AccelerationZ" double precision NULL,
40 "RotationX" double precision NULL,
41 "RotationY" double precision NULL,
42 "RotationZ" double precision NULL,
43 "RotationW" double precision NULL,
44 "SitTargetOffsetX" double precision NULL,
45 "SitTargetOffsetY" double precision NULL,
46 "SitTargetOffsetZ" double precision NULL,
47 "SitTargetOrientW" double precision NULL,
48 "SitTargetOrientX" double precision NULL,
49 "SitTargetOrientY" double precision NULL,
50 "SitTargetOrientZ" double precision NULL
51 );
52
53CREATE TABLE primshapes(
54 "UUID" varchar(255) NOT NULL primary key,
55 "Shape" int NULL,
56 "ScaleX" double precision NULL,
57 "ScaleY" double precision NULL,
58 "ScaleZ" double precision NULL,
59 "PCode" int NULL,
60 "PathBegin" int NULL,
61 "PathEnd" int NULL,
62 "PathScaleX" int NULL,
63 "PathScaleY" int NULL,
64 "PathShearX" int NULL,
65 "PathShearY" int NULL,
66 "PathSkew" int NULL,
67 "PathCurve" int NULL,
68 "PathRadiusOffset" int NULL,
69 "PathRevolutions" int NULL,
70 "PathTaperX" int NULL,
71 "PathTaperY" int NULL,
72 "PathTwist" int NULL,
73 "PathTwistBegin" int NULL,
74 "ProfileBegin" int NULL,
75 "ProfileEnd" int NULL,
76 "ProfileCurve" int NULL,
77 "ProfileHollow" int NULL,
78 "State" int NULL,
79 "Texture" bytea NULL,
80 "ExtraParams" bytea NULL
81 );
82
83CREATE TABLE primitems(
84 "itemID" varchar(255) NOT NULL primary key,
85 "primID" varchar(255) NULL,
86 "assetID" varchar(255) NULL,
87 "parentFolderID" varchar(255) NULL,
88 "invType" int NULL,
89 "assetType" int NULL,
90 "name" varchar(255) NULL,
91 "description" varchar(255) NULL,
92 "creationDate" varchar(255) NULL,
93 "creatorID" varchar(255) NULL,
94 "ownerID" varchar(255) NULL,
95 "lastOwnerID" varchar(255) NULL,
96 "groupID" varchar(255) NULL,
97 "nextPermissions" int NULL,
98 "currentPermissions" int NULL,
99 "basePermissions" int NULL,
100 "everyonePermissions" int NULL,
101 "groupPermissions" int NULL
102 );
103
104CREATE TABLE terrain(
105 "RegionUUID" varchar(255) NULL,
106 "Revision" int NULL,
107 "Heightfield" bytea NULL
108);
109
110
111CREATE TABLE land(
112 "UUID" varchar(255) NOT NULL primary key,
113 "RegionUUID" varchar(255) NULL,
114 "LocalLandID" int NULL,
115 "Bitmap" bytea NULL,
116 "Name" varchar(255) NULL,
117 "Description" varchar(255) NULL,
118 "OwnerUUID" varchar(255) NULL,
119 "IsGroupOwned" boolean NULL,
120 "Area" int NULL,
121 "AuctionID" int NULL,
122 "Category" int NULL,
123 "ClaimDate" int NULL,
124 "ClaimPrice" int NULL,
125 "GroupUUID" varchar(255) NULL,
126 "SalePrice" int NULL,
127 "LandStatus" int NULL,
128 "LandFlags" int NULL,
129 "LandingType" int NULL,
130 "MediaAutoScale" int NULL,
131 "MediaTextureUUID" varchar(255) NULL,
132 "MediaURL" varchar(255) NULL,
133 "MusicURL" varchar(255) NULL,
134 "PassHours" double precision NULL,
135 "PassPrice" int NULL,
136 "SnapshotUUID" varchar(255) NULL,
137 "UserLocationX" double precision NULL,
138 "UserLocationY" double precision NULL,
139 "UserLocationZ" double precision NULL,
140 "UserLookAtX" double precision NULL,
141 "UserLookAtY" double precision NULL,
142 "UserLookAtZ" double precision NULL
143);
144
145Create index on land (lower("Name"));
146
147CREATE TABLE landaccesslist(
148 "LandUUID" varchar(255) NULL,
149 "AccessUUID" varchar(255) NULL,
150 "Flags" int NULL
151);
152
153COMMIT;
154
155:VERSION 2
156
157BEGIN TRANSACTION;
158
159CREATE TABLE regionban (
160 "regionUUID" VARCHAR(36) NOT NULL,
161 "bannedUUID" VARCHAR(36) NOT NULL,
162 "bannedIp" VARCHAR(16) NOT NULL,
163 "bannedIpHostMask" VARCHAR(16) NOT NULL
164 );
165
166create table regionsettings (
167 "regionUUID" varchar(36) not null primary key,
168 "block_terraform" boolean not null,
169 "block_fly" boolean not null,
170 "allow_damage" boolean not null,
171 "restrict_pushing" boolean not null,
172 "allow_land_resell" boolean not null,
173 "allow_land_join_divide" boolean not null,
174 "block_show_in_search" boolean not null,
175 "agent_limit" int not null,
176 "object_bonus" double precision not null,
177 "maturity" int not null,
178 "disable_scripts" boolean not null,
179 "disable_collisions" boolean not null,
180 "disable_physics" boolean not null,
181 "terrain_texture_1" varchar(36) not null,
182 "terrain_texture_2" varchar(36) not null,
183 "terrain_texture_3" varchar(36) not null,
184 "terrain_texture_4" varchar(36) not null,
185 "elevation_1_nw" double precision not null,
186 "elevation_2_nw" double precision not null,
187 "elevation_1_ne" double precision not null,
188 "elevation_2_ne" double precision not null,
189 "elevation_1_se" double precision not null,
190 "elevation_2_se" double precision not null,
191 "elevation_1_sw" double precision not null,
192 "elevation_2_sw" double precision not null,
193 "water_height" double precision not null,
194 "terrain_raise_limit" double precision not null,
195 "terrain_lower_limit" double precision not null,
196 "use_estate_sun" boolean not null,
197 "fixed_sun" boolean not null,
198 "sun_position" double precision not null,
199 "covenant" varchar(36) default NULL,
200 "Sandbox" boolean NOT NULL
201 );
202
203COMMIT;
204
205:VERSION 3
206
207BEGIN TRANSACTION;
208
209CREATE TABLE Tmp_prims
210 (
211 "UUID" varchar(36) NOT NULL ,
212 "RegionUUID" varchar(36) NULL,
213 "ParentID" int NULL,
214 "CreationDate" int NULL,
215 "Name" varchar(255) NULL,
216 "SceneGroupID" varchar(36) NULL,
217 "Text" varchar(255) NULL,
218 "Description" varchar(255) NULL,
219 "SitName" varchar(255) NULL,
220 "TouchName" varchar(255) NULL,
221 "ObjectFlags" int NULL,
222 "CreatorID" varchar(36) NULL,
223 "OwnerID" varchar(36) NULL,
224 "GroupID" varchar(36) NULL,
225 "LastOwnerID" varchar(36) NULL,
226 "OwnerMask" int NULL,
227 "NextOwnerMask" int NULL,
228 "GroupMask" int NULL,
229 "EveryoneMask" int NULL,
230 "BaseMask" int NULL,
231 "PositionX" double precision NULL,
232 "PositionY" double precision NULL,
233 "PositionZ" double precision NULL,
234 "GroupPositionX" double precision NULL,
235 "GroupPositionY" double precision NULL,
236 "GroupPositionZ" double precision NULL,
237 "VelocityX" double precision NULL,
238 "VelocityY" double precision NULL,
239 "VelocityZ" double precision NULL,
240 "AngularVelocityX" double precision NULL,
241 "AngularVelocityY" double precision NULL,
242 "AngularVelocityZ" double precision NULL,
243 "AccelerationX" double precision NULL,
244 "AccelerationY" double precision NULL,
245 "AccelerationZ" double precision NULL,
246 "RotationX" double precision NULL,
247 "RotationY" double precision NULL,
248 "RotationZ" double precision NULL,
249 "RotationW" double precision NULL,
250 "SitTargetOffsetX" double precision NULL,
251 "SitTargetOffsetY" double precision NULL,
252 "SitTargetOffsetZ" double precision NULL,
253 "SitTargetOrientW" double precision NULL,
254 "SitTargetOrientX" double precision NULL,
255 "SitTargetOrientY" double precision NULL,
256 "SitTargetOrientZ" double precision NULL
257 );
258
259INSERT INTO Tmp_prims ("UUID", "RegionUUID", "ParentID", "CreationDate", "Name", "SceneGroupID", "Text", "Description", "SitName", "TouchName", "ObjectFlags", "CreatorID", "OwnerID", "GroupID", "LastOwnerID", "OwnerMask", "NextOwnerMask", "GroupMask", "EveryoneMask", "BaseMask", "PositionX", "PositionY", "PositionZ", "GroupPositionX", "GroupPositionY", "GroupPositionZ", "VelocityX", "VelocityY", "VelocityZ", "AngularVelocityX", "AngularVelocityY", "AngularVelocityZ", "AccelerationX", "AccelerationY", "AccelerationZ", "RotationX", "RotationY", "RotationZ", "RotationW", "SitTargetOffsetX", "SitTargetOffsetY", "SitTargetOffsetZ", "SitTargetOrientW", "SitTargetOrientX", "SitTargetOrientY", "SitTargetOrientZ")
260 SELECT cast("UUID" as varchar(36)), cast("RegionUUID" as varchar(36)), "ParentID", "CreationDate", "Name", cast("SceneGroupID" as varchar(36)), "Text", "Description", "SitName", "TouchName", "ObjectFlags", cast("CreatorID" as varchar(36)), cast("OwnerID" as varchar(36)), cast( "GroupID" as varchar(36)), cast("LastOwnerID" as varchar(36)), "OwnerMask", "NextOwnerMask", "GroupMask", "EveryoneMask", "BaseMask", "PositionX", "PositionY", "PositionZ", "GroupPositionX", "GroupPositionY", "GroupPositionZ", "VelocityX", "VelocityY", "VelocityZ", "AngularVelocityX", "AngularVelocityY", "AngularVelocityZ", "AccelerationX", "AccelerationY", "AccelerationZ", "RotationX", "RotationY", "RotationZ", "RotationW", "SitTargetOffsetX", "SitTargetOffsetY", "SitTargetOffsetZ", "SitTargetOrientW", "SitTargetOrientX", "SitTargetOrientY", "SitTargetOrientZ"
261 FROM prims ;
262
263DROP TABLE prims;
264
265alter table Tmp_prims rename to prims;
266
267
268ALTER TABLE prims ADD CONSTRAINT
269 PK__prims__10566F31 PRIMARY KEY
270 (
271 "UUID"
272 );
273
274COMMIT;
275
276:VERSION 4
277
278BEGIN TRANSACTION;
279
280CREATE TABLE Tmp_primitems
281 (
282 "itemID" varchar(36) NOT NULL,
283 "primID" varchar(36) NULL,
284 "assetID" varchar(36) NULL,
285 "parentFolderID" varchar(36) NULL,
286 "invType" int NULL,
287 "assetType" int NULL,
288 "name" varchar(255) NULL,
289 "description" varchar(255) NULL,
290 "creationDate" varchar(255) NULL,
291 "creatorID" varchar(36) NULL,
292 "ownerID" varchar(36) NULL,
293 "lastOwnerID" varchar(36) NULL,
294 "groupID" varchar(36) NULL,
295 "nextPermissions" int NULL,
296 "currentPermissions" int NULL,
297 "basePermissions" int NULL,
298 "everyonePermissions" int NULL,
299 "groupPermissions" int NULL
300 );
301
302INSERT INTO Tmp_primitems ("itemID", "primID", "assetID", "parentFolderID", "invType", "assetType", "name", "description", "creationDate", "creatorID", "ownerID", "lastOwnerID", "groupID", "nextPermissions", "currentPermissions", "basePermissions", "everyonePermissions", "groupPermissions")
303 SELECT cast("itemID" as varchar(36)), cast("primID" as varchar(36)), cast("assetID" as varchar(36)), cast( "parentFolderID" as varchar(36)), "invType", "assetType", "name", "description", "creationDate", cast( "creatorID" as varchar(36)), cast("ownerID" as varchar(36)), cast("lastOwnerID" as varchar(36)), cast("groupID" as varchar(36)), "nextPermissions", "currentPermissions", "basePermissions", "everyonePermissions", "groupPermissions"
304 from primitems;
305
306DROP TABLE primitems;
307
308alter table Tmp_primitems rename to primitems;
309
310ALTER TABLE primitems ADD CONSTRAINT
311 PK__primitems__0A688BB1 PRIMARY KEY
312 (
313 "itemID"
314 );
315
316
317COMMIT;
318
319
320:VERSION 5
321
322BEGIN TRANSACTION;
323
324CREATE TABLE Tmp_primshapes
325 (
326 "UUID" varchar(36) NOT NULL,
327 "Shape" int NULL,
328 "ScaleX" double precision NULL,
329 "ScaleY" double precision NULL,
330 "ScaleZ" double precision NULL,
331 "PCode" int NULL,
332 "PathBegin" int NULL,
333 "PathEnd" int NULL,
334 "PathScaleX" int NULL,
335 "PathScaleY" int NULL,
336 "PathShearX" int NULL,
337 "PathShearY" int NULL,
338 "PathSkew" int NULL,
339 "PathCurve" int NULL,
340 "PathRadiusOffset" int NULL,
341 "PathRevolutions" int NULL,
342 "PathTaperX" int NULL,
343 "PathTaperY" int NULL,
344 "PathTwist" int NULL,
345 "PathTwistBegin" int NULL,
346 "ProfileBegin" int NULL,
347 "ProfileEnd" int NULL,
348 "ProfileCurve" int NULL,
349 "ProfileHollow" int NULL,
350 "State" int NULL,
351 "Texture" bytea NULL,
352 "ExtraParams" bytea NULL
353 ) ;
354
355INSERT INTO Tmp_primshapes ("UUID", "Shape", "ScaleX", "ScaleY", "ScaleZ", "PCode", "PathBegin", "PathEnd", "PathScaleX", "PathScaleY", "PathShearX", "PathShearY", "PathSkew", "PathCurve", "PathRadiusOffset", "PathRevolutions", "PathTaperX", "PathTaperY", "PathTwist", "PathTwistBegin", "ProfileBegin", "ProfileEnd", "ProfileCurve", "ProfileHollow", "State", "Texture", "ExtraParams")
356 SELECT cast("UUID" as varchar(36)), "Shape", "ScaleX", "ScaleY", "ScaleZ", "PCode", "PathBegin", "PathEnd", "PathScaleX", "PathScaleY", "PathShearX", "PathShearY", "PathSkew", "PathCurve", "PathRadiusOffset", "PathRevolutions", "PathTaperX", "PathTaperY", "PathTwist", "PathTwistBegin", "ProfileBegin", "ProfileEnd", "ProfileCurve", "ProfileHollow", "State", "Texture", "ExtraParams"
357 FROM primshapes;
358
359DROP TABLE primshapes;
360
361alter table Tmp_primshapes rename to primshapes;
362
363ALTER TABLE primshapes ADD CONSTRAINT
364 PK__primshapes__0880433F PRIMARY KEY
365 (
366 "UUID"
367 ) ;
368
369COMMIT;
370
371
372:VERSION 6
373
374BEGIN TRANSACTION;
375
376ALTER TABLE prims ADD "PayPrice" int not null default 0;
377ALTER TABLE prims ADD "PayButton1" int not null default 0;
378ALTER TABLE prims ADD "PayButton2" int not null default 0;
379ALTER TABLE prims ADD "PayButton3" int not null default 0;
380ALTER TABLE prims ADD "PayButton4" int not null default 0;
381ALTER TABLE prims ADD "LoopedSound" varchar(36) not null default '00000000-0000-0000-0000-000000000000';
382ALTER TABLE prims ADD "LoopedSoundGain" double precision not null default 0.0;
383ALTER TABLE prims ADD "TextureAnimation" bytea;
384ALTER TABLE prims ADD "OmegaX" double precision not null default 0.0;
385ALTER TABLE prims ADD "OmegaY" double precision not null default 0.0;
386ALTER TABLE prims ADD "OmegaZ" double precision not null default 0.0;
387ALTER TABLE prims ADD "CameraEyeOffsetX" double precision not null default 0.0;
388ALTER TABLE prims ADD "CameraEyeOffsetY" double precision not null default 0.0;
389ALTER TABLE prims ADD "CameraEyeOffsetZ" double precision not null default 0.0;
390ALTER TABLE prims ADD "CameraAtOffsetX" double precision not null default 0.0;
391ALTER TABLE prims ADD "CameraAtOffsetY" double precision not null default 0.0;
392ALTER TABLE prims ADD "CameraAtOffsetZ" double precision not null default 0.0;
393ALTER TABLE prims ADD "ForceMouselook" smallint not null default 0;
394ALTER TABLE prims ADD "ScriptAccessPin" int not null default 0;
395ALTER TABLE prims ADD "AllowedDrop" smallint not null default 0;
396ALTER TABLE prims ADD "DieAtEdge" smallint not null default 0;
397ALTER TABLE prims ADD "SalePrice" int not null default 10;
398ALTER TABLE prims ADD "SaleType" smallint not null default 0;
399
400ALTER TABLE primitems add "flags" integer not null default 0;
401
402ALTER TABLE land ADD "AuthbuyerID" varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000';
403
404CREATE index prims_regionuuid on prims("RegionUUID");
405CREATE index prims_parentid on prims("ParentID");
406
407CREATE index primitems_primid on primitems("primID");
408
409COMMIT;
410
411
412:VERSION 7
413
414BEGIN TRANSACTION;
415
416ALTER TABLE prims ADD "ColorR" int not null default 0;
417ALTER TABLE prims ADD "ColorG" int not null default 0;
418ALTER TABLE prims ADD "ColorB" int not null default 0;
419ALTER TABLE prims ADD "ColorA" int not null default 0;
420ALTER TABLE prims ADD "ParticleSystem" bytea;
421ALTER TABLE prims ADD "ClickAction" smallint NOT NULL default 0;
422
423COMMIT;
424
425
426:VERSION 8
427
428BEGIN TRANSACTION;
429
430ALTER TABLE land ADD "OtherCleanTime" integer NOT NULL default 0;
431ALTER TABLE land ADD "Dwell" integer NOT NULL default 0;
432
433COMMIT;
434
435:VERSION 9
436
437BEGIN TRANSACTION;
438
439ALTER TABLE prims ADD "Material" smallint NOT NULL default 3;
440
441COMMIT;
442
443
444:VERSION 10
445
446BEGIN TRANSACTION;
447
448ALTER TABLE regionsettings ADD "sunvectorx" double precision NOT NULL default 0;
449ALTER TABLE regionsettings ADD "sunvectory" double precision NOT NULL default 0;
450ALTER TABLE regionsettings ADD "sunvectorz" double precision NOT NULL default 0;
451
452COMMIT;
453
454
455:VERSION 11
456
457BEGIN TRANSACTION;
458
459ALTER TABLE prims ADD "CollisionSound" char(36) not null default '00000000-0000-0000-0000-000000000000';
460ALTER TABLE prims ADD "CollisionSoundVolume" double precision not null default 0.0;
461
462COMMIT;
463
464
465:VERSION 12
466
467BEGIN TRANSACTION;
468
469ALTER TABLE prims ADD "LinkNumber" integer not null default 0;
470
471COMMIT;
472
473
474:VERSION 13
475
476BEGIN TRANSACTION;
477
478CREATE TABLE Tmp_prims
479 (
480 "UUID" uuid NOT NULL,
481 "RegionUUID" uuid NULL,
482 "ParentID" int NULL,
483 "CreationDate" int NULL,
484 "Name" varchar(255) NULL,
485 "SceneGroupID" uuid NULL,
486 "Text" varchar(255) NULL,
487 "Description" varchar(255) NULL,
488 "SitName" varchar(255) NULL,
489 "TouchName" varchar(255) NULL,
490 "ObjectFlags" int NULL,
491 "CreatorID" uuid NULL,
492 "OwnerID" uuid NULL,
493 "GroupID" uuid NULL,
494 "LastOwnerID" uuid NULL,
495 "OwnerMask" int NULL,
496 "NextOwnerMask" int NULL,
497 "GroupMask" int NULL,
498 "EveryoneMask" int NULL,
499 "BaseMask" int NULL,
500 "PositionX" double precision NULL,
501 "PositionY" double precision NULL,
502 "PositionZ" double precision NULL,
503 "GroupPositionX" double precision NULL,
504 "GroupPositionY" double precision NULL,
505 "GroupPositionZ" double precision NULL,
506 "VelocityX" double precision NULL,
507 "VelocityY" double precision NULL,
508 "VelocityZ" double precision NULL,
509 "AngularVelocityX" double precision NULL,
510 "AngularVelocityY" double precision NULL,
511 "AngularVelocityZ" double precision NULL,
512 "AccelerationX" double precision NULL,
513 "AccelerationY" double precision NULL,
514 "AccelerationZ" double precision NULL,
515 "RotationX" double precision NULL,
516 "RotationY" double precision NULL,
517 "RotationZ" double precision NULL,
518 "RotationW" double precision NULL,
519 "SitTargetOffsetX" double precision NULL,
520 "SitTargetOffsetY" double precision NULL,
521 "SitTargetOffsetZ" double precision NULL,
522 "SitTargetOrientW" double precision NULL,
523 "SitTargetOrientX" double precision NULL,
524 "SitTargetOrientY" double precision NULL,
525 "SitTargetOrientZ" double precision NULL,
526 "PayPrice" int NOT NULL DEFAULT ((0)),
527 "PayButton1" int NOT NULL DEFAULT ((0)),
528 "PayButton2" int NOT NULL DEFAULT ((0)),
529 "PayButton3" int NOT NULL DEFAULT ((0)),
530 "PayButton4" int NOT NULL DEFAULT ((0)),
531 "LoopedSound" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
532 "LoopedSoundGain" double precision NOT NULL DEFAULT ((0.0)),
533 "TextureAnimation" bytea NULL,
534 "OmegaX" double precision NOT NULL DEFAULT ((0.0)),
535 "OmegaY" double precision NOT NULL DEFAULT ((0.0)),
536 "OmegaZ" double precision NOT NULL DEFAULT ((0.0)),
537 "CameraEyeOffsetX" double precision NOT NULL DEFAULT ((0.0)),
538 "CameraEyeOffsetY" double precision NOT NULL DEFAULT ((0.0)),
539 "CameraEyeOffsetZ" double precision NOT NULL DEFAULT ((0.0)),
540 "CameraAtOffsetX" double precision NOT NULL DEFAULT ((0.0)),
541 "CameraAtOffsetY" double precision NOT NULL DEFAULT ((0.0)),
542 "CameraAtOffsetZ" double precision NOT NULL DEFAULT ((0.0)),
543 "ForceMouselook" smallint NOT NULL DEFAULT ((0)),
544 "ScriptAccessPin" int NOT NULL DEFAULT ((0)),
545 "AllowedDrop" smallint NOT NULL DEFAULT ((0)),
546 "DieAtEdge" smallint NOT NULL DEFAULT ((0)),
547 "SalePrice" int NOT NULL DEFAULT ((10)),
548 "SaleType" smallint NOT NULL DEFAULT ((0)),
549 "ColorR" int NOT NULL DEFAULT ((0)),
550 "ColorG" int NOT NULL DEFAULT ((0)),
551 "ColorB" int NOT NULL DEFAULT ((0)),
552 "ColorA" int NOT NULL DEFAULT ((0)),
553 "ParticleSystem" bytea NULL,
554 "ClickAction" smallint NOT NULL DEFAULT ((0)),
555 "Material" smallint NOT NULL DEFAULT ((3)),
556 "CollisionSound" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
557 "CollisionSoundVolume" double precision NOT NULL DEFAULT ((0.0)),
558 "LinkNumber" int NOT NULL DEFAULT ((0))
559 );
560
561INSERT INTO Tmp_prims ("UUID", "RegionUUID", "ParentID", "CreationDate", "Name", "SceneGroupID", "Text", "Description", "SitName", "TouchName", "ObjectFlags", "CreatorID", "OwnerID", "GroupID", "LastOwnerID", "OwnerMask", "NextOwnerMask", "GroupMask", "EveryoneMask", "BaseMask", "PositionX", "PositionY", "PositionZ", "GroupPositionX", "GroupPositionY", "GroupPositionZ", "VelocityX", "VelocityY", "VelocityZ", "AngularVelocityX", "AngularVelocityY", "AngularVelocityZ", "AccelerationX", "AccelerationY", "AccelerationZ", "RotationX", "RotationY", "RotationZ", "RotationW", "SitTargetOffsetX", "SitTargetOffsetY", "SitTargetOffsetZ", "SitTargetOrientW", "SitTargetOrientX", "SitTargetOrientY", "SitTargetOrientZ", "PayPrice", "PayButton1", "PayButton2", "PayButton3", "PayButton4", "LoopedSound", "LoopedSoundGain", "TextureAnimation", "OmegaX", "OmegaY", "OmegaZ", "CameraEyeOffsetX", "CameraEyeOffsetY", "CameraEyeOffsetZ", "CameraAtOffsetX", "CameraAtOffsetY", "CameraAtOffsetZ", "ForceMouselook", "ScriptAccessPin", "AllowedDrop", "DieAtEdge", "SalePrice", "SaleType", "ColorR", "ColorG", "ColorB", "ColorA", "ParticleSystem", "ClickAction", "Material", "CollisionSound", "CollisionSoundVolume", "LinkNumber")
562 SELECT cast("UUID" as uuid), cast("RegionUUID" as uuid), "ParentID", "CreationDate", "Name", cast("SceneGroupID" as uuid), "Text", "Description", "SitName", "TouchName", "ObjectFlags", cast("CreatorID" as uuid), cast("OwnerID" as uuid), cast("GroupID" as uuid), cast("LastOwnerID" as uuid), "OwnerMask", "NextOwnerMask", "GroupMask", "EveryoneMask", "BaseMask", "PositionX", "PositionY", "PositionZ", "GroupPositionX", "GroupPositionY", "GroupPositionZ", "VelocityX", "VelocityY", "VelocityZ", "AngularVelocityX", "AngularVelocityY", "AngularVelocityZ", "AccelerationX", "AccelerationY", "AccelerationZ", "RotationX", "RotationY", "RotationZ", "RotationW", "SitTargetOffsetX", "SitTargetOffsetY", "SitTargetOffsetZ", "SitTargetOrientW", "SitTargetOrientX", "SitTargetOrientY", "SitTargetOrientZ", "PayPrice", "PayButton1", "PayButton2", "PayButton3", "PayButton4", cast("LoopedSound" as uuid), "LoopedSoundGain", "TextureAnimation", "OmegaX", "OmegaY", "OmegaZ", "CameraEyeOffsetX", "CameraEyeOffsetY", "CameraEyeOffsetZ", "CameraAtOffsetX", "CameraAtOffsetY", "CameraAtOffsetZ", "ForceMouselook", "ScriptAccessPin", "AllowedDrop", "DieAtEdge", "SalePrice", "SaleType", "ColorR", "ColorG", "ColorB", "ColorA", "ParticleSystem", "ClickAction", "Material", cast("CollisionSound" as uuid), "CollisionSoundVolume", "LinkNumber"
563 FROM prims ;
564
565DROP TABLE prims;
566
567alter table Tmp_prims rename to prims;
568
569ALTER TABLE prims ADD CONSTRAINT
570 PK__prims__10566F31 PRIMARY KEY
571 (
572 "UUID"
573 );
574
575
576CREATE INDEX prims_regionuuid ON prims
577 (
578 "RegionUUID"
579 );
580
581CREATE INDEX prims_parentid ON prims
582 (
583 "ParentID"
584 );
585
586COMMIT;
587
588
589:VERSION 14
590
591BEGIN TRANSACTION;
592
593CREATE TABLE Tmp_primshapes
594 (
595 "UUID" uuid NOT NULL,
596 "Shape" int NULL,
597 "ScaleX" double precision NULL,
598 "ScaleY" double precision NULL,
599 "ScaleZ" double precision NULL,
600 "PCode" int NULL,
601 "PathBegin" int NULL,
602 "PathEnd" int NULL,
603 "PathScaleX" int NULL,
604 "PathScaleY" int NULL,
605 "PathShearX" int NULL,
606 "PathShearY" int NULL,
607 "PathSkew" int NULL,
608 "PathCurve" int NULL,
609 "PathRadiusOffset" int NULL,
610 "PathRevolutions" int NULL,
611 "PathTaperX" int NULL,
612 "PathTaperY" int NULL,
613 "PathTwist" int NULL,
614 "PathTwistBegin" int NULL,
615 "ProfileBegin" int NULL,
616 "ProfileEnd" int NULL,
617 "ProfileCurve" int NULL,
618 "ProfileHollow" int NULL,
619 "State" int NULL,
620 "Texture" bytea NULL,
621 "ExtraParams" bytea NULL
622 );
623
624INSERT INTO Tmp_primshapes ("UUID", "Shape", "ScaleX", "ScaleY", "ScaleZ", "PCode", "PathBegin", "PathEnd", "PathScaleX", "PathScaleY", "PathShearX", "PathShearY", "PathSkew", "PathCurve", "PathRadiusOffset", "PathRevolutions", "PathTaperX", "PathTaperY", "PathTwist", "PathTwistBegin", "ProfileBegin", "ProfileEnd", "ProfileCurve", "ProfileHollow", "State", "Texture", "ExtraParams")
625 SELECT cast("UUID" as uuid), "Shape", "ScaleX", "ScaleY", "ScaleZ", "PCode", "PathBegin", "PathEnd", "PathScaleX", "PathScaleY", "PathShearX", "PathShearY", "PathSkew", "PathCurve", "PathRadiusOffset", "PathRevolutions", "PathTaperX", "PathTaperY", "PathTwist", "PathTwistBegin", "ProfileBegin", "ProfileEnd", "ProfileCurve", "ProfileHollow", "State", "Texture", "ExtraParams"
626 FROM primshapes;
627
628DROP TABLE primshapes;
629
630alter table Tmp_primshapes rename to primshapes;
631
632ALTER TABLE primshapes ADD CONSTRAINT
633 PK__primshapes__0880433F PRIMARY KEY
634 (
635 "UUID"
636 );
637
638COMMIT;
639
640
641:VERSION 15
642
643BEGIN TRANSACTION;
644
645CREATE TABLE Tmp_primitems
646 (
647 "itemID" uuid NOT NULL,
648 "primID" uuid NULL,
649 "assetID" uuid NULL,
650 "parentFolderID" uuid NULL,
651 "invType" int NULL,
652 "assetType" int NULL,
653 "name" varchar(255) NULL,
654 "description" varchar(255) NULL,
655 "creationDate" varchar(255) NULL,
656 "creatorID" uuid NULL,
657 "ownerID" uuid NULL,
658 "lastOwnerID" uuid NULL,
659 "groupID" uuid NULL,
660 "nextPermissions" int NULL,
661 "currentPermissions" int NULL,
662 "basePermissions" int NULL,
663 "everyonePermissions" int NULL,
664 "groupPermissions" int NULL,
665 flags int NOT NULL DEFAULT ((0))
666 );
667
668INSERT INTO Tmp_primitems ("itemID", "primID", "assetID", "parentFolderID", "invType", "assetType", "name", "description", "creationDate", "creatorID", "ownerID", "lastOwnerID", "groupID", "nextPermissions", "currentPermissions", "basePermissions", "everyonePermissions", "groupPermissions", flags)
669 SELECT cast("itemID" as uuid), cast("primID" as uuid), cast("assetID" as uuid), cast("parentFolderID" as uuid), "invType", "assetType", "name", "description", "creationDate", cast("creatorID" as uuid), cast("ownerID" as uuid), cast("lastOwnerID" as uuid), cast("groupID" as uuid), "nextPermissions", "currentPermissions", "basePermissions", "everyonePermissions", "groupPermissions", flags
670 FROM primitems ;
671
672DROP TABLE primitems;
673
674alter table Tmp_primitems rename to primitems;
675
676ALTER TABLE primitems ADD CONSTRAINT
677 PK__primitems__0A688BB1 PRIMARY KEY
678 (
679 "itemID"
680 );
681
682CREATE INDEX primitems_primid ON primitems
683 (
684 "primID"
685 ) ;
686
687COMMIT;
688
689
690:VERSION 16
691
692
693BEGIN TRANSACTION;
694
695CREATE TABLE Tmp_terrain
696 (
697 "RegionUUID" uuid NULL,
698 "Revision" int NULL,
699 "Heightfield" bytea NULL
700 );
701
702INSERT INTO Tmp_terrain ("RegionUUID", "Revision", "Heightfield")
703 SELECT cast("RegionUUID" as uuid), "Revision", "Heightfield"
704 FROM terrain ;
705
706DROP TABLE terrain;
707
708alter table Tmp_terrain rename to terrain;
709
710COMMIT;
711
712
713:VERSION 17
714
715BEGIN TRANSACTION;
716
717CREATE TABLE Tmp_land
718 (
719 "UUID" uuid NOT NULL,
720 "RegionUUID" uuid NULL,
721 "LocalLandID" int NULL,
722 "Bitmap" bytea NULL,
723 "Name" varchar(255) NULL,
724 "Description" varchar(255) NULL,
725 "OwnerUUID" uuid NULL,
726 "IsGroupOwned" boolean NULL,
727 "Area" int NULL,
728 "AuctionID" int NULL,
729 "Category" int NULL,
730 "ClaimDate" int NULL,
731 "ClaimPrice" int NULL,
732 "GroupUUID" uuid NULL,
733 "SalePrice" int NULL,
734 "LandStatus" int NULL,
735 "LandFlags" int NULL,
736 "LandingType" int NULL,
737 "MediaAutoScale" int NULL,
738 "MediaTextureUUID" uuid NULL,
739 "MediaURL" varchar(255) NULL,
740 "MusicURL" varchar(255) NULL,
741 "PassHours" double precision NULL,
742 "PassPrice" int NULL,
743 "SnapshotUUID" uuid NULL,
744 "UserLocationX" double precision NULL,
745 "UserLocationY" double precision NULL,
746 "UserLocationZ" double precision NULL,
747 "UserLookAtX" double precision NULL,
748 "UserLookAtY" double precision NULL,
749 "UserLookAtZ" double precision NULL,
750 "AuthbuyerID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
751 "OtherCleanTime" int NOT NULL DEFAULT ((0)),
752 "Dwell" int NOT NULL DEFAULT ((0))
753 );
754
755INSERT INTO Tmp_land ("UUID", "RegionUUID", "LocalLandID", "Bitmap", "Name", "Description", "OwnerUUID", "IsGroupOwned", "Area", "AuctionID", "Category", "ClaimDate", "ClaimPrice", "GroupUUID", "SalePrice", "LandStatus", "LandFlags", "LandingType", "MediaAutoScale", "MediaTextureUUID", "MediaURL", "MusicURL", "PassHours", "PassPrice", "SnapshotUUID", "UserLocationX", "UserLocationY", "UserLocationZ", "UserLookAtX", "UserLookAtY", "UserLookAtZ", "AuthbuyerID", "OtherCleanTime", "Dwell")
756 SELECT cast("UUID" as uuid), cast("RegionUUID" as uuid), "LocalLandID", "Bitmap", "Name", "Description", cast("OwnerUUID" as uuid), "IsGroupOwned", "Area", "AuctionID", "Category", "ClaimDate", "ClaimPrice", cast("GroupUUID" as uuid), "SalePrice", "LandStatus", "LandFlags", "LandingType", "MediaAutoScale", cast("MediaTextureUUID" as uuid), "MediaURL", "MusicURL", "PassHours", "PassPrice", cast("SnapshotUUID" as uuid), "UserLocationX", "UserLocationY", "UserLocationZ", "UserLookAtX", "UserLookAtY", "UserLookAtZ", cast("AuthbuyerID" as uuid), "OtherCleanTime", "Dwell"
757 FROM land ;
758
759DROP TABLE land;
760
761alter table Tmp_land rename to land;
762
763ALTER TABLE land ADD CONSTRAINT
764 PK__land__65A475E71BFD2C07 PRIMARY KEY
765 (
766 "UUID"
767 );
768
769Create index on land (lower("Name"));
770
771COMMIT;
772
773
774
775:VERSION 18
776
777BEGIN TRANSACTION;
778
779CREATE TABLE Tmp_landaccesslist
780 (
781 "LandUUID" uuid NULL,
782 "AccessUUID" uuid NULL,
783 "Flags" int NULL
784 );
785
786INSERT INTO Tmp_landaccesslist ("LandUUID", "AccessUUID", "Flags")
787 SELECT cast("LandUUID" as uuid), cast("AccessUUID" as uuid), "Flags"
788 FROM landaccesslist ;
789
790DROP TABLE landaccesslist;
791
792alter table Tmp_landaccesslist rename to landaccesslist;
793
794COMMIT;
795
796
797
798:VERSION 19
799
800BEGIN TRANSACTION;
801
802CREATE TABLE Tmp_regionban
803 (
804 "regionUUID" uuid NOT NULL,
805 "bannedUUID" uuid NOT NULL,
806 "bannedIp" varchar(16) NOT NULL,
807 "bannedIpHostMask" varchar(16) NOT NULL
808 );
809
810INSERT INTO Tmp_regionban ("regionUUID", "bannedUUID", "bannedIp", "bannedIpHostMask")
811 SELECT cast("regionUUID" as uuid), cast("bannedUUID" as uuid), "bannedIp", "bannedIpHostMask"
812 FROM regionban ;
813
814DROP TABLE regionban;
815
816alter table Tmp_regionban rename to regionban;
817
818COMMIT;
819
820
821:VERSION 20
822
823BEGIN TRANSACTION;
824
825CREATE TABLE Tmp_regionsettings
826 (
827 "regionUUID" uuid NOT NULL,
828 "block_terraform" boolean NOT NULL,
829 "block_fly" boolean NOT NULL,
830 "allow_damage" boolean NOT NULL,
831 "restrict_pushing" boolean NOT NULL,
832 "allow_land_resell" boolean NOT NULL,
833 "allow_land_join_divide" boolean NOT NULL,
834 "block_show_in_search" boolean NOT NULL,
835 "agent_limit" int NOT NULL,
836 "object_bonus" double precision NOT NULL,
837 "maturity" int NOT NULL,
838 "disable_scripts" boolean NOT NULL,
839 "disable_collisions" boolean NOT NULL,
840 "disable_physics" boolean NOT NULL,
841 "terrain_texture_1" uuid NOT NULL,
842 "terrain_texture_2" uuid NOT NULL,
843 "terrain_texture_3" uuid NOT NULL,
844 "terrain_texture_4" uuid NOT NULL,
845 "elevation_1_nw" double precision NOT NULL,
846 "elevation_2_nw" double precision NOT NULL,
847 "elevation_1_ne" double precision NOT NULL,
848 "elevation_2_ne" double precision NOT NULL,
849 "elevation_1_se" double precision NOT NULL,
850 "elevation_2_se" double precision NOT NULL,
851 "elevation_1_sw" double precision NOT NULL,
852 "elevation_2_sw" double precision NOT NULL,
853 "water_height" double precision NOT NULL,
854 "terrain_raise_limit" double precision NOT NULL,
855 "terrain_lower_limit" double precision NOT NULL,
856 "use_estate_sun" boolean NOT NULL,
857 "fixed_sun" boolean NOT NULL,
858 "sun_position" double precision NOT NULL,
859 "covenant" uuid NULL DEFAULT (NULL),
860 "Sandbox" boolean NOT NULL,
861 "sunvectorx" double precision NOT NULL DEFAULT ((0)),
862 "sunvectory" double precision NOT NULL DEFAULT ((0)),
863 "sunvectorz" double precision NOT NULL DEFAULT ((0))
864 );
865
866INSERT INTO Tmp_regionsettings ("regionUUID", "block_terraform", "block_fly", "allow_damage", "restrict_pushing", "allow_land_resell", "allow_land_join_divide", "block_show_in_search", "agent_limit", "object_bonus", "maturity", "disable_scripts", "disable_collisions", "disable_physics", "terrain_texture_1", "terrain_texture_2", "terrain_texture_3", "terrain_texture_4", "elevation_1_nw", "elevation_2_nw", "elevation_1_ne", "elevation_2_ne", "elevation_1_se", "elevation_2_se", "elevation_1_sw", "elevation_2_sw", "water_height", "terrain_raise_limit", "terrain_lower_limit", "use_estate_sun", "fixed_sun", "sun_position", "covenant", "Sandbox", "sunvectorx", "sunvectory", "sunvectorz")
867 SELECT cast("regionUUID" as uuid), "block_terraform", "block_fly", "allow_damage", "restrict_pushing", "allow_land_resell", "allow_land_join_divide", "block_show_in_search", "agent_limit", "object_bonus", "maturity", "disable_scripts", "disable_collisions", "disable_physics", cast("terrain_texture_1" as uuid), cast("terrain_texture_2" as uuid), cast("terrain_texture_3" as uuid), cast("terrain_texture_4" as uuid), "elevation_1_nw", "elevation_2_nw", "elevation_1_ne", "elevation_2_ne", "elevation_1_se", "elevation_2_se", "elevation_1_sw", "elevation_2_sw", "water_height", "terrain_raise_limit", "terrain_lower_limit", "use_estate_sun", "fixed_sun", "sun_position", cast("covenant" as uuid), "Sandbox", "sunvectorx", "sunvectory", "sunvectorz"
868 FROM regionsettings ;
869
870DROP TABLE regionsettings;
871
872alter table Tmp_regionsettings rename to regionsettings;
873
874ALTER TABLE regionsettings ADD CONSTRAINT
875 PK__regionse__5B35159D21B6055D PRIMARY KEY
876 (
877 "regionUUID"
878 );
879
880COMMIT;
881
882
883:VERSION 21
884
885BEGIN TRANSACTION;
886
887ALTER TABLE prims ADD "PassTouches" boolean not null default false;
888
889COMMIT;
890
891
892:VERSION 22
893
894BEGIN TRANSACTION;
895
896ALTER TABLE regionsettings ADD "loaded_creation_date" varchar(20) ;
897ALTER TABLE regionsettings ADD "loaded_creation_time" varchar(20) ;
898ALTER TABLE regionsettings ADD "loaded_creation_id" varchar(64) ;
899
900COMMIT;
901
902:VERSION 23
903
904BEGIN TRANSACTION;
905
906ALTER TABLE regionsettings DROP COLUMN "loaded_creation_date";
907ALTER TABLE regionsettings DROP COLUMN "loaded_creation_time";
908ALTER TABLE regionsettings ADD "loaded_creation_datetime" int NOT NULL default 0;
909
910COMMIT;
911
912:VERSION 24
913
914BEGIN TRANSACTION;
915
916ALTER TABLE prims ADD "MediaURL" varchar(255);
917ALTER TABLE primshapes ADD "Media" TEXT NULL;
918
919COMMIT;
920
921:VERSION 25
922
923BEGIN TRANSACTION;
924CREATE TABLE regionwindlight (
925 "region_id" varchar(36) NOT NULL DEFAULT '000000-0000-0000-0000-000000000000' PRIMARY KEY,
926 "water_color_r" double precision NOT NULL DEFAULT '4.000000',
927 water_color_g double precision NOT NULL DEFAULT '38.000000',
928 water_color_b double precision NOT NULL DEFAULT '64.000000',
929 water_fog_density_exponent double precision NOT NULL DEFAULT '4.0',
930 underwater_fog_modifier double precision NOT NULL DEFAULT '0.25',
931 reflection_wavelet_scale_1 double precision NOT NULL DEFAULT '2.0',
932 reflection_wavelet_scale_2 double precision NOT NULL DEFAULT '2.0',
933 reflection_wavelet_scale_3 double precision NOT NULL DEFAULT '2.0',
934 fresnel_scale double precision NOT NULL DEFAULT '0.40',
935 fresnel_offset double precision NOT NULL DEFAULT '0.50',
936 refract_scale_above double precision NOT NULL DEFAULT '0.03',
937 refract_scale_below double precision NOT NULL DEFAULT '0.20',
938 blur_multiplier double precision NOT NULL DEFAULT '0.040',
939 big_wave_direction_x double precision NOT NULL DEFAULT '1.05',
940 big_wave_direction_y double precision NOT NULL DEFAULT '-0.42',
941 little_wave_direction_x double precision NOT NULL DEFAULT '1.11',
942 little_wave_direction_y double precision NOT NULL DEFAULT '-1.16',
943 normal_map_texture varchar(36) NOT NULL DEFAULT '822ded49-9a6c-f61c-cb89-6df54f42cdf4',
944 horizon_r double precision NOT NULL DEFAULT '0.25',
945 horizon_g double precision NOT NULL DEFAULT '0.25',
946 horizon_b double precision NOT NULL DEFAULT '0.32',
947 horizon_i double precision NOT NULL DEFAULT '0.32',
948 haze_horizon double precision NOT NULL DEFAULT '0.19',
949 blue_density_r double precision NOT NULL DEFAULT '0.12',
950 blue_density_g double precision NOT NULL DEFAULT '0.22',
951 blue_density_b double precision NOT NULL DEFAULT '0.38',
952 blue_density_i double precision NOT NULL DEFAULT '0.38',
953 haze_density double precision NOT NULL DEFAULT '0.70',
954 density_multiplier double precision NOT NULL DEFAULT '0.18',
955 distance_multiplier double precision NOT NULL DEFAULT '0.8',
956 max_altitude int NOT NULL DEFAULT '1605',
957 sun_moon_color_r double precision NOT NULL DEFAULT '0.24',
958 sun_moon_color_g double precision NOT NULL DEFAULT '0.26',
959 sun_moon_color_b double precision NOT NULL DEFAULT '0.30',
960 sun_moon_color_i double precision NOT NULL DEFAULT '0.30',
961 sun_moon_position double precision NOT NULL DEFAULT '0.317',
962 ambient_r double precision NOT NULL DEFAULT '0.35',
963 ambient_g double precision NOT NULL DEFAULT '0.35',
964 ambient_b double precision NOT NULL DEFAULT '0.35',
965 ambient_i double precision NOT NULL DEFAULT '0.35',
966 east_angle double precision NOT NULL DEFAULT '0.00',
967 sun_glow_focus double precision NOT NULL DEFAULT '0.10',
968 sun_glow_size double precision NOT NULL DEFAULT '1.75',
969 scene_gamma double precision NOT NULL DEFAULT '1.00',
970 star_brightness double precision NOT NULL DEFAULT '0.00',
971 cloud_color_r double precision NOT NULL DEFAULT '0.41',
972 cloud_color_g double precision NOT NULL DEFAULT '0.41',
973 cloud_color_b double precision NOT NULL DEFAULT '0.41',
974 cloud_color_i double precision NOT NULL DEFAULT '0.41',
975 cloud_x double precision NOT NULL DEFAULT '1.00',
976 cloud_y double precision NOT NULL DEFAULT '0.53',
977 cloud_density double precision NOT NULL DEFAULT '1.00',
978 cloud_coverage double precision NOT NULL DEFAULT '0.27',
979 cloud_scale double precision NOT NULL DEFAULT '0.42',
980 cloud_detail_x double precision NOT NULL DEFAULT '1.00',
981 cloud_detail_y double precision NOT NULL DEFAULT '0.53',
982 cloud_detail_density double precision NOT NULL DEFAULT '0.12',
983 cloud_scroll_x double precision NOT NULL DEFAULT '0.20',
984 cloud_scroll_x_lock smallint NOT NULL DEFAULT '0',
985 cloud_scroll_y double precision NOT NULL DEFAULT '0.01',
986 cloud_scroll_y_lock smallint NOT NULL DEFAULT '0',
987 draw_classic_clouds smallint NOT NULL DEFAULT '1'
988);
989
990COMMIT;
991
992:VERSION 26
993
994BEGIN TRANSACTION;
995
996ALTER TABLE regionsettings ADD "map_tile_ID" CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
997
998COMMIT;
999
1000:VERSION 27 #---------------------
1001
1002BEGIN TRANSACTION;
1003ALTER TABLE land ADD "MediaType" VARCHAR(32) NOT NULL DEFAULT 'none/none' ;
1004ALTER TABLE land ADD "MediaDescription" VARCHAR(255) NOT NULL DEFAULT '';
1005ALTER TABLE land ADD "MediaSize" VARCHAR(16) NOT NULL DEFAULT '0,0';
1006ALTER TABLE land ADD "MediaLoop" boolean NOT NULL DEFAULT false;
1007ALTER TABLE land ADD "ObscureMusic" boolean NOT NULL DEFAULT false;
1008ALTER TABLE land ADD "ObscureMedia" boolean NOT NULL DEFAULT false;
1009COMMIT;
1010
1011:VERSION 28 #---------------------
1012
1013BEGIN TRANSACTION;
1014
1015ALTER TABLE prims
1016alter column "CreatorID" set DEFAULT '00000000-0000-0000-0000-000000000000' ;
1017
1018ALTER TABLE prims ALTER COLUMN "CreatorID" set NOT NULL;
1019
1020ALTER TABLE primitems
1021alter column "creatorID" set DEFAULT '00000000-0000-0000-0000-000000000000' ;
1022
1023ALTER TABLE primitems ALTER COLUMN "creatorID" set NOT NULL;
1024
1025COMMIT;
1026
1027:VERSION 29 #----------------- Region Covenant changed time
1028
1029BEGIN TRANSACTION;
1030
1031ALTER TABLE regionsettings ADD "covenant_datetime" int NOT NULL default 0;
1032
1033COMMIT;
1034
1035:VERSION 30 #------------------Migrate "creatorID" storage to varchars instead of UUIDs for HG support
1036
1037BEGIN TRANSACTION;
1038
1039alter table prims rename column "CreatorID" to "CreatorIDOld";
1040alter table primitems rename column "creatorID" to "creatorIDOld";
1041
1042COMMIT;
1043
1044:VERSION 31 #---------------------
1045
1046BEGIN TRANSACTION;
1047
1048ALTER TABLE prims ADD "CreatorID" varchar(255);
1049ALTER TABLE primitems ADD "creatorID" varchar(255);
1050
1051COMMIT;
1052
1053:VERSION 32 #---------------------
1054
1055BEGIN TRANSACTION;
1056
1057UPDATE prims SET "CreatorID" = cast("CreatorIDOld" as varchar(255));
1058UPDATE primitems SET "creatorID" = cast("creatorIDOld" as varchar(255));
1059
1060COMMIT;
1061
1062:VERSION 33 #---------------------
1063
1064BEGIN TRANSACTION;
1065
1066ALTER TABLE prims alter column "CreatorID" set default '00000000-0000-0000-0000-000000000000' ;
1067
1068ALTER TABLE prims ALTER COLUMN "CreatorID" set NOT NULL;
1069
1070ALTER TABLE primitems alter column "creatorID" set DEFAULT '00000000-0000-0000-0000-000000000000' ;
1071
1072ALTER TABLE primitems ALTER COLUMN "creatorID" set NOT NULL;
1073
1074COMMIT;
1075
1076:VERSION 34 #--------------- Telehub support
1077
1078BEGIN TRANSACTION;
1079
1080CREATE TABLE spawn_points(
1081 "RegionUUID" uuid NOT NULL PRIMARY KEY,
1082 "Yaw" double precision NOT NULL,
1083 "Pitch" double precision NOT NULL,
1084 "Distance" double precision NOT NULL
1085);
1086
1087ALTER TABLE regionsettings ADD "TelehubObject" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
1088
1089COMMIT;
1090
1091:VERSION 35 #---------------- Parcels for sale
1092
1093BEGIN TRANSACTION;
1094
1095ALTER TABLE regionsettings ADD "parcel_tile_ID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
1096
1097COMMIT;
1098
1099:VERSION 36 #---------------- Timed bans/access
1100
1101BEGIN TRANSACTION;
1102
1103ALTER TABLE landaccesslist ADD "Expires" integer NOT NULL DEFAULT 0;
1104
1105COMMIT;
1106
1107:VERSION 37 #---------------- Environment Settings
1108
1109BEGIN TRANSACTION;
1110
1111CREATE TABLE regionenvironment(
1112 "region_id" uuid NOT NULL primary key,
1113 "llsd_settings" varchar NOT NULL
1114);
1115
1116COMMIT;
1117
1118:VERSION 38 #---------------- Dynamic attributes
1119
1120BEGIN TRANSACTION;
1121
1122ALTER TABLE prims ADD "DynAttrs" TEXT;
1123
1124COMMIT;
1125
1126:VERSION 39 #---------------- Extra physics params
1127
1128BEGIN TRANSACTION;
1129
1130ALTER TABLE prims ADD "PhysicsShapeType" smallint NOT NULL default '0';
1131ALTER TABLE prims ADD "Density" double precision NOT NULL default '1000';
1132ALTER TABLE prims ADD "GravityModifier" double precision NOT NULL default '1';
1133ALTER TABLE prims ADD "Friction" double precision NOT NULL default '0.6';
1134ALTER TABLE prims ADD "Restitution" double precision NOT NULL default '0.5';
1135
1136COMMIT;
1137
1138:VERSION 40 #-- regionwindlight changed type from smallint to bool
1139
1140BEGIN TRANSACTION;
1141
1142ALTER TABLE regionwindlight ALTER COLUMN cloud_scroll_x_lock DROP DEFAULT;
1143ALTER TABLE regionwindlight ALTER cloud_scroll_x_lock TYPE bool USING CASE WHEN cloud_scroll_x_lock=0 THEN FALSE ELSE TRUE END;
1144ALTER TABLE regionwindlight ALTER COLUMN cloud_scroll_x_lock SET DEFAULT FALSE;
1145
1146ALTER TABLE regionwindlight ALTER COLUMN cloud_scroll_y_lock DROP DEFAULT;
1147ALTER TABLE regionwindlight ALTER cloud_scroll_y_lock TYPE bool USING CASE WHEN cloud_scroll_y_lock=0 THEN FALSE ELSE TRUE END;
1148ALTER TABLE regionwindlight ALTER COLUMN cloud_scroll_y_lock SET DEFAULT FALSE;
1149
1150ALTER TABLE regionwindlight ALTER COLUMN draw_classic_clouds DROP DEFAULT;
1151ALTER TABLE regionwindlight ALTER draw_classic_clouds TYPE bool USING CASE WHEN draw_classic_clouds=0 THEN FALSE ELSE TRUE END;
1152ALTER TABLE regionwindlight ALTER COLUMN draw_classic_clouds SET DEFAULT FALSE;
1153
1154COMMIT;
1155
1156VERSION 41 #-- Change Landlags to bigint
1157
1158BEGIN TRANSACTION;
1159
1160ALTER TABLE land ALTER "LandFlags" TYPE bigint;
1161
1162COMMIT;
diff --git a/OpenSim/Data/PGSQL/Resources/UserAccount.migrations b/OpenSim/Data/PGSQL/Resources/UserAccount.migrations
new file mode 100644
index 0000000..c785463
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/UserAccount.migrations
@@ -0,0 +1,51 @@
1:VERSION 1
2
3CREATE TABLE UserAccounts (
4 "PrincipalID" uuid NOT NULL Primary key,
5 "ScopeID" uuid NOT NULL,
6 "FirstName" varchar(64) NOT NULL,
7 "LastName" varchar(64) NOT NULL,
8 "Email" varchar(64) NULL,
9 "ServiceURLs" text NULL,
10 "Created" int default NULL
11);
12
13
14:VERSION 2
15
16BEGIN TRANSACTION;
17
18INSERT INTO UserAccounts ("PrincipalID", "ScopeID", "FirstName", "LastName", "Email", "ServiceURLs", "Created")
19SELECT UUID AS "PrincipalID", '00000000-0000-0000-0000-000000000000' AS "ScopeID",
20username AS "FirstName",
21lastname AS "LastName",
22email as "Email", (
23'AssetServerURI=' +
24userAssetURI + ' InventoryServerURI=' + userInventoryURI + ' GatewayURI= HomeURI=') AS "ServiceURLs",
25created as "Created" FROM users;
26
27COMMIT;
28
29:VERSION 3
30
31BEGIN TRANSACTION;
32
33CREATE UNIQUE INDEX "PrincipalID" ON UserAccounts("PrincipalID");
34CREATE INDEX "Email" ON UserAccounts("Email");
35CREATE INDEX "FirstName" ON UserAccounts("FirstName");
36CREATE INDEX "LastName" ON UserAccounts("LastName");
37CREATE INDEX Name ON UserAccounts("FirstName","LastName");
38
39COMMIT;
40
41:VERSION 4
42
43BEGIN TRANSACTION;
44
45ALTER TABLE UserAccounts ADD "UserLevel" integer NOT NULL DEFAULT 0;
46ALTER TABLE UserAccounts ADD "UserFlags" integer NOT NULL DEFAULT 0;
47ALTER TABLE UserAccounts ADD "UserTitle" varchar(64) NOT NULL DEFAULT '';
48
49COMMIT;
50
51
diff --git a/OpenSim/Data/PGSQL/Resources/UserProfiles.migrations b/OpenSim/Data/PGSQL/Resources/UserProfiles.migrations
new file mode 100644
index 0000000..a6bd8ca
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/UserProfiles.migrations
@@ -0,0 +1,155 @@
1:VERSION 1 # -------------------------------
2
3begin;
4
5CREATE TABLE classifieds (
6 "classifieduuid" char(36) NOT NULL,
7 "creatoruuid" char(36) NOT NULL,
8 "creationdate" integer NOT NULL,
9 "expirationdate" integer NOT NULL,
10 "category" varchar(20) NOT NULL,
11 "name" varchar(255) NOT NULL,
12 "description" text NOT NULL,
13 "parceluuid" char(36) NOT NULL,
14 "parentestate" integer NOT NULL,
15 "snapshotuuid" char(36) NOT NULL,
16 "simname" varchar(255) NOT NULL,
17 "posglobal" varchar(255) NOT NULL,
18 "parcelname" varchar(255) NOT NULL,
19 "classifiedflags" integer NOT NULL,
20 "priceforlisting" integer NOT NULL,
21 constraint classifiedspk PRIMARY KEY ("classifieduuid")
22);
23
24
25CREATE TABLE usernotes (
26 "useruuid" varchar(36) NOT NULL,
27 "targetuuid" varchar(36) NOT NULL,
28 "notes" text NOT NULL,
29 constraint usernoteuk UNIQUE ("useruuid","targetuuid")
30);
31
32
33CREATE TABLE userpicks (
34 "pickuuid" varchar(36) NOT NULL,
35 "creatoruuid" varchar(36) NOT NULL,
36 "toppick" boolean NOT NULL,
37 "parceluuid" varchar(36) NOT NULL,
38 "name" varchar(255) NOT NULL,
39 "description" text NOT NULL,
40 "snapshotuuid" varchar(36) NOT NULL,
41 "user" varchar(255) NOT NULL,
42 "originalname" varchar(255) NOT NULL,
43 "simname" varchar(255) NOT NULL,
44 "posglobal" varchar(255) NOT NULL,
45 "sortorder" integer NOT NULL,
46 "enabled" boolean NOT NULL,
47 PRIMARY KEY ("pickuuid")
48);
49
50
51CREATE TABLE userprofile (
52 "useruuid" varchar(36) NOT NULL,
53 "profilePartner" varchar(36) NOT NULL,
54 "profileAllowPublish" bytea NOT NULL,
55 "profileMaturePublish" bytea NOT NULL,
56 "profileURL" varchar(255) NOT NULL,
57 "profileWantToMask" integer NOT NULL,
58 "profileWantToText" text NOT NULL,
59 "profileSkillsMask" integer NOT NULL,
60 "profileSkillsText" text NOT NULL,
61 "profileLanguages" text NOT NULL,
62 "profileImage" varchar(36) NOT NULL,
63 "profileAboutText" text NOT NULL,
64 "profileFirstImage" varchar(36) NOT NULL,
65 "profileFirstText" text NOT NULL,
66 PRIMARY KEY ("useruuid")
67);
68
69commit;
70
71:VERSION 2 # -------------------------------
72
73begin;
74CREATE TABLE userdata (
75 "UserId" char(36) NOT NULL,
76 "TagId" varchar(64) NOT NULL,
77 "DataKey" varchar(255),
78 "DataVal" varchar(255),
79 PRIMARY KEY ("UserId","TagId")
80);
81
82commit;
83
84:VERSION 3 # -------------------------------
85begin;
86CREATE TABLE usersettings (
87 "useruuid" char(36) NOT NULL,
88 "imviaemail" bytea NOT NULL,
89 "visible" bytea NOT NULL,
90 PRIMARY KEY ("useruuid")
91);
92commit;
93
94:VERSION 4
95
96BEGIN;
97
98-- Classifieds
99ALTER TABLE classifieds DROP CONSTRAINT classifiedspk;
100ALTER TABLE classifieds ALTER COLUMN classifieduuid SET DATA TYPE uuid using classifieduuid::uuid;
101ALTER TABLE classifieds ALTER COLUMN creatoruuid SET DATA TYPE uuid using creatoruuid::uuid;
102ALTER TABLE classifieds ALTER COLUMN parceluuid SET DATA TYPE uuid using parceluuid::uuid;
103ALTER TABLE classifieds ALTER COLUMN snapshotuuid SET DATA TYPE uuid using snapshotuuid::uuid;
104ALTER TABLE classifieds ADD CONSTRAINT classifiedspk PRIMARY KEY (classifieduuid);
105
106-- Notes
107ALTER TABLE usernotes DROP CONSTRAINT usernoteuk;
108ALTER TABLE usernotes ALTER COLUMN useruuid SET DATA TYPE uuid USING useruuid::uuid;
109ALTER TABLE usernotes ALTER COLUMN targetuuid SET DATA TYPE uuid USING targetuuid::uuid;
110ALTER TABLE usernotes ADD CONSTRAINT usernoteuk UNIQUE (useruuid,targetuuid);
111
112
113-- Userpicks
114ALTER TABLE userpicks DROP CONSTRAINT userpicks_pkey;
115ALTER TABLE userpicks ALTER COLUMN pickuuid SET DATA TYPE uuid USING pickuuid::uuid;
116ALTER TABLE userpicks ALTER COLUMN creatoruuid SET DATA TYPE uuid USING creatoruuid::uuid;
117ALTER TABLE userpicks ALTER COLUMN parceluuid SET DATA TYPE uuid USING parceluuid::uuid;
118ALTER TABLE userpicks ALTER COLUMN parceluuid SET DATA TYPE uuid USING parceluuid::uuid;
119ALTER TABLE userpicks ADD PRIMARY KEY (pickuuid);
120
121-- Userprofile
122ALTER TABLE userprofile DROP CONSTRAINT userprofile_pkey;
123ALTER TABLE userprofile ALTER COLUMN useruuid SET DATA TYPE uuid USING useruuid::uuid;
124ALTER TABLE userprofile ALTER COLUMN "profilePartner" SET DATA TYPE uuid USING "profilePartner"::uuid;
125-- Force column conversions
126ALTER TABLE userprofile ALTER COLUMN "profileAllowPublish" SET DATA TYPE boolean USING CASE WHEN false THEN false ELSE true END;
127ALTER TABLE userprofile ALTER COLUMN "profileMaturePublish" SET DATA TYPE boolean USING CASE WHEN false THEN false ELSE true END;
128ALTER TABLE userprofile ALTER COLUMN "profileImage" SET DATA TYPE uuid USING "profileImage"::uuid;
129ALTER TABLE userprofile ALTER COLUMN "profileFirstImage" SET DATA TYPE uuid USING "profileFirstImage"::uuid;
130ALTER TABLE userprofile ADD PRIMARY KEY (useruuid);
131
132-- Userdata
133ALTER TABLE userdata DROP CONSTRAINT userdata_pkey;
134ALTER TABLE userdata ALTER COLUMN "UserId" SET DATA TYPE uuid USING "UserId"::uuid;
135ALTER TABLE userdata ALTER COLUMN "UserId" SET DATA TYPE uuid USING "UserId"::uuid;
136ALTER TABLE userdata ADD PRIMARY KEY ("UserId","TagId");
137
138
139-- Usersettings
140ALTER TABLE usersettings DROP CONSTRAINT usersettings_pkey;
141ALTER TABLE usersettings ALTER COLUMN useruuid SET DATA TYPE uuid USING useruuid::uuid;
142ALTER TABLE usersettings ALTER COLUMN visible SET DATA TYPE boolean USING CASE WHEN false THEN false ELSE true END;
143ALTER TABLE usersettings ADD COLUMN email varchar(254) NOT NULL;
144ALTER TABLE usersettings ADD PRIMARY KEY (useruuid);
145
146COMMIT;
147
148
149:VERSION 5 # -------------------------------
150
151BEGIN;
152
153ALTER TABLE usersettings ALTER COLUMN imviaemail SET DATA TYPE boolean USING CASE WHEN false THEN false ELSE true END;
154
155COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/PGSQL/Resources/UserStore.migrations b/OpenSim/Data/PGSQL/Resources/UserStore.migrations
new file mode 100644
index 0000000..974d489
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/UserStore.migrations
@@ -0,0 +1,404 @@
1:VERSION 1
2
3CREATE TABLE users (
4 "UUID" varchar(36) NOT NULL default '' Primary Key,
5 "username" varchar(32) NOT NULL,
6 "lastname" varchar(32) NOT NULL,
7 "passwordHash" varchar(32) NOT NULL,
8 "passwordSalt" varchar(32) NOT NULL,
9 "homeRegion" bigint default NULL,
10 "homeLocationX" double precision default NULL,
11 "homeLocationY" double precision default NULL,
12 "homeLocationZ" double precision default NULL,
13 "homeLookAtX" double precision default NULL,
14 "homeLookAtY" double precision default NULL,
15 "homeLookAtZ" double precision default NULL,
16 "created" int NOT NULL,
17 "lastLogin" int NOT NULL,
18 "userInventoryURI" varchar(255) default NULL,
19 "userAssetURI" varchar(255) default NULL,
20 "profileCanDoMask" int default NULL,
21 "profileWantDoMask" int default NULL,
22 "profileAboutText" text,
23 "profileFirstText" text,
24 "profileImage" varchar(36) default NULL,
25 "profileFirstImage" varchar(36) default NULL,
26 "webLoginKey" varchar(36) default NULL
27);
28
29CREATE INDEX "usernames" ON users
30(
31 "username" ASC,
32 "lastname" ASC
33);
34
35
36CREATE TABLE agents (
37 "UUID" varchar(36) NOT NULL Primary Key,
38 "sessionID" varchar(36) NOT NULL,
39 "secureSessionID" varchar(36) NOT NULL,
40 "agentIP" varchar(16) NOT NULL,
41 "agentPort" int NOT NULL,
42 "agentOnline" smallint NOT NULL,
43 "loginTime" int NOT NULL,
44 "logoutTime" int NOT NULL,
45 "currentRegion" varchar(36) NOT NULL,
46 "currentHandle" bigint NOT NULL,
47 "currentPos" varchar(64) NOT NULL
48);
49
50CREATE INDEX session ON agents
51(
52 "sessionID" ASC
53);
54
55CREATE INDEX ssession ON agents
56(
57 "secureSessionID" ASC
58);
59
60
61CREATE TABLE userfriends(
62 "ownerID" varchar(50) NOT NULL,
63 "friendID" varchar(50) NOT NULL,
64 "friendPerms" varchar(50) NOT NULL,
65 "datetimestamp" varchar(50) NOT NULL
66);
67
68CREATE TABLE avatarappearance (
69 "Owner" varchar(36) NOT NULL primary key,
70 "Serial" int NOT NULL,
71 "Visual_Params" bytea NOT NULL,
72 "Texture" bytea NOT NULL,
73 "Avatar_Height" double precision NOT NULL,
74 "Body_Item" varchar(36) NOT NULL,
75 "Body_Asset" varchar(36) NOT NULL,
76 "Skin_Item" varchar(36) NOT NULL,
77 "Skin_Asset" varchar(36) NOT NULL,
78 "Hair_Item" varchar(36) NOT NULL,
79 "Hair_Asset" varchar(36) NOT NULL,
80 "Eyes_Item" varchar(36) NOT NULL,
81 "Eyes_Asset" varchar(36) NOT NULL,
82 "Shirt_Item" varchar(36) NOT NULL,
83 "Shirt_Asset" varchar(36) NOT NULL,
84 "Pants_Item" varchar(36) NOT NULL,
85 "Pants_Asset" varchar(36) NOT NULL,
86 "Shoes_Item" varchar(36) NOT NULL,
87 "Shoes_Asset" varchar(36) NOT NULL,
88 "Socks_Item" varchar(36) NOT NULL,
89 "Socks_Asset" varchar(36) NOT NULL,
90 "Jacket_Item" varchar(36) NOT NULL,
91 "Jacket_Asset" varchar(36) NOT NULL,
92 "Gloves_Item" varchar(36) NOT NULL,
93 "Gloves_Asset" varchar(36) NOT NULL,
94 "Undershirt_Item" varchar(36) NOT NULL,
95 "Undershirt_Asset" varchar(36) NOT NULL,
96 "Underpants_Item" varchar(36) NOT NULL,
97 "Underpants_Asset" varchar(36) NOT NULL,
98 "Skirt_Item" varchar(36) NOT NULL,
99 "Skirt_Asset" varchar(36) NOT NULL
100);
101
102:VERSION 2
103
104BEGIN TRANSACTION;
105
106ALTER TABLE users ADD "homeRegionID" varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000';
107ALTER TABLE users ADD "userFlags" int NOT NULL default 0;
108ALTER TABLE users ADD "godLevel" int NOT NULL default 0;
109ALTER TABLE users ADD "customType" varchar(32) not null default '';
110ALTER TABLE users ADD "partner" varchar(36) not null default '00000000-0000-0000-0000-000000000000';
111
112COMMIT;
113
114
115:VERSION 3
116
117BEGIN TRANSACTION;
118
119CREATE TABLE avatarattachments (
120 "UUID" varchar(36) NOT NULL
121 , "attachpoint" int NOT NULL
122 , item varchar(36) NOT NULL
123 , asset varchar(36) NOT NULL);
124
125CREATE INDEX IX_avatarattachments ON avatarattachments
126 (
127 "UUID"
128 );
129
130COMMIT;
131
132
133:VERSION 4
134
135BEGIN TRANSACTION;
136
137CREATE TABLE Tmp_userfriends
138 (
139 "ownerID" varchar(36) NOT NULL,
140 "friendID" varchar(36) NOT NULL,
141 "friendPerms" int NOT NULL,
142 "datetimestamp" int NOT NULL
143 );
144
145INSERT INTO Tmp_userfriends ("ownerID", "friendID", "friendPerms", "datetimestamp")
146 SELECT cast("ownerID" as varchar(36)), cast("friendID" as varchar(36)), cast("friendPerms" as int), cast("datetimestamp" as int)
147 FROM userfriends;
148
149DROP TABLE userfriends;
150
151alter table Tmp_userfriends rename to userfriends;
152
153CREATE INDEX IX_userfriends_ownerID ON userfriends
154 (
155 "ownerID"
156 );
157
158CREATE INDEX IX_userfriends_friendID ON userfriends
159 (
160 "friendID"
161 );
162
163COMMIT;
164
165
166:VERSION 5
167
168BEGIN TRANSACTION;
169
170 ALTER TABLE users add "email" varchar(250);
171
172COMMIT;
173
174
175:VERSION 6
176
177BEGIN TRANSACTION;
178
179CREATE TABLE Tmp_users
180 (
181 "UUID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
182 "username" varchar(32) NOT NULL,
183 "lastname" varchar(32) NOT NULL,
184 "passwordHash" varchar(32) NOT NULL,
185 "passwordSalt" varchar(32) NOT NULL,
186 "homeRegion" bigint NULL DEFAULT (NULL),
187 "homeLocationX" double precision NULL DEFAULT (NULL),
188 "homeLocationY" double precision NULL DEFAULT (NULL),
189 "homeLocationZ" double precision NULL DEFAULT (NULL),
190 "homeLookAtX" double precision NULL DEFAULT (NULL),
191 "homeLookAtY" double precision NULL DEFAULT (NULL),
192 "homeLookAtZ" double precision NULL DEFAULT (NULL),
193 "created" int NOT NULL,
194 "lastLogin" int NOT NULL,
195 "userInventoryURI" varchar(255) NULL DEFAULT (NULL),
196 "userAssetURI" varchar(255) NULL DEFAULT (NULL),
197 "profileCanDoMask" int NULL DEFAULT (NULL),
198 "profileWantDoMask" int NULL DEFAULT (NULL),
199 "profileAboutText" text NULL,
200 "profileFirstText" text NULL,
201 "profileImage" uuid NULL DEFAULT (NULL),
202 "profileFirstImage" uuid NULL DEFAULT (NULL),
203 "webLoginKey" uuid NULL DEFAULT (NULL),
204 "homeRegionID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
205 "userFlags" int NOT NULL DEFAULT ((0)),
206 "godLevel" int NOT NULL DEFAULT ((0)),
207 "customType" varchar(32) NOT NULL DEFAULT (''),
208 "partner" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
209 email varchar(250) NULL
210 );
211
212INSERT INTO Tmp_users ("UUID", "username", "lastname", "passwordHash", "passwordSalt", "homeRegion", "homeLocationX", "homeLocationY", "homeLocationZ", "homeLookAtX", "homeLookAtY", "homeLookAtZ", "created", "lastLogin", "userInventoryURI", "userAssetURI", "profileCanDoMask", "profileWantDoMask", "profileAboutText", "profileFirstText", "profileImage", "profileFirstImage", "webLoginKey", "homeRegionID", "userFlags", "godLevel", "customType", "partner", email)
213 SELECT cast("UUID" as uuid), "username", "lastname", "passwordHash", "passwordSalt", "homeRegion", "homeLocationX", "homeLocationY", "homeLocationZ", "homeLookAtX", "homeLookAtY", "homeLookAtZ", "created", "lastLogin", "userInventoryURI", "userAssetURI", "profileCanDoMask", "profileWantDoMask", "profileAboutText", "profileFirstText", cast("profileImage" as uuid), cast("profileFirstImage" as uuid), cast("webLoginKey" as uuid), cast("homeRegionID" as uuid), "userFlags", "godLevel", "customType", cast("partner" as uuid), email
214 FROM users ;
215
216DROP TABLE users;
217
218alter table Tmp_users rename to users;
219
220ALTER TABLE users ADD CONSTRAINT
221 PK__users__65A475E737A5467C PRIMARY KEY
222 (
223 "UUID"
224 );
225
226CREATE INDEX "usernames" ON users
227 (
228 "username",
229 "lastname"
230 );
231
232COMMIT;
233
234
235:VERSION 7
236
237BEGIN TRANSACTION;
238
239CREATE TABLE Tmp_agents
240 (
241 "UUID" uuid NOT NULL,
242 "sessionID" uuid NOT NULL,
243 "secureSessionID" uuid NOT NULL,
244 "agentIP" varchar(16) NOT NULL,
245 "agentPort" int NOT NULL,
246 "agentOnline" smallint NOT NULL,
247 "loginTime" int NOT NULL,
248 "logoutTime" int NOT NULL,
249 "currentRegion" uuid NOT NULL,
250 "currentHandle" bigint NOT NULL,
251 "currentPos" varchar(64) NOT NULL
252 );
253
254INSERT INTO Tmp_agents ("UUID", "sessionID", "secureSessionID", "agentIP", "agentPort", "agentOnline", "loginTime", "logoutTime", "currentRegion", "currentHandle", "currentPos")
255 SELECT cast("UUID" as uuid), cast("sessionID" as uuid), cast("secureSessionID" as uuid), "agentIP", "agentPort", "agentOnline", "loginTime", "logoutTime", cast("currentRegion" as uuid), "currentHandle", "currentPos"
256 FROM agents ;
257
258DROP TABLE agents;
259
260alter table Tmp_agents rename to agents;
261
262ALTER TABLE agents ADD CONSTRAINT
263 PK__agents__65A475E749C3F6B7 PRIMARY KEY
264 (
265 "UUID"
266 ) ;
267
268CREATE INDEX session ON agents
269 (
270 "sessionID"
271 );
272
273CREATE INDEX ssession ON agents
274 (
275 "secureSessionID"
276 );
277
278COMMIT;
279
280
281:VERSION 8
282
283BEGIN TRANSACTION;
284
285CREATE TABLE Tmp_userfriends
286 (
287 "ownerID" uuid NOT NULL,
288 "friendID" uuid NOT NULL,
289 "friendPerms" int NOT NULL,
290 "datetimestamp" int NOT NULL
291 );
292
293INSERT INTO Tmp_userfriends ("ownerID", "friendID", "friendPerms", "datetimestamp")
294 SELECT cast("ownerID" as uuid), cast( "friendID" as uuid), "friendPerms", "datetimestamp"
295 FROM userfriends;
296
297DROP TABLE userfriends;
298
299alter table Tmp_userfriends rename to userfriends;
300
301CREATE INDEX IX_userfriends_ownerID ON userfriends
302 (
303 "ownerID"
304 );
305
306CREATE INDEX IX_userfriends_friendID ON userfriends
307 (
308 "friendID"
309 );
310
311COMMIT;
312
313
314:VERSION 9
315
316BEGIN TRANSACTION;
317
318CREATE TABLE Tmp_avatarappearance
319 (
320 "Owner" uuid NOT NULL,
321 "Serial" int NOT NULL,
322 "Visual_Params" bytea NOT NULL,
323 "Texture" bytea NOT NULL,
324 "Avatar_Height" double precision NOT NULL,
325 "Body_Item" uuid NOT NULL,
326 "Body_Asset" uuid NOT NULL,
327 "Skin_Item" uuid NOT NULL,
328 "Skin_Asset" uuid NOT NULL,
329 "Hair_Item" uuid NOT NULL,
330 "Hair_Asset" uuid NOT NULL,
331 "Eyes_Item" uuid NOT NULL,
332 "Eyes_Asset" uuid NOT NULL,
333 "Shirt_Item" uuid NOT NULL,
334 "Shirt_Asset" uuid NOT NULL,
335 "Pants_Item" uuid NOT NULL,
336 "Pants_Asset" uuid NOT NULL,
337 "Shoes_Item" uuid NOT NULL,
338 "Shoes_Asset" uuid NOT NULL,
339 "Socks_Item" uuid NOT NULL,
340 "Socks_Asset" uuid NOT NULL,
341 "Jacket_Item" uuid NOT NULL,
342 "Jacket_Asset" uuid NOT NULL,
343 "Gloves_Item" uuid NOT NULL,
344 "Gloves_Asset" uuid NOT NULL,
345 "Undershirt_Item" uuid NOT NULL,
346 "Undershirt_Asset" uuid NOT NULL,
347 "Underpants_Item" uuid NOT NULL,
348 "Underpants_Asset" uuid NOT NULL,
349 "Skirt_Item" uuid NOT NULL,
350 "Skirt_Asset" uuid NOT NULL
351 );
352
353INSERT INTO Tmp_avatarappearance ("Owner", "Serial", "Visual_Params", "Texture", "Avatar_Height", "Body_Item", "Body_Asset", "Skin_Item", "Skin_Asset", "Hair_Item", "Hair_Asset", "Eyes_Item", "Eyes_Asset", "Shirt_Item", "Shirt_Asset", "Pants_Item", "Pants_Asset", "Shoes_Item", "Shoes_Asset", "Socks_Item", "Socks_Asset", "Jacket_Item", "Jacket_Asset", "Gloves_Item", "Gloves_Asset", "Undershirt_Item", "Undershirt_Asset", "Underpants_Item", "Underpants_Asset", "Skirt_Item", "Skirt_Asset")
354 SELECT cast("Owner" as uuid), "Serial", "Visual_Params", "Texture", "Avatar_Height", cast("Body_Item" as uuid), cast("Body_Asset" as uuid), cast("Skin_Item" as uuid), cast("Skin_Asset" as uuid), cast("Hair_Item" as uuid), cast("Hair_Asset" as uuid), cast("Eyes_Item" as uuid), cast("Eyes_Asset" as uuid), cast("Shirt_Item" as uuid), cast("Shirt_Asset" as uuid), cast("Pants_Item" as uuid), cast("Pants_Asset" as uuid), cast("Shoes_Item" as uuid), cast("Shoes_Asset" as uuid), cast("Socks_Item" as uuid), cast("Socks_Asset" as uuid), cast("Jacket_Item" as uuid), cast("Jacket_Asset" as uuid), cast("Gloves_Item" as uuid), cast("Gloves_Asset" as uuid), cast("Undershirt_Item" as uuid), cast("Undershirt_Asset" as uuid), cast("Underpants_Item" as uuid), cast("Underpants_Asset" as uuid), cast("Skirt_Item" as uuid), cast("Skirt_Asset" as uuid)
355 FROM avatarappearance ;
356
357DROP TABLE avatarappearance;
358
359alter table Tmp_avatarappearance rename to avatarappearance;
360
361ALTER TABLE avatarappearance ADD CONSTRAINT
362 PK__avatarap__7DD115CC4E88ABD4 PRIMARY KEY
363 (
364 "Owner"
365 );
366
367COMMIT;
368
369
370:VERSION 10
371
372BEGIN TRANSACTION;
373
374CREATE TABLE Tmp_avatarattachments
375 (
376 "UUID" uuid NOT NULL,
377 "attachpoint" int NOT NULL,
378 item uuid NOT NULL,
379 asset uuid NOT NULL
380 );
381
382INSERT INTO Tmp_avatarattachments ("UUID", "attachpoint", item, asset)
383 SELECT cast("UUID" as uuid), "attachpoint", cast(item as uuid), cast(asset as uuid)
384 FROM avatarattachments ;
385
386DROP TABLE avatarattachments;
387
388alter table Tmp_avatarattachments rename to avatarattachments;
389
390CREATE INDEX IX_avatarattachments ON avatarattachments
391 (
392 "UUID"
393 );
394
395COMMIT;
396
397
398:VERSION 11
399
400BEGIN TRANSACTION;
401
402ALTER TABLE users ADD "scopeID" uuid not null default '00000000-0000-0000-0000-000000000000';
403
404COMMIT;
diff --git a/OpenSim/Data/PGSQL/Resources/XAssetStore.migrations b/OpenSim/Data/PGSQL/Resources/XAssetStore.migrations
new file mode 100644
index 0000000..df9d821
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/XAssetStore.migrations
@@ -0,0 +1,80 @@
1# -----------------
2:VERSION 1
3
4BEGIN;
5
6CREATE TABLE XAssetsMeta (
7 "ID" char(36) NOT NULL,
8 "Hash" char(32) NOT NULL,
9 "Name" varchar(64) NOT NULL,
10 "Description" varchar(64) NOT NULL,
11 "AssetType" smallint NOT NULL,
12 "Local" smallint NOT NULL,
13 "Temporary" smallint NOT NULL,
14 "CreateTime" integer NOT NULL,
15 "AccessTime" integer NOT NULL,
16 "AssetFlags" integer NOT NULL,
17 "CreatorID" varchar(128) NOT NULL,
18 PRIMARY KEY ("ID")
19);
20
21CREATE TABLE XAssetsData (
22 "Hash" char(32) NOT NULL,
23 "Data" bytea NOT NULL,
24 PRIMARY KEY ("Hash")
25);
26
27COMMIT;
28
29
30:VERSION 2
31
32BEGIN;
33
34ALTER TABLE xassetsmeta ALTER COLUMN "Local" SET DATA TYPE boolean USING CASE WHEN '0' THEN FALSE ELSE TRUE END;
35ALTER TABLE xassetsmeta ALTER COLUMN "Temporary" SET DATA TYPE boolean USING CASE WHEN '0' THEN FALSE ELSE TRUE END;
36ALTER TABLE xassetsmeta ALTER COLUMN "Hash" SET DATA TYPE char(66);
37ALTER TABLE xassetsdata ALTER COLUMN "Hash" SET DATA TYPE char(66);
38
39COMMIT;
40
41:VERSION 3
42
43BEGIN;
44
45ALTER TABLE xassetsmeta RENAME COLUMN "ID" TO id;
46ALTER TABLE xassetsmeta RENAME COLUMN "Hash" TO hash;
47ALTER TABLE xassetsmeta RENAME COLUMN "Name" TO name;
48ALTER TABLE xassetsmeta RENAME COLUMN "Description" TO description;
49ALTER TABLE xassetsmeta RENAME COLUMN "Local" to local;
50ALTER TABLE xassetsmeta RENAME COLUMN "Temporary" TO temporary;
51ALTER TABLE xassetsmeta RENAME COLUMN "CreateTime" TO create_time;
52ALTER TABLE xassetsmeta RENAME COLUMN "AccessTime" TO access_time;
53ALTER TABLE xassetsmeta RENAME COLUMN "AssetFlags" TO asset_flags;
54ALTER TABLE xassetsmeta RENAME COLUMN "CreatorID" TO creatorid;
55ALTER TABLE xassetsmeta DROP CONSTRAINT xassetsmeta_pkey;
56ALTER TABLE xassetsmeta ADD PRIMARY KEY (id);
57
58
59ALTER TABLE xassetsdata RENAME COLUMN "Hash" TO hash;
60ALTER TABLE xassetsdata RENAME COLUMN "Data" TO data;
61ALTER TABLE xassetsdata DROP CONSTRAINT xassetsdata_pkey;
62ALTER TABLE xassetsdata ADD PRIMARY KEY (hash);
63
64COMMIT;
65
66
67:VERSION 4
68
69BEGIN;
70
71ALTER TABLE xassetsmeta ALTER COLUMN id SET DATA TYPE uuid USING id::uuid;
72ALTER TABLE xassetsmeta ALTER COLUMN hash SET DATA TYPE bytea USING hash::bytea;
73ALTER TABLE xassetsdata ALTER COLUMN hash SET DATA TYPE bytea USING hash::bytea;
74
75COMMIT;
76
77:VERSION 5
78
79BEGIN;
80COMMIT;
diff --git a/OpenSim/Data/PGSQL/Resources/os_groups_Store.migrations b/OpenSim/Data/PGSQL/Resources/os_groups_Store.migrations
new file mode 100644
index 0000000..74b07c3
--- /dev/null
+++ b/OpenSim/Data/PGSQL/Resources/os_groups_Store.migrations
@@ -0,0 +1,211 @@
1:VERSION 1 # --------------------------
2
3BEGIN;
4
5CREATE TABLE os_groups_groups (
6 "GroupID" char(36) Primary Key NOT NULL default '',
7 "Location" varchar(255) NOT NULL default '',
8 "Name" varchar(255) NOT NULL default '',
9 "Charter" text NOT NULL,
10 "InsigniaID" char(36) NOT NULL default '',
11 "FounderID" char(36) NOT NULL default '',
12 "MembershipFee" integer NOT NULL default '0',
13 "OpenEnrollment" varchar(255) NOT NULL default '',
14 "ShowInList" integer NOT NULL default '0',
15 "AllowPublish" integer NOT NULL default '0',
16 "MaturePublish" integer NOT NULL default '0',
17 "OwnerRoleID" char(36) NOT NULL default ''
18);
19
20
21CREATE TABLE os_groups_membership (
22 "GroupID"char(36) NOT NULL default '',
23 "PrincipalID" VARCHAR(255) NOT NULL default '',
24 "SelectedRoleID" char(36) NOT NULL default '',
25 "Contribution" integer NOT NULL default '0',
26 "ListInProfile" integer NOT NULL default '1',
27 "AcceptNotices" integer NOT NULL default '1',
28 "AccessToken" char(36) NOT NULL default '',
29 constraint os_groupmemberpk primary key ("GroupID", "PrincipalID")
30);
31
32
33
34CREATE TABLE os_groups_roles (
35 "GroupID" char(36) NOT NULL default '',
36 "RoleID" char(36) NOT NULL default '',
37 "Name" varchar(255) NOT NULL default '',
38 "Description" varchar(255) NOT NULL default '',
39 "Title" varchar(255) NOT NULL default '',
40 "Powers" bigint NOT NULL default 0,
41 constraint os_grouprolepk PRIMARY KEY ("GroupID","RoleID")
42);
43
44
45CREATE TABLE os_groups_rolemembership (
46 "GroupID" char(36) NOT NULL default '',
47 "RoleID" char(36) NOT NULL default '',
48 "PrincipalID" VARCHAR(255) NOT NULL default '',
49 constraint os_grouprolememberpk PRIMARY KEY ("GroupID","RoleID","PrincipalID")
50);
51
52
53CREATE TABLE os_groups_invites (
54 "InviteID" char(36) NOT NULL default '',
55 "GroupID" char(36) NOT NULL default '',
56 "RoleID" char(36) NOT NULL default '',
57 "PrincipalID" VARCHAR(255) NOT NULL default '',
58 "TMStamp" timestamp NOT NULL default now(),
59 constraint os_groupinvitespk PRIMARY KEY ("InviteID")
60);
61-- UNIQUE KEY "PrincipalGroup" ("GroupID","PrincipalID")
62
63
64CREATE TABLE os_groups_notices (
65 "GroupID" char(36) NOT NULL default '',
66 "NoticeID" char(36) NOT NULL default '',
67 "TMStamp" integer NOT NULL default '0',
68 "FromName" varchar(255) NOT NULL default '',
69 "Subject" varchar(255) NOT NULL default '',
70 "Message" text NOT NULL,
71 "HasAttachment" integer NOT NULL default '0',
72 "AttachmentType" integer NOT NULL default '0',
73 "AttachmentName" varchar(128) NOT NULL default '',
74 "AttachmentItemID" char(36) NOT NULL default '',
75 "AttachmentOwnerID" varchar(255) NOT NULL default '',
76 constraint os_groupsnoticespk PRIMARY KEY ("NoticeID")
77);
78-- KEY "GroupID" ("GroupID"),
79-- KEY "TMStamp" ("TMStamp")
80
81CREATE TABLE os_groups_principals (
82 "PrincipalID" VARCHAR(255) NOT NULL default '',
83 "ActiveGroupID" char(36) NOT NULL default '',
84 constraint os_groupprincpk PRIMARY KEY ("PrincipalID")
85);
86
87COMMIT;
88
89:VERSION 2 # --------------------------
90
91BEGIN;
92
93
94COMMIT;
95
96
97
98:VERSION 3
99
100BEGIN;
101
102-- Not a pretty way to do this, but it did not work as-is
103-- and nothing was found about converting between existing data
104-- and the new type.
105-- Since there should be nothing to preserve ...
106
107DROP TABLE IF EXISTS os_groups_groups CASCADE;
108
109CREATE TABLE os_groups_groups (
110 "GroupID" uuid PRIMARY KEY NOT NULL,
111 "Location" varchar(255) NOT NULL DEFAULT '',
112 "Name" varchar(255) NOT NULL DEFAULT '',
113 "Charter" text NOT NULL,
114 "InsigniaID" uuid NOT NULL,
115 "FounderID" uuid NOT NULL,
116 "MembershipFee" integer NOT NULL DEFAULT '0',
117 "OpenEnrollment" varchar(255) NOT NULL DEFAULT '',
118 "ShowInList" integer NOT NULL DEFAULT '0',
119 "AllowPublish" integer NOT NULL DEFAULT '0',
120 "MaturePublish" integer NOT NULL DEFAULT '0',
121 "OwnerRoleID" uuid NOT NULL
122);
123
124
125DROP TABLE IF EXISTS os_groups_membership;
126
127CREATE TABLE os_groups_membership (
128 "GroupID"uuid NOT NULL,
129 "PrincipalID" VARCHAR(255) NOT NULL DEFAULT '',
130 "SelectedRoleID" uuid NOT NULL,
131 "Contribution" integer NOT NULL DEFAULT '0',
132 "ListInProfile" integer NOT NULL DEFAULT '1',
133 "AcceptNotices" integer NOT NULL DEFAULT '1',
134 "AccessToken" uuid NOT NULL,
135 constraint os_groupmemberpk PRIMARY KEY ("GroupID", "PrincipalID")
136);
137
138
139
140DROP TABLE IF EXISTS os_groups_roles;
141
142CREATE TABLE os_groups_roles (
143 "GroupID" uuid NOT NULL,
144 "RoleID" uuid NOT NULL,
145 "Name" varchar(255) NOT NULL DEFAULT '',
146 "Description" varchar(255) NOT NULL DEFAULT '',
147 "Title" varchar(255) NOT NULL DEFAULT '',
148 "Powers" varchar(36) NOT NULL DEFAULT '',
149 constraint os_grouprolepk PRIMARY KEY ("GroupID","RoleID")
150);
151
152
153DROP TABLE IF EXISTS os_groups_rolemembership;
154
155CREATE TABLE os_groups_rolemembership (
156 "GroupID" uuid NOT NULL,
157 "RoleID" uuid NOT NULL,
158 "PrincipalID" VARCHAR(255) NOT NULL DEFAULT '',
159 constraint os_grouprolememberpk PRIMARY KEY ("GroupID","RoleID","PrincipalID")
160);
161
162
163DROP TABLE IF EXISTS os_groups_invites;
164
165CREATE TABLE os_groups_invites (
166 "InviteID" uuid NOT NULL,
167 "GroupID" uuid NOT NULL,
168 "RoleID" uuid NOT NULL,
169 "PrincipalID" VARCHAR(255) NOT NULL DEFAULT '',
170 "TMStamp" timestamp NOT NULL DEFAULT now(),
171 constraint os_groupinvitespk PRIMARY KEY ("InviteID")
172);
173
174
175DROP TABLE IF EXISTS os_groups_notices;
176
177CREATE TABLE os_groups_notices (
178 "GroupID" uuid NOT NULL,
179 "NoticeID" uuid NOT NULL,
180 "TMStamp" integer NOT NULL DEFAULT '0',
181 "FromName" varchar(255) NOT NULL DEFAULT '',
182 "Subject" varchar(255) NOT NULL DEFAULT '',
183 "Message" text NOT NULL,
184 "HasAttachment" integer NOT NULL DEFAULT '0',
185 "AttachmentType" integer NOT NULL DEFAULT '0',
186 "AttachmentName" varchar(128) NOT NULL DEFAULT '',
187 "AttachmentItemID" uuid NOT NULL,
188 "AttachmentOwnerID" varchar(255) NOT NULL DEFAULT '',
189 constraint os_groupsnoticespk PRIMARY KEY ("NoticeID")
190);
191
192
193DROP TABLE IF EXISTS os_groups_principals;
194
195CREATE TABLE os_groups_principals (
196 "PrincipalID" VARCHAR(255) NOT NULL DEFAULT '',
197 "ActiveGroupID" uuid NOT NULL,
198 constraint os_groupprincpk PRIMARY KEY ("PrincipalID")
199);
200
201COMMIT;
202
203:VERSION 4
204
205BEGIN;
206
207ALTER TABLE IF EXISTS os_groups_notices
208 ALTER COLUMN "AttachmentItemID" SET DEFAULT '00000000-0000-0000-0000-000000000000'
209;
210
211COMMIT;