diff options
Diffstat (limited to '')
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 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Data; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using Npgsql; | ||
35 | |||
36 | namespace 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 | ||
28 | using System; | 28 | using System; |
29 | using System.Data; | 29 | using System.Data; |
30 | using System.Data.SqlClient; | ||
31 | using System.Reflection; | 30 | using System.Reflection; |
32 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
33 | using OpenMetaverse; | 32 | using OpenMetaverse; |
34 | using log4net; | 33 | using log4net; |
35 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using Npgsql; | ||
36 | using NpgsqlTypes; | ||
36 | 37 | ||
37 | namespace OpenSim.Data.MSSQL | 38 | namespace 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 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Data; | ||
32 | using OpenMetaverse; | 31 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
34 | using System.Data.SqlClient; | ||
35 | using System.Reflection; | 33 | using System.Reflection; |
36 | using System.Text; | 34 | using System.Text; |
35 | using System.Data; | ||
36 | using Npgsql; | ||
37 | using NpgsqlTypes; | ||
37 | 38 | ||
38 | namespace OpenSim.Data.MSSQL | 39 | namespace 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 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Data; | ||
31 | using System.Reflection; | 30 | using System.Reflection; |
32 | using System.Threading; | 31 | using System.Threading; |
33 | using log4net; | 32 | using log4net; |
34 | using OpenMetaverse; | 33 | using OpenMetaverse; |
35 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
36 | using System.Data.SqlClient; | 35 | using Npgsql; |
36 | using NpgsqlTypes; | ||
37 | 37 | ||
38 | namespace OpenSim.Data.MSSQL | 38 | |
39 | namespace 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 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Data; | ||
31 | using System.Data.SqlClient; | ||
32 | using System.Reflection; | 30 | using System.Reflection; |
33 | using log4net; | 31 | using log4net; |
34 | using OpenMetaverse; | 32 | using OpenMetaverse; |
35 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
36 | using OpenSim.Region.Framework.Interfaces; | 34 | using OpenSim.Region.Framework.Interfaces; |
35 | using System.Data; | ||
36 | using Npgsql; | ||
37 | using NpgsqlTypes; | ||
37 | 38 | ||
38 | namespace OpenSim.Data.MSSQL | 39 | namespace 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 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Data; | ||
32 | using System.Reflection; | ||
33 | using OpenMetaverse; | ||
34 | using OpenSim.Framework; | ||
35 | using Npgsql; | ||
36 | |||
37 | namespace 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; | |||
31 | using System.Data; | 31 | using System.Data; |
32 | using OpenMetaverse; | 32 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using System.Data.SqlClient; | ||
35 | using System.Reflection; | 34 | using System.Reflection; |
36 | using System.Text; | 35 | using System.Text; |
36 | using Npgsql; | ||
37 | 37 | ||
38 | namespace OpenSim.Data.MSSQL | 38 | namespace 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; | |||
30 | using System.Data; | 30 | using System.Data; |
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | using log4net; | 32 | using log4net; |
33 | using System.Data.SqlClient; | ||
34 | using OpenMetaverse; | 33 | using OpenMetaverse; |
35 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
36 | using OpenSim.Region.Framework.Interfaces; | 35 | using OpenSim.Region.Framework.Interfaces; |
37 | using System.Text; | 36 | using System.Text; |
37 | using Npgsql; | ||
38 | 38 | ||
39 | namespace OpenSim.Data.MSSQL | 39 | namespace 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; | |||
33 | using log4net; | 33 | using log4net; |
34 | using OpenMetaverse; | 34 | using OpenMetaverse; |
35 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
36 | using System.Data.SqlClient; | ||
37 | 36 | ||
38 | namespace OpenSim.Data.MSSQL | 37 | namespace 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 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Reflection; | ||
32 | using OpenSim.Framework; | ||
33 | using OpenMetaverse; | ||
34 | using log4net; | ||
35 | using Npgsql; | ||
36 | |||
37 | namespace 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 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Data; | ||
31 | using System.Reflection; | ||
32 | using System.Threading; | ||
33 | using log4net; | ||
34 | using OpenMetaverse; | ||
35 | using OpenSim.Framework; | ||
36 | using Npgsql; | ||
37 | |||
38 | namespace 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 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Data; | 30 | using System.Data; |
31 | using System.Data.SqlClient; | ||
32 | using System.Reflection; | 31 | using System.Reflection; |
33 | using log4net; | 32 | using log4net; |
34 | using OpenMetaverse; | 33 | using OpenMetaverse; |
35 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using Npgsql; | ||
36 | 36 | ||
37 | namespace OpenSim.Data.MSSQL | 37 | namespace 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 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Data; | 30 | using System.Data; |
31 | using System.Data.SqlClient; | ||
32 | using System.IO; | 31 | using System.IO; |
33 | using System.Reflection; | 32 | using System.Reflection; |
33 | using OpenSim.Framework; | ||
34 | using log4net; | 34 | using log4net; |
35 | using OpenMetaverse; | 35 | using OpenMetaverse; |
36 | using Npgsql; | ||
37 | using NpgsqlTypes; | ||
36 | 38 | ||
37 | namespace OpenSim.Data.MSSQL | 39 | namespace 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 | ||
28 | using Npgsql; | ||
28 | using System; | 29 | using System; |
29 | using System.Data; | 30 | using System.Data; |
30 | using System.Data.Common; | 31 | using System.Data.Common; |
31 | using System.Reflection; | 32 | using System.Reflection; |
32 | using System.Data.SqlClient; | ||
33 | 33 | ||
34 | namespace OpenSim.Data.MSSQL | 34 | namespace 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 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Reflection; | ||
32 | using OpenSim.Framework; | ||
33 | using OpenMetaverse; | ||
34 | using Npgsql; | ||
35 | |||
36 | namespace 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; | |||
33 | using log4net; | 33 | using log4net; |
34 | using OpenMetaverse; | 34 | using OpenMetaverse; |
35 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
36 | using System.Data.SqlClient; | 36 | using Npgsql; |
37 | 37 | ||
38 | namespace OpenSim.Data.MSSQL | 38 | namespace 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 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Data; | 30 | using System.Data; |
31 | using System.Data.SqlClient; | ||
32 | using System.Drawing; | 31 | using System.Drawing; |
33 | using System.IO; | 32 | using System.IO; |
34 | using System.Reflection; | 33 | using System.Reflection; |
@@ -38,45 +37,80 @@ using OpenSim.Framework; | |||
38 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
40 | using RegionFlags = OpenSim.Framework.RegionFlags; | 39 | using RegionFlags = OpenSim.Framework.RegionFlags; |
40 | using Npgsql; | ||
41 | 41 | ||
42 | namespace OpenSim.Data.MSSQL | 42 | namespace 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 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using System.Data; | 30 | using System.Data; |
31 | using System.Data.SqlClient; | ||
32 | using System.Drawing; | 31 | using System.Drawing; |
33 | using System.IO; | 32 | using System.IO; |
34 | using System.Reflection; | 33 | using System.Reflection; |
@@ -37,15 +36,17 @@ using OpenMetaverse; | |||
37 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
38 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
39 | using Npgsql; | ||
40 | 40 | ||
41 | namespace OpenSim.Data.MSSQL | 41 | namespace 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 = @" |
333 | IF 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 ; |
357 | ELSE | 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 = @" |
404 | IF 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 | |
415 | ELSE | ||
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"", |
667 | VALUES | 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 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Data; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Framework; | ||
34 | using System.Text; | ||
35 | using Npgsql; | ||
36 | using log4net; | ||
37 | using System.Reflection; | ||
38 | |||
39 | namespace 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 | |||
28 | using System; | ||
29 | using System.Data; | ||
30 | using System.Reflection; | ||
31 | using OpenSim.Data; | ||
32 | using OpenSim.Framework; | ||
33 | using OpenMetaverse; | ||
34 | using OpenMetaverse.StructuredData; | ||
35 | using log4net; | ||
36 | using Npgsql; | ||
37 | |||
38 | namespace 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 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Data; | ||
31 | using System.IO; | ||
32 | using System.IO.Compression; | ||
33 | using System.Reflection; | ||
34 | using System.Security.Cryptography; | ||
35 | using System.Text; | ||
36 | using log4net; | ||
37 | using OpenMetaverse; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Data; | ||
40 | using Npgsql; | ||
41 | |||
42 | namespace 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; | |||
31 | using System.Data; | 31 | using System.Data; |
32 | using OpenMetaverse; | 32 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using System.Data.SqlClient; | ||
35 | using System.Reflection; | 34 | using System.Reflection; |
36 | using System.Text; | 35 | using System.Text; |
37 | using log4net; | 36 | using log4net; |
37 | using Npgsql; | ||
38 | using NpgsqlTypes; | ||
38 | 39 | ||
39 | namespace OpenSim.Data.MSSQL | 40 | namespace 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 | |||
3 | CREATE 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 | |||
15 | BEGIN TRANSACTION; | ||
16 | |||
17 | CREATE 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 | |||
28 | INSERT 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 | |||
32 | DROP TABLE assets; | ||
33 | |||
34 | Alter table Tmp_assets | ||
35 | rename to assets; | ||
36 | |||
37 | ALTER TABLE assets ADD PRIMARY KEY ("id"); | ||
38 | |||
39 | COMMIT; | ||
40 | |||
41 | |||
42 | :VERSION 3 | ||
43 | |||
44 | BEGIN TRANSACTION; | ||
45 | |||
46 | ALTER TABLE assets add "create_time" integer default 0; | ||
47 | ALTER TABLE assets add "access_time" integer default 0; | ||
48 | |||
49 | COMMIT; | ||
50 | |||
51 | |||
52 | :VERSION 4 | ||
53 | |||
54 | BEGIN TRANSACTION; | ||
55 | |||
56 | CREATE 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 | |||
70 | INSERT 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 | |||
74 | DROP TABLE assets; | ||
75 | |||
76 | Alter table Tmp_assets | ||
77 | rename to assets; | ||
78 | |||
79 | ALTER TABLE assets ADD PRIMARY KEY ("id"); | ||
80 | |||
81 | COMMIT; | ||
82 | |||
83 | |||
84 | :VERSION 5 | ||
85 | |||
86 | DELETE FROM assets WHERE "id" = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621'; | ||
87 | |||
88 | :VERSION 6 | ||
89 | |||
90 | ALTER TABLE assets ADD "asset_flags" INTEGER NOT NULL DEFAULT 0; | ||
91 | |||
92 | :VERSION 7 | ||
93 | |||
94 | alter table assets add "creatorid" varchar(36) not null default ''; | ||
95 | |||
96 | :VERSION 8 | ||
97 | |||
98 | BEGIN TRANSACTION; | ||
99 | COMMIT; | ||
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 | |||
3 | BEGIN TRANSACTION; | ||
4 | |||
5 | CREATE 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 | |||
13 | CREATE 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 | |||
19 | COMMIT; | ||
20 | |||
21 | :VERSION 2 | ||
22 | |||
23 | BEGIN 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 | |||
31 | COMMIT; | ||
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 | |||
3 | BEGIN TRANSACTION; | ||
4 | |||
5 | CREATE 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 | |||
12 | COMMIT; | ||
13 | |||
14 | :VERSION 2 | ||
15 | |||
16 | BEGIN TRANSACTION; | ||
17 | |||
18 | CREATE 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 | |||
29 | DROP TABLE Avatars; | ||
30 | |||
31 | Alter table Tmp_Avatars | ||
32 | rename to Avatars; | ||
33 | |||
34 | COMMIT; | ||
35 | |||
36 | :VERSION 3 | ||
37 | |||
38 | BEGIN TRANSACTION; | ||
39 | |||
40 | CREATE TABLE Tmp_Avatars | ||
41 | ( | ||
42 | "PrincipalID" uuid NOT NULL, | ||
43 | "Name" varchar(32) NOT NULL, | ||
44 | "Value" text NOT NULL DEFAULT '' | ||
45 | ); | ||
46 | |||
47 | ALTER TABLE Tmp_Avatars ADD PRIMARY KEY ("PrincipalID", "Name"); | ||
48 | |||
49 | |||
50 | INSERT INTO Tmp_Avatars ("PrincipalID", "Name", "Value") | ||
51 | SELECT "PrincipalID", "Name", cast("Value" as text) FROM Avatars ; | ||
52 | |||
53 | DROP TABLE Avatars; | ||
54 | |||
55 | Alter table Tmp_Avatars | ||
56 | rename to Avatars; | ||
57 | |||
58 | COMMIT; | ||
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 | |||
3 | BEGIN TRANSACTION; | ||
4 | |||
5 | CREATE TABLE estate_managers( | ||
6 | "EstateID" int NOT NULL Primary Key, | ||
7 | uuid varchar(36) NOT NULL | ||
8 | ); | ||
9 | |||
10 | CREATE TABLE estate_groups( | ||
11 | "EstateID" int NOT NULL, | ||
12 | uuid varchar(36) NOT NULL | ||
13 | ); | ||
14 | |||
15 | |||
16 | CREATE TABLE estate_users( | ||
17 | "EstateID" int NOT NULL, | ||
18 | uuid varchar(36) NOT NULL | ||
19 | ); | ||
20 | |||
21 | |||
22 | CREATE 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 | |||
30 | Create Sequence estate_settings_id increment by 100 start with 100; | ||
31 | |||
32 | CREATE 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 | |||
60 | CREATE TABLE estate_map( | ||
61 | "RegionID" varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), | ||
62 | "EstateID" int NOT NULL | ||
63 | ); | ||
64 | |||
65 | COMMIT; | ||
66 | |||
67 | :VERSION 2 | ||
68 | |||
69 | BEGIN TRANSACTION; | ||
70 | |||
71 | CREATE INDEX IX_estate_managers ON estate_managers | ||
72 | ( | ||
73 | "EstateID" | ||
74 | ); | ||
75 | |||
76 | |||
77 | CREATE INDEX IX_estate_groups ON estate_groups | ||
78 | ( | ||
79 | "EstateID" | ||
80 | ); | ||
81 | |||
82 | |||
83 | CREATE INDEX IX_estate_users ON estate_users | ||
84 | ( | ||
85 | "EstateID" | ||
86 | ); | ||
87 | |||
88 | COMMIT; | ||
89 | |||
90 | :VERSION 3 | ||
91 | |||
92 | BEGIN TRANSACTION; | ||
93 | |||
94 | CREATE 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 | |||
106 | DROP TABLE estateban; | ||
107 | |||
108 | Alter table Tmp_estateban | ||
109 | rename to estateban; | ||
110 | |||
111 | CREATE INDEX IX_estateban ON estateban | ||
112 | ( | ||
113 | "EstateID" | ||
114 | ); | ||
115 | |||
116 | COMMIT; | ||
117 | |||
118 | |||
119 | :VERSION 4 | ||
120 | |||
121 | BEGIN TRANSACTION; | ||
122 | |||
123 | CREATE TABLE Tmp_estate_managers | ||
124 | ( | ||
125 | "EstateID" int NOT NULL, | ||
126 | uuid uuid NOT NULL | ||
127 | ); | ||
128 | |||
129 | INSERT INTO Tmp_estate_managers ("EstateID", uuid) | ||
130 | SELECT "EstateID", cast(uuid as uuid) FROM estate_managers; | ||
131 | |||
132 | DROP TABLE estate_managers; | ||
133 | |||
134 | Alter table Tmp_estate_managers | ||
135 | rename to estate_managers; | ||
136 | |||
137 | CREATE INDEX IX_estate_managers ON estate_managers | ||
138 | ( | ||
139 | "EstateID" | ||
140 | ); | ||
141 | |||
142 | COMMIT; | ||
143 | |||
144 | |||
145 | :VERSION 5 | ||
146 | |||
147 | BEGIN TRANSACTION; | ||
148 | |||
149 | CREATE 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 | |||
158 | DROP TABLE estate_groups; | ||
159 | |||
160 | Alter table Tmp_estate_groups | ||
161 | rename to estate_groups; | ||
162 | |||
163 | CREATE INDEX IX_estate_groups ON estate_groups | ||
164 | ( | ||
165 | "EstateID" | ||
166 | ); | ||
167 | |||
168 | COMMIT; | ||
169 | |||
170 | |||
171 | :VERSION 6 | ||
172 | |||
173 | BEGIN TRANSACTION; | ||
174 | |||
175 | CREATE TABLE Tmp_estate_users | ||
176 | ( | ||
177 | "EstateID" int NOT NULL, | ||
178 | uuid uuid NOT NULL | ||
179 | ); | ||
180 | |||
181 | INSERT INTO Tmp_estate_users ("EstateID", uuid) | ||
182 | SELECT "EstateID", cast(uuid as uuid) FROM estate_users ; | ||
183 | |||
184 | DROP TABLE estate_users; | ||
185 | |||
186 | Alter table Tmp_estate_users | ||
187 | rename to estate_users; | ||
188 | |||
189 | CREATE INDEX IX_estate_users ON estate_users | ||
190 | ( | ||
191 | "EstateID" | ||
192 | ); | ||
193 | |||
194 | COMMIT; | ||
195 | |||
196 | |||
197 | :VERSION 7 | ||
198 | |||
199 | BEGIN TRANSACTION; | ||
200 | |||
201 | CREATE 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 | |||
210 | INSERT INTO Tmp_estateban ("EstateID", "bannedUUID", "bannedIp", "bannedIpHostMask", "bannedNameMask") | ||
211 | SELECT "EstateID", cast("bannedUUID" as uuid), "bannedIp", "bannedIpHostMask", "bannedNameMask" FROM estateban ; | ||
212 | |||
213 | DROP TABLE estateban; | ||
214 | |||
215 | Alter table Tmp_estateban | ||
216 | rename to estateban; | ||
217 | |||
218 | CREATE INDEX IX_estateban ON estateban | ||
219 | ( | ||
220 | "EstateID" | ||
221 | ); | ||
222 | |||
223 | COMMIT; | ||
224 | |||
225 | |||
226 | :VERSION 8 | ||
227 | |||
228 | BEGIN TRANSACTION; | ||
229 | |||
230 | CREATE 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 | |||
258 | INSERT 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 | |||
261 | DROP TABLE estate_settings; | ||
262 | |||
263 | |||
264 | Alter table Tmp_estate_settings | ||
265 | rename to estate_settings; | ||
266 | |||
267 | |||
268 | Create index on estate_settings (lower("EstateName")); | ||
269 | |||
270 | COMMIT; | ||
271 | |||
272 | |||
273 | :VERSION 9 | ||
274 | |||
275 | BEGIN TRANSACTION; | ||
276 | |||
277 | CREATE TABLE Tmp_estate_map | ||
278 | ( | ||
279 | "RegionID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'), | ||
280 | "EstateID" int NOT NULL | ||
281 | ); | ||
282 | |||
283 | INSERT INTO Tmp_estate_map ("RegionID", "EstateID") | ||
284 | SELECT cast("RegionID" as uuid), "EstateID" FROM estate_map ; | ||
285 | |||
286 | DROP TABLE estate_map; | ||
287 | |||
288 | Alter table Tmp_estate_map | ||
289 | rename to estate_map; | ||
290 | |||
291 | COMMIT; | ||
292 | |||
293 | :VERSION 10 | ||
294 | |||
295 | BEGIN TRANSACTION; | ||
296 | ALTER TABLE estate_settings ADD COLUMN "AllowLandmark" boolean NOT NULL default true; | ||
297 | ALTER TABLE estate_settings ADD COLUMN "AllowParcelChanges" boolean NOT NULL default true; | ||
298 | ALTER TABLE estate_settings ADD COLUMN "AllowSetHome" boolean NOT NULL default true; | ||
299 | COMMIT; | ||
300 | |||
301 | :VERSION 11 | ||
302 | |||
303 | Begin transaction; | ||
304 | |||
305 | |||
306 | Commit; | ||
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 | |||
3 | BEGIN TRANSACTION; | ||
4 | |||
5 | CREATE 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 | |||
12 | COMMIT; | ||
13 | |||
14 | :VERSION 2 | ||
15 | |||
16 | BEGIN TRANSACTION; | ||
17 | |||
18 | INSERT INTO Friends ("PrincipalID", "Friend", "Flags", "Offered") | ||
19 | SELECT "ownerID", "friendID", "friendPerms", 0 FROM userfriends; | ||
20 | |||
21 | COMMIT; | ||
22 | |||
23 | :VERSION 3 | ||
24 | |||
25 | BEGIN TRANSACTION; | ||
26 | |||
27 | CREATE 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 | |||
33 | INSERT INTO Tmp_Friends ("PrincipalID", "Friend", "Flags", "Offered") | ||
34 | SELECT cast("PrincipalID" as varchar(255)), "Friend", "Flags", "Offered" FROM Friends ; | ||
35 | |||
36 | DROP TABLE Friends; | ||
37 | |||
38 | Alter table Tmp_Friends | ||
39 | rename to Friends; | ||
40 | |||
41 | ALTER TABLE Friends ADD PRIMARY KEY("PrincipalID", "Friend"); | ||
42 | |||
43 | |||
44 | COMMIT; | ||
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 | |||
3 | BEGIN TRANSACTION; | ||
4 | |||
5 | CREATE 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 | |||
35 | COMMIT; | ||
36 | |||
37 | |||
38 | :VERSION 2 | ||
39 | |||
40 | BEGIN TRANSACTION; | ||
41 | |||
42 | CREATE 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 | |||
74 | INSERT 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 | |||
80 | DROP TABLE regions; | ||
81 | |||
82 | alter table Tmp_regions | ||
83 | rename to regions; | ||
84 | |||
85 | COMMIT; | ||
86 | |||
87 | :VERSION 3 | ||
88 | |||
89 | BEGIN TRANSACTION; | ||
90 | |||
91 | CREATE INDEX IX_regions_name ON regions | ||
92 | ( | ||
93 | "regionName" | ||
94 | ); | ||
95 | |||
96 | CREATE INDEX IX_regions_handle ON regions | ||
97 | ( | ||
98 | "regionHandle" | ||
99 | ); | ||
100 | |||
101 | |||
102 | CREATE INDEX IX_regions_override ON regions | ||
103 | ( | ||
104 | "eastOverrideHandle", | ||
105 | "westOverrideHandle", | ||
106 | "southOverrideHandle", | ||
107 | "northOverrideHandle" | ||
108 | ); | ||
109 | |||
110 | COMMIT; | ||
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.*/ | ||
116 | BEGIN TRANSACTION; | ||
117 | |||
118 | CREATE 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 | |||
151 | INSERT 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 | |||
155 | DROP TABLE regions; | ||
156 | |||
157 | alter table Tmp_regions rename to regions; | ||
158 | |||
159 | ALTER TABLE regions ADD CONSTRAINT | ||
160 | PK__regions__uuid PRIMARY KEY | ||
161 | ( | ||
162 | uuid | ||
163 | ); | ||
164 | |||
165 | CREATE INDEX IX_regions_name ON regions | ||
166 | ( | ||
167 | "regionName" | ||
168 | ); | ||
169 | |||
170 | CREATE INDEX IX_regions_handle ON regions | ||
171 | ( | ||
172 | "regionHandle" | ||
173 | ); | ||
174 | |||
175 | CREATE INDEX IX_regions_override ON regions | ||
176 | ( | ||
177 | "eastOverrideHandle", | ||
178 | "westOverrideHandle", | ||
179 | "southOverrideHandle", | ||
180 | "northOverrideHandle" | ||
181 | ); | ||
182 | |||
183 | COMMIT; | ||
184 | |||
185 | |||
186 | :VERSION 5 | ||
187 | |||
188 | BEGIN TRANSACTION; | ||
189 | |||
190 | ALTER TABLE regions ADD access int default 0; | ||
191 | |||
192 | COMMIT; | ||
193 | |||
194 | |||
195 | :VERSION 6 | ||
196 | |||
197 | BEGIN TRANSACTION; | ||
198 | |||
199 | ALTER TABLE regions ADD "ScopeID" uuid default '00000000-0000-0000-0000-000000000000'; | ||
200 | ALTER TABLE regions alter column "owner_uuid" set DEFAULT ('00000000-0000-0000-0000-000000000000'); | ||
201 | ALTER TABLE regions ADD "sizeX" integer not null default 0; | ||
202 | ALTER TABLE regions ADD "sizeY" integer not null default 0; | ||
203 | |||
204 | COMMIT; | ||
205 | |||
206 | |||
207 | :VERSION 7 | ||
208 | |||
209 | BEGIN TRANSACTION; | ||
210 | |||
211 | ALTER TABLE regions ADD "flags" integer NOT NULL DEFAULT 0; | ||
212 | CREATE INDEX flags ON regions("flags"); | ||
213 | ALTER TABLE regions ADD "last_seen" integer NOT NULL DEFAULT 0; | ||
214 | ALTER TABLE regions ADD "PrincipalID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; | ||
215 | ALTER TABLE regions ADD "Token" varchar(255) NOT NULL DEFAULT 0; | ||
216 | |||
217 | COMMIT; | ||
218 | |||
219 | :VERSION 8 | ||
220 | |||
221 | BEGIN TRANSACTION; | ||
222 | ALTER TABLE regions ALTER COLUMN "regionName" type VarChar(128) ; | ||
223 | |||
224 | DROP INDEX IX_regions_name; | ||
225 | ALTER TABLE regions ALTER COLUMN "regionName" type VarChar(128), | ||
226 | ALTER COLUMN "regionName" SET NOT NULL; | ||
227 | |||
228 | CREATE INDEX IX_regions_name ON regions | ||
229 | ( | ||
230 | "regionName" | ||
231 | ); | ||
232 | |||
233 | COMMIT; | ||
234 | |||
235 | :VERSION 9 | ||
236 | |||
237 | BEGIN TRANSACTION; | ||
238 | |||
239 | ALTER TABLE regions ADD "parcelMapTexture" uuid NULL; | ||
240 | |||
241 | COMMIT; | ||
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 | |||
3 | BEGIN TRANSACTION; | ||
4 | |||
5 | CREATE 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 | |||
18 | COMMIT; | ||
19 | |||
20 | :VERSION 2 # -------------------------- | ||
21 | |||
22 | BEGIN TRANSACTION; | ||
23 | |||
24 | CREATE 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 | |||
37 | COMMIT; | ||
38 | |||
39 | |||
40 | INSERT 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 | |||
57 | DROP TABLE GridUser; | ||
58 | |||
59 | alter 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 | |||
3 | BEGIN; | ||
4 | |||
5 | CREATE 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 | |||
16 | COMMIT; | ||
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 | |||
3 | BEGIN Transaction; | ||
4 | |||
5 | Create Sequence im_offiline_id increment by 1 start with 1; | ||
6 | |||
7 | CREATE 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 | |||
14 | COMMIT; | ||
15 | |||
16 | :VERSION 2 # -------------------------- | ||
17 | |||
18 | BEGIN; | ||
19 | |||
20 | /* | ||
21 | INSERT INTO `im_offline` SELECT * from `diva_im_offline`; | ||
22 | DROP TABLE `diva_im_offline`; | ||
23 | DELETE FROM `migrations` WHERE name='diva_im_Store'; | ||
24 | */ | ||
25 | |||
26 | COMMIT; | ||
27 | |||
28 | :VERSION 3 # -------------------------- | ||
29 | |||
30 | BEGIN; | ||
31 | |||
32 | -- dropping the table here as there most likely is only one record in the table at the time of migration | ||
33 | |||
34 | DROP TABLE IF EXISTS "public"."im_offline"; | ||
35 | CREATE 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 | ) | ||
42 | WITH (OIDS=FALSE); | ||
43 | ALTER TABLE "public"."im_offline" ADD PRIMARY KEY ("ID","PrincipalID","FromID") NOT DEFERRABLE INITIALLY IMMEDIATE; | ||
44 | |||
45 | COMMIT; \ 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 | |||
3 | BEGIN TRANSACTION; | ||
4 | |||
5 | CREATE 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 | |||
15 | CREATE INDEX owner ON inventoryfolders | ||
16 | ( | ||
17 | "agentID" ASC | ||
18 | ); | ||
19 | |||
20 | CREATE INDEX parent ON inventoryfolders | ||
21 | ( | ||
22 | "parentFolderID" ASC | ||
23 | ); | ||
24 | |||
25 | |||
26 | CREATE 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 | |||
49 | CREATE INDEX ii_owner ON inventoryitems | ||
50 | ( | ||
51 | "avatarID" ASC | ||
52 | ); | ||
53 | |||
54 | CREATE INDEX ii_folder ON inventoryitems | ||
55 | ( | ||
56 | "parentFolderID" ASC | ||
57 | ); | ||
58 | |||
59 | COMMIT; | ||
60 | |||
61 | |||
62 | :VERSION 2 | ||
63 | |||
64 | BEGIN TRANSACTION; | ||
65 | |||
66 | ALTER TABLE inventoryitems ADD "inventoryGroupPermissions" INTEGER NOT NULL default 0; | ||
67 | |||
68 | COMMIT; | ||
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.*/ | ||
73 | BEGIN TRANSACTION; | ||
74 | |||
75 | CREATE 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 | |||
89 | DROP TABLE inventoryfolders; | ||
90 | |||
91 | alter table Tmp_inventoryfolders rename to inventoryfolders; | ||
92 | |||
93 | ALTER TABLE inventoryfolders ADD CONSTRAINT | ||
94 | PK__inventor__C2FABFB3173876EA PRIMARY KEY | ||
95 | ( | ||
96 | "folderID" | ||
97 | ); | ||
98 | |||
99 | CREATE INDEX owner ON inventoryfolders | ||
100 | ( | ||
101 | "agentID" | ||
102 | ); | ||
103 | |||
104 | CREATE INDEX parent ON inventoryfolders | ||
105 | ( | ||
106 | "parentFolderID" | ||
107 | ); | ||
108 | |||
109 | COMMIT; | ||
110 | |||
111 | |||
112 | :VERSION 4 | ||
113 | |||
114 | BEGIN TRANSACTION; | ||
115 | |||
116 | CREATE 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 | |||
145 | DROP TABLE inventoryitems; | ||
146 | |||
147 | alter table Tmp_inventoryitems rename to inventoryitems; | ||
148 | |||
149 | ALTER TABLE inventoryitems ADD CONSTRAINT | ||
150 | PK__inventor__C4B7BC2220C1E124 PRIMARY KEY | ||
151 | ( | ||
152 | "inventoryID" | ||
153 | ); | ||
154 | |||
155 | |||
156 | CREATE INDEX ii2_owner ON inventoryitems | ||
157 | ( | ||
158 | "avatarID" | ||
159 | ); | ||
160 | |||
161 | CREATE INDEX ii2_folder ON inventoryitems | ||
162 | ( | ||
163 | "parentFolderID" | ||
164 | ); | ||
165 | |||
166 | COMMIT; | ||
167 | |||
168 | :VERSION 5 | ||
169 | |||
170 | |||
171 | BEGIN 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 | |||
176 | alter table inventoryitems | ||
177 | alter column "inventoryBasePermissions" set default 0; | ||
178 | alter table inventoryitems | ||
179 | alter column "inventoryEveryOnePermissions" set default 0; | ||
180 | alter table inventoryitems | ||
181 | alter column "inventoryGroupPermissions" set default 0 ; | ||
182 | |||
183 | COMMIT ; | ||
184 | |||
185 | :VERSION 7 | ||
186 | |||
187 | BEGIN TRANSACTION; | ||
188 | |||
189 | -- # "creatorID" goes back to VARCHAR(36) (???) | ||
190 | |||
191 | alter table inventoryitems | ||
192 | alter column "creatorID" type varchar(36); | ||
193 | |||
194 | COMMIT ; | ||
195 | |||
196 | :VERSION 8 | ||
197 | |||
198 | ALTER TABLE inventoryitems | ||
199 | alter column "creatorID" set DEFAULT '00000000-0000-0000-0000-000000000000'; | ||
200 | |||
201 | |||
202 | :VERSION 9 | ||
203 | |||
204 | BEGIN TRANSACTION; | ||
205 | |||
206 | --# "creatorID" goes up to VARCHAR(255) | ||
207 | |||
208 | alter table inventoryitems | ||
209 | alter column "creatorID" type varchar(255); | ||
210 | |||
211 | Commit; | ||
212 | |||
213 | :VERSION 10 | ||
214 | |||
215 | BEGIN TRANSACTION; | ||
216 | |||
217 | Alter table inventoryitems Rename Column "SaleType" to "saleType"; | ||
218 | |||
219 | Commit; | ||
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 | |||
3 | BEGIN TRANSACTION; | ||
4 | |||
5 | CREATE 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 | |||
15 | COMMIT; | ||
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 | |||
3 | BEGIN TRANSACTION; | ||
4 | |||
5 | CREATE 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 | |||
13 | COMMIT; | ||
14 | |||
15 | :VERSION 2 | ||
16 | |||
17 | BEGIN TRANSACTION; | ||
18 | |||
19 | CREATE UNIQUE INDEX SessionID ON Presence("SessionID"); | ||
20 | CREATE INDEX UserID ON Presence("UserID"); | ||
21 | |||
22 | ALTER TABLE Presence ADD "LastSeen" Timestamp; | ||
23 | |||
24 | COMMIT; | ||
25 | |||
26 | :VERSION 3 # -------------------------- | ||
27 | |||
28 | BEGIN; | ||
29 | |||
30 | CREATE INDEX RegionID ON Presence("RegionID"); | ||
31 | |||
32 | COMMIT; | ||
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 | |||
36 | BEGIN; | ||
37 | |||
38 | ALTER TABLE Presence | ||
39 | DROP COLUMN IF EXISTS "LastSeen", | ||
40 | ADD COLUMN "LastSeen" Timestamp; | ||
41 | |||
42 | COMMIT; \ 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 @@ | |||
1 | begin transaction ; | ||
2 | :VERSION 1 | ||
3 | |||
4 | CREATE 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 | |||
53 | CREATE 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 | |||
83 | CREATE 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 | |||
104 | CREATE TABLE terrain( | ||
105 | "RegionUUID" varchar(255) NULL, | ||
106 | "Revision" int NULL, | ||
107 | "Heightfield" bytea NULL | ||
108 | ); | ||
109 | |||
110 | |||
111 | CREATE 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 | |||
145 | Create index on land (lower("Name")); | ||
146 | |||
147 | CREATE TABLE landaccesslist( | ||
148 | "LandUUID" varchar(255) NULL, | ||
149 | "AccessUUID" varchar(255) NULL, | ||
150 | "Flags" int NULL | ||
151 | ); | ||
152 | |||
153 | COMMIT; | ||
154 | |||
155 | :VERSION 2 | ||
156 | |||
157 | BEGIN TRANSACTION; | ||
158 | |||
159 | CREATE 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 | |||
166 | create 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 | |||
203 | COMMIT; | ||
204 | |||
205 | :VERSION 3 | ||
206 | |||
207 | BEGIN TRANSACTION; | ||
208 | |||
209 | CREATE 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 | |||
259 | INSERT 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 | |||
263 | DROP TABLE prims; | ||
264 | |||
265 | alter table Tmp_prims rename to prims; | ||
266 | |||
267 | |||
268 | ALTER TABLE prims ADD CONSTRAINT | ||
269 | PK__prims__10566F31 PRIMARY KEY | ||
270 | ( | ||
271 | "UUID" | ||
272 | ); | ||
273 | |||
274 | COMMIT; | ||
275 | |||
276 | :VERSION 4 | ||
277 | |||
278 | BEGIN TRANSACTION; | ||
279 | |||
280 | CREATE 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 | |||
302 | INSERT 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 | |||
306 | DROP TABLE primitems; | ||
307 | |||
308 | alter table Tmp_primitems rename to primitems; | ||
309 | |||
310 | ALTER TABLE primitems ADD CONSTRAINT | ||
311 | PK__primitems__0A688BB1 PRIMARY KEY | ||
312 | ( | ||
313 | "itemID" | ||
314 | ); | ||
315 | |||
316 | |||
317 | COMMIT; | ||
318 | |||
319 | |||
320 | :VERSION 5 | ||
321 | |||
322 | BEGIN TRANSACTION; | ||
323 | |||
324 | CREATE 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 | |||
355 | INSERT 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 | |||
359 | DROP TABLE primshapes; | ||
360 | |||
361 | alter table Tmp_primshapes rename to primshapes; | ||
362 | |||
363 | ALTER TABLE primshapes ADD CONSTRAINT | ||
364 | PK__primshapes__0880433F PRIMARY KEY | ||
365 | ( | ||
366 | "UUID" | ||
367 | ) ; | ||
368 | |||
369 | COMMIT; | ||
370 | |||
371 | |||
372 | :VERSION 6 | ||
373 | |||
374 | BEGIN TRANSACTION; | ||
375 | |||
376 | ALTER TABLE prims ADD "PayPrice" int not null default 0; | ||
377 | ALTER TABLE prims ADD "PayButton1" int not null default 0; | ||
378 | ALTER TABLE prims ADD "PayButton2" int not null default 0; | ||
379 | ALTER TABLE prims ADD "PayButton3" int not null default 0; | ||
380 | ALTER TABLE prims ADD "PayButton4" int not null default 0; | ||
381 | ALTER TABLE prims ADD "LoopedSound" varchar(36) not null default '00000000-0000-0000-0000-000000000000'; | ||
382 | ALTER TABLE prims ADD "LoopedSoundGain" double precision not null default 0.0; | ||
383 | ALTER TABLE prims ADD "TextureAnimation" bytea; | ||
384 | ALTER TABLE prims ADD "OmegaX" double precision not null default 0.0; | ||
385 | ALTER TABLE prims ADD "OmegaY" double precision not null default 0.0; | ||
386 | ALTER TABLE prims ADD "OmegaZ" double precision not null default 0.0; | ||
387 | ALTER TABLE prims ADD "CameraEyeOffsetX" double precision not null default 0.0; | ||
388 | ALTER TABLE prims ADD "CameraEyeOffsetY" double precision not null default 0.0; | ||
389 | ALTER TABLE prims ADD "CameraEyeOffsetZ" double precision not null default 0.0; | ||
390 | ALTER TABLE prims ADD "CameraAtOffsetX" double precision not null default 0.0; | ||
391 | ALTER TABLE prims ADD "CameraAtOffsetY" double precision not null default 0.0; | ||
392 | ALTER TABLE prims ADD "CameraAtOffsetZ" double precision not null default 0.0; | ||
393 | ALTER TABLE prims ADD "ForceMouselook" smallint not null default 0; | ||
394 | ALTER TABLE prims ADD "ScriptAccessPin" int not null default 0; | ||
395 | ALTER TABLE prims ADD "AllowedDrop" smallint not null default 0; | ||
396 | ALTER TABLE prims ADD "DieAtEdge" smallint not null default 0; | ||
397 | ALTER TABLE prims ADD "SalePrice" int not null default 10; | ||
398 | ALTER TABLE prims ADD "SaleType" smallint not null default 0; | ||
399 | |||
400 | ALTER TABLE primitems add "flags" integer not null default 0; | ||
401 | |||
402 | ALTER TABLE land ADD "AuthbuyerID" varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; | ||
403 | |||
404 | CREATE index prims_regionuuid on prims("RegionUUID"); | ||
405 | CREATE index prims_parentid on prims("ParentID"); | ||
406 | |||
407 | CREATE index primitems_primid on primitems("primID"); | ||
408 | |||
409 | COMMIT; | ||
410 | |||
411 | |||
412 | :VERSION 7 | ||
413 | |||
414 | BEGIN TRANSACTION; | ||
415 | |||
416 | ALTER TABLE prims ADD "ColorR" int not null default 0; | ||
417 | ALTER TABLE prims ADD "ColorG" int not null default 0; | ||
418 | ALTER TABLE prims ADD "ColorB" int not null default 0; | ||
419 | ALTER TABLE prims ADD "ColorA" int not null default 0; | ||
420 | ALTER TABLE prims ADD "ParticleSystem" bytea; | ||
421 | ALTER TABLE prims ADD "ClickAction" smallint NOT NULL default 0; | ||
422 | |||
423 | COMMIT; | ||
424 | |||
425 | |||
426 | :VERSION 8 | ||
427 | |||
428 | BEGIN TRANSACTION; | ||
429 | |||
430 | ALTER TABLE land ADD "OtherCleanTime" integer NOT NULL default 0; | ||
431 | ALTER TABLE land ADD "Dwell" integer NOT NULL default 0; | ||
432 | |||
433 | COMMIT; | ||
434 | |||
435 | :VERSION 9 | ||
436 | |||
437 | BEGIN TRANSACTION; | ||
438 | |||
439 | ALTER TABLE prims ADD "Material" smallint NOT NULL default 3; | ||
440 | |||
441 | COMMIT; | ||
442 | |||
443 | |||
444 | :VERSION 10 | ||
445 | |||
446 | BEGIN TRANSACTION; | ||
447 | |||
448 | ALTER TABLE regionsettings ADD "sunvectorx" double precision NOT NULL default 0; | ||
449 | ALTER TABLE regionsettings ADD "sunvectory" double precision NOT NULL default 0; | ||
450 | ALTER TABLE regionsettings ADD "sunvectorz" double precision NOT NULL default 0; | ||
451 | |||
452 | COMMIT; | ||
453 | |||
454 | |||
455 | :VERSION 11 | ||
456 | |||
457 | BEGIN TRANSACTION; | ||
458 | |||
459 | ALTER TABLE prims ADD "CollisionSound" char(36) not null default '00000000-0000-0000-0000-000000000000'; | ||
460 | ALTER TABLE prims ADD "CollisionSoundVolume" double precision not null default 0.0; | ||
461 | |||
462 | COMMIT; | ||
463 | |||
464 | |||
465 | :VERSION 12 | ||
466 | |||
467 | BEGIN TRANSACTION; | ||
468 | |||
469 | ALTER TABLE prims ADD "LinkNumber" integer not null default 0; | ||
470 | |||
471 | COMMIT; | ||
472 | |||
473 | |||
474 | :VERSION 13 | ||
475 | |||
476 | BEGIN TRANSACTION; | ||
477 | |||
478 | CREATE 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 | |||
561 | INSERT 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 | |||
565 | DROP TABLE prims; | ||
566 | |||
567 | alter table Tmp_prims rename to prims; | ||
568 | |||
569 | ALTER TABLE prims ADD CONSTRAINT | ||
570 | PK__prims__10566F31 PRIMARY KEY | ||
571 | ( | ||
572 | "UUID" | ||
573 | ); | ||
574 | |||
575 | |||
576 | CREATE INDEX prims_regionuuid ON prims | ||
577 | ( | ||
578 | "RegionUUID" | ||
579 | ); | ||
580 | |||
581 | CREATE INDEX prims_parentid ON prims | ||
582 | ( | ||
583 | "ParentID" | ||
584 | ); | ||
585 | |||
586 | COMMIT; | ||
587 | |||
588 | |||
589 | :VERSION 14 | ||
590 | |||
591 | BEGIN TRANSACTION; | ||
592 | |||
593 | CREATE 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 | |||
624 | INSERT 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 | |||
628 | DROP TABLE primshapes; | ||
629 | |||
630 | alter table Tmp_primshapes rename to primshapes; | ||
631 | |||
632 | ALTER TABLE primshapes ADD CONSTRAINT | ||
633 | PK__primshapes__0880433F PRIMARY KEY | ||
634 | ( | ||
635 | "UUID" | ||
636 | ); | ||
637 | |||
638 | COMMIT; | ||
639 | |||
640 | |||
641 | :VERSION 15 | ||
642 | |||
643 | BEGIN TRANSACTION; | ||
644 | |||
645 | CREATE 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 | |||
668 | INSERT 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 | |||
672 | DROP TABLE primitems; | ||
673 | |||
674 | alter table Tmp_primitems rename to primitems; | ||
675 | |||
676 | ALTER TABLE primitems ADD CONSTRAINT | ||
677 | PK__primitems__0A688BB1 PRIMARY KEY | ||
678 | ( | ||
679 | "itemID" | ||
680 | ); | ||
681 | |||
682 | CREATE INDEX primitems_primid ON primitems | ||
683 | ( | ||
684 | "primID" | ||
685 | ) ; | ||
686 | |||
687 | COMMIT; | ||
688 | |||
689 | |||
690 | :VERSION 16 | ||
691 | |||
692 | |||
693 | BEGIN TRANSACTION; | ||
694 | |||
695 | CREATE TABLE Tmp_terrain | ||
696 | ( | ||
697 | "RegionUUID" uuid NULL, | ||
698 | "Revision" int NULL, | ||
699 | "Heightfield" bytea NULL | ||
700 | ); | ||
701 | |||
702 | INSERT INTO Tmp_terrain ("RegionUUID", "Revision", "Heightfield") | ||
703 | SELECT cast("RegionUUID" as uuid), "Revision", "Heightfield" | ||
704 | FROM terrain ; | ||
705 | |||
706 | DROP TABLE terrain; | ||
707 | |||
708 | alter table Tmp_terrain rename to terrain; | ||
709 | |||
710 | COMMIT; | ||
711 | |||
712 | |||
713 | :VERSION 17 | ||
714 | |||
715 | BEGIN TRANSACTION; | ||
716 | |||
717 | CREATE 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 | |||
755 | INSERT 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 | |||
759 | DROP TABLE land; | ||
760 | |||
761 | alter table Tmp_land rename to land; | ||
762 | |||
763 | ALTER TABLE land ADD CONSTRAINT | ||
764 | PK__land__65A475E71BFD2C07 PRIMARY KEY | ||
765 | ( | ||
766 | "UUID" | ||
767 | ); | ||
768 | |||
769 | Create index on land (lower("Name")); | ||
770 | |||
771 | COMMIT; | ||
772 | |||
773 | |||
774 | |||
775 | :VERSION 18 | ||
776 | |||
777 | BEGIN TRANSACTION; | ||
778 | |||
779 | CREATE TABLE Tmp_landaccesslist | ||
780 | ( | ||
781 | "LandUUID" uuid NULL, | ||
782 | "AccessUUID" uuid NULL, | ||
783 | "Flags" int NULL | ||
784 | ); | ||
785 | |||
786 | INSERT INTO Tmp_landaccesslist ("LandUUID", "AccessUUID", "Flags") | ||
787 | SELECT cast("LandUUID" as uuid), cast("AccessUUID" as uuid), "Flags" | ||
788 | FROM landaccesslist ; | ||
789 | |||
790 | DROP TABLE landaccesslist; | ||
791 | |||
792 | alter table Tmp_landaccesslist rename to landaccesslist; | ||
793 | |||
794 | COMMIT; | ||
795 | |||
796 | |||
797 | |||
798 | :VERSION 19 | ||
799 | |||
800 | BEGIN TRANSACTION; | ||
801 | |||
802 | CREATE 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 | |||
810 | INSERT INTO Tmp_regionban ("regionUUID", "bannedUUID", "bannedIp", "bannedIpHostMask") | ||
811 | SELECT cast("regionUUID" as uuid), cast("bannedUUID" as uuid), "bannedIp", "bannedIpHostMask" | ||
812 | FROM regionban ; | ||
813 | |||
814 | DROP TABLE regionban; | ||
815 | |||
816 | alter table Tmp_regionban rename to regionban; | ||
817 | |||
818 | COMMIT; | ||
819 | |||
820 | |||
821 | :VERSION 20 | ||
822 | |||
823 | BEGIN TRANSACTION; | ||
824 | |||
825 | CREATE 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 | |||
866 | INSERT 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 | |||
870 | DROP TABLE regionsettings; | ||
871 | |||
872 | alter table Tmp_regionsettings rename to regionsettings; | ||
873 | |||
874 | ALTER TABLE regionsettings ADD CONSTRAINT | ||
875 | PK__regionse__5B35159D21B6055D PRIMARY KEY | ||
876 | ( | ||
877 | "regionUUID" | ||
878 | ); | ||
879 | |||
880 | COMMIT; | ||
881 | |||
882 | |||
883 | :VERSION 21 | ||
884 | |||
885 | BEGIN TRANSACTION; | ||
886 | |||
887 | ALTER TABLE prims ADD "PassTouches" boolean not null default false; | ||
888 | |||
889 | COMMIT; | ||
890 | |||
891 | |||
892 | :VERSION 22 | ||
893 | |||
894 | BEGIN TRANSACTION; | ||
895 | |||
896 | ALTER TABLE regionsettings ADD "loaded_creation_date" varchar(20) ; | ||
897 | ALTER TABLE regionsettings ADD "loaded_creation_time" varchar(20) ; | ||
898 | ALTER TABLE regionsettings ADD "loaded_creation_id" varchar(64) ; | ||
899 | |||
900 | COMMIT; | ||
901 | |||
902 | :VERSION 23 | ||
903 | |||
904 | BEGIN TRANSACTION; | ||
905 | |||
906 | ALTER TABLE regionsettings DROP COLUMN "loaded_creation_date"; | ||
907 | ALTER TABLE regionsettings DROP COLUMN "loaded_creation_time"; | ||
908 | ALTER TABLE regionsettings ADD "loaded_creation_datetime" int NOT NULL default 0; | ||
909 | |||
910 | COMMIT; | ||
911 | |||
912 | :VERSION 24 | ||
913 | |||
914 | BEGIN TRANSACTION; | ||
915 | |||
916 | ALTER TABLE prims ADD "MediaURL" varchar(255); | ||
917 | ALTER TABLE primshapes ADD "Media" TEXT NULL; | ||
918 | |||
919 | COMMIT; | ||
920 | |||
921 | :VERSION 25 | ||
922 | |||
923 | BEGIN TRANSACTION; | ||
924 | CREATE 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 | |||
990 | COMMIT; | ||
991 | |||
992 | :VERSION 26 | ||
993 | |||
994 | BEGIN TRANSACTION; | ||
995 | |||
996 | ALTER TABLE regionsettings ADD "map_tile_ID" CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; | ||
997 | |||
998 | COMMIT; | ||
999 | |||
1000 | :VERSION 27 #--------------------- | ||
1001 | |||
1002 | BEGIN TRANSACTION; | ||
1003 | ALTER TABLE land ADD "MediaType" VARCHAR(32) NOT NULL DEFAULT 'none/none' ; | ||
1004 | ALTER TABLE land ADD "MediaDescription" VARCHAR(255) NOT NULL DEFAULT ''; | ||
1005 | ALTER TABLE land ADD "MediaSize" VARCHAR(16) NOT NULL DEFAULT '0,0'; | ||
1006 | ALTER TABLE land ADD "MediaLoop" boolean NOT NULL DEFAULT false; | ||
1007 | ALTER TABLE land ADD "ObscureMusic" boolean NOT NULL DEFAULT false; | ||
1008 | ALTER TABLE land ADD "ObscureMedia" boolean NOT NULL DEFAULT false; | ||
1009 | COMMIT; | ||
1010 | |||
1011 | :VERSION 28 #--------------------- | ||
1012 | |||
1013 | BEGIN TRANSACTION; | ||
1014 | |||
1015 | ALTER TABLE prims | ||
1016 | alter column "CreatorID" set DEFAULT '00000000-0000-0000-0000-000000000000' ; | ||
1017 | |||
1018 | ALTER TABLE prims ALTER COLUMN "CreatorID" set NOT NULL; | ||
1019 | |||
1020 | ALTER TABLE primitems | ||
1021 | alter column "creatorID" set DEFAULT '00000000-0000-0000-0000-000000000000' ; | ||
1022 | |||
1023 | ALTER TABLE primitems ALTER COLUMN "creatorID" set NOT NULL; | ||
1024 | |||
1025 | COMMIT; | ||
1026 | |||
1027 | :VERSION 29 #----------------- Region Covenant changed time | ||
1028 | |||
1029 | BEGIN TRANSACTION; | ||
1030 | |||
1031 | ALTER TABLE regionsettings ADD "covenant_datetime" int NOT NULL default 0; | ||
1032 | |||
1033 | COMMIT; | ||
1034 | |||
1035 | :VERSION 30 #------------------Migrate "creatorID" storage to varchars instead of UUIDs for HG support | ||
1036 | |||
1037 | BEGIN TRANSACTION; | ||
1038 | |||
1039 | alter table prims rename column "CreatorID" to "CreatorIDOld"; | ||
1040 | alter table primitems rename column "creatorID" to "creatorIDOld"; | ||
1041 | |||
1042 | COMMIT; | ||
1043 | |||
1044 | :VERSION 31 #--------------------- | ||
1045 | |||
1046 | BEGIN TRANSACTION; | ||
1047 | |||
1048 | ALTER TABLE prims ADD "CreatorID" varchar(255); | ||
1049 | ALTER TABLE primitems ADD "creatorID" varchar(255); | ||
1050 | |||
1051 | COMMIT; | ||
1052 | |||
1053 | :VERSION 32 #--------------------- | ||
1054 | |||
1055 | BEGIN TRANSACTION; | ||
1056 | |||
1057 | UPDATE prims SET "CreatorID" = cast("CreatorIDOld" as varchar(255)); | ||
1058 | UPDATE primitems SET "creatorID" = cast("creatorIDOld" as varchar(255)); | ||
1059 | |||
1060 | COMMIT; | ||
1061 | |||
1062 | :VERSION 33 #--------------------- | ||
1063 | |||
1064 | BEGIN TRANSACTION; | ||
1065 | |||
1066 | ALTER TABLE prims alter column "CreatorID" set default '00000000-0000-0000-0000-000000000000' ; | ||
1067 | |||
1068 | ALTER TABLE prims ALTER COLUMN "CreatorID" set NOT NULL; | ||
1069 | |||
1070 | ALTER TABLE primitems alter column "creatorID" set DEFAULT '00000000-0000-0000-0000-000000000000' ; | ||
1071 | |||
1072 | ALTER TABLE primitems ALTER COLUMN "creatorID" set NOT NULL; | ||
1073 | |||
1074 | COMMIT; | ||
1075 | |||
1076 | :VERSION 34 #--------------- Telehub support | ||
1077 | |||
1078 | BEGIN TRANSACTION; | ||
1079 | |||
1080 | CREATE 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 | |||
1087 | ALTER TABLE regionsettings ADD "TelehubObject" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; | ||
1088 | |||
1089 | COMMIT; | ||
1090 | |||
1091 | :VERSION 35 #---------------- Parcels for sale | ||
1092 | |||
1093 | BEGIN TRANSACTION; | ||
1094 | |||
1095 | ALTER TABLE regionsettings ADD "parcel_tile_ID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'; | ||
1096 | |||
1097 | COMMIT; | ||
1098 | |||
1099 | :VERSION 36 #---------------- Timed bans/access | ||
1100 | |||
1101 | BEGIN TRANSACTION; | ||
1102 | |||
1103 | ALTER TABLE landaccesslist ADD "Expires" integer NOT NULL DEFAULT 0; | ||
1104 | |||
1105 | COMMIT; | ||
1106 | |||
1107 | :VERSION 37 #---------------- Environment Settings | ||
1108 | |||
1109 | BEGIN TRANSACTION; | ||
1110 | |||
1111 | CREATE TABLE regionenvironment( | ||
1112 | "region_id" uuid NOT NULL primary key, | ||
1113 | "llsd_settings" varchar NOT NULL | ||
1114 | ); | ||
1115 | |||
1116 | COMMIT; | ||
1117 | |||
1118 | :VERSION 38 #---------------- Dynamic attributes | ||
1119 | |||
1120 | BEGIN TRANSACTION; | ||
1121 | |||
1122 | ALTER TABLE prims ADD "DynAttrs" TEXT; | ||
1123 | |||
1124 | COMMIT; | ||
1125 | |||
1126 | :VERSION 39 #---------------- Extra physics params | ||
1127 | |||
1128 | BEGIN TRANSACTION; | ||
1129 | |||
1130 | ALTER TABLE prims ADD "PhysicsShapeType" smallint NOT NULL default '0'; | ||
1131 | ALTER TABLE prims ADD "Density" double precision NOT NULL default '1000'; | ||
1132 | ALTER TABLE prims ADD "GravityModifier" double precision NOT NULL default '1'; | ||
1133 | ALTER TABLE prims ADD "Friction" double precision NOT NULL default '0.6'; | ||
1134 | ALTER TABLE prims ADD "Restitution" double precision NOT NULL default '0.5'; | ||
1135 | |||
1136 | COMMIT; | ||
1137 | |||
1138 | :VERSION 40 #-- regionwindlight changed type from smallint to bool | ||
1139 | |||
1140 | BEGIN TRANSACTION; | ||
1141 | |||
1142 | ALTER TABLE regionwindlight ALTER COLUMN cloud_scroll_x_lock DROP DEFAULT; | ||
1143 | ALTER TABLE regionwindlight ALTER cloud_scroll_x_lock TYPE bool USING CASE WHEN cloud_scroll_x_lock=0 THEN FALSE ELSE TRUE END; | ||
1144 | ALTER TABLE regionwindlight ALTER COLUMN cloud_scroll_x_lock SET DEFAULT FALSE; | ||
1145 | |||
1146 | ALTER TABLE regionwindlight ALTER COLUMN cloud_scroll_y_lock DROP DEFAULT; | ||
1147 | ALTER TABLE regionwindlight ALTER cloud_scroll_y_lock TYPE bool USING CASE WHEN cloud_scroll_y_lock=0 THEN FALSE ELSE TRUE END; | ||
1148 | ALTER TABLE regionwindlight ALTER COLUMN cloud_scroll_y_lock SET DEFAULT FALSE; | ||
1149 | |||
1150 | ALTER TABLE regionwindlight ALTER COLUMN draw_classic_clouds DROP DEFAULT; | ||
1151 | ALTER TABLE regionwindlight ALTER draw_classic_clouds TYPE bool USING CASE WHEN draw_classic_clouds=0 THEN FALSE ELSE TRUE END; | ||
1152 | ALTER TABLE regionwindlight ALTER COLUMN draw_classic_clouds SET DEFAULT FALSE; | ||
1153 | |||
1154 | COMMIT; | ||
1155 | |||
1156 | VERSION 41 #-- Change Landlags to bigint | ||
1157 | |||
1158 | BEGIN TRANSACTION; | ||
1159 | |||
1160 | ALTER TABLE land ALTER "LandFlags" TYPE bigint; | ||
1161 | |||
1162 | COMMIT; | ||
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 | |||
3 | CREATE 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 | |||
16 | BEGIN TRANSACTION; | ||
17 | |||
18 | INSERT INTO UserAccounts ("PrincipalID", "ScopeID", "FirstName", "LastName", "Email", "ServiceURLs", "Created") | ||
19 | SELECT UUID AS "PrincipalID", '00000000-0000-0000-0000-000000000000' AS "ScopeID", | ||
20 | username AS "FirstName", | ||
21 | lastname AS "LastName", | ||
22 | email as "Email", ( | ||
23 | 'AssetServerURI=' + | ||
24 | userAssetURI + ' InventoryServerURI=' + userInventoryURI + ' GatewayURI= HomeURI=') AS "ServiceURLs", | ||
25 | created as "Created" FROM users; | ||
26 | |||
27 | COMMIT; | ||
28 | |||
29 | :VERSION 3 | ||
30 | |||
31 | BEGIN TRANSACTION; | ||
32 | |||
33 | CREATE UNIQUE INDEX "PrincipalID" ON UserAccounts("PrincipalID"); | ||
34 | CREATE INDEX "Email" ON UserAccounts("Email"); | ||
35 | CREATE INDEX "FirstName" ON UserAccounts("FirstName"); | ||
36 | CREATE INDEX "LastName" ON UserAccounts("LastName"); | ||
37 | CREATE INDEX Name ON UserAccounts("FirstName","LastName"); | ||
38 | |||
39 | COMMIT; | ||
40 | |||
41 | :VERSION 4 | ||
42 | |||
43 | BEGIN TRANSACTION; | ||
44 | |||
45 | ALTER TABLE UserAccounts ADD "UserLevel" integer NOT NULL DEFAULT 0; | ||
46 | ALTER TABLE UserAccounts ADD "UserFlags" integer NOT NULL DEFAULT 0; | ||
47 | ALTER TABLE UserAccounts ADD "UserTitle" varchar(64) NOT NULL DEFAULT ''; | ||
48 | |||
49 | COMMIT; | ||
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 | |||
3 | begin; | ||
4 | |||
5 | CREATE 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 | |||
25 | CREATE 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 | |||
33 | CREATE 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 | |||
51 | CREATE 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 | |||
69 | commit; | ||
70 | |||
71 | :VERSION 2 # ------------------------------- | ||
72 | |||
73 | begin; | ||
74 | CREATE 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 | |||
82 | commit; | ||
83 | |||
84 | :VERSION 3 # ------------------------------- | ||
85 | begin; | ||
86 | CREATE TABLE usersettings ( | ||
87 | "useruuid" char(36) NOT NULL, | ||
88 | "imviaemail" bytea NOT NULL, | ||
89 | "visible" bytea NOT NULL, | ||
90 | PRIMARY KEY ("useruuid") | ||
91 | ); | ||
92 | commit; | ||
93 | |||
94 | :VERSION 4 | ||
95 | |||
96 | BEGIN; | ||
97 | |||
98 | -- Classifieds | ||
99 | ALTER TABLE classifieds DROP CONSTRAINT classifiedspk; | ||
100 | ALTER TABLE classifieds ALTER COLUMN classifieduuid SET DATA TYPE uuid using classifieduuid::uuid; | ||
101 | ALTER TABLE classifieds ALTER COLUMN creatoruuid SET DATA TYPE uuid using creatoruuid::uuid; | ||
102 | ALTER TABLE classifieds ALTER COLUMN parceluuid SET DATA TYPE uuid using parceluuid::uuid; | ||
103 | ALTER TABLE classifieds ALTER COLUMN snapshotuuid SET DATA TYPE uuid using snapshotuuid::uuid; | ||
104 | ALTER TABLE classifieds ADD CONSTRAINT classifiedspk PRIMARY KEY (classifieduuid); | ||
105 | |||
106 | -- Notes | ||
107 | ALTER TABLE usernotes DROP CONSTRAINT usernoteuk; | ||
108 | ALTER TABLE usernotes ALTER COLUMN useruuid SET DATA TYPE uuid USING useruuid::uuid; | ||
109 | ALTER TABLE usernotes ALTER COLUMN targetuuid SET DATA TYPE uuid USING targetuuid::uuid; | ||
110 | ALTER TABLE usernotes ADD CONSTRAINT usernoteuk UNIQUE (useruuid,targetuuid); | ||
111 | |||
112 | |||
113 | -- Userpicks | ||
114 | ALTER TABLE userpicks DROP CONSTRAINT userpicks_pkey; | ||
115 | ALTER TABLE userpicks ALTER COLUMN pickuuid SET DATA TYPE uuid USING pickuuid::uuid; | ||
116 | ALTER TABLE userpicks ALTER COLUMN creatoruuid SET DATA TYPE uuid USING creatoruuid::uuid; | ||
117 | ALTER TABLE userpicks ALTER COLUMN parceluuid SET DATA TYPE uuid USING parceluuid::uuid; | ||
118 | ALTER TABLE userpicks ALTER COLUMN parceluuid SET DATA TYPE uuid USING parceluuid::uuid; | ||
119 | ALTER TABLE userpicks ADD PRIMARY KEY (pickuuid); | ||
120 | |||
121 | -- Userprofile | ||
122 | ALTER TABLE userprofile DROP CONSTRAINT userprofile_pkey; | ||
123 | ALTER TABLE userprofile ALTER COLUMN useruuid SET DATA TYPE uuid USING useruuid::uuid; | ||
124 | ALTER TABLE userprofile ALTER COLUMN "profilePartner" SET DATA TYPE uuid USING "profilePartner"::uuid; | ||
125 | -- Force column conversions | ||
126 | ALTER TABLE userprofile ALTER COLUMN "profileAllowPublish" SET DATA TYPE boolean USING CASE WHEN false THEN false ELSE true END; | ||
127 | ALTER TABLE userprofile ALTER COLUMN "profileMaturePublish" SET DATA TYPE boolean USING CASE WHEN false THEN false ELSE true END; | ||
128 | ALTER TABLE userprofile ALTER COLUMN "profileImage" SET DATA TYPE uuid USING "profileImage"::uuid; | ||
129 | ALTER TABLE userprofile ALTER COLUMN "profileFirstImage" SET DATA TYPE uuid USING "profileFirstImage"::uuid; | ||
130 | ALTER TABLE userprofile ADD PRIMARY KEY (useruuid); | ||
131 | |||
132 | -- Userdata | ||
133 | ALTER TABLE userdata DROP CONSTRAINT userdata_pkey; | ||
134 | ALTER TABLE userdata ALTER COLUMN "UserId" SET DATA TYPE uuid USING "UserId"::uuid; | ||
135 | ALTER TABLE userdata ALTER COLUMN "UserId" SET DATA TYPE uuid USING "UserId"::uuid; | ||
136 | ALTER TABLE userdata ADD PRIMARY KEY ("UserId","TagId"); | ||
137 | |||
138 | |||
139 | -- Usersettings | ||
140 | ALTER TABLE usersettings DROP CONSTRAINT usersettings_pkey; | ||
141 | ALTER TABLE usersettings ALTER COLUMN useruuid SET DATA TYPE uuid USING useruuid::uuid; | ||
142 | ALTER TABLE usersettings ALTER COLUMN visible SET DATA TYPE boolean USING CASE WHEN false THEN false ELSE true END; | ||
143 | ALTER TABLE usersettings ADD COLUMN email varchar(254) NOT NULL; | ||
144 | ALTER TABLE usersettings ADD PRIMARY KEY (useruuid); | ||
145 | |||
146 | COMMIT; | ||
147 | |||
148 | |||
149 | :VERSION 5 # ------------------------------- | ||
150 | |||
151 | BEGIN; | ||
152 | |||
153 | ALTER TABLE usersettings ALTER COLUMN imviaemail SET DATA TYPE boolean USING CASE WHEN false THEN false ELSE true END; | ||
154 | |||
155 | COMMIT; \ 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 | |||
3 | CREATE 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 | |||
29 | CREATE INDEX "usernames" ON users | ||
30 | ( | ||
31 | "username" ASC, | ||
32 | "lastname" ASC | ||
33 | ); | ||
34 | |||
35 | |||
36 | CREATE 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 | |||
50 | CREATE INDEX session ON agents | ||
51 | ( | ||
52 | "sessionID" ASC | ||
53 | ); | ||
54 | |||
55 | CREATE INDEX ssession ON agents | ||
56 | ( | ||
57 | "secureSessionID" ASC | ||
58 | ); | ||
59 | |||
60 | |||
61 | CREATE 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 | |||
68 | CREATE 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 | |||
104 | BEGIN TRANSACTION; | ||
105 | |||
106 | ALTER TABLE users ADD "homeRegionID" varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; | ||
107 | ALTER TABLE users ADD "userFlags" int NOT NULL default 0; | ||
108 | ALTER TABLE users ADD "godLevel" int NOT NULL default 0; | ||
109 | ALTER TABLE users ADD "customType" varchar(32) not null default ''; | ||
110 | ALTER TABLE users ADD "partner" varchar(36) not null default '00000000-0000-0000-0000-000000000000'; | ||
111 | |||
112 | COMMIT; | ||
113 | |||
114 | |||
115 | :VERSION 3 | ||
116 | |||
117 | BEGIN TRANSACTION; | ||
118 | |||
119 | CREATE 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 | |||
125 | CREATE INDEX IX_avatarattachments ON avatarattachments | ||
126 | ( | ||
127 | "UUID" | ||
128 | ); | ||
129 | |||
130 | COMMIT; | ||
131 | |||
132 | |||
133 | :VERSION 4 | ||
134 | |||
135 | BEGIN TRANSACTION; | ||
136 | |||
137 | CREATE 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 | |||
145 | INSERT 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 | |||
149 | DROP TABLE userfriends; | ||
150 | |||
151 | alter table Tmp_userfriends rename to userfriends; | ||
152 | |||
153 | CREATE INDEX IX_userfriends_ownerID ON userfriends | ||
154 | ( | ||
155 | "ownerID" | ||
156 | ); | ||
157 | |||
158 | CREATE INDEX IX_userfriends_friendID ON userfriends | ||
159 | ( | ||
160 | "friendID" | ||
161 | ); | ||
162 | |||
163 | COMMIT; | ||
164 | |||
165 | |||
166 | :VERSION 5 | ||
167 | |||
168 | BEGIN TRANSACTION; | ||
169 | |||
170 | ALTER TABLE users add "email" varchar(250); | ||
171 | |||
172 | COMMIT; | ||
173 | |||
174 | |||
175 | :VERSION 6 | ||
176 | |||
177 | BEGIN TRANSACTION; | ||
178 | |||
179 | CREATE 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 | |||
212 | INSERT 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 | |||
216 | DROP TABLE users; | ||
217 | |||
218 | alter table Tmp_users rename to users; | ||
219 | |||
220 | ALTER TABLE users ADD CONSTRAINT | ||
221 | PK__users__65A475E737A5467C PRIMARY KEY | ||
222 | ( | ||
223 | "UUID" | ||
224 | ); | ||
225 | |||
226 | CREATE INDEX "usernames" ON users | ||
227 | ( | ||
228 | "username", | ||
229 | "lastname" | ||
230 | ); | ||
231 | |||
232 | COMMIT; | ||
233 | |||
234 | |||
235 | :VERSION 7 | ||
236 | |||
237 | BEGIN TRANSACTION; | ||
238 | |||
239 | CREATE 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 | |||
254 | INSERT 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 | |||
258 | DROP TABLE agents; | ||
259 | |||
260 | alter table Tmp_agents rename to agents; | ||
261 | |||
262 | ALTER TABLE agents ADD CONSTRAINT | ||
263 | PK__agents__65A475E749C3F6B7 PRIMARY KEY | ||
264 | ( | ||
265 | "UUID" | ||
266 | ) ; | ||
267 | |||
268 | CREATE INDEX session ON agents | ||
269 | ( | ||
270 | "sessionID" | ||
271 | ); | ||
272 | |||
273 | CREATE INDEX ssession ON agents | ||
274 | ( | ||
275 | "secureSessionID" | ||
276 | ); | ||
277 | |||
278 | COMMIT; | ||
279 | |||
280 | |||
281 | :VERSION 8 | ||
282 | |||
283 | BEGIN TRANSACTION; | ||
284 | |||
285 | CREATE 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 | |||
293 | INSERT INTO Tmp_userfriends ("ownerID", "friendID", "friendPerms", "datetimestamp") | ||
294 | SELECT cast("ownerID" as uuid), cast( "friendID" as uuid), "friendPerms", "datetimestamp" | ||
295 | FROM userfriends; | ||
296 | |||
297 | DROP TABLE userfriends; | ||
298 | |||
299 | alter table Tmp_userfriends rename to userfriends; | ||
300 | |||
301 | CREATE INDEX IX_userfriends_ownerID ON userfriends | ||
302 | ( | ||
303 | "ownerID" | ||
304 | ); | ||
305 | |||
306 | CREATE INDEX IX_userfriends_friendID ON userfriends | ||
307 | ( | ||
308 | "friendID" | ||
309 | ); | ||
310 | |||
311 | COMMIT; | ||
312 | |||
313 | |||
314 | :VERSION 9 | ||
315 | |||
316 | BEGIN TRANSACTION; | ||
317 | |||
318 | CREATE 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 | |||
353 | INSERT 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 | |||
357 | DROP TABLE avatarappearance; | ||
358 | |||
359 | alter table Tmp_avatarappearance rename to avatarappearance; | ||
360 | |||
361 | ALTER TABLE avatarappearance ADD CONSTRAINT | ||
362 | PK__avatarap__7DD115CC4E88ABD4 PRIMARY KEY | ||
363 | ( | ||
364 | "Owner" | ||
365 | ); | ||
366 | |||
367 | COMMIT; | ||
368 | |||
369 | |||
370 | :VERSION 10 | ||
371 | |||
372 | BEGIN TRANSACTION; | ||
373 | |||
374 | CREATE 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 | |||
382 | INSERT 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 | |||
386 | DROP TABLE avatarattachments; | ||
387 | |||
388 | alter table Tmp_avatarattachments rename to avatarattachments; | ||
389 | |||
390 | CREATE INDEX IX_avatarattachments ON avatarattachments | ||
391 | ( | ||
392 | "UUID" | ||
393 | ); | ||
394 | |||
395 | COMMIT; | ||
396 | |||
397 | |||
398 | :VERSION 11 | ||
399 | |||
400 | BEGIN TRANSACTION; | ||
401 | |||
402 | ALTER TABLE users ADD "scopeID" uuid not null default '00000000-0000-0000-0000-000000000000'; | ||
403 | |||
404 | COMMIT; | ||
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 | |||
4 | BEGIN; | ||
5 | |||
6 | CREATE 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 | |||
21 | CREATE TABLE XAssetsData ( | ||
22 | "Hash" char(32) NOT NULL, | ||
23 | "Data" bytea NOT NULL, | ||
24 | PRIMARY KEY ("Hash") | ||
25 | ); | ||
26 | |||
27 | COMMIT; | ||
28 | |||
29 | |||
30 | :VERSION 2 | ||
31 | |||
32 | BEGIN; | ||
33 | |||
34 | ALTER TABLE xassetsmeta ALTER COLUMN "Local" SET DATA TYPE boolean USING CASE WHEN '0' THEN FALSE ELSE TRUE END; | ||
35 | ALTER TABLE xassetsmeta ALTER COLUMN "Temporary" SET DATA TYPE boolean USING CASE WHEN '0' THEN FALSE ELSE TRUE END; | ||
36 | ALTER TABLE xassetsmeta ALTER COLUMN "Hash" SET DATA TYPE char(66); | ||
37 | ALTER TABLE xassetsdata ALTER COLUMN "Hash" SET DATA TYPE char(66); | ||
38 | |||
39 | COMMIT; | ||
40 | |||
41 | :VERSION 3 | ||
42 | |||
43 | BEGIN; | ||
44 | |||
45 | ALTER TABLE xassetsmeta RENAME COLUMN "ID" TO id; | ||
46 | ALTER TABLE xassetsmeta RENAME COLUMN "Hash" TO hash; | ||
47 | ALTER TABLE xassetsmeta RENAME COLUMN "Name" TO name; | ||
48 | ALTER TABLE xassetsmeta RENAME COLUMN "Description" TO description; | ||
49 | ALTER TABLE xassetsmeta RENAME COLUMN "Local" to local; | ||
50 | ALTER TABLE xassetsmeta RENAME COLUMN "Temporary" TO temporary; | ||
51 | ALTER TABLE xassetsmeta RENAME COLUMN "CreateTime" TO create_time; | ||
52 | ALTER TABLE xassetsmeta RENAME COLUMN "AccessTime" TO access_time; | ||
53 | ALTER TABLE xassetsmeta RENAME COLUMN "AssetFlags" TO asset_flags; | ||
54 | ALTER TABLE xassetsmeta RENAME COLUMN "CreatorID" TO creatorid; | ||
55 | ALTER TABLE xassetsmeta DROP CONSTRAINT xassetsmeta_pkey; | ||
56 | ALTER TABLE xassetsmeta ADD PRIMARY KEY (id); | ||
57 | |||
58 | |||
59 | ALTER TABLE xassetsdata RENAME COLUMN "Hash" TO hash; | ||
60 | ALTER TABLE xassetsdata RENAME COLUMN "Data" TO data; | ||
61 | ALTER TABLE xassetsdata DROP CONSTRAINT xassetsdata_pkey; | ||
62 | ALTER TABLE xassetsdata ADD PRIMARY KEY (hash); | ||
63 | |||
64 | COMMIT; | ||
65 | |||
66 | |||
67 | :VERSION 4 | ||
68 | |||
69 | BEGIN; | ||
70 | |||
71 | ALTER TABLE xassetsmeta ALTER COLUMN id SET DATA TYPE uuid USING id::uuid; | ||
72 | ALTER TABLE xassetsmeta ALTER COLUMN hash SET DATA TYPE bytea USING hash::bytea; | ||
73 | ALTER TABLE xassetsdata ALTER COLUMN hash SET DATA TYPE bytea USING hash::bytea; | ||
74 | |||
75 | COMMIT; | ||
76 | |||
77 | :VERSION 5 | ||
78 | |||
79 | BEGIN; | ||
80 | COMMIT; | ||
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 | |||
3 | BEGIN; | ||
4 | |||
5 | CREATE 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 | |||
21 | CREATE 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 | |||
34 | CREATE 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 | |||
45 | CREATE 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 | |||
53 | CREATE 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 | |||
64 | CREATE 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 | |||
81 | CREATE 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 | |||
87 | COMMIT; | ||
88 | |||
89 | :VERSION 2 # -------------------------- | ||
90 | |||
91 | BEGIN; | ||
92 | |||
93 | |||
94 | COMMIT; | ||
95 | |||
96 | |||
97 | |||
98 | :VERSION 3 | ||
99 | |||
100 | BEGIN; | ||
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 | |||
107 | DROP TABLE IF EXISTS os_groups_groups CASCADE; | ||
108 | |||
109 | CREATE 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 | |||
125 | DROP TABLE IF EXISTS os_groups_membership; | ||
126 | |||
127 | CREATE 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 | |||
140 | DROP TABLE IF EXISTS os_groups_roles; | ||
141 | |||
142 | CREATE 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 | |||
153 | DROP TABLE IF EXISTS os_groups_rolemembership; | ||
154 | |||
155 | CREATE 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 | |||
163 | DROP TABLE IF EXISTS os_groups_invites; | ||
164 | |||
165 | CREATE 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 | |||
175 | DROP TABLE IF EXISTS os_groups_notices; | ||
176 | |||
177 | CREATE 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 | |||
193 | DROP TABLE IF EXISTS os_groups_principals; | ||
194 | |||
195 | CREATE 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 | |||
201 | COMMIT; | ||
202 | |||
203 | :VERSION 4 | ||
204 | |||
205 | BEGIN; | ||
206 | |||
207 | ALTER TABLE IF EXISTS os_groups_notices | ||
208 | ALTER COLUMN "AttachmentItemID" SET DEFAULT '00000000-0000-0000-0000-000000000000' | ||
209 | ; | ||
210 | |||
211 | COMMIT; | ||