diff --git a/components/net/sf/briar/db/JdbcDatabase.java b/components/net/sf/briar/db/JdbcDatabase.java index 40d519045ff42e6b59e49c2cf53eefe52ade52cc..7dcff3b5d0e4dd89ac98a46f00628cbe5aa29fe5 100644 --- a/components/net/sf/briar/db/JdbcDatabase.java +++ b/components/net/sf/briar/db/JdbcDatabase.java @@ -1454,10 +1454,13 @@ abstract class JdbcDatabase implements Database<Connection> { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT contactId, key, value" - + " FROM contactTransportProperties" - + " WHERE transportId = ?" - + " ORDER BY contactId"; + String sql = "SELECT contactTransports.contactId, key, value" + + " FROM contactTransports" + + " LEFT OUTER JOIN contactTransportProperties" + + " ON contactTransports.transportId" + + " = contactTransportProperties.transportId" + + " WHERE contactTransports.transportId = ?" + + " ORDER BY contactTransports.contactId"; ps = txn.prepareStatement(sql); ps.setBytes(1, t.getBytes()); rs = ps.executeQuery(); @@ -1471,7 +1474,10 @@ abstract class JdbcDatabase implements Database<Connection> { p = new TransportProperties(); properties.put(id, p); } - p.put(rs.getString(2), rs.getString(3)); + // Key and value may be null due to the left outer join + String key = rs.getString(2); + String value = rs.getString(3); + if(key != null && value != null) p.put(key, value); } rs.close(); ps.close(); diff --git a/test/net/sf/briar/db/H2DatabaseTest.java b/test/net/sf/briar/db/H2DatabaseTest.java index e8d0248fa5251326b23109442fc774ee2cbed157..11020c3178e1cd039ed7e93cbf4ee8a7facb1a32 100644 --- a/test/net/sf/briar/db/H2DatabaseTest.java +++ b/test/net/sf/briar/db/H2DatabaseTest.java @@ -999,7 +999,7 @@ public class H2DatabaseTest extends TestCase { Database<Connection> db = open(false); Connection txn = db.startTransaction(); - // Add a contact with some transport properties + // Add a contact with a transport assertEquals(contactId, db.addContact(txn, secret)); db.setTransports(txn, contactId, remoteTransports, 1); assertEquals(remoteProperties, @@ -1018,8 +1018,17 @@ public class H2DatabaseTest extends TestCase { assertEquals(remoteProperties1, db.getRemoteProperties(txn, transportId)); - // Remove the transport properties - db.setTransports(txn, contactId, Collections.<Transport>emptyList(), 3); + // Remove the transport properties but leave the transport + properties1 = new TransportProperties(); + remoteTransport1 = new Transport(transportId, remoteIndex, properties1); + remoteTransports1 = Collections.singletonList(remoteTransport1); + remoteProperties1 = Collections.singletonMap(contactId, properties1); + db.setTransports(txn, contactId, remoteTransports1, 3); + assertEquals(remoteProperties1, + db.getRemoteProperties(txn, transportId)); + + // Remove the transport + db.setTransports(txn, contactId, Collections.<Transport>emptyList(), 4); assertEquals(Collections.emptyMap(), db.getRemoteProperties(txn, transportId)); @@ -1035,13 +1044,12 @@ public class H2DatabaseTest extends TestCase { // Allocate a transport index assertEquals(localIndex, db.addTransport(txn, transportId)); - // Set the local transport properties + // Set the transport properties db.setLocalProperties(txn, transportId, properties); assertEquals(Collections.singletonList(properties), db.getLocalTransports(txn)); - // Remove the local transport properties - the transport itself will - // not be removed + // Remove the transport properties but leave the transport db.setLocalProperties(txn, transportId, new TransportProperties()); assertEquals(Collections.singletonList(Collections.emptyMap()), db.getLocalTransports(txn)); @@ -1084,7 +1092,7 @@ public class H2DatabaseTest extends TestCase { Database<Connection> db = open(false); Connection txn = db.startTransaction(); - // Add a contact with some transport properties + // Add a contact with a transport assertEquals(contactId, db.addContact(txn, secret)); db.setTransports(txn, contactId, remoteTransports, 1); assertEquals(remoteProperties,