aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Data/NHibernate/NHibernateUserData.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Data/NHibernate/NHibernateUserData.cs')
-rw-r--r--OpenSim/Data/NHibernate/NHibernateUserData.cs155
1 files changed, 99 insertions, 56 deletions
diff --git a/OpenSim/Data/NHibernate/NHibernateUserData.cs b/OpenSim/Data/NHibernate/NHibernateUserData.cs
index ee0d2b8..3a22dc3 100644
--- a/OpenSim/Data/NHibernate/NHibernateUserData.cs
+++ b/OpenSim/Data/NHibernate/NHibernateUserData.cs
@@ -33,7 +33,10 @@ using System.Text.RegularExpressions;
33using OpenMetaverse; 33using OpenMetaverse;
34using log4net; 34using log4net;
35using NHibernate; 35using NHibernate;
36using NHibernate.Criterion; 36using NHibernate.Cfg;
37using NHibernate.Expression;
38using NHibernate.Mapping.Attributes;
39using NHibernate.Tool.hbm2ddl;
37using OpenSim.Framework; 40using OpenSim.Framework;
38using Environment=NHibernate.Cfg.Environment; 41using Environment=NHibernate.Cfg.Environment;
39 42
@@ -46,7 +49,9 @@ namespace OpenSim.Data.NHibernate
46 { 49 {
47 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
48 51
49 private NHibernateManager manager; 52 private Configuration cfg;
53 private ISessionFactory factory;
54 private ISession session;
50 55
51 public override void Initialise() 56 public override void Initialise()
52 { 57 {
@@ -56,40 +61,62 @@ namespace OpenSim.Data.NHibernate
56 61
57 public override void Initialise(string connect) 62 public override void Initialise(string connect)
58 { 63 {
59 m_log.InfoFormat("[NHIBERNATE] Initializing NHibernateUserData"); 64 char[] split = {';'};
60 manager = new NHibernateManager(connect, "UserStore"); 65 string[] parts = connect.Split(split, 3);
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();
61 } 91 }
62 92
63 private bool ExistsUser(UUID uuid) 93 private bool ExistsUser(UUID uuid)
64 { 94 {
65 UserProfileData user = null; 95 UserProfileData user = null;
66 96 try
67 m_log.InfoFormat("[NHIBERNATE] ExistsUser; {0}", uuid);
68 user = (UserProfileData)manager.Load(typeof(UserProfileData), uuid);
69
70 if (user == null)
71 { 97 {
72 m_log.InfoFormat("[NHIBERNATE] User with given UUID does not exist {0} ", uuid); 98 user = session.Load(typeof(UserProfileData), uuid) as UserProfileData;
73 return false; 99 }
100 catch (ObjectNotFoundException)
101 {
102 user = null;
74 } 103 }
75 104
76 return true; 105 return (user != null);
77
78 } 106 }
79 107
80 override public UserProfileData GetUserByUUID(UUID uuid) 108 override public UserProfileData GetUserByUUID(UUID uuid)
81 { 109 {
82 UserProfileData user; 110 UserProfileData user;
83 m_log.InfoFormat("[NHIBERNATE] GetUserByUUID: {0} ", uuid); 111 // TODO: I'm sure I'll have to do something silly here
84 112 try
85 user = (UserProfileData)manager.Load(typeof(UserProfileData), uuid);
86 if (user != null)
87 { 113 {
88 UserAgentData agent = GetAgentByUUID(uuid); 114 user = session.Load(typeof(UserProfileData), uuid) as UserProfileData;
89 if (agent != null) 115 user.CurrentAgent = GetAgentByUUID(uuid);
90 { 116 }
91 user.CurrentAgent = agent; 117 catch (ObjectNotFoundException)
92 } 118 {
119 user = null;
93 } 120 }
94 121
95 return user; 122 return user;
@@ -99,30 +126,33 @@ namespace OpenSim.Data.NHibernate
99 { 126 {
100 if (!ExistsUser(profile.ID)) 127 if (!ExistsUser(profile.ID))
101 { 128 {
102 m_log.InfoFormat("[NHIBERNATE] AddNewUserProfile {0}", profile.ID); 129 session.Save(profile);
103 manager.Save(profile);
104 SetAgentData(profile.ID, profile.CurrentAgent); 130 SetAgentData(profile.ID, profile.CurrentAgent);
105
106 } 131 }
107 else 132 else
108 { 133 {
109 m_log.ErrorFormat("[NHIBERNATE] Attempted to add User {0} {1} that already exists, updating instead", profile.FirstName, profile.SurName); 134 m_log.ErrorFormat("Attempted to add User {0} {1} that already exists, updating instead", profile.FirstName, profile.SurName);
110 UpdateUserProfile(profile); 135 UpdateUserProfile(profile);
111 } 136 }
112 } 137 }
113 138
114 private void SetAgentData(UUID uuid, UserAgentData agent) 139 private void SetAgentData(UUID uuid, UserAgentData agent)
115 { 140 {
116 UserAgentData old = (UserAgentData)manager.Load(typeof(UserAgentData), uuid); 141 if (agent == null)
117 if (old != null)
118 { 142 {
119 m_log.InfoFormat("[NHIBERNATE] SetAgentData deleting old: {0} ",uuid); 143 // TODO: got to figure out how to do a delete right
120 manager.Delete(old);
121 } 144 }
122 if (agent != null) 145 else
123 { 146 {
124 m_log.InfoFormat("[NHIBERNATE] SetAgentData: {0} ", agent.ProfileID); 147 try
125 manager.Save(agent); 148 {
149 UserAgentData old = session.Load(typeof(UserAgentData), uuid) as UserAgentData;
150 session.Delete(old);
151 }
152 catch (ObjectNotFoundException)
153 {
154 }
155 session.Save(agent);
126 } 156 }
127 157
128 } 158 }
@@ -130,13 +160,13 @@ namespace OpenSim.Data.NHibernate
130 { 160 {
131 if (ExistsUser(profile.ID)) 161 if (ExistsUser(profile.ID))
132 { 162 {
133 manager.Update(profile); 163 session.Update(profile);
134 SetAgentData(profile.ID, profile.CurrentAgent); 164 SetAgentData(profile.ID, profile.CurrentAgent);
135 return true; 165 return true;
136 } 166 }
137 else 167 else
138 { 168 {
139 m_log.ErrorFormat("[NHIBERNATE] Attempted to update User {0} {1} that doesn't exist, updating instead", profile.FirstName, profile.SurName); 169 m_log.ErrorFormat("Attempted to update User {0} {1} that doesn't exist, updating instead", profile.FirstName, profile.SurName);
140 AddNewUserProfile(profile); 170 AddNewUserProfile(profile);
141 return true; 171 return true;
142 } 172 }
@@ -144,32 +174,37 @@ namespace OpenSim.Data.NHibernate
144 174
145 override public void AddNewUserAgent(UserAgentData agent) 175 override public void AddNewUserAgent(UserAgentData agent)
146 { 176 {
147 UserAgentData old = (UserAgentData)manager.Load(typeof(UserAgentData), agent.ProfileID); 177 try
148 if (old != null)
149 { 178 {
150 manager.Delete(old); 179 UserAgentData old = session.Load(typeof(UserAgentData), agent.ProfileID) as UserAgentData;
180 session.Delete(old);
151 } 181 }
152 182 catch (ObjectNotFoundException)
153 manager.Save(agent); 183 {
154 184 }
185 session.Save(agent);
155 } 186 }
156 187
157 public void UpdateUserAgent(UserAgentData agent) 188 public void UpdateUserAgent(UserAgentData agent)
158 { 189 {
159 m_log.InfoFormat("[NHIBERNATE] UpdateUserAgent: {0} ", agent.ProfileID); 190 session.Update(agent);
160 manager.Update(agent);
161 } 191 }
162 192
163 override public UserAgentData GetAgentByUUID(UUID uuid) 193 override public UserAgentData GetAgentByUUID(UUID uuid)
164 { 194 {
165 m_log.InfoFormat("[NHIBERNATE] GetAgentByUUID: {0} ", uuid); 195 try
166 return (UserAgentData)manager.Load(typeof(UserAgentData), uuid); 196 {
197 return session.Load(typeof(UserAgentData), uuid) as UserAgentData;
198 }
199 catch
200 {
201 return null;
202 }
167 } 203 }
168 204
169 override public UserProfileData GetUserByName(string fname, string lname) 205 override public UserProfileData GetUserByName(string fname, string lname)
170 { 206 {
171 m_log.InfoFormat("[NHIBERNATE] GetUserByName: {0} {1} ", fname, lname); 207 ICriteria criteria = session.CreateCriteria(typeof(UserProfileData));
172 ICriteria criteria = manager.GetSession().CreateCriteria(typeof(UserProfileData));
173 criteria.Add(Expression.Eq("FirstName", fname)); 208 criteria.Add(Expression.Eq("FirstName", fname));
174 criteria.Add(Expression.Eq("SurName", lname)); 209 criteria.Add(Expression.Eq("SurName", lname));
175 foreach (UserProfileData profile in criteria.List()) 210 foreach (UserProfileData profile in criteria.List())
@@ -198,7 +233,7 @@ namespace OpenSim.Data.NHibernate
198 233
199 if (querysplit.Length == 2) 234 if (querysplit.Length == 2)
200 { 235 {
201 ICriteria criteria = manager.GetSession().CreateCriteria(typeof(UserProfileData)); 236 ICriteria criteria = session.CreateCriteria(typeof(UserProfileData));
202 criteria.Add(Expression.Like("FirstName", querysplit[0])); 237 criteria.Add(Expression.Like("FirstName", querysplit[0]));
203 criteria.Add(Expression.Like("SurName", querysplit[1])); 238 criteria.Add(Expression.Like("SurName", querysplit[1]));
204 foreach (UserProfileData profile in criteria.List()) 239 foreach (UserProfileData profile in criteria.List())
@@ -227,18 +262,26 @@ namespace OpenSim.Data.NHibernate
227 /// TODO: stubs for now to get us to a compiling state gently 262 /// TODO: stubs for now to get us to a compiling state gently
228 public override AvatarAppearance GetUserAppearance(UUID user) 263 public override AvatarAppearance GetUserAppearance(UUID user)
229 { 264 {
230 return (AvatarAppearance)manager.Load(typeof(AvatarAppearance), user); 265 AvatarAppearance appearance;
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;
231 } 273 }
232 274
233 private bool ExistsAppearance(UUID uuid) 275 private bool ExistsAppearance(UUID uuid)
234 { 276 {
235 AvatarAppearance appearance = (AvatarAppearance)manager.Load(typeof(AvatarAppearance), uuid); 277 AvatarAppearance appearance;
236 if (appearance == null) 278 try {
237 { 279 appearance = session.Load(typeof(AvatarAppearance), uuid) as AvatarAppearance;
238 return false; 280 } catch (ObjectNotFoundException) {
281 appearance = null;
239 } 282 }
240 283
241 return true; 284 return (appearance == null) ? false : true;
242 } 285 }
243 286
244 287
@@ -252,11 +295,11 @@ namespace OpenSim.Data.NHibernate
252 bool exists = ExistsAppearance(user); 295 bool exists = ExistsAppearance(user);
253 if (exists) 296 if (exists)
254 { 297 {
255 manager.Update(appearance); 298 session.Update(appearance);
256 } 299 }
257 else 300 else
258 { 301 {
259 manager.Save(appearance); 302 session.Save(appearance);
260 } 303 }
261 } 304 }
262 305