Added getVisibleSubscriptions() method for managing group visibility.

This commit is contained in:
akwizgran
2013-01-29 17:09:06 +00:00
parent 33d0f19f26
commit ea339e76d6
4 changed files with 60 additions and 1 deletions

View File

@@ -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;

View File

@@ -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>

View File

@@ -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 {

View File

@@ -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;