コード例 #1
0
        public override void Attach(DatabaseParameterBuffer dpb, string dataSource, int port, string database, byte[] cryptKey)
        {
            try
            {
                SendAttachToBuffer(dpb, database);
                XdrStream.Flush();
                var response = ReadResponse();
                while (response is CryptKeyCallbackReponse cryptResponse)
                {
                    XdrStream.Write(IscCodes.op_crypt_key_callback);
                    XdrStream.WriteBuffer(cryptKey);
                    XdrStream.Flush();
                    response = ReadResponse();
                }
                ProcessAttachResponse(response as GenericResponse);
            }
            catch (IscException)
            {
                SafelyDetach();
                throw;
            }
            catch (IOException ex)
            {
                SafelyDetach();
                throw IscException.ForErrorCode(IscCodes.isc_net_write_err, ex);
            }

            AfterAttachActions();
        }
コード例 #2
0
        public override void AttachWithTrustedAuth(DatabaseParameterBuffer dpb, string dataSource, int port, string database)
        {
            lock (SyncObject)
            {
                try
                {
                    using (SspiHelper sspiHelper = new SspiHelper())
                    {
                        byte[] authData = sspiHelper.InitializeClientSecurity();
                        SendTrustedAuthToBuffer(dpb, authData);
                        SendAttachToBuffer(dpb, database);
                        XdrStream.Flush();

                        IResponse response = ReadResponse();
                        ProcessTrustedAuthResponse(sspiHelper, ref response);
                        ProcessAttachResponse((GenericResponse)response);
                    }
                }
                catch (IscException)
                {
                    SafelyDetach();
                    throw;
                }
                catch (IOException ex)
                {
                    SafelyDetach();
                    throw IscException.ForErrorCode(IscCodes.isc_net_write_err, ex);
                }

                AfterAttachActions();
            }
        }
コード例 #3
0
        public override void CreateDatabase(DatabaseParameterBuffer dpb, string dataSource, int port, string database, byte[] cryptKey)
        {
            try
            {
                SendCreateToBuffer(dpb, database);
                XdrStream.Flush();

                try
                {
                    var response = ReadResponse();
                    response = ProcessCryptCallbackResponseIfNeeded(response, cryptKey);
                    ProcessCreateResponse(response as GenericResponse);

                    Detach();
                }
                catch (IscException)
                {
                    try
                    {
                        CloseConnection();
                    }
                    catch
                    { }
                    throw;
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForErrorCode(IscCodes.isc_net_write_err, ex);
            }
        }
コード例 #4
0
 protected void ProcessTrustedAuthResponse(SspiHelper sspiHelper, ref IResponse response)
 {
     while (response is AuthResponse)
     {
         byte[] authData = sspiHelper.GetClientSecurity(((AuthResponse)response).Data);
         XdrStream.Write(IscCodes.op_trusted_auth);
         XdrStream.WriteBuffer(authData);
         XdrStream.Flush();
         response = ReadResponse();
     }
 }
コード例 #5
0
 public IResponse ProcessCryptCallbackResponseIfNeeded(IResponse response, byte[] cryptKey)
 {
     while (response is CryptKeyCallbackResponse cryptResponse)
     {
         XdrStream.Write(IscCodes.op_crypt_key_callback);
         XdrStream.WriteBuffer(cryptKey);
         XdrStream.Flush();
         response = ReadResponse();
     }
     return(response);
 }
コード例 #6
0
 protected override void SendCreateToBuffer(DatabaseParameterBuffer dpb, string database)
 {
     XdrStream.Write(IscCodes.op_create);
     XdrStream.Write(0);
     if (AuthData != null)
     {
         dpb.Append(IscCodes.isc_dpb_specific_auth_data, AuthData);
     }
     dpb.Append(IscCodes.isc_dpb_utf8_filename, 0);
     XdrStream.WriteBuffer(Encoding.UTF8.GetBytes(database));
     XdrStream.WriteBuffer(dpb.ToArray());
 }
コード例 #7
0
 protected override void SendCreateToBuffer(DatabaseParameterBuffer dpb, string database)
 {
     XdrStream.Write(IscCodes.op_create);
     XdrStream.Write(0);
     if (!string.IsNullOrEmpty(Password))
     {
         dpb.Append(IscCodes.isc_dpb_password, Password);
     }
     dpb.Append(IscCodes.isc_dpb_utf8_filename, 0);
     XdrStream.WriteBuffer(Encoding.UTF8.GetBytes(database));
     XdrStream.WriteBuffer(dpb.ToArray());
 }
コード例 #8
0
 public override void CancelOperation(int kind)
 {
     try
     {
         SendCancelOperationToBuffer(kind);
         XdrStream.Flush();
         // no response, this is async
     }
     catch (IOException ex)
     {
         throw IscException.ForErrorCode(IscCodes.isc_network_error, ex);
     }
 }
コード例 #9
0
        public override void CreateDatabaseWithTrustedAuth(DatabaseParameterBuffer dpb, string dataSource, int port, string database, byte[] cryptKey)
        {
            using (var sspiHelper = new SspiHelper())
            {
                var authData = sspiHelper.InitializeClientSecurity();
                SendTrustedAuthToBuffer(dpb, authData);
                SendCreateToBuffer(dpb, database);
                XdrStream.Flush();

                var response = ReadResponse();
                ProcessTrustedAuthResponse(sspiHelper, ref response);
                ProcessCreateResponse((GenericResponse)response);
            }
        }
コード例 #10
0
        protected override byte[] WriteParameters()
        {
            if (_parameters == null)
            {
                return(null);
            }

            using (var xdr = new XdrStream(_database.Charset))
            {
                try
                {
                    var bits = new BitArray(_parameters.Count);
                    for (var i = 0; i < _parameters.Count; i++)
                    {
                        var field = _parameters[i];
                        bits.Set(i, field.DbValue.IsDBNull());
                    }
                    var buffer = new byte[(int)Math.Ceiling(_parameters.Count / 8d)];
                    for (var i = 0; i < buffer.Length * 8; i++)
                    {
                        var index = i / 8;
                        // LSB
                        buffer[index] = (byte)((buffer[index] >> 1) | (bits.Length > i && bits[i] ? 1 << 7 : 0));
                    }
                    xdr.WriteOpaque(buffer);

                    for (var i = 0; i < _parameters.Count; i++)
                    {
                        var field = _parameters[i];
                        if (field.DbValue.IsDBNull())
                        {
                            continue;
                        }
                        WriteRawParameter(xdr, field);
                    }

                    return(xdr.ToArray());
                }
                catch (IOException ex)
                {
                    throw IscException.ForErrorCode(IscCodes.isc_net_write_err, ex);
                }
            }
        }
コード例 #11
0
        public override void Attach(DatabaseParameterBuffer dpb, string dataSource, int port, string database, byte[] cryptKey)
        {
            try
            {
                SendAttachToBuffer(dpb, database);
                XdrStream.Flush();
                var response = ReadResponse();
                response = ProcessCryptCallbackResponseIfNeeded(response, cryptKey);
                ProcessAttachResponse(response as GenericResponse);
            }
            catch (IscException)
            {
                SafelyDetach();
                throw;
            }
            catch (IOException ex)
            {
                SafelyDetach();
                throw IscException.ForErrorCode(IscCodes.isc_network_error, ex);
            }

            AfterAttachActions();
        }
コード例 #12
0
 protected void SendCancelOperationToBuffer(int kind)
 {
     XdrStream.Write(IscCodes.op_cancel);
     XdrStream.Write(kind);
 }