Thread: Bug receiving NotificationResponse Message v3
Hello, I found a problem in the current jdbc driver. My application receives asynchronous notification messages from the backend. Using postgresql 7.1, it works. When I switch to postgresql 7.4, it doesn't work anymore. An exception postgresql.con.type is thrown in org.postgresql.core.QueryExecutor.executeV3. This is because 7.1 uses protocol version 2 and 7.4 uses protocol version 3. In version 3, the message format has changed, the message contains additional data (message length, additional information) => see http://www.postgresql.org/docs/current/interactive/protocol-message-formats.html under NotificationResponse. So the function executeV3 needs to be changed, I propose the following change: ... (line 129): switch (c) { case 'A': // Asynchronous Notify int msglen = pgStream.ReceiveInteger(4); // added int pid = pgStream.ReceiveInteger(4); String msg = pgStream.ReceiveString(connection.getEncoding()); String param = pgStream.ReceiveString(connection.getEncoding()); // added connection.addNotification(new org.postgresql.core.Notification(msg, pid)); break; case 'B': // Binary Data Transfer ... regards Hans
On Wed, 28 Jan 2004, [ISO-8859-1] Hans N�ther wrote: > Hello, > > I found a problem in the current jdbc driver. My application receives > asynchronous notification messages from the backend. Using postgresql > 7.1, it works. When I switch to postgresql 7.4, it doesn't work anymore. > An exception postgresql.con.type is thrown in > org.postgresql.core.QueryExecutor.executeV3. This is because 7.1 uses > protocol version 2 and 7.4 uses protocol version 3. In version 3, the > message format has changed, the message contains additional data > (message length, additional information) => see > http://www.postgresql.org/docs/current/interactive/protocol-message-formats.html > under NotificationResponse. > > So the function executeV3 needs to be changed, I propose the following > change: > > ... (line 129): > switch (c) > { > case 'A': // Asynchronous Notify > int msglen = pgStream.ReceiveInteger(4); // added > int pid = pgStream.ReceiveInteger(4); > String msg = pgStream.ReceiveString(connection.getEncoding()); > String param = pgStream.ReceiveString(connection.getEncoding()); // > added > connection.addNotification(new > org.postgresql.core.Notification(msg, pid)); > break; > case 'B': // Binary Data Transfer > ... Good catch. I've applied the attached patch to the gborg cvs driver. I'm not sure how well it will apply to the 7.4 version. This problem was also present in the notification receiving in fastpath. Further the pid field was being read in the wrong byte order. Kris Jurka
On Wed, 28 Jan 2004, Kris Jurka wrote: > Good catch. I've applied the attached patch to the gborg cvs driver. I'm > not sure how well it will apply to the 7.4 version. This problem was also > present in the notification receiving in fastpath. Further the pid > field was being read in the wrong byte order. > With the actual patch. Kris Jurka