From ea339e76d64e954d89a964c58bc6cd330b11abb7 Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Tue, 29 Jan 2013 17:09:06 +0000 Subject: [PATCH] Added getVisibleSubscriptions() method for managing group visibility. --- .../sf/briar/api/db/DatabaseComponent.java | 3 +++ briar-core/src/net/sf/briar/db/Database.java | 8 ++++++ .../sf/briar/db/DatabaseComponentImpl.java | 26 +++++++++++++++++++ .../src/net/sf/briar/db/JdbcDatabase.java | 24 ++++++++++++++++- 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java b/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java index c8a8b3a02f..0932c53595 100644 --- a/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java +++ b/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java @@ -174,6 +174,9 @@ public interface DatabaseComponent { /** Returns the contacts to which the given group is visible. */ Collection<ContactId> getVisibility(GroupId g) throws DbException; + /** Returns the subscriptions that are visible to the given contact. */ + Collection<GroupId> getVisibleSubscriptions(ContactId c) throws DbException; + /** Returns true if any messages are sendable to the given contact. */ boolean hasSendableMessages(ContactId c) throws DbException; diff --git a/briar-core/src/net/sf/briar/db/Database.java b/briar-core/src/net/sf/briar/db/Database.java index eaf7b6a143..9fa585ff38 100644 --- a/briar-core/src/net/sf/briar/db/Database.java +++ b/briar-core/src/net/sf/briar/db/Database.java @@ -441,6 +441,14 @@ interface Database<T> { */ Collection<ContactId> getVisibility(T txn, GroupId g) throws DbException; + /** + * Returns the subscriptions that are visible to the given contact. + * <p> + * Locking: contact read, subscription read. + */ + Collection<GroupId> getVisibleSubscriptions(T txn, ContactId c) + throws DbException; + /** * Returns true if any messages are sendable to the given contact. * <p> diff --git a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java index 0c96b0fa87..87777852ed 100644 --- a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java +++ b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java @@ -982,6 +982,32 @@ DatabaseCleaner.Callback { } } + public Collection<GroupId> getVisibleSubscriptions(ContactId c) + throws DbException { + contactLock.readLock().lock(); + try { + subscriptionLock.readLock().lock(); + try { + T txn = db.startTransaction(); + try { + if(!db.containsContact(txn, c)) + throw new NoSuchContactException(); + Collection<GroupId> visible = + db.getVisibleSubscriptions(txn, c); + db.commitTransaction(txn); + return visible; + } catch(DbException e) { + db.abortTransaction(txn); + throw e; + } + } finally { + subscriptionLock.readLock().unlock(); + } + } finally { + contactLock.readLock().unlock(); + } + } + public boolean hasSendableMessages(ContactId c) throws DbException { contactLock.readLock().lock(); try { diff --git a/briar-core/src/net/sf/briar/db/JdbcDatabase.java b/briar-core/src/net/sf/briar/db/JdbcDatabase.java index c6ba2bb27d..e3a8637e42 100644 --- a/briar-core/src/net/sf/briar/db/JdbcDatabase.java +++ b/briar-core/src/net/sf/briar/db/JdbcDatabase.java @@ -1854,7 +1854,7 @@ abstract class JdbcDatabase implements Database<Connection> { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT transportId, key, value, localVersion" + String sql = "SELECT tp.transportId, key, value, localVersion" + " FROM transportProperties AS tp" + " JOIN transportVersions AS tv" + " ON tp.transportId = tv.transportId" @@ -1937,6 +1937,28 @@ abstract class JdbcDatabase implements Database<Connection> { } } + public Collection<GroupId> getVisibleSubscriptions(Connection txn, + ContactId c) throws DbException { + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = "SELECT groupId FROM groupVisibilities" + + " WHERE contactId = ?"; + ps = txn.prepareStatement(sql); + ps.setInt(1, c.getInt()); + rs = ps.executeQuery(); + List<GroupId> visible = new ArrayList<GroupId>(); + while(rs.next()) visible.add(new GroupId(rs.getBytes(1))); + rs.close(); + ps.close(); + return Collections.unmodifiableList(visible); + } catch(SQLException e) { + tryToClose(rs); + tryToClose(ps); + throw new DbException(e); + } + } + public boolean hasSendableMessages(Connection txn, ContactId c) throws DbException { PreparedStatement ps = null; -- GitLab