Merge branch 'master' of github.com:tgiphil/mono
[mono.git] / mcs / class / System.Data.OracleClient / System.Data.OracleClient.Oci / OciServiceHandle.cs
index d1c6a7a56f2f70add8ccd88c8687310d1a903d65..84a5cad6b6f6e3d89ac1642c67a02309e00b2043 100644 (file)
 // 
 // Author: 
 //     Tim Coleman <tim@timcoleman.com>
+//     Daniel Morgan <monodanmorg@yahoo.com>
 //         
 // Copyright (C) Tim Coleman, 2003
+// Copyright (C) Daniel Morgan, 2009
 // 
 
+//#define ORACLE_DATA_ACCESS
+
 using System;
 using System.Runtime.InteropServices;
 
@@ -29,6 +33,10 @@ namespace System.Data.OracleClient.Oci {
 
                OciErrorHandle errorHandle;
 
+#if ORACLE_DATA_ACCESS
+               static readonly uint OCI_AUTH = 8;
+#endif
+
                #endregion // Fields
 
                #region Constructors
@@ -92,6 +100,43 @@ namespace System.Data.OracleClient.Oci {
                        return (status == 0);
                }
 
+#if ORACLE_DATA_ACCESS
+               byte[] UnicodeToCharSet (string s)
+               {
+                       int rsize = 0;
+                       byte [] buffer;
+                       
+                       // Get size of buffer
+                       OciCalls.OCIUnicodeToCharSet (Parent, null, s, out rsize);
+                       
+                       // Fill buffer
+                       buffer = new byte[rsize];
+                       OciCalls.OCIUnicodeToCharSet (Parent, buffer, s, out rsize);
+
+                       return buffer;
+               }
+
+               internal bool ChangePassword (string new_password, OciErrorHandle error) 
+               {                       
+                       if (!session.SetCredentialAttributes (error))
+                               return false;
+
+                       byte[] ub = UnicodeToCharSet (session.Username
+                       byte[] opb = UnicodeToCharSet (session.Password);
+                       byte[] npb = UnicodeToCharSet (new_password);
+
+                       int status = OciCalls.OCIPasswordChange (this, error, ub, ub.Length, opb, opb.Length, npb, npb.Length, OCI_AUTH);
+                       
+                       if (status == 0) {
+                               session.Password = new_password;
+                               return true;
+                       }
+                               
+                       return false;
+               }
+#endif
+
                #endregion // Methods
        }
 }
+