Send op_disconnect
------------------

                 Key: DNET-275
                 URL: http://tracker.firebirdsql.org/browse/DNET-275
             Project: .NET Data provider
          Issue Type: Bug
          Components: ADO.NET Provider
    Affects Versions: 2.5.1
            Reporter: Jiri Cincura
            Assignee: Jiri Cincura


Jiri,

As far as I remember, the .NET provider doesn't send op_disconnect to the 
server either. Could you please check whether it's true and fix the code 
appropriately?

This is indirectly related to CORE-2462 where both main and event ports are 
disconnected only forcibly via the socket shutdown and the server sometimes has 
problems with that.


Dmitry



-------- Original Message --------
Subject: [Firebird-checkins] CVS:
Date: Tue, 29 Sep 2009 06:31:54 +0000 (UTC)
From: rrokyts...@users.sourceforge.net ("Roman Rokytskyy")
Organization: Firebird and InterBase Community Site
To: firebird-check...@lists.sourceforge.net
Newsgroups: sourceforge.firebird-checkins

Update of
/cvsroot/firebird/client-java/src/main/org/firebirdsql/gds/impl/wire
In directory
fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv13506/src/main/org/firebirdsql/gds/impl/wire

Modified Files:
        AbstractJavaGDSImpl.java
Log Message:
Jaybird was not sending op_disconnect on isc_database_detach and 
isc_service_detach and there was no op_connect on isc_service_attach

Index: AbstractJavaGDSImpl.java
===================================================================
RCS file: 
/cvsroot/firebird/client-java/src/main/org/firebirdsql/gds/impl/wire/AbstractJavaGDSImpl.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -b -U3 -r1.23 -r1.24
--- AbstractJavaGDSImpl.java    18 Sep 2009 08:12:25 -0000      1.23
+++ AbstractJavaGDSImpl.java    29 Sep 2009 06:58:33 -0000      1.24
@@ -643,6 +643,7 @@
                                        log.debug("op_detach ");
                                db.out.writeInt(op_detach);
                                db.out.writeInt(db.getRdb_id());
+                               db.out.writeInt(op_disconnect);
                                db.out.flush();
                                if (debug)
                                        log.debug("sent");
@@ -1170,12 +1171,12 @@
                                        stmt.notifyOpenResultSet();
                                if (debug)
                                        log.debug("sent");
-                               int op = nextOperation(db);
+                               int op = nextOperation(db.in);
                                if (op == op_sql_response) {
                                        // this would be an Execute procedure
                                        stmt.ensureCapacity(1);
                                        receiveSqlResponse(db, out_xsqlda, 
stmt);
-                                       op = nextOperation(db);
+                                       op = nextOperation(db.in);
                                        stmt.setAllRowsFetched(true);
                                        stmt.setSingletonResult(true);
                                } else {
@@ -1283,10 +1284,10 @@
                                if (debug)
                                        log.debug("sent");

-                               int op = nextOperation(db);
+                               int op = nextOperation(db.in);
                                if (op == op_sql_response) {
                                        receiveSqlResponse(db, out_xsqlda, 
null);
-                                       op = nextOperation(db);
+                                       op = nextOperation(db.in);
                                }
                                receiveResponse(db, op);
                        } catch (IOException ex) {
@@ -1331,7 +1332,7 @@
                                if (debug)
                                        log.debug("sent");

-                               int op = nextOperation(db);
+                               int op = nextOperation(db.in);
                                stmt.notifyOpenResultSet();
                                if (op == op_fetch_response) {

@@ -1345,7 +1346,7 @@
                                                if (sqldata_messages > 0 && 
sqldata_status == 0) {
                                                        
in.readSQLData(xsqlda.ioLength, stmt);
                                                        do {
-                                                               op = 
nextOperation(db);
+                                                               op = 
nextOperation(db.in);
                                                                if (op == 
op_response) {
                                                                        
receiveResponse(db, op);
                                                                        
continue;
@@ -1925,6 +1926,7 @@
        protected void connect(isc_db_handle_impl db, DbAttachInfo dbai,
                        DatabaseParameterBuffer databaseParameterBuffer)
                        throws GDSException {
+
                boolean debug = log != null && log.isDebugEnabled();

                int socketBufferSize = -1;
@@ -1949,10 +1951,41 @@
                try {
                        openSocket(db, dbai, debug, socketBufferSize);

+                       XdrOutputStream out = db.out;
+                       XdrInputStream in = db.in;
+                       String fileName = dbai.getFileName();
+
+                       int nextOperation = sendConnectPacket(out, in, 
fileName);
+                       
+                       if (nextOperation == op_accept) {
+                               db.setProtocol(in.readInt()); // Protocol 
version number
+                               int arch = in.readInt(); // Architecture for 
protocol
+                               int min = in.readInt(); // Minimum type
+                               if (debug)
+                                       log.debug("received");
+                       } else {
+                               disconnect(db);
+                               if (debug)
+                                       log.debug("not received");
+                               throw new 
GDSException(ISCConstants.isc_connect_reject);
+                       }
+               } catch (IOException ex) {
+                       if (debug)
+                               log.debug("IOException while trying to connect 
to db:", ex);
+                       throw new GDSException(ISCConstants.isc_arg_gds,
+                                       ISCConstants.isc_network_error, 
dbai.getServer());
+               }
+       }
+
+       protected int sendConnectPacket(XdrOutputStream out, XdrInputStream in,
+                       String fileName) throws IOException {
+               
+               boolean debug = log != null && log.isDebugEnabled();
+
                        // Here we identify the user to the engine. This may or 
may not be
-                       // used
-                       // as login info to a database.
+               // used as login info to a database.
                        String user = System.getProperty("user.name");
+               
                        if (debug)
                                log.debug("user.name: " + user);
                        
@@ -1994,44 +2027,29 @@

                        if (debug)
                                log.debug("op_connect ");
-                       db.out.writeInt(op_connect);
-                       db.out.writeInt(op_attach);
-                       db.out.writeInt(2); // CONNECT_VERSION2
-                       db.out.writeInt(1); // arch_generic
+               out.writeInt(op_connect);
+               out.writeInt(op_attach);
+               out.writeInt(2); // CONNECT_VERSION2
+               out.writeInt(1); // arch_generic
                        // db.out.writeString(file_name); // p_cnct_file
-                       db.out.writeString(dbai.getFileName()); // p_cnct_file
-                       db.out.writeInt(1); // p_cnct_count
-                       db.out.writeBuffer(user_id); // p_cnct_user_id
-
-                       db.out.writeInt(10); // PROTOCOL_VERSION10
-                       db.out.writeInt(1); // arch_generic
-                       db.out.writeInt(2); // ptype_rpc
-                       db.out.writeInt(3); // ptype_batch_send
-                       db.out.writeInt(2);
-                       db.out.flush();
+               out.writeString(fileName); // p_cnct_file
+               out.writeInt(1); // p_cnct_count
+               out.writeBuffer(user_id); // p_cnct_user_id
+
+               out.writeInt(10); // PROTOCOL_VERSION10
+               out.writeInt(1); // arch_generic
+               out.writeInt(2); // ptype_rpc
+               out.writeInt(3); // ptype_batch_send
+               out.writeInt(2);
+               out.flush();
                        if (debug)
                                log.debug("sent");

                        if (debug)
                                log.debug("op_accept ");
-                       if (nextOperation(db) == op_accept) {
-                               db.setProtocol(db.in.readInt()); // Protocol 
version number
-                               int arch = db.in.readInt(); // Architecture for 
protocol
-                               int min = db.in.readInt(); // Minimum type
-                               if (debug)
-                                       log.debug("received");
-                       } else {
-                               disconnect(db);
-                               if (debug)
-                                       log.debug("not received");
-                               throw new 
GDSException(ISCConstants.isc_connect_reject);
-                       }
-               } catch (IOException ex) {
-                       if (debug)
-                               log.debug("IOException while trying to connect 
to db:", ex);
-                       throw new GDSException(ISCConstants.isc_arg_gds,
-                                       ISCConstants.isc_network_error, 
dbai.getServer());
-               }
+               
+               int nextOperation = nextOperation(in);
+               return nextOperation;
        }

        /**
@@ -2115,7 +2133,7 @@
                // when used directly
                try {
                        if (op == -1)
-                               op = nextOperation(db);
+                               op = nextOperation(db.in);
                        if (debug)
                                log.debug("op_response ");
                        if (op == op_response) {
@@ -2157,11 +2175,11 @@
                }
        }

-       protected int nextOperation(isc_db_handle_impl db) throws IOException {
+       protected int nextOperation(XdrInputStream in) throws IOException {
                boolean debug = log != null && log.isDebugEnabled();
                int op = 0;
                do {
-                       op = db.in.readInt();
+                       op = in.readInt();
                        if (debug) {
                                if (op == op_dummy) {
                                        log.debug("op_dummy received");
@@ -2704,7 +2722,7 @@
                synchronized (svc) {
                        try {
                                try {
-                                       svc.socket = new Socket(host, port);
+                                       svc.socket = getSocket(host, port);
                                        svc.socket.setTcpNoDelay(true);

                                        // if (socketBufferSize != -1) {
@@ -2724,6 +2742,22 @@
                                svc.out = new 
XdrOutputStream(svc.socket.getOutputStream());
                                svc.in = new 
XdrInputStream(svc.socket.getInputStream());

+                               int nextOperation = sendConnectPacket(svc.out, 
svc.in, 
+serviceMgrStr);
+                               
+                               if (nextOperation == op_accept) {
+                                       svc.in.readInt(); // Protocol version 
number
+                                       svc.in.readInt(); // Architecture for 
protocol
+                                       svc.in.readInt(); // Minimum type
+                                       if (debug)
+                                               log.debug("received");
+                               } else {
+                                       svc.invalidate();
+                                       if (debug)
+                                               log.debug("not received");
+                                       throw new 
GDSException(ISCConstants.isc_connect_reject);
+                               }
+
+                               
                                if (debug)
                                        log.debug("op_service_attach ");
                                svc.out.writeInt(op_service_attach);
@@ -2761,7 +2795,7 @@
                // when used directly
                try {
                        if (op == -1)
-                               op = nextOperation(svc);
+                               op = nextOperation(svc.in);
                        if (debug)
                                log.debug("op_response ");
                        if (op == op_response) {
@@ -2791,20 +2825,6 @@
                }
        }

-       protected int nextOperation(isc_svc_handle_impl svc) throws IOException 
{
-               boolean debug = log != null && log.isDebugEnabled();
-               int op = 0;
-               do {
-                       op = svc.in.readInt();
-                       if (debug) {
-                               if (op == op_dummy) {
-                                       log.debug("op_dummy received");
-                               }
-                       }
-               } while (op == op_dummy);
-               return op;
-       }
-
        private void readStatusVector(isc_svc_handle_impl svc) throws 
GDSException {
                boolean debug = log != null && log.isDebugEnabled();
                try {
@@ -2907,6 +2927,7 @@
                        try {
                                svc.out.writeInt(op_service_detach);
                                svc.out.writeInt(svc.getHandle());
+                               svc.out.writeInt(op_disconnect);
                                svc.out.flush();

                                receiveResponse(svc, -1);
@@ -3014,7 +3035,7 @@
                      db.out.writeInt(0);
                      db.out.flush();

-                    nextOperation(db);
+                    nextOperation(db.in);

                      int auxHandle = db.in.readInt();
                      // garbage
@@ -3145,7 +3166,7 @@
          public void run(){
              try {
                  while (running){
-                    int op = nextOperation(db);
+                    int op = nextOperation(db.in);
                      switch (op){
                          case op_response:
                              receiveResponse(db, op);


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

------------------------------------------------------------------------------
Come build with us! The BlackBerry® Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9-12, 2009. Register now!
http://p.sf.net/sfu/devconf
_______________________________________________
Firebird-net-provider mailing list
Firebird-net-provider@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/firebird-net-provider

Reply via email to