diff --git a/components/net/sf/briar/db/JdbcDatabase.java b/components/net/sf/briar/db/JdbcDatabase.java index 0ec9015392e60610466fa0607021f38ea183a1b4..458d39edc21900f477e5b55e050cd2cdf5911586 100644 --- a/components/net/sf/briar/db/JdbcDatabase.java +++ b/components/net/sf/briar/db/JdbcDatabase.java @@ -550,6 +550,44 @@ abstract class JdbcDatabase implements Database<Connection> { affected = ps.executeUpdate(); if(affected != 1) throw new DbStateException(); ps.close(); + // Initialise the connection numbers for all transports + sql = "INSERT INTO connections (contactId, index, outgoing)" + + " VALUES (?, ?, ZERO())"; + ps = txn.prepareStatement(sql); + ps.setInt(1, c.getInt()); + for(int i = 0; i < ProtocolConstants.MAX_TRANSPORTS; i++) { + ps.setInt(2, i); + ps.addBatch(); + } + int[] batchAffected = ps.executeBatch(); + if(batchAffected.length != ProtocolConstants.MAX_TRANSPORTS) + throw new DbStateException(); + for(int i = 0; i < batchAffected.length; i++) { + if(batchAffected[i] != 1) throw new DbStateException(); + } + ps.close(); + // Initialise the connection windows for all transports + sql = "INSERT INTO connectionWindows (contactId, index, unseen)" + + " VALUES (?, ?, ?)"; + ps = txn.prepareStatement(sql); + ps.setInt(1, c.getInt()); + int batchSize = 0; + for(int i = 0; i < ProtocolConstants.MAX_TRANSPORTS; i++) { + ps.setInt(2, i); + ConnectionWindow w = + connectionWindowFactory.createConnectionWindow(); + for(long l : w.getUnseen()) { + ps.setLong(3, l); + ps.addBatch(); + batchSize++; + } + } + batchAffected = ps.executeBatch(); + if(batchAffected.length != batchSize) throw new DbStateException(); + for(int i = 0; i < batchAffected.length; i++) { + if(batchAffected[i] != 1) throw new DbStateException(); + } + ps.close(); return c; } catch(SQLException e) { tryToClose(rs); @@ -903,42 +941,26 @@ abstract class JdbcDatabase implements Database<Connection> { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT outgoing FROM connections" + String sql = "UPDATE connections SET outgoing = outgoing + 1" + + " WHERE contactId = ? AND index = ?"; + ps = txn.prepareStatement(sql); + ps.setInt(1, c.getInt()); + ps.setInt(2, i.getInt()); + int affected = ps.executeUpdate(); + if(affected != 1) throw new DbStateException(); + ps.close(); + sql = "SELECT outgoing FROM connections" + " WHERE contactId = ? AND index = ?"; ps = txn.prepareStatement(sql); ps.setInt(1, c.getInt()); ps.setInt(2, i.getInt()); rs = ps.executeQuery(); - if(rs.next()) { - // A connection row exists - update it - long outgoing = rs.getLong(1); - if(rs.next()) throw new DbStateException(); - rs.close(); - ps.close(); - sql = "UPDATE connections SET outgoing = ?" - + " WHERE contactId = ? AND index = ?"; - ps = txn.prepareStatement(sql); - ps.setLong(1, outgoing + 1); - ps.setInt(2, c.getInt()); - ps.setInt(3, i.getInt()); - int affected = ps.executeUpdate(); - if(affected != 1) throw new DbStateException(); - ps.close(); - return outgoing; - } else { - // No connection row exists - create one - rs.close(); - ps.close(); - sql = "INSERT INTO connections (contactId, index, outgoing)" - + " VALUES(?, ?, ZERO())"; - ps = txn.prepareStatement(sql); - ps.setInt(1, c.getInt()); - ps.setInt(2, i.getInt()); - int affected = ps.executeUpdate(); - if(affected != 1) throw new DbStateException(); - ps.close(); - return 0L; - } + if(!rs.next()) throw new DbStateException(); + long outgoing = rs.getLong(1); + if(rs.next()) throw new DbStateException(); + rs.close(); + ps.close(); + return outgoing; } catch(SQLException e) { tryToClose(rs); tryToClose(ps); @@ -961,9 +983,7 @@ abstract class JdbcDatabase implements Database<Connection> { while(rs.next()) unseen.add(rs.getLong(1)); rs.close(); ps.close(); - if(unseen.isEmpty()) - return connectionWindowFactory.createConnectionWindow(); - else return connectionWindowFactory.createConnectionWindow(unseen); + return connectionWindowFactory.createConnectionWindow(unseen); } catch(SQLException e) { tryToClose(rs); tryToClose(ps);