mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-15 20:29:52 +01:00
Added getVisibleSubscriptions() method for managing group visibility.
This commit is contained in:
@@ -174,6 +174,9 @@ public interface DatabaseComponent {
|
|||||||
/** Returns the contacts to which the given group is visible. */
|
/** Returns the contacts to which the given group is visible. */
|
||||||
Collection<ContactId> getVisibility(GroupId g) throws DbException;
|
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. */
|
/** Returns true if any messages are sendable to the given contact. */
|
||||||
boolean hasSendableMessages(ContactId c) throws DbException;
|
boolean hasSendableMessages(ContactId c) throws DbException;
|
||||||
|
|
||||||
|
|||||||
@@ -441,6 +441,14 @@ interface Database<T> {
|
|||||||
*/
|
*/
|
||||||
Collection<ContactId> getVisibility(T txn, GroupId g) throws DbException;
|
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.
|
* Returns true if any messages are sendable to the given contact.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -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 {
|
public boolean hasSendableMessages(ContactId c) throws DbException {
|
||||||
contactLock.readLock().lock();
|
contactLock.readLock().lock();
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1854,7 +1854,7 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
try {
|
try {
|
||||||
String sql = "SELECT transportId, key, value, localVersion"
|
String sql = "SELECT tp.transportId, key, value, localVersion"
|
||||||
+ " FROM transportProperties AS tp"
|
+ " FROM transportProperties AS tp"
|
||||||
+ " JOIN transportVersions AS tv"
|
+ " JOIN transportVersions AS tv"
|
||||||
+ " ON tp.transportId = tv.transportId"
|
+ " 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)
|
public boolean hasSendableMessages(Connection txn, ContactId c)
|
||||||
throws DbException {
|
throws DbException {
|
||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
|
|||||||
Reference in New Issue
Block a user