Advertisement
Guest User

Untitled

a guest
Nov 17th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.07 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sun Nov 13 00:00:06 2016
  4. @author: ergo
  5. """
  6.  
  7. import select
  8. import psycopg2
  9. import psycopg2.extensions
  10. import threading
  11. from time import sleep
  12.  
  13. def populate_cache(conn):
  14. curs = conn.cursor()
  15. curs.execute('SELECT face_name, id FROM cats;')
  16. cats = curs.fetchall()
  17. curs.close()
  18. cats = dict(cats)
  19.  
  20. return cats
  21.  
  22.  
  23. def insert(conn, cats, v):
  24. curs = conn.cursor()
  25. curs.execute('SELECT face_name, id FROM cats WHERE face_name = %s;', (v,))
  26. val = curs.fetchone()
  27. curs.close()
  28.  
  29. cats[val[0]] = val[1]
  30.  
  31. return cats
  32.  
  33.  
  34. def update(conn, cats, v):
  35. curs = conn.cursor()
  36. curs.execute('SELECT face_name FROM cats WHERE id = %s;', (cats[v],))
  37. val = curs.fetchone()
  38. curs.close()
  39.  
  40. cats[val[0]] = cats.pop(v)
  41.  
  42. return cats
  43.  
  44.  
  45. def notify(conn, cats):
  46. while True:
  47. if select.select([conn],[],[],1) != ([],[],[]):
  48. conn.poll()
  49. if conn.notifies:
  50. #print "Must refresh cache"
  51. while conn.notifies:
  52. notify = conn.notifies.pop(0)
  53. #print "Got NOTIFY:", notify.pid, notify.channel, notify.payload
  54. ret = notify.payload.split(',')
  55.  
  56. #print ret
  57.  
  58. op = ret[1]
  59. v = ret[2].split('=')[1].replace("'",'')
  60. if op == 'I':
  61. insert(conn, cats, v)
  62. elif op == 'D':
  63. del cats[v]
  64. elif op == 'U':
  65. cats = update(conn, cats, v)
  66.  
  67. #print cats.keys()
  68.  
  69.  
  70. conn = psycopg2.connect("host=<host> dbname=<database> user=<user> password=<password>")
  71. conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
  72.  
  73. curs = conn.cursor()
  74. curs.execute("LISTEN cats;")
  75. curs.close()
  76.  
  77. print "Waiting for notifications on channel 'cats'"
  78.  
  79. cats = populate_cache(conn)
  80.  
  81. t = threading.Thread(target=notify, args=(conn,cats))
  82.  
  83. t.daemon = True
  84.  
  85. t.start()
  86.  
  87. while True:
  88. print cats.keys()
  89. sleep(10)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement