diff options
author | Adam Frisby | 2008-12-01 07:50:38 +0000 |
---|---|---|
committer | Adam Frisby | 2008-12-01 07:50:38 +0000 |
commit | 4ed7ca62b153817a142ded621cc5c5c1b1c055c5 (patch) | |
tree | e8cad8abe60b6becd22da1a8d2c2dfefbf6f9784 /OpenSim | |
parent | Mantis #2729 (diff) | |
download | opensim-SC_OLD-4ed7ca62b153817a142ded621cc5c5c1b1c055c5.zip opensim-SC_OLD-4ed7ca62b153817a142ded621cc5c5c1b1c055c5.tar.gz opensim-SC_OLD-4ed7ca62b153817a142ded621cc5c5c1b1c055c5.tar.bz2 opensim-SC_OLD-4ed7ca62b153817a142ded621cc5c5c1b1c055c5.tar.xz |
* From Mantis#2701 - Implements NHibernate data adapter, adds support for MsSql2005 to NHibernate.
* Patch courtesy of Adminotech and realXtend. Thanks!
Diffstat (limited to 'OpenSim')
17 files changed, 509 insertions, 387 deletions
diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs index 8fbf789..332b8ec 100644 --- a/OpenSim/Data/Migration.cs +++ b/OpenSim/Data/Migration.cs | |||
@@ -82,6 +82,7 @@ namespace OpenSim.Data | |||
82 | // private static readonly string _migrations_init = "insert into migrations values('migrations', 1)"; | 82 | // private static readonly string _migrations_init = "insert into migrations values('migrations', 1)"; |
83 | // private static readonly string _migrations_find = "select version from migrations where name='migrations'"; | 83 | // private static readonly string _migrations_find = "select version from migrations where name='migrations'"; |
84 | 84 | ||
85 | |||
85 | public Migration(DbConnection conn, Assembly assem, string type) | 86 | public Migration(DbConnection conn, Assembly assem, string type) |
86 | { | 87 | { |
87 | _type = type; | 88 | _type = type; |
@@ -112,6 +113,7 @@ namespace OpenSim.Data | |||
112 | DbCommand cmd = _conn.CreateCommand(); | 113 | DbCommand cmd = _conn.CreateCommand(); |
113 | cmd.CommandText = _migrations_create; | 114 | cmd.CommandText = _migrations_create; |
114 | cmd.ExecuteNonQuery(); | 115 | cmd.ExecuteNonQuery(); |
116 | cmd.Dispose(); | ||
115 | 117 | ||
116 | InsertVersion("migrations", 1); | 118 | InsertVersion("migrations", 1); |
117 | } | 119 | } |
@@ -135,7 +137,7 @@ namespace OpenSim.Data | |||
135 | int newversion = kvp.Key; | 137 | int newversion = kvp.Key; |
136 | cmd.CommandText = kvp.Value; | 138 | cmd.CommandText = kvp.Value; |
137 | // we need to up the command timeout to infinite as we might be doing long migrations. | 139 | // we need to up the command timeout to infinite as we might be doing long migrations. |
138 | cmd.CommandTimeout = 0; | 140 | //cmd.CommandTimeout = 0; |
139 | cmd.ExecuteNonQuery(); | 141 | cmd.ExecuteNonQuery(); |
140 | 142 | ||
141 | if (version == 0) | 143 | if (version == 0) |
@@ -147,6 +149,7 @@ namespace OpenSim.Data | |||
147 | UpdateVersion(_type, newversion); | 149 | UpdateVersion(_type, newversion); |
148 | } | 150 | } |
149 | version = newversion; | 151 | version = newversion; |
152 | cmd.Dispose(); | ||
150 | } | 153 | } |
151 | } | 154 | } |
152 | 155 | ||
@@ -189,7 +192,7 @@ namespace OpenSim.Data | |||
189 | DbCommand cmd = conn.CreateCommand(); | 192 | DbCommand cmd = conn.CreateCommand(); |
190 | try | 193 | try |
191 | { | 194 | { |
192 | cmd.CommandText = "select version from migrations where name='" + type + "' limit 1"; | 195 | cmd.CommandText = "select version from migrations where name='" + type +"' order by version desc"; |
193 | using (IDataReader reader = cmd.ExecuteReader()) | 196 | using (IDataReader reader = cmd.ExecuteReader()) |
194 | { | 197 | { |
195 | if (reader.Read()) | 198 | if (reader.Read()) |
@@ -203,6 +206,7 @@ namespace OpenSim.Data | |||
203 | { | 206 | { |
204 | // Something went wrong, so we're version 0 | 207 | // Something went wrong, so we're version 0 |
205 | } | 208 | } |
209 | cmd.Dispose(); | ||
206 | return version; | 210 | return version; |
207 | } | 211 | } |
208 | 212 | ||
@@ -212,6 +216,7 @@ namespace OpenSim.Data | |||
212 | cmd.CommandText = "insert into migrations(name, version) values('" + type + "', " + version + ")"; | 216 | cmd.CommandText = "insert into migrations(name, version) values('" + type + "', " + version + ")"; |
213 | m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version); | 217 | m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version); |
214 | cmd.ExecuteNonQuery(); | 218 | cmd.ExecuteNonQuery(); |
219 | cmd.Dispose(); | ||
215 | } | 220 | } |
216 | 221 | ||
217 | private void UpdateVersion(string type, int version) | 222 | private void UpdateVersion(string type, int version) |
@@ -220,6 +225,7 @@ namespace OpenSim.Data | |||
220 | cmd.CommandText = "update migrations set version=" + version + " where name='" + type + "'"; | 225 | cmd.CommandText = "update migrations set version=" + version + " where name='" + type + "'"; |
221 | m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version); | 226 | m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version); |
222 | cmd.ExecuteNonQuery(); | 227 | cmd.ExecuteNonQuery(); |
228 | cmd.Dispose(); | ||
223 | } | 229 | } |
224 | 230 | ||
225 | // private SortedList<int, string> GetAllMigrations() | 231 | // private SortedList<int, string> GetAllMigrations() |
diff --git a/OpenSim/Data/NHibernate/LLQuaternionUserType.cs b/OpenSim/Data/NHibernate/LLQuaternionUserType.cs index 7431433..0cd5c6f 100644 --- a/OpenSim/Data/NHibernate/LLQuaternionUserType.cs +++ b/OpenSim/Data/NHibernate/LLQuaternionUserType.cs | |||
@@ -78,7 +78,11 @@ namespace OpenSim.Data.NHibernate | |||
78 | int w = rs.GetOrdinal(names[3]); | 78 | int w = rs.GetOrdinal(names[3]); |
79 | if (!rs.IsDBNull(x)) | 79 | if (!rs.IsDBNull(x)) |
80 | { | 80 | { |
81 | quat = new Quaternion((Single)rs[x], (Single)rs[y], (Single)rs[z], (Single)rs[w]); | 81 | float X = (Single)Convert.ToDouble(rs[x].ToString()); |
82 | float Y = (Single)Convert.ToDouble(rs[y].ToString()); | ||
83 | float Z = (Single)Convert.ToDouble(rs[z].ToString()); | ||
84 | float W = (Single)Convert.ToDouble(rs[w].ToString()); | ||
85 | quat = new Quaternion(X, Y, Z, W); | ||
82 | } | 86 | } |
83 | return quat; | 87 | return quat; |
84 | } | 88 | } |
diff --git a/OpenSim/Data/NHibernate/LLVector3UserType.cs b/OpenSim/Data/NHibernate/LLVector3UserType.cs index cdd15ec..25a2bc6 100644 --- a/OpenSim/Data/NHibernate/LLVector3UserType.cs +++ b/OpenSim/Data/NHibernate/LLVector3UserType.cs | |||
@@ -74,9 +74,12 @@ namespace OpenSim.Data.NHibernate | |||
74 | int x = rs.GetOrdinal(names[0]); | 74 | int x = rs.GetOrdinal(names[0]); |
75 | int y = rs.GetOrdinal(names[1]); | 75 | int y = rs.GetOrdinal(names[1]); |
76 | int z = rs.GetOrdinal(names[2]); | 76 | int z = rs.GetOrdinal(names[2]); |
77 | if (!rs.IsDBNull(x)) | 77 | if (!rs.IsDBNull(x) && !rs.IsDBNull(y) && !rs.IsDBNull(z)) |
78 | { | 78 | { |
79 | vector = new Vector3((Single)rs[x], (Single)rs[y], (Single)rs[z]); | 79 | float X = (Single)Convert.ToDouble(rs[x].ToString()); |
80 | float Y = (Single)Convert.ToDouble(rs[y].ToString()); | ||
81 | float Z = (Single)Convert.ToDouble(rs[z].ToString()); | ||
82 | vector = new Vector3(X, Y, Z); | ||
80 | } | 83 | } |
81 | return vector; | 84 | return vector; |
82 | } | 85 | } |
diff --git a/OpenSim/Data/NHibernate/NHibernateAssetData.cs b/OpenSim/Data/NHibernate/NHibernateAssetData.cs index 6ee527e..90d41e3 100644 --- a/OpenSim/Data/NHibernate/NHibernateAssetData.cs +++ b/OpenSim/Data/NHibernate/NHibernateAssetData.cs | |||
@@ -33,10 +33,7 @@ using System.Text.RegularExpressions; | |||
33 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using log4net; | 34 | using log4net; |
35 | using NHibernate; | 35 | using NHibernate; |
36 | using NHibernate.Cfg; | ||
37 | using NHibernate.Expression; | ||
38 | using NHibernate.Mapping.Attributes; | 36 | using NHibernate.Mapping.Attributes; |
39 | using NHibernate.Tool.hbm2ddl; | ||
40 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
41 | using Environment=NHibernate.Cfg.Environment; | 38 | using Environment=NHibernate.Cfg.Environment; |
42 | 39 | ||
@@ -49,9 +46,7 @@ namespace OpenSim.Data.NHibernate | |||
49 | { | 46 | { |
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
51 | 48 | ||
52 | private Configuration cfg; | 49 | private NHibernateManager manager; |
53 | private ISessionFactory factory; | ||
54 | private ISession session; | ||
55 | 50 | ||
56 | override public void Dispose() { } | 51 | override public void Dispose() { } |
57 | 52 | ||
@@ -62,79 +57,23 @@ namespace OpenSim.Data.NHibernate | |||
62 | 57 | ||
63 | public override void Initialise(string connect) | 58 | public override void Initialise(string connect) |
64 | { | 59 | { |
65 | // Split out the dialect, driver, and connect string | ||
66 | char[] split = {';'}; | ||
67 | string[] parts = connect.Split(split, 3); | ||
68 | if (parts.Length != 3) | ||
69 | { | ||
70 | // TODO: make this a real exception type | ||
71 | throw new Exception("Malformed Inventory connection string '" + connect + "'"); | ||
72 | } | ||
73 | |||
74 | string dialect = parts[0]; | ||
75 | |||
76 | // NHibernate setup | ||
77 | cfg = new Configuration(); | ||
78 | cfg.SetProperty(Environment.ConnectionProvider, | ||
79 | "NHibernate.Connection.DriverConnectionProvider"); | ||
80 | cfg.SetProperty(Environment.Dialect, | ||
81 | "NHibernate.Dialect." + dialect); | ||
82 | cfg.SetProperty(Environment.ConnectionDriver, | ||
83 | "NHibernate.Driver." + parts[1]); | ||
84 | cfg.SetProperty(Environment.ConnectionString, parts[2]); | ||
85 | cfg.AddAssembly("OpenSim.Data.NHibernate"); | ||
86 | |||
87 | 60 | ||
88 | 61 | m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateAssetData"); | |
89 | HbmSerializer.Default.Validate = true; | 62 | manager = new NHibernateManager(connect, "AssetStore"); |
90 | using (MemoryStream stream = | ||
91 | HbmSerializer.Default.Serialize(Assembly.GetExecutingAssembly())) | ||
92 | cfg.AddInputStream(stream); | ||
93 | |||
94 | factory = cfg.BuildSessionFactory(); | ||
95 | session = factory.OpenSession(); | ||
96 | |||
97 | // This actually does the roll forward assembly stuff | ||
98 | Assembly assem = GetType().Assembly; | ||
99 | Migration m = new Migration((System.Data.Common.DbConnection)factory.ConnectionProvider.GetConnection(), assem, dialect, "AssetStore"); | ||
100 | m.Update(); | ||
101 | 63 | ||
102 | } | 64 | } |
103 | 65 | ||
104 | override public AssetBase FetchAsset(UUID uuid) | 66 | override public AssetBase FetchAsset(UUID uuid) |
105 | { | 67 | { |
106 | try | 68 | return (AssetBase)manager.Load(typeof(AssetBase), uuid); |
107 | { | ||
108 | return session.Load(typeof(AssetBase), uuid) as AssetBase; | ||
109 | } | ||
110 | catch (ObjectNotFoundException) | ||
111 | { | ||
112 | m_log.ErrorFormat("[NHIBERNATE] no such asset {0}", uuid); | ||
113 | return null; | ||
114 | } | ||
115 | catch (Exception e) | ||
116 | { | ||
117 | m_log.Error("[NHIBERNATE] unexpected exception: ", e); | ||
118 | return null; | ||
119 | } | ||
120 | } | 69 | } |
121 | 70 | ||
122 | private void Save(AssetBase asset) | 71 | private void Save(AssetBase asset) |
123 | { | 72 | { |
124 | try | 73 | AssetBase temp = (AssetBase)manager.Load(typeof(AssetBase), asset.FullID); |
74 | if (temp == null) | ||
125 | { | 75 | { |
126 | // a is not used anywhere? | 76 | manager.Save(asset); |
127 | // AssetBase a = session.Load(typeof(AssetBase), asset.FullID) as AssetBase; | ||
128 | session.Load(typeof(AssetBase), asset.FullID); | ||
129 | } | ||
130 | catch (ObjectNotFoundException) | ||
131 | { | ||
132 | session.Save(asset); | ||
133 | session.Flush(); | ||
134 | } | ||
135 | catch (Exception e) | ||
136 | { | ||
137 | m_log.Error("[NHIBERNATE] issue saving asset", e); | ||
138 | } | 77 | } |
139 | } | 78 | } |
140 | 79 | ||
@@ -147,7 +86,7 @@ namespace OpenSim.Data.NHibernate | |||
147 | override public void UpdateAsset(AssetBase asset) | 86 | override public void UpdateAsset(AssetBase asset) |
148 | { | 87 | { |
149 | m_log.InfoFormat("[NHIBERNATE] updating asset {0}", asset.FullID); | 88 | m_log.InfoFormat("[NHIBERNATE] updating asset {0}", asset.FullID); |
150 | Save(asset); | 89 | manager.Update(asset); |
151 | } | 90 | } |
152 | 91 | ||
153 | // private void LogAssetLoad(AssetBase asset) | 92 | // private void LogAssetLoad(AssetBase asset) |
diff --git a/OpenSim/Data/NHibernate/NHibernateInventoryData.cs b/OpenSim/Data/NHibernate/NHibernateInventoryData.cs index bceb5d5..f7de8eb 100644 --- a/OpenSim/Data/NHibernate/NHibernateInventoryData.cs +++ b/OpenSim/Data/NHibernate/NHibernateInventoryData.cs | |||
@@ -33,10 +33,7 @@ using System.Text.RegularExpressions; | |||
33 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using log4net; | 34 | using log4net; |
35 | using NHibernate; | 35 | using NHibernate; |
36 | using NHibernate.Cfg; | 36 | using NHibernate.Criterion; |
37 | using NHibernate.Expression; | ||
38 | using NHibernate.Mapping.Attributes; | ||
39 | using NHibernate.Tool.hbm2ddl; | ||
40 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
41 | using Environment=NHibernate.Cfg.Environment; | 38 | using Environment=NHibernate.Cfg.Environment; |
42 | 39 | ||
@@ -46,9 +43,7 @@ namespace OpenSim.Data.NHibernate | |||
46 | { | 43 | { |
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | 45 | ||
49 | private Configuration cfg; | 46 | private NHibernateManager manager; |
50 | private ISessionFactory factory; | ||
51 | private ISession session; | ||
52 | 47 | ||
53 | public void Initialise() | 48 | public void Initialise() |
54 | { | 49 | { |
@@ -61,35 +56,8 @@ namespace OpenSim.Data.NHibernate | |||
61 | /// </summary> | 56 | /// </summary> |
62 | public void Initialise(string connect) | 57 | public void Initialise(string connect) |
63 | { | 58 | { |
64 | // Split out the dialect, driver, and connect string | 59 | m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateInventoryData"); |
65 | char[] split = {';'}; | 60 | manager = new NHibernateManager(connect, "InventoryStore"); |
66 | string[] parts = connect.Split(split, 3); | ||
67 | if (parts.Length != 3) | ||
68 | { | ||
69 | // TODO: make this a real exception type | ||
70 | throw new Exception("Malformed Inventory connection string '" + connect + "'"); | ||
71 | } | ||
72 | string dialect = parts[0]; | ||
73 | |||
74 | // Establish NHibernate Connection | ||
75 | cfg = new Configuration(); | ||
76 | cfg.SetProperty(Environment.ConnectionProvider, | ||
77 | "NHibernate.Connection.DriverConnectionProvider"); | ||
78 | cfg.SetProperty(Environment.Dialect, | ||
79 | "NHibernate.Dialect." + parts[0]); | ||
80 | cfg.SetProperty(Environment.ConnectionDriver, | ||
81 | "NHibernate.Driver." + parts[1]); | ||
82 | cfg.SetProperty(Environment.ConnectionString, parts[2]); | ||
83 | cfg.AddAssembly("OpenSim.Data.NHibernate"); | ||
84 | |||
85 | factory = cfg.BuildSessionFactory(); | ||
86 | session = factory.OpenSession(); | ||
87 | |||
88 | // This actually does the roll forward assembly stuff | ||
89 | Assembly assem = GetType().Assembly; | ||
90 | Migration m = new Migration((System.Data.Common.DbConnection)factory.ConnectionProvider.GetConnection(), assem, dialect, "InventoryStore"); | ||
91 | m.Update(); | ||
92 | |||
93 | } | 61 | } |
94 | 62 | ||
95 | /***************************************************************** | 63 | /***************************************************************** |
@@ -109,7 +77,8 @@ namespace OpenSim.Data.NHibernate | |||
109 | { | 77 | { |
110 | try | 78 | try |
111 | { | 79 | { |
112 | return session.Load(typeof(InventoryItemBase), item) as InventoryItemBase; | 80 | m_log.InfoFormat("[NHIBERNATE] getInventoryItem {0}", item); |
81 | return (InventoryItemBase)manager.Load(typeof(InventoryItemBase), item); | ||
113 | } | 82 | } |
114 | catch | 83 | catch |
115 | { | 84 | { |
@@ -126,15 +95,11 @@ namespace OpenSim.Data.NHibernate | |||
126 | { | 95 | { |
127 | if (!ExistsItem(item.ID)) | 96 | if (!ExistsItem(item.ID)) |
128 | { | 97 | { |
129 | using (ITransaction transaction = session.BeginTransaction()) | 98 | manager.Save(item); |
130 | { | ||
131 | session.Save(item); | ||
132 | transaction.Commit(); | ||
133 | } | ||
134 | } | 99 | } |
135 | else | 100 | else |
136 | { | 101 | { |
137 | m_log.ErrorFormat("Attempted to add Inventory Item {0} that already exists, updating instead", item.ID); | 102 | m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Item {0} that already exists, updating instead", item.ID); |
138 | updateInventoryItem(item); | 103 | updateInventoryItem(item); |
139 | } | 104 | } |
140 | } | 105 | } |
@@ -147,15 +112,11 @@ namespace OpenSim.Data.NHibernate | |||
147 | { | 112 | { |
148 | if (ExistsItem(item.ID)) | 113 | if (ExistsItem(item.ID)) |
149 | { | 114 | { |
150 | using (ITransaction transaction = session.BeginTransaction()) | 115 | manager.Update(item); |
151 | { | ||
152 | session.Update(item); | ||
153 | transaction.Commit(); | ||
154 | } | ||
155 | } | 116 | } |
156 | else | 117 | else |
157 | { | 118 | { |
158 | m_log.ErrorFormat("Attempted to add Inventory Item {0} that already exists", item.ID); | 119 | m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Item {0} that already exists", item.ID); |
159 | } | 120 | } |
160 | } | 121 | } |
161 | 122 | ||
@@ -165,11 +126,16 @@ namespace OpenSim.Data.NHibernate | |||
165 | /// <param name="item"></param> | 126 | /// <param name="item"></param> |
166 | public void deleteInventoryItem(UUID itemID) | 127 | public void deleteInventoryItem(UUID itemID) |
167 | { | 128 | { |
168 | using (ITransaction transaction = session.BeginTransaction()) | 129 | InventoryItemBase item = (InventoryItemBase)manager.Load(typeof(InventoryItemBase), itemID); |
130 | if (item != null) | ||
169 | { | 131 | { |
170 | session.Delete(itemID); | 132 | manager.Delete(item); |
171 | transaction.Commit(); | ||
172 | } | 133 | } |
134 | else | ||
135 | { | ||
136 | m_log.ErrorFormat("[NHIBERNATE] Error deleting InventoryItemBase {0}", itemID); | ||
137 | } | ||
138 | |||
173 | } | 139 | } |
174 | 140 | ||
175 | /// <summary> | 141 | /// <summary> |
@@ -181,11 +147,11 @@ namespace OpenSim.Data.NHibernate | |||
181 | { | 147 | { |
182 | try | 148 | try |
183 | { | 149 | { |
184 | return session.Load(typeof(InventoryFolderBase), folder) as InventoryFolderBase; | 150 | return (InventoryFolderBase)manager.Load(typeof(InventoryFolderBase), folder); |
185 | } | 151 | } |
186 | catch | 152 | catch |
187 | { | 153 | { |
188 | m_log.ErrorFormat("Couldn't find inventory item: {0}", folder); | 154 | m_log.ErrorFormat("[NHIBERNATE] Couldn't find inventory item: {0}", folder); |
189 | return null; | 155 | return null; |
190 | } | 156 | } |
191 | } | 157 | } |
@@ -198,15 +164,11 @@ namespace OpenSim.Data.NHibernate | |||
198 | { | 164 | { |
199 | if (!ExistsFolder(folder.ID)) | 165 | if (!ExistsFolder(folder.ID)) |
200 | { | 166 | { |
201 | using (ITransaction transaction = session.BeginTransaction()) | 167 | manager.Save(folder); |
202 | { | ||
203 | session.Save(folder); | ||
204 | transaction.Commit(); | ||
205 | } | ||
206 | } | 168 | } |
207 | else | 169 | else |
208 | { | 170 | { |
209 | m_log.ErrorFormat("Attempted to add Inventory Folder {0} that already exists, updating instead", folder.ID); | 171 | m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Folder {0} that already exists, updating instead", folder.ID); |
210 | updateInventoryFolder(folder); | 172 | updateInventoryFolder(folder); |
211 | } | 173 | } |
212 | } | 174 | } |
@@ -219,15 +181,11 @@ namespace OpenSim.Data.NHibernate | |||
219 | { | 181 | { |
220 | if (ExistsFolder(folder.ID)) | 182 | if (ExistsFolder(folder.ID)) |
221 | { | 183 | { |
222 | using (ITransaction transaction = session.BeginTransaction()) | 184 | manager.Update(folder); |
223 | { | ||
224 | session.Update(folder); | ||
225 | transaction.Commit(); | ||
226 | } | ||
227 | } | 185 | } |
228 | else | 186 | else |
229 | { | 187 | { |
230 | m_log.ErrorFormat("Attempted to add Inventory Folder {0} that already exists", folder.ID); | 188 | m_log.ErrorFormat("[NHIBERNATE] Attempted to add Inventory Folder {0} that already exists", folder.ID); |
231 | } | 189 | } |
232 | } | 190 | } |
233 | 191 | ||
@@ -237,11 +195,16 @@ namespace OpenSim.Data.NHibernate | |||
237 | /// <param name="folder"></param> | 195 | /// <param name="folder"></param> |
238 | public void deleteInventoryFolder(UUID folderID) | 196 | public void deleteInventoryFolder(UUID folderID) |
239 | { | 197 | { |
240 | using (ITransaction transaction = session.BeginTransaction()) | 198 | InventoryFolderBase item = (InventoryFolderBase)manager.Load(typeof(InventoryFolderBase), folderID); |
199 | if (item != null) | ||
200 | { | ||
201 | manager.Delete(item); | ||
202 | } | ||
203 | else | ||
241 | { | 204 | { |
242 | session.Delete(folderID.ToString()); | 205 | m_log.ErrorFormat("[NHIBERNATE] Error deleting InventoryFolderBase {0}", folderID); |
243 | transaction.Commit(); | ||
244 | } | 206 | } |
207 | manager.Delete(folderID); | ||
245 | } | 208 | } |
246 | 209 | ||
247 | // useful private methods | 210 | // useful private methods |
@@ -317,7 +280,7 @@ namespace OpenSim.Data.NHibernate | |||
317 | public List<InventoryItemBase> getInventoryInFolder(UUID folderID) | 280 | public List<InventoryItemBase> getInventoryInFolder(UUID folderID) |
318 | { | 281 | { |
319 | // try { | 282 | // try { |
320 | ICriteria criteria = session.CreateCriteria(typeof(InventoryItemBase)); | 283 | ICriteria criteria = manager.GetSession().CreateCriteria(typeof(InventoryItemBase)); |
321 | criteria.Add(Expression.Eq("Folder", folderID)); | 284 | criteria.Add(Expression.Eq("Folder", folderID)); |
322 | List<InventoryItemBase> list = new List<InventoryItemBase>(); | 285 | List<InventoryItemBase> list = new List<InventoryItemBase>(); |
323 | foreach (InventoryItemBase item in criteria.List()) | 286 | foreach (InventoryItemBase item in criteria.List()) |
@@ -340,7 +303,7 @@ namespace OpenSim.Data.NHibernate | |||
340 | // see InventoryItemBase.getUserRootFolder | 303 | // see InventoryItemBase.getUserRootFolder |
341 | public InventoryFolderBase getUserRootFolder(UUID user) | 304 | public InventoryFolderBase getUserRootFolder(UUID user) |
342 | { | 305 | { |
343 | ICriteria criteria = session.CreateCriteria(typeof(InventoryFolderBase)); | 306 | ICriteria criteria = manager.GetSession().CreateCriteria(typeof(InventoryFolderBase)); |
344 | criteria.Add(Expression.Eq("ParentID", UUID.Zero)); | 307 | criteria.Add(Expression.Eq("ParentID", UUID.Zero)); |
345 | criteria.Add(Expression.Eq("Owner", user)); | 308 | criteria.Add(Expression.Eq("Owner", user)); |
346 | foreach (InventoryFolderBase folder in criteria.List()) | 309 | foreach (InventoryFolderBase folder in criteria.List()) |
@@ -358,7 +321,7 @@ namespace OpenSim.Data.NHibernate | |||
358 | /// <param name="parentID">ID of parent</param> | 321 | /// <param name="parentID">ID of parent</param> |
359 | private void getInventoryFolders(ref List<InventoryFolderBase> folders, UUID parentID) | 322 | private void getInventoryFolders(ref List<InventoryFolderBase> folders, UUID parentID) |
360 | { | 323 | { |
361 | ICriteria criteria = session.CreateCriteria(typeof(InventoryFolderBase)); | 324 | ICriteria criteria = manager.GetSession().CreateCriteria(typeof(InventoryFolderBase)); |
362 | criteria.Add(Expression.Eq("ParentID", parentID)); | 325 | criteria.Add(Expression.Eq("ParentID", parentID)); |
363 | foreach (InventoryFolderBase item in criteria.List()) | 326 | foreach (InventoryFolderBase item in criteria.List()) |
364 | { | 327 | { |
diff --git a/OpenSim/Data/NHibernate/NHibernateManager.cs b/OpenSim/Data/NHibernate/NHibernateManager.cs index 161ec1d..36d84e2 100644 --- a/OpenSim/Data/NHibernate/NHibernateManager.cs +++ b/OpenSim/Data/NHibernate/NHibernateManager.cs | |||
@@ -25,35 +25,141 @@ | |||
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 System; | ||
28 | using System.Reflection; | 29 | using System.Reflection; |
30 | using System.IO; | ||
29 | using log4net; | 31 | using log4net; |
30 | using NHibernate; | 32 | using NHibernate; |
33 | using NHibernate.Cfg; | ||
34 | using NHibernate.Mapping.Attributes; | ||
35 | using NHibernate.Tool.hbm2ddl; | ||
36 | using OpenMetaverse; | ||
37 | using Environment = NHibernate.Cfg.Environment; | ||
31 | 38 | ||
32 | namespace OpenSim.Data.NHibernate | 39 | namespace OpenSim.Data.NHibernate |
33 | { | 40 | { |
34 | internal class NHibernateManager | 41 | public class NHibernateManager |
35 | { | 42 | { |
36 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
37 | 44 | ||
38 | // private ISessionFactory factory; | 45 | private string dialect; |
39 | // private ISession session; | 46 | private Configuration cfg; |
40 | // private ITransaction transaction; | 47 | private ISessionFactory factory; |
48 | private ISession session; | ||
41 | 49 | ||
42 | public NHibernateManager() | 50 | public NHibernateManager(string connect, string store) |
43 | { | 51 | { |
44 | // This is stubbing for now, it will become dynamic later and support different db backends | 52 | |
45 | // NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration(); | 53 | // Split out the dialect, driver, and connect string |
46 | // cfg.Properties[NHibernate.Cfg.Environment.ConnectionProvider] = | 54 | char[] split = { ';' }; |
47 | // "NHibernate.Connection.DriverConnectionProvider"; | 55 | string[] parts = connect.Split(split, 3); |
48 | // cfg.Properties[NHibernate.Cfg.Environment.Dialect] = | 56 | if (parts.Length != 3) |
49 | // "NHibernate.Dialect.SQLite"; | 57 | { |
50 | // cfg.Properties[NHibernate.Cfg.Environment.ConnectionDriver] = | 58 | // TODO: make this a real exception type |
51 | // "NHibernate.Driver.SqliteClientDriver"; | 59 | throw new Exception("Malformed Inventory connection string '" + connect + "'"); |
52 | // cfg.Properties[NHibernate.Cfg.Environment.ConnectionString] = | 60 | } |
53 | // "URI=file:opensim-nh.db,version=3"; | 61 | |
54 | 62 | dialect = parts[0]; | |
55 | // factory = cfg.BuildSessionFactory(); | 63 | |
64 | // NHibernate setup | ||
65 | cfg = new Configuration(); | ||
66 | cfg.SetProperty(Environment.ConnectionProvider, | ||
67 | "NHibernate.Connection.DriverConnectionProvider"); | ||
68 | cfg.SetProperty(Environment.Dialect, | ||
69 | "NHibernate.Dialect." + dialect); | ||
70 | cfg.SetProperty(Environment.ConnectionDriver, | ||
71 | "NHibernate.Driver." + parts[1]); | ||
72 | cfg.SetProperty(Environment.ConnectionString, parts[2]); | ||
73 | cfg.AddAssembly("OpenSim.Data.NHibernate"); | ||
74 | |||
75 | //To create sql file uncomment code below and write the name of the file | ||
76 | //SchemaExport exp = new SchemaExport(cfg); | ||
77 | //exp.SetOutputFile("nameofthefile.sql"); | ||
78 | //exp.Create(false, true); | ||
79 | |||
80 | HbmSerializer.Default.Validate = true; | ||
81 | using (MemoryStream stream = | ||
82 | HbmSerializer.Default.Serialize(Assembly.GetExecutingAssembly())) | ||
83 | cfg.AddInputStream(stream); | ||
84 | |||
85 | factory = cfg.BuildSessionFactory(); | ||
86 | session = factory.OpenSession(); | ||
87 | |||
88 | Assembly assem = GetType().Assembly; | ||
89 | Migration m = new Migration((System.Data.Common.DbConnection)factory.ConnectionProvider.GetConnection(), assem, dialect, store); | ||
90 | m.Update(); | ||
56 | } | 91 | } |
57 | 92 | ||
93 | public object Load(Type type, UUID uuid) | ||
94 | { | ||
95 | object obj = null; | ||
96 | try | ||
97 | { | ||
98 | obj = session.Load(type, uuid); | ||
99 | } | ||
100 | catch (Exception) | ||
101 | { | ||
102 | m_log.ErrorFormat("[NHIBERNATE] {0} not found with ID {1} ", type.Name, uuid); | ||
103 | } | ||
104 | return obj; | ||
105 | |||
106 | } | ||
107 | |||
108 | public bool Save(object obj) | ||
109 | { | ||
110 | try | ||
111 | { | ||
112 | session.BeginTransaction(); | ||
113 | session.Save(obj); | ||
114 | session.Transaction.Commit(); | ||
115 | session.Flush(); | ||
116 | return true; | ||
117 | } | ||
118 | catch (Exception e) | ||
119 | { | ||
120 | m_log.Error("[NHIBERNATE] issue saving object ", e); | ||
121 | } | ||
122 | return false; | ||
123 | } | ||
124 | |||
125 | public bool Update(object obj) | ||
126 | { | ||
127 | try | ||
128 | { | ||
129 | session.BeginTransaction(); | ||
130 | session.Update(obj); | ||
131 | session.Transaction.Commit(); | ||
132 | session.Flush(); | ||
133 | return true; | ||
134 | } | ||
135 | catch (Exception e) | ||
136 | { | ||
137 | m_log.Error("[NHIBERNATE] issue updating object ", e); | ||
138 | } | ||
139 | return false; | ||
140 | } | ||
141 | |||
142 | public bool Delete(object obj) | ||
143 | { | ||
144 | try | ||
145 | { | ||
146 | session.BeginTransaction(); | ||
147 | session.Delete(obj); | ||
148 | session.Transaction.Commit(); | ||
149 | session.Flush(); | ||
150 | return true; | ||
151 | } | ||
152 | catch (Exception e) | ||
153 | { | ||
154 | |||
155 | m_log.Error("[NHIBERNATE] issue deleting object ", e); | ||
156 | } | ||
157 | return false; | ||
158 | } | ||
159 | |||
160 | public ISession GetSession() | ||
161 | { | ||
162 | return session; | ||
163 | } | ||
58 | } | 164 | } |
59 | } | 165 | } |
diff --git a/OpenSim/Data/NHibernate/NHibernateRegionData.cs b/OpenSim/Data/NHibernate/NHibernateRegionData.cs index 475cd71..0aba58c 100644 --- a/OpenSim/Data/NHibernate/NHibernateRegionData.cs +++ b/OpenSim/Data/NHibernate/NHibernateRegionData.cs | |||
@@ -34,10 +34,7 @@ using System.Text.RegularExpressions; | |||
34 | using OpenMetaverse; | 34 | using OpenMetaverse; |
35 | using log4net; | 35 | using log4net; |
36 | using NHibernate; | 36 | using NHibernate; |
37 | using NHibernate.Cfg; | 37 | using NHibernate.Criterion; |
38 | using NHibernate.Expression; | ||
39 | using NHibernate.Mapping.Attributes; | ||
40 | using NHibernate.Tool.hbm2ddl; | ||
41 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
42 | using OpenSim.Region.Environment.Interfaces; | 39 | using OpenSim.Region.Environment.Interfaces; |
43 | using OpenSim.Region.Environment.Scenes; | 40 | using OpenSim.Region.Environment.Scenes; |
@@ -52,51 +49,12 @@ namespace OpenSim.Data.NHibernate | |||
52 | { | 49 | { |
53 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
54 | 51 | ||
55 | private Configuration cfg; | 52 | private NHibernateManager manager; |
56 | private ISessionFactory factory; | ||
57 | private ISession session; | ||
58 | |||
59 | // public void Initialise() | ||
60 | // { | ||
61 | // Initialise("SQLiteDialect;SqliteClientDriver;URI=file:OpenSim.db,version=3", true); | ||
62 | // } | ||
63 | 53 | ||
64 | public void Initialise(string connect) | 54 | public void Initialise(string connect) |
65 | { | 55 | { |
66 | // Split out the dialect, driver, and connect string | 56 | m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateRegionData"); |
67 | char[] split = {';'}; | 57 | manager = new NHibernateManager(connect, "RegionStore"); |
68 | string[] parts = connect.Split(split, 3); | ||
69 | if (parts.Length != 3) | ||
70 | { | ||
71 | // TODO: make this a real exception type | ||
72 | throw new Exception("Malformed Region connection string '" + connect + "'"); | ||
73 | } | ||
74 | |||
75 | string dialect = parts[0]; | ||
76 | |||
77 | // NHibernate setup | ||
78 | cfg = new Configuration(); | ||
79 | cfg.SetProperty(Environment.ConnectionProvider, | ||
80 | "NHibernate.Connection.DriverConnectionProvider"); | ||
81 | cfg.SetProperty(Environment.Dialect, | ||
82 | "NHibernate.Dialect." + dialect); | ||
83 | cfg.SetProperty(Environment.ConnectionDriver, | ||
84 | "NHibernate.Driver." + parts[1]); | ||
85 | cfg.SetProperty(Environment.ConnectionString, parts[2]); | ||
86 | cfg.AddAssembly("OpenSim.Data.NHibernate"); | ||
87 | |||
88 | HbmSerializer.Default.Validate = true; | ||
89 | using (MemoryStream stream = | ||
90 | HbmSerializer.Default.Serialize(Assembly.GetExecutingAssembly())) | ||
91 | cfg.AddInputStream(stream); | ||
92 | |||
93 | factory = cfg.BuildSessionFactory(); | ||
94 | session = factory.OpenSession(); | ||
95 | |||
96 | // This actually does the roll forward assembly stuff | ||
97 | Assembly assem = GetType().Assembly; | ||
98 | Migration m = new Migration((System.Data.Common.DbConnection)factory.ConnectionProvider.GetConnection(), assem, dialect, "RegionStore"); | ||
99 | m.Update(); | ||
100 | } | 58 | } |
101 | 59 | ||
102 | /*********************************************************************** | 60 | /*********************************************************************** |
@@ -122,15 +80,18 @@ namespace OpenSim.Data.NHibernate | |||
122 | { | 80 | { |
123 | try | 81 | try |
124 | { | 82 | { |
125 | SceneObjectPart old = session.Load(typeof(SceneObjectPart), p.UUID) as SceneObjectPart; | 83 | SceneObjectPart old = (SceneObjectPart)manager.Load(typeof(SceneObjectPart), p.UUID); |
126 | session.Evict(old); | 84 | if (old != null) |
127 | session.Update(p); | 85 | { |
128 | m_log.InfoFormat("[NHIBERNATE] updating object {0}", p.UUID); | 86 | m_log.InfoFormat("[NHIBERNATE] updating object {0}", p.UUID); |
129 | } | 87 | manager.Update(old); |
130 | catch (ObjectNotFoundException) | 88 | } |
131 | { | 89 | else |
132 | m_log.InfoFormat("[NHIBERNATE] saving object {0}", p.UUID); | 90 | { |
133 | session.Save(p); | 91 | m_log.InfoFormat("[NHIBERNATE] saving object {0}", p.UUID); |
92 | manager.Save(p); | ||
93 | } | ||
94 | |||
134 | } | 95 | } |
135 | catch (Exception e) | 96 | catch (Exception e) |
136 | { | 97 | { |
@@ -142,15 +103,19 @@ namespace OpenSim.Data.NHibernate | |||
142 | { | 103 | { |
143 | try | 104 | try |
144 | { | 105 | { |
145 | Terrain old = session.Load(typeof(Terrain), t.RegionID) as Terrain; | 106 | |
146 | session.Evict(old); | 107 | Terrain old = (Terrain)manager.Load(typeof(Terrain), t.RegionID); |
147 | session.Update(t); | 108 | if (old != null) |
148 | session.Flush(); | 109 | { |
149 | } | 110 | m_log.InfoFormat("[NHIBERNATE] updating terrain {0}", t.RegionID); |
150 | catch (ObjectNotFoundException) | 111 | manager.Update(old); |
151 | { | 112 | } |
152 | session.Save(t); | 113 | else |
153 | session.Flush(); | 114 | { |
115 | m_log.InfoFormat("[NHIBERNATE] saving terrain {0}", t.RegionID); | ||
116 | manager.Save(t); | ||
117 | } | ||
118 | |||
154 | } | 119 | } |
155 | catch (Exception e) | 120 | catch (Exception e) |
156 | { | 121 | { |
@@ -173,7 +138,6 @@ namespace OpenSim.Data.NHibernate | |||
173 | m_log.InfoFormat("Storing part {0}", part.UUID); | 138 | m_log.InfoFormat("Storing part {0}", part.UUID); |
174 | SaveOrUpdate(part); | 139 | SaveOrUpdate(part); |
175 | } | 140 | } |
176 | session.Flush(); | ||
177 | } | 141 | } |
178 | catch (Exception e) | 142 | catch (Exception e) |
179 | { | 143 | { |
@@ -185,7 +149,7 @@ namespace OpenSim.Data.NHibernate | |||
185 | { | 149 | { |
186 | SceneObjectGroup group = new SceneObjectGroup(); | 150 | SceneObjectGroup group = new SceneObjectGroup(); |
187 | 151 | ||
188 | ICriteria criteria = session.CreateCriteria(typeof(SceneObjectPart)); | 152 | ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart)); |
189 | criteria.Add(Expression.Eq("RegionID", region)); | 153 | criteria.Add(Expression.Eq("RegionID", region)); |
190 | criteria.Add(Expression.Eq("ParentUUID", uuid)); | 154 | criteria.Add(Expression.Eq("ParentUUID", uuid)); |
191 | criteria.AddOrder( Order.Asc("ParentID") ); | 155 | criteria.AddOrder( Order.Asc("ParentID") ); |
@@ -216,9 +180,8 @@ namespace OpenSim.Data.NHibernate | |||
216 | SceneObjectGroup g = LoadObject(obj, regionUUID); | 180 | SceneObjectGroup g = LoadObject(obj, regionUUID); |
217 | foreach (SceneObjectPart p in g.Children.Values) | 181 | foreach (SceneObjectPart p in g.Children.Values) |
218 | { | 182 | { |
219 | session.Delete(p); | 183 | manager.Delete(p); |
220 | } | 184 | } |
221 | session.Flush(); | ||
222 | 185 | ||
223 | m_log.InfoFormat("[REGION DB]: Removing obj: {0} from region: {1}", obj.Guid, regionUUID); | 186 | m_log.InfoFormat("[REGION DB]: Removing obj: {0} from region: {1}", obj.Guid, regionUUID); |
224 | 187 | ||
@@ -234,7 +197,7 @@ namespace OpenSim.Data.NHibernate | |||
234 | Dictionary<UUID, SceneObjectGroup> SOG = new Dictionary<UUID, SceneObjectGroup>(); | 197 | Dictionary<UUID, SceneObjectGroup> SOG = new Dictionary<UUID, SceneObjectGroup>(); |
235 | List<SceneObjectGroup> ret = new List<SceneObjectGroup>(); | 198 | List<SceneObjectGroup> ret = new List<SceneObjectGroup>(); |
236 | 199 | ||
237 | ICriteria criteria = session.CreateCriteria(typeof(SceneObjectPart)); | 200 | ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart)); |
238 | criteria.Add(Expression.Eq("RegionID", regionUUID)); | 201 | criteria.Add(Expression.Eq("RegionID", regionUUID)); |
239 | criteria.AddOrder( Order.Asc("ParentID") ); | 202 | criteria.AddOrder( Order.Asc("ParentID") ); |
240 | foreach (SceneObjectPart p in criteria.List()) | 203 | foreach (SceneObjectPart p in criteria.List()) |
@@ -252,7 +215,7 @@ namespace OpenSim.Data.NHibernate | |||
252 | } | 215 | } |
253 | // get the inventory | 216 | // get the inventory |
254 | 217 | ||
255 | ICriteria InvCriteria = session.CreateCriteria(typeof(TaskInventoryItem)); | 218 | ICriteria InvCriteria = manager.GetSession().CreateCriteria(typeof(TaskInventoryItem)); |
256 | InvCriteria.Add(Expression.Eq("ParentPartID", p.UUID)); | 219 | InvCriteria.Add(Expression.Eq("ParentPartID", p.UUID)); |
257 | IList<TaskInventoryItem> inventory = new List<TaskInventoryItem>(); | 220 | IList<TaskInventoryItem> inventory = new List<TaskInventoryItem>(); |
258 | foreach (TaskInventoryItem i in InvCriteria.List()) | 221 | foreach (TaskInventoryItem i in InvCriteria.List()) |
@@ -291,16 +254,14 @@ namespace OpenSim.Data.NHibernate | |||
291 | /// <returns>Heightfield data</returns> | 254 | /// <returns>Heightfield data</returns> |
292 | public double[,] LoadTerrain(UUID regionID) | 255 | public double[,] LoadTerrain(UUID regionID) |
293 | { | 256 | { |
294 | try | 257 | Terrain t = (Terrain)manager.Load(typeof(Terrain), regionID); |
258 | if (t != null) | ||
295 | { | 259 | { |
296 | Terrain t = session.Load(typeof(Terrain), regionID) as Terrain; | ||
297 | return t.Doubles; | 260 | return t.Doubles; |
298 | } | 261 | } |
299 | catch (ObjectNotFoundException) | 262 | |
300 | { | 263 | m_log.Info("No terrain yet"); |
301 | m_log.Info("No terrain yet"); | 264 | return null; |
302 | return null; | ||
303 | } | ||
304 | } | 265 | } |
305 | 266 | ||
306 | /// <summary> | 267 | /// <summary> |
@@ -339,7 +300,7 @@ namespace OpenSim.Data.NHibernate | |||
339 | /// </summary> | 300 | /// </summary> |
340 | public void Shutdown() | 301 | public void Shutdown() |
341 | { | 302 | { |
342 | session.Flush(); | 303 | //session.Flush(); |
343 | } | 304 | } |
344 | 305 | ||
345 | /// <summary> | 306 | /// <summary> |
@@ -397,21 +358,20 @@ namespace OpenSim.Data.NHibernate | |||
397 | /// <param name="items"></param> | 358 | /// <param name="items"></param> |
398 | public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items) | 359 | public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items) |
399 | { | 360 | { |
400 | ICriteria criteria = session.CreateCriteria(typeof(TaskInventoryItem)); | 361 | ICriteria criteria = manager.GetSession().CreateCriteria(typeof(TaskInventoryItem)); |
401 | criteria.Add(Expression.Eq("ParentPartID", primID)); | 362 | criteria.Add(Expression.Eq("ParentPartID", primID)); |
402 | try | 363 | try |
403 | { | 364 | { |
404 | foreach (TaskInventoryItem i in criteria.List()) | 365 | foreach (TaskInventoryItem i in criteria.List()) |
405 | { | 366 | { |
406 | session.Delete(i); | 367 | manager.Delete(i); |
407 | } | 368 | } |
408 | 369 | ||
409 | foreach (TaskInventoryItem i in items) | 370 | foreach (TaskInventoryItem i in items) |
410 | { | 371 | { |
411 | session.Save(i); | 372 | manager.Save(i); |
412 | 373 | ||
413 | } | 374 | } |
414 | session.Flush(); | ||
415 | } | 375 | } |
416 | catch (Exception e) | 376 | catch (Exception e) |
417 | { | 377 | { |
diff --git a/OpenSim/Data/NHibernate/NHibernateUserData.cs b/OpenSim/Data/NHibernate/NHibernateUserData.cs index 3a22dc3..ee0d2b8 100644 --- a/OpenSim/Data/NHibernate/NHibernateUserData.cs +++ b/OpenSim/Data/NHibernate/NHibernateUserData.cs | |||
@@ -33,10 +33,7 @@ using System.Text.RegularExpressions; | |||
33 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using log4net; | 34 | using log4net; |
35 | using NHibernate; | 35 | using NHibernate; |
36 | using NHibernate.Cfg; | 36 | using NHibernate.Criterion; |
37 | using NHibernate.Expression; | ||
38 | using NHibernate.Mapping.Attributes; | ||
39 | using NHibernate.Tool.hbm2ddl; | ||
40 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
41 | using Environment=NHibernate.Cfg.Environment; | 38 | using Environment=NHibernate.Cfg.Environment; |
42 | 39 | ||
@@ -49,9 +46,7 @@ namespace OpenSim.Data.NHibernate | |||
49 | { | 46 | { |
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
51 | 48 | ||
52 | private Configuration cfg; | 49 | private NHibernateManager manager; |
53 | private ISessionFactory factory; | ||
54 | private ISession session; | ||
55 | 50 | ||
56 | public override void Initialise() | 51 | public override void Initialise() |
57 | { | 52 | { |
@@ -61,62 +56,40 @@ namespace OpenSim.Data.NHibernate | |||
61 | 56 | ||
62 | public override void Initialise(string connect) | 57 | public override void Initialise(string connect) |
63 | { | 58 | { |
64 | char[] split = {';'}; | 59 | m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateUserData"); |
65 | string[] parts = connect.Split(split, 3); | 60 | manager = new NHibernateManager(connect, "UserStore"); |
66 | if (parts.Length != 3) | ||
67 | { | ||
68 | // TODO: make this a real exception type | ||
69 | throw new Exception("Malformed Inventory connection string '" + connect + "'"); | ||
70 | } | ||
71 | string dialect = parts[0]; | ||
72 | |||
73 | // This is stubbing for now, it will become dynamic later and support different db backends | ||
74 | cfg = new Configuration(); | ||
75 | cfg.SetProperty(Environment.ConnectionProvider, | ||
76 | "NHibernate.Connection.DriverConnectionProvider"); | ||
77 | cfg.SetProperty(Environment.Dialect, | ||
78 | "NHibernate.Dialect." + parts[0]); | ||
79 | cfg.SetProperty(Environment.ConnectionDriver, | ||
80 | "NHibernate.Driver." + parts[1]); | ||
81 | cfg.SetProperty(Environment.ConnectionString, parts[2]); | ||
82 | cfg.AddAssembly("OpenSim.Data.NHibernate"); | ||
83 | |||
84 | factory = cfg.BuildSessionFactory(); | ||
85 | session = factory.OpenSession(); | ||
86 | |||
87 | // This actually does the roll forward assembly stuff | ||
88 | Assembly assem = GetType().Assembly; | ||
89 | Migration m = new Migration((System.Data.Common.DbConnection)factory.ConnectionProvider.GetConnection(), assem, dialect, "UserStore"); | ||
90 | m.Update(); | ||
91 | } | 61 | } |
92 | 62 | ||
93 | private bool ExistsUser(UUID uuid) | 63 | private bool ExistsUser(UUID uuid) |
94 | { | 64 | { |
95 | UserProfileData user = null; | 65 | UserProfileData user = null; |
96 | try | 66 | |
97 | { | 67 | m_log.InfoFormat("[NHIBERNATE] ExistsUser; {0}", uuid); |
98 | user = session.Load(typeof(UserProfileData), uuid) as UserProfileData; | 68 | user = (UserProfileData)manager.Load(typeof(UserProfileData), uuid); |
99 | } | 69 | |
100 | catch (ObjectNotFoundException) | 70 | if (user == null) |
101 | { | 71 | { |
102 | user = null; | 72 | m_log.InfoFormat("[NHIBERNATE] User with given UUID does not exist {0} ", uuid); |
73 | return false; | ||
103 | } | 74 | } |
104 | 75 | ||
105 | return (user != null); | 76 | return true; |
77 | |||
106 | } | 78 | } |
107 | 79 | ||
108 | override public UserProfileData GetUserByUUID(UUID uuid) | 80 | override public UserProfileData GetUserByUUID(UUID uuid) |
109 | { | 81 | { |
110 | UserProfileData user; | 82 | UserProfileData user; |
111 | // TODO: I'm sure I'll have to do something silly here | 83 | m_log.InfoFormat("[NHIBERNATE] GetUserByUUID: {0} ", uuid); |
112 | try | 84 | |
85 | user = (UserProfileData)manager.Load(typeof(UserProfileData), uuid); | ||
86 | if (user != null) | ||
113 | { | 87 | { |
114 | user = session.Load(typeof(UserProfileData), uuid) as UserProfileData; | 88 | UserAgentData agent = GetAgentByUUID(uuid); |
115 | user.CurrentAgent = GetAgentByUUID(uuid); | 89 | if (agent != null) |
116 | } | 90 | { |
117 | catch (ObjectNotFoundException) | 91 | user.CurrentAgent = agent; |
118 | { | 92 | } |
119 | user = null; | ||
120 | } | 93 | } |
121 | 94 | ||
122 | return user; | 95 | return user; |
@@ -126,33 +99,30 @@ namespace OpenSim.Data.NHibernate | |||
126 | { | 99 | { |
127 | if (!ExistsUser(profile.ID)) | 100 | if (!ExistsUser(profile.ID)) |
128 | { | 101 | { |
129 | session.Save(profile); | 102 | m_log.InfoFormat("[NHIBERNATE] AddNewUserProfile {0}", profile.ID); |
103 | manager.Save(profile); | ||
130 | SetAgentData(profile.ID, profile.CurrentAgent); | 104 | SetAgentData(profile.ID, profile.CurrentAgent); |
105 | |||
131 | } | 106 | } |
132 | else | 107 | else |
133 | { | 108 | { |
134 | m_log.ErrorFormat("Attempted to add User {0} {1} that already exists, updating instead", profile.FirstName, profile.SurName); | 109 | m_log.ErrorFormat("[NHIBERNATE] Attempted to add User {0} {1} that already exists, updating instead", profile.FirstName, profile.SurName); |
135 | UpdateUserProfile(profile); | 110 | UpdateUserProfile(profile); |
136 | } | 111 | } |
137 | } | 112 | } |
138 | 113 | ||
139 | private void SetAgentData(UUID uuid, UserAgentData agent) | 114 | private void SetAgentData(UUID uuid, UserAgentData agent) |
140 | { | 115 | { |
141 | if (agent == null) | 116 | UserAgentData old = (UserAgentData)manager.Load(typeof(UserAgentData), uuid); |
117 | if (old != null) | ||
142 | { | 118 | { |
143 | // TODO: got to figure out how to do a delete right | 119 | m_log.InfoFormat("[NHIBERNATE] SetAgentData deleting old: {0} ",uuid); |
120 | manager.Delete(old); | ||
144 | } | 121 | } |
145 | else | 122 | if (agent != null) |
146 | { | 123 | { |
147 | try | 124 | m_log.InfoFormat("[NHIBERNATE] SetAgentData: {0} ", agent.ProfileID); |
148 | { | 125 | manager.Save(agent); |
149 | UserAgentData old = session.Load(typeof(UserAgentData), uuid) as UserAgentData; | ||
150 | session.Delete(old); | ||
151 | } | ||
152 | catch (ObjectNotFoundException) | ||
153 | { | ||
154 | } | ||
155 | session.Save(agent); | ||
156 | } | 126 | } |
157 | 127 | ||
158 | } | 128 | } |
@@ -160,13 +130,13 @@ namespace OpenSim.Data.NHibernate | |||
160 | { | 130 | { |
161 | if (ExistsUser(profile.ID)) | 131 | if (ExistsUser(profile.ID)) |
162 | { | 132 | { |
163 | session.Update(profile); | 133 | manager.Update(profile); |
164 | SetAgentData(profile.ID, profile.CurrentAgent); | 134 | SetAgentData(profile.ID, profile.CurrentAgent); |
165 | return true; | 135 | return true; |
166 | } | 136 | } |
167 | else | 137 | else |
168 | { | 138 | { |
169 | m_log.ErrorFormat("Attempted to update User {0} {1} that doesn't exist, updating instead", profile.FirstName, profile.SurName); | 139 | m_log.ErrorFormat("[NHIBERNATE] Attempted to update User {0} {1} that doesn't exist, updating instead", profile.FirstName, profile.SurName); |
170 | AddNewUserProfile(profile); | 140 | AddNewUserProfile(profile); |
171 | return true; | 141 | return true; |
172 | } | 142 | } |
@@ -174,37 +144,32 @@ namespace OpenSim.Data.NHibernate | |||
174 | 144 | ||
175 | override public void AddNewUserAgent(UserAgentData agent) | 145 | override public void AddNewUserAgent(UserAgentData agent) |
176 | { | 146 | { |
177 | try | 147 | UserAgentData old = (UserAgentData)manager.Load(typeof(UserAgentData), agent.ProfileID); |
148 | if (old != null) | ||
178 | { | 149 | { |
179 | UserAgentData old = session.Load(typeof(UserAgentData), agent.ProfileID) as UserAgentData; | 150 | manager.Delete(old); |
180 | session.Delete(old); | ||
181 | } | 151 | } |
182 | catch (ObjectNotFoundException) | 152 | |
183 | { | 153 | manager.Save(agent); |
184 | } | 154 | |
185 | session.Save(agent); | ||
186 | } | 155 | } |
187 | 156 | ||
188 | public void UpdateUserAgent(UserAgentData agent) | 157 | public void UpdateUserAgent(UserAgentData agent) |
189 | { | 158 | { |
190 | session.Update(agent); | 159 | m_log.InfoFormat("[NHIBERNATE] UpdateUserAgent: {0} ", agent.ProfileID); |
160 | manager.Update(agent); | ||
191 | } | 161 | } |
192 | 162 | ||
193 | override public UserAgentData GetAgentByUUID(UUID uuid) | 163 | override public UserAgentData GetAgentByUUID(UUID uuid) |
194 | { | 164 | { |
195 | try | 165 | m_log.InfoFormat("[NHIBERNATE] GetAgentByUUID: {0} ", uuid); |
196 | { | 166 | return (UserAgentData)manager.Load(typeof(UserAgentData), uuid); |
197 | return session.Load(typeof(UserAgentData), uuid) as UserAgentData; | ||
198 | } | ||
199 | catch | ||
200 | { | ||
201 | return null; | ||
202 | } | ||
203 | } | 167 | } |
204 | 168 | ||
205 | override public UserProfileData GetUserByName(string fname, string lname) | 169 | override public UserProfileData GetUserByName(string fname, string lname) |
206 | { | 170 | { |
207 | ICriteria criteria = session.CreateCriteria(typeof(UserProfileData)); | 171 | m_log.InfoFormat("[NHIBERNATE] GetUserByName: {0} {1} ", fname, lname); |
172 | ICriteria criteria = manager.GetSession().CreateCriteria(typeof(UserProfileData)); | ||
208 | criteria.Add(Expression.Eq("FirstName", fname)); | 173 | criteria.Add(Expression.Eq("FirstName", fname)); |
209 | criteria.Add(Expression.Eq("SurName", lname)); | 174 | criteria.Add(Expression.Eq("SurName", lname)); |
210 | foreach (UserProfileData profile in criteria.List()) | 175 | foreach (UserProfileData profile in criteria.List()) |
@@ -233,7 +198,7 @@ namespace OpenSim.Data.NHibernate | |||
233 | 198 | ||
234 | if (querysplit.Length == 2) | 199 | if (querysplit.Length == 2) |
235 | { | 200 | { |
236 | ICriteria criteria = session.CreateCriteria(typeof(UserProfileData)); | 201 | ICriteria criteria = manager.GetSession().CreateCriteria(typeof(UserProfileData)); |
237 | criteria.Add(Expression.Like("FirstName", querysplit[0])); | 202 | criteria.Add(Expression.Like("FirstName", querysplit[0])); |
238 | criteria.Add(Expression.Like("SurName", querysplit[1])); | 203 | criteria.Add(Expression.Like("SurName", querysplit[1])); |
239 | foreach (UserProfileData profile in criteria.List()) | 204 | foreach (UserProfileData profile in criteria.List()) |
@@ -262,26 +227,18 @@ namespace OpenSim.Data.NHibernate | |||
262 | /// TODO: stubs for now to get us to a compiling state gently | 227 | /// TODO: stubs for now to get us to a compiling state gently |
263 | public override AvatarAppearance GetUserAppearance(UUID user) | 228 | public override AvatarAppearance GetUserAppearance(UUID user) |
264 | { | 229 | { |
265 | AvatarAppearance appearance; | 230 | return (AvatarAppearance)manager.Load(typeof(AvatarAppearance), user); |
266 | // TODO: I'm sure I'll have to do something silly here | ||
267 | try { | ||
268 | appearance = session.Load(typeof(AvatarAppearance), user) as AvatarAppearance; | ||
269 | } catch (ObjectNotFoundException) { | ||
270 | appearance = null; | ||
271 | } | ||
272 | return appearance; | ||
273 | } | 231 | } |
274 | 232 | ||
275 | private bool ExistsAppearance(UUID uuid) | 233 | private bool ExistsAppearance(UUID uuid) |
276 | { | 234 | { |
277 | AvatarAppearance appearance; | 235 | AvatarAppearance appearance = (AvatarAppearance)manager.Load(typeof(AvatarAppearance), uuid); |
278 | try { | 236 | if (appearance == null) |
279 | appearance = session.Load(typeof(AvatarAppearance), uuid) as AvatarAppearance; | 237 | { |
280 | } catch (ObjectNotFoundException) { | 238 | return false; |
281 | appearance = null; | ||
282 | } | 239 | } |
283 | 240 | ||
284 | return (appearance == null) ? false : true; | 241 | return true; |
285 | } | 242 | } |
286 | 243 | ||
287 | 244 | ||
@@ -295,11 +252,11 @@ namespace OpenSim.Data.NHibernate | |||
295 | bool exists = ExistsAppearance(user); | 252 | bool exists = ExistsAppearance(user); |
296 | if (exists) | 253 | if (exists) |
297 | { | 254 | { |
298 | session.Update(appearance); | 255 | manager.Update(appearance); |
299 | } | 256 | } |
300 | else | 257 | else |
301 | { | 258 | { |
302 | session.Save(appearance); | 259 | manager.Save(appearance); |
303 | } | 260 | } |
304 | } | 261 | } |
305 | 262 | ||
diff --git a/OpenSim/Data/NHibernate/Resources/AssetBase.hbm.xml b/OpenSim/Data/NHibernate/Resources/AssetBase.hbm.xml index 7c3d8cf..7c42609 100644 --- a/OpenSim/Data/NHibernate/Resources/AssetBase.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/AssetBase.hbm.xml | |||
@@ -4,7 +4,7 @@ | |||
4 | <id name="FullID" column="ID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"> | 4 | <id name="FullID" column="ID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"> |
5 | <generator class="assigned" /> | 5 | <generator class="assigned" /> |
6 | </id> | 6 | </id> |
7 | <property name="Type" type="System.SByte" /> | 7 | <property name="Type" type="OpenSim.Data.NHibernate.SByteType, OpenSim.Data.NHibernate" /> |
8 | <property name="Name" type="String" length="64" /> | 8 | <property name="Name" type="String" length="64" /> |
9 | <property name="Description" type="String" length="64" /> | 9 | <property name="Description" type="String" length="64" /> |
10 | <property name="Local" type="boolean" /> | 10 | <property name="Local" type="boolean" /> |
diff --git a/OpenSim/Data/NHibernate/Resources/InventoryFolderBase.hbm.xml b/OpenSim/Data/NHibernate/Resources/InventoryFolderBase.hbm.xml index 6afe9fa..c5f0115 100644 --- a/OpenSim/Data/NHibernate/Resources/InventoryFolderBase.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/InventoryFolderBase.hbm.xml | |||
@@ -5,7 +5,7 @@ | |||
5 | <generator class="assigned" /> | 5 | <generator class="assigned" /> |
6 | </id> | 6 | </id> |
7 | <property name="Type" type="Int16" /> | 7 | <property name="Type" type="Int16" /> |
8 | <property name="Version" type="System.UInt16" /> | 8 | <property name="Version" type="OpenSim.Data.NHibernate.UInt16Type, OpenSim.Data.NHibernate" /> |
9 | <property name="ParentID" index="folder_parent_id" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 9 | <property name="ParentID" index="folder_parent_id" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
10 | <property name="Owner" index="folder_owner_id" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 10 | <property name="Owner" index="folder_owner_id" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
11 | <property name="Name" type="String" length="64" /> | 11 | <property name="Name" type="String" length="64" /> |
diff --git a/OpenSim/Data/NHibernate/Resources/InventoryItemBase.hbm.xml b/OpenSim/Data/NHibernate/Resources/InventoryItemBase.hbm.xml index 9a4d7ca..f5e365b 100644 --- a/OpenSim/Data/NHibernate/Resources/InventoryItemBase.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/InventoryItemBase.hbm.xml | |||
@@ -12,15 +12,15 @@ | |||
12 | <property name="Creator" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 12 | <property name="Creator" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
13 | <property name="Name" type="String" length="64" /> | 13 | <property name="Name" type="String" length="64" /> |
14 | <property name="Description" type="String" length="64" /> | 14 | <property name="Description" type="String" length="64" /> |
15 | <property name="NextPermissions" type="System.UInt32" /> | 15 | <property name="NextPermissions" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
16 | <property name="CurrentPermissions" type="System.UInt32" /> | 16 | <property name="CurrentPermissions" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
17 | <property name="BasePermissions" type="System.UInt32" /> | 17 | <property name="BasePermissions" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
18 | <property name="EveryOnePermissions" type="System.UInt32" /> | 18 | <property name="EveryOnePermissions" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
19 | <property name="GroupID" index="item_group_id" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 19 | <property name="GroupID" index="item_group_id" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
20 | <property name="GroupOwned" type="boolean" /> | 20 | <property name="GroupOwned" type="boolean" /> |
21 | <property name="SalePrice" type="System.Int32" /> | 21 | <property name="SalePrice" type="System.Int32" /> |
22 | <property name="SaleType" type="System.Byte" /> | 22 | <property name="SaleType" type="System.Byte" /> |
23 | <property name="Flags" type="System.UInt32" /> | 23 | <property name="Flags" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
24 | <property name="CreationDate" type="System.Int32" /> | 24 | <property name="CreationDate" type="System.Int32" /> |
25 | </class> | 25 | </class> |
26 | </hibernate-mapping> | 26 | </hibernate-mapping> |
diff --git a/OpenSim/Data/NHibernate/Resources/MySQLDialect/002_RegionStore.sql b/OpenSim/Data/NHibernate/Resources/MySQLDialect/002_RegionStore.sql index fc11e95..d34d44e 100644 --- a/OpenSim/Data/NHibernate/Resources/MySQLDialect/002_RegionStore.sql +++ b/OpenSim/Data/NHibernate/Resources/MySQLDialect/002_RegionStore.sql | |||
@@ -2,8 +2,8 @@ BEGIN; | |||
2 | 2 | ||
3 | CREATE TABLE `Terrain` ( | 3 | CREATE TABLE `Terrain` ( |
4 | `RegionID` char(36) not null, | 4 | `RegionID` char(36) not null, |
5 | `Map` longblob, | 5 | `MapData` longblob, |
6 | PRIMARY KEY (`RegionID`) | 6 | PRIMARY KEY (`RegionID`) |
7 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | 7 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
8 | 8 | ||
9 | COMMIT; \ No newline at end of file | 9 | COMMIT; |
diff --git a/OpenSim/Data/NHibernate/Resources/RegionStore.hbm.xml b/OpenSim/Data/NHibernate/Resources/RegionStore.hbm.xml index fe055bb..1851904 100644 --- a/OpenSim/Data/NHibernate/Resources/RegionStore.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/RegionStore.hbm.xml | |||
@@ -4,7 +4,7 @@ | |||
4 | <id name="UUID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"> | 4 | <id name="UUID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"> |
5 | <generator class="assigned" /> | 5 | <generator class="assigned" /> |
6 | </id> | 6 | </id> |
7 | <property name="ParentID" type="System.UInt32"/> | 7 | <property name="ParentID" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate"/> |
8 | <property name="ParentUUID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 8 | <property name="ParentUUID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
9 | <property name="RegionID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 9 | <property name="RegionID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
10 | <property name="CreationDate" type="System.Int32" /> | 10 | <property name="CreationDate" type="System.Int32" /> |
@@ -14,17 +14,17 @@ | |||
14 | <property name="SitName" type="String" length="255" /> | 14 | <property name="SitName" type="String" length="255" /> |
15 | <property name="TouchName" type="String" length="255" /> | 15 | <property name="TouchName" type="String" length="255" /> |
16 | 16 | ||
17 | <property name="ObjectFlags" type="System.UInt32" /> | 17 | <property name="ObjectFlags" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
18 | <property name="CreatorID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 18 | <property name="CreatorID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
19 | <property name="OwnerID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 19 | <property name="OwnerID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
20 | <property name="GroupID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 20 | <property name="GroupID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
21 | <property name="LastOwnerID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 21 | <property name="LastOwnerID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
22 | 22 | ||
23 | <property name="OwnerMask" type="System.UInt32" /> | 23 | <property name="OwnerMask" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
24 | <property name="NextOwnerMask" type="System.UInt32" /> | 24 | <property name="NextOwnerMask" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
25 | <property name="GroupMask" type="System.UInt32" /> | 25 | <property name="GroupMask" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
26 | <property name="EveryoneMask" type="System.UInt32" /> | 26 | <property name="EveryoneMask" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
27 | <property name="BaseMask" type="System.UInt32" /> | 27 | <property name="BaseMask" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
28 | 28 | ||
29 | <property name="OffsetPosition" type="OpenSim.Data.NHibernate.Vector3UserType, OpenSim.Data.NHibernate" > | 29 | <property name="OffsetPosition" type="OpenSim.Data.NHibernate.Vector3UserType, OpenSim.Data.NHibernate" > |
30 | <column name="PositionX" /> | 30 | <column name="PositionX" /> |
@@ -83,24 +83,24 @@ | |||
83 | <column name="ScaleZ" /> | 83 | <column name="ScaleZ" /> |
84 | </property> | 84 | </property> |
85 | <property name="PCode" type="System.Byte" /> | 85 | <property name="PCode" type="System.Byte" /> |
86 | <property name="PathBegin" type="System.UInt16" /> | 86 | <property name="PathBegin" type="OpenSim.Data.NHibernate.UInt16Type, OpenSim.Data.NHibernate" /> |
87 | <property name="PathEnd" type="System.UInt16" /> | 87 | <property name="PathEnd" type="OpenSim.Data.NHibernate.UInt16Type, OpenSim.Data.NHibernate" /> |
88 | <property name="PathScaleX" type="System.Byte" /> | 88 | <property name="PathScaleX" type="System.Byte" /> |
89 | <property name="PathScaleY" type="System.Byte" /> | 89 | <property name="PathScaleY" type="System.Byte" /> |
90 | <property name="PathShearX" type="System.Byte" /> | 90 | <property name="PathShearX" type="System.Byte" /> |
91 | <property name="PathShearY" type="System.Byte" /> | 91 | <property name="PathShearY" type="System.Byte" /> |
92 | <property name="PathSkew" type="System.SByte" /> | 92 | <property name="PathSkew" type="OpenSim.Data.NHibernate.SByteType, OpenSim.Data.NHibernate" /> |
93 | <property name="PathCurve" type="System.Byte" /> | 93 | <property name="PathCurve" type="System.Byte" /> |
94 | <property name="PathRadiusOffset" type="System.SByte" /> | 94 | <property name="PathRadiusOffset" type="OpenSim.Data.NHibernate.SByteType, OpenSim.Data.NHibernate" /> |
95 | <property name="PathRevolutions" type="System.Byte" /> | 95 | <property name="PathRevolutions" type="System.Byte" /> |
96 | <property name="PathTaperX" type="System.SByte" /> | 96 | <property name="PathTaperX" type="OpenSim.Data.NHibernate.SByteType, OpenSim.Data.NHibernate" /> |
97 | <property name="PathTwist" type="System.SByte" /> | 97 | <property name="PathTwist" type="OpenSim.Data.NHibernate.SByteType, OpenSim.Data.NHibernate" /> |
98 | <property name="ProfileBegin" type="System.UInt16" /> | 98 | <property name="ProfileBegin" type="OpenSim.Data.NHibernate.UInt16Type, OpenSim.Data.NHibernate" /> |
99 | <property name="ProfileEnd" type="System.UInt16" /> | 99 | <property name="ProfileEnd" type="OpenSim.Data.NHibernate.UInt16Type, OpenSim.Data.NHibernate" /> |
100 | <property name="ProfileCurve" type="System.Byte" /> | 100 | <property name="ProfileCurve" type="System.Byte" /> |
101 | <property name="ProfileHollow" type="System.UInt16" /> | 101 | <property name="ProfileHollow" type="OpenSim.Data.NHibernate.UInt16Type, OpenSim.Data.NHibernate" /> |
102 | <property name="TextureEntry" column="Texture" type="System.Byte[]" /> | 102 | <property name="TextureEntry" column="Texture" type="binary" /> |
103 | <property name="ExtraParams" type="System.Byte[]" /> | 103 | <property name="ExtraParams" type="binary" /> |
104 | <property name="State" type="System.Byte" /> | 104 | <property name="State" type="System.Byte" /> |
105 | </component> | 105 | </component> |
106 | </class> | 106 | </class> |
@@ -108,7 +108,8 @@ | |||
108 | <id name="RegionID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"> | 108 | <id name="RegionID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"> |
109 | <generator class="assigned" /> | 109 | <generator class="assigned" /> |
110 | </id> | 110 | </id> |
111 | <property name="Map" type="System.Byte[]" /> | 111 | <!-- <property name="MapData" type="OpenSim.Data.NHibernate.BlobType, OpenSim.Data.NHibernate" /> --> |
112 | <property name="MapData" type="binary" /> | ||
112 | </class> | 113 | </class> |
113 | <class name="OpenSim.Framework.TaskInventoryItem, OpenSim.Framework" table="PrimItems" lazy="false"> | 114 | <class name="OpenSim.Framework.TaskInventoryItem, OpenSim.Framework" table="PrimItems" lazy="false"> |
114 | <id name="ItemID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"> | 115 | <id name="ItemID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"> |
@@ -121,15 +122,47 @@ | |||
121 | <property name="OwnerID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"/> | 122 | <property name="OwnerID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"/> |
122 | <property name="GroupID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"/> | 123 | <property name="GroupID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"/> |
123 | <property name="LastOwnerID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"/> | 124 | <property name="LastOwnerID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"/> |
124 | <property name="CurrentPermissions" type="System.UInt32" /> | 125 | <property name="CurrentPermissions" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
125 | <property name="BasePermissions" type="System.UInt32" /> | 126 | <property name="BasePermissions" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
126 | <property name="EveryonePermissions" type="System.UInt32" /> | 127 | <property name="EveryonePermissions" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
127 | <property name="GroupPermissions" type="System.UInt32" /> | 128 | <property name="GroupPermissions" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
128 | <property name="NextPermissions" type="System.UInt32" /> | 129 | <property name="NextPermissions" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
129 | <property name="Name" type="String" length="255" /> | 130 | <property name="Name" type="String" length="255" /> |
130 | <property name="Description" type="String" length="255" /> | 131 | <property name="Description" type="String" length="255" /> |
131 | <property name="CreationDate" type="System.UInt32" /> | 132 | <property name="CreationDate" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
132 | <property name="Flags" type="System.UInt32" /> | 133 | <property name="Flags" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
133 | <property name="InvType" type="System.Int32" /> | 134 | <property name="InvType" type="System.Int32" /> |
134 | </class> | 135 | </class> |
136 | <class name="OpenSim.Data.RegionProfileData, OpenSim.Data" table="Regions" lazy="false"> | ||
137 | <id name="Uuid" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"> | ||
138 | <generator class="assigned" /> | ||
139 | </id> | ||
140 | <property name="RegionHandle" index="region_handle" type="OpenSim.Data.NHibernate.UInt64Type, OpenSim.Data.NHibernate" /> | ||
141 | <property name="RegionName" index="region_name" type="String" length="32"/> | ||
142 | <property name="RegionRecvKey" type="String" length="128"/> | ||
143 | <property name="RegionSendKey" type="String" length="128"/> | ||
144 | <property name="RegionSecret" type="String" length="128"/> | ||
145 | <property name="RegionDataURI" type="String" length="255"/> | ||
146 | <property name="ServerIP" type="String" length="64"/> | ||
147 | <property name="ServerPort" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> | ||
148 | <property name="ServerURI" type="String" length="255"/> | ||
149 | <property name="RegionLocX" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> | ||
150 | <property name="RegionLocY" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> | ||
151 | <property name="RegionLocZ" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> | ||
152 | <property name="EastOverrideHandle" index="overrideHandles" type="OpenSim.Data.NHibernate.UInt64Type, OpenSim.Data.NHibernate" /> | ||
153 | <property name="WestOverrideHandle" index="overrideHandles" type="OpenSim.Data.NHibernate.UInt64Type, OpenSim.Data.NHibernate" /> | ||
154 | <property name="SouthOverrideHandle" index="overrideHandles" type="OpenSim.Data.NHibernate.UInt64Type, OpenSim.Data.NHibernate" /> | ||
155 | <property name="NorthOverrideHandle" index="overrideHandles" type="OpenSim.Data.NHibernate.UInt64Type, OpenSim.Data.NHibernate" /> | ||
156 | <property name="RegionAssetURI" type="String" length="255"/> | ||
157 | <property name="RegionAssetRecvKey" type="String" length="128"/> | ||
158 | <property name="RegionAssetSendKey" type="String" length="128"/> | ||
159 | <property name="RegionUserURI" type="String" length="255"/> | ||
160 | <property name="RegionUserRecvKey" type="String" length="128"/> | ||
161 | <property name="RegionUserSendKey" type="String" length="128"/> | ||
162 | <property name="ServerHttpPort" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> | ||
163 | <property name="ServerRemotingPort" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> | ||
164 | <property name="RegionMapTextureID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"/> | ||
165 | <property name="Owner_uuid" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"/> | ||
166 | <property name="OriginUUID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate"/> | ||
167 | </class> | ||
135 | </hibernate-mapping> | 168 | </hibernate-mapping> |
diff --git a/OpenSim/Data/NHibernate/Resources/UserAgentData.hbm.xml b/OpenSim/Data/NHibernate/Resources/UserAgentData.hbm.xml index 0beddaf..e10fb8f 100644 --- a/OpenSim/Data/NHibernate/Resources/UserAgentData.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/UserAgentData.hbm.xml | |||
@@ -5,7 +5,7 @@ | |||
5 | <generator class="assigned" /> | 5 | <generator class="assigned" /> |
6 | </id> | 6 | </id> |
7 | <property name="AgentIP" type="String" length="24" /> | 7 | <property name="AgentIP" type="String" length="24" /> |
8 | <property name="AgentPort" type="Int32" /> | 8 | <property name="AgentPort" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
9 | <property name="AgentOnline" type="boolean" /> | 9 | <property name="AgentOnline" type="boolean" /> |
10 | <property name="SessionID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 10 | <property name="SessionID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
11 | <property name="SecureSessionID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 11 | <property name="SecureSessionID" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
@@ -13,9 +13,9 @@ | |||
13 | <property name="Region" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 13 | <property name="Region" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
14 | <property name="LoginTime" type="Int32" /> | 14 | <property name="LoginTime" type="Int32" /> |
15 | <property name="LogoutTime" type="Int32" /> | 15 | <property name="LogoutTime" type="Int32" /> |
16 | <property name="Handle" type="Int64" /> | 16 | <property name="Handle" type="OpenSim.Data.NHibernate.UInt64Type, OpenSim.Data.NHibernate" /> |
17 | <property name="PositionX" type="Single" /> | 17 | <!-- <property name="PositionX" type="Single" /> |
18 | <property name="PositionY" type="Single" /> | 18 | <property name="PositionY" type="Single" /> |
19 | <property name="PositionZ" type="Single" /> | 19 | <property name="PositionZ" type="Single" /> --> |
20 | </class> | 20 | </class> |
21 | </hibernate-mapping> | 21 | </hibernate-mapping> |
diff --git a/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml b/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml index 873930b..740a9f1 100644 --- a/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml +++ b/OpenSim/Data/NHibernate/Resources/UserProfileData.hbm.xml | |||
@@ -9,8 +9,8 @@ | |||
9 | <property name="PasswordHash" type="String" length="32" /> | 9 | <property name="PasswordHash" type="String" length="32" /> |
10 | <property name="PasswordSalt" type="String" length="32" /> | 10 | <property name="PasswordSalt" type="String" length="32" /> |
11 | <property name="WebLoginKey" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> | 11 | <property name="WebLoginKey" type="OpenSim.Data.NHibernate.UUIDUserType, OpenSim.Data.NHibernate" /> |
12 | <property name="HomeRegionX" type="System.UInt32" /> | 12 | <property name="HomeRegionX" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
13 | <property name="HomeRegionY" type="System.UInt32" /> | 13 | <property name="HomeRegionY" type="OpenSim.Data.NHibernate.UInt32Type, OpenSim.Data.NHibernate" /> |
14 | <property name="HomeLocationX" type="Single" /> | 14 | <property name="HomeLocationX" type="Single" /> |
15 | <property name="HomeLocationY" type="Single" /> | 15 | <property name="HomeLocationY" type="Single" /> |
16 | <property name="HomeLocationZ" type="Single" /> | 16 | <property name="HomeLocationZ" type="Single" /> |
diff --git a/OpenSim/Data/NHibernate/Terrain.cs b/OpenSim/Data/NHibernate/Terrain.cs index dd0da44..88be17f 100644 --- a/OpenSim/Data/NHibernate/Terrain.cs +++ b/OpenSim/Data/NHibernate/Terrain.cs | |||
@@ -60,7 +60,7 @@ namespace OpenSim.Data.NHibernate | |||
60 | set { regionID = value; } | 60 | set { regionID = value; } |
61 | } | 61 | } |
62 | 62 | ||
63 | public byte[] Map | 63 | public byte[] MapData |
64 | { | 64 | { |
65 | get { return serializeTerrain(map); } | 65 | get { return serializeTerrain(map); } |
66 | set { map = parseTerrain(value); } | 66 | set { map = parseTerrain(value); } |
diff --git a/OpenSim/Data/RegionProfileData.cs b/OpenSim/Data/RegionProfileData.cs index a683bf1..5a3a42c 100644 --- a/OpenSim/Data/RegionProfileData.cs +++ b/OpenSim/Data/RegionProfileData.cs | |||
@@ -36,6 +36,7 @@ namespace OpenSim.Data | |||
36 | /// <summary> | 36 | /// <summary> |
37 | /// A class which contains information known to the grid server about a region | 37 | /// A class which contains information known to the grid server about a region |
38 | /// </summary> | 38 | /// </summary> |
39 | [Serializable] | ||
39 | public class RegionProfileData | 40 | public class RegionProfileData |
40 | { | 41 | { |
41 | /// <summary> | 42 | /// <summary> |
@@ -210,5 +211,155 @@ namespace OpenSim.Data | |||
210 | { | 211 | { |
211 | return RequestSimData(gridserver_url, gridserver_sendkey, "region_name_search", regionName ); | 212 | return RequestSimData(gridserver_url, gridserver_sendkey, "region_name_search", regionName ); |
212 | } | 213 | } |
214 | |||
215 | |||
216 | //Data Wrappers | ||
217 | public string RegionName | ||
218 | { | ||
219 | get { return regionName; } | ||
220 | set { regionName = value; } | ||
221 | } | ||
222 | public ulong RegionHandle | ||
223 | { | ||
224 | get { return regionHandle; } | ||
225 | set { regionHandle = value; } | ||
226 | } | ||
227 | public UUID Uuid | ||
228 | { | ||
229 | get { return UUID; } | ||
230 | set { UUID = value; } | ||
231 | } | ||
232 | public uint RegionLocX | ||
233 | { | ||
234 | get { return regionLocX; } | ||
235 | set { regionLocX = value; } | ||
236 | } | ||
237 | public uint RegionLocY | ||
238 | { | ||
239 | get { return regionLocY; } | ||
240 | set { regionLocY = value; } | ||
241 | } | ||
242 | public uint RegionLocZ | ||
243 | { | ||
244 | get { return regionLocZ; } | ||
245 | set { regionLocZ = value; } | ||
246 | } | ||
247 | public string RegionSendKey | ||
248 | { | ||
249 | get { return regionSendKey; } | ||
250 | set { regionSendKey = value; } | ||
251 | } | ||
252 | public string RegionRecvKey | ||
253 | { | ||
254 | get { return regionRecvKey; } | ||
255 | set { regionRecvKey = value; } | ||
256 | } | ||
257 | public string RegionSecret | ||
258 | { | ||
259 | get { return regionSecret; } | ||
260 | set { regionSecret = value; } | ||
261 | } | ||
262 | public bool RegionOnline | ||
263 | { | ||
264 | get { return regionOnline; } | ||
265 | set { regionOnline = value; } | ||
266 | } | ||
267 | public string ServerIP | ||
268 | { | ||
269 | get { return serverIP; } | ||
270 | set { serverIP = value; } | ||
271 | } | ||
272 | public uint ServerPort | ||
273 | { | ||
274 | get { return serverPort; } | ||
275 | set { serverPort = value; } | ||
276 | } | ||
277 | public string ServerURI | ||
278 | { | ||
279 | get { return serverURI; } | ||
280 | set { serverURI = value; } | ||
281 | } | ||
282 | public uint ServerHttpPort | ||
283 | { | ||
284 | get { return httpPort; } | ||
285 | set { httpPort = value; } | ||
286 | } | ||
287 | public uint ServerRemotingPort | ||
288 | { | ||
289 | get { return remotingPort; } | ||
290 | set { remotingPort = value; } | ||
291 | } | ||
292 | |||
293 | public ulong NorthOverrideHandle | ||
294 | { | ||
295 | get { return regionNorthOverrideHandle; } | ||
296 | set { regionNorthOverrideHandle = value; } | ||
297 | } | ||
298 | public ulong SouthOverrideHandle | ||
299 | { | ||
300 | get { return regionSouthOverrideHandle; } | ||
301 | set { regionSouthOverrideHandle = value; } | ||
302 | } | ||
303 | public ulong EastOverrideHandle | ||
304 | { | ||
305 | get { return regionEastOverrideHandle; } | ||
306 | set { regionEastOverrideHandle = value; } | ||
307 | } | ||
308 | public ulong WestOverrideHandle | ||
309 | { | ||
310 | get { return regionWestOverrideHandle; } | ||
311 | set { regionWestOverrideHandle = value; } | ||
312 | } | ||
313 | public string RegionDataURI | ||
314 | { | ||
315 | get { return regionDataURI; } | ||
316 | set { regionDataURI = value; } | ||
317 | } | ||
318 | public string RegionAssetURI | ||
319 | { | ||
320 | get { return regionAssetURI; } | ||
321 | set { regionAssetURI = value; } | ||
322 | } | ||
323 | public string RegionAssetSendKey | ||
324 | { | ||
325 | get { return regionAssetSendKey; } | ||
326 | set { regionAssetSendKey = value; } | ||
327 | } | ||
328 | public string RegionAssetRecvKey | ||
329 | { | ||
330 | get { return regionAssetRecvKey; } | ||
331 | set { regionAssetRecvKey = value; } | ||
332 | } | ||
333 | public string RegionUserURI | ||
334 | { | ||
335 | get { return regionUserURI; } | ||
336 | set { regionUserURI = value; } | ||
337 | } | ||
338 | public string RegionUserSendKey | ||
339 | { | ||
340 | get { return regionUserSendKey; } | ||
341 | set { regionUserSendKey = value; } | ||
342 | } | ||
343 | public string RegionUserRecvKey | ||
344 | { | ||
345 | get { return regionUserRecvKey; } | ||
346 | set { regionUserRecvKey = value; } | ||
347 | } | ||
348 | public UUID RegionMapTextureID | ||
349 | { | ||
350 | get { return regionMapTextureID; } | ||
351 | set { regionMapTextureID = value; } | ||
352 | } | ||
353 | public UUID Owner_uuid | ||
354 | { | ||
355 | get { return owner_uuid; } | ||
356 | set { owner_uuid = value; } | ||
357 | } | ||
358 | public UUID OriginUUID | ||
359 | { | ||
360 | get { return originUUID; } | ||
361 | set { originUUID = value; } | ||
362 | } | ||
363 | |||
213 | } | 364 | } |
214 | } | 365 | } |