class TrunkTest(TestCase): def setUp(self): dsn = os.environ.get("DATABASE_URL") self.listener = Trunk(dsn or "postgres://localhost/trunk") self.notifier = Trunk(dsn or "postgres://localhost/trunk") def test_get(self): self.listener.listen("trunk_get") self.notifier.notify("trunk_get", "payload") channel, payload = self.listener.get("trunk_get") self.assertEqual(channel, "trunk_get") self.assertEqual(payload, "payload") def test_listen(self): self.listener.listen("trunk_listen") self.assertTrue("trunk_listen" in self.listener.channels()) def test_unlisten(self): self.listener.listen("trunk_channels") self.assertTrue("trunk_channels" in self.listener.channels()) self.listener.unlisten("trunk_channels") self.assertTrue("trunk_channels" not in self.listener.channels()) def tearDown(self): self.listener.close() self.notifier.close()
class PGQueue(object): def __init__(self, dsn): self.trunk = Trunk(dsn) def create(self, name): self.trunk.listen(name) def get(self, name, block=True, timeout=None): try: channel, payload = self.trunk.get(name, block=block, timeout=timeout) except Empty: pass with self.trunk.cursor() as cursor: cursor.execute("SELECT id, message FROM public.pop_lock(%s)", (name, )) row = cursor.fetchone() if row is None: raise Empty() return row def get_nowait(self, name): return self.get(name, block=False) def put(self, name, message): with self.trunk.cursor() as cursor: cursor.execute( "INSERT INTO public.trunk_queue (name, message) VALUES (%s, %s)", (name, message)) self.trunk.notify(name) def empty(self, name): return 0 == self.qsize(name) def qsize(self, name): with self.trunk.cursor() as cursor: cursor.execute( "SELECT COUNT(*) FROM public.trunk_queue WHERE name = %s", (name, )) row = cursor.fetchone() return row[0] def purge(self, name): size = self.qsize(name) with self.trunk.cursor() as cursor: cursor.execute("DELETE FROM public.trunk_queue WHERE name = %s", (name, )) return size def close(self): self.trunk.close()
class PGQueue(object): def __init__(self, dsn): self.trunk = Trunk(dsn) def create(self, name): self.trunk.listen(name) def get(self, name, block=True, timeout=None): channel, payload = self.trunk.get(name, block=block, timeout=timeout) with self.trunk.cursor() as cursor: cursor.execute("SELECT id, message FROM pop_lock(%s)", (name,)) row = cursor.fetchone() if row is None: raise Empty() return row def get_nowait(self, name): return self.get(name, block=False) def put(self, name, message): with self.trunk.cursor() as cursor: cursor.execute("INSERT INTO trunk_queue (name, message) VALUES (%s, %s)", (name, message)) self.trunk.notify(name) def empty(self, name): return 0 == self.qsize(name) def qsize(self, name): with self.trunk.cursor() as cursor: cursor.execute("SELECT COUNT(*) FROM trunk_queue WHERE name = %s", (name,)) row = cursor.fetchone() return row[0] def purge(self, name): size = self.qsize(name) with self.trunk.cursor() as cursor: cursor.execute("DELETE FROM trunk_queue WHERE name = %s", (name,)) return size def close(self): self.trunk.close()