]>
jfr.im git - irc/rizon/acid.git/blob - pyva/src/main/python/pseudoclient/collection.py
1 from datetime
import datetime
7 class InvariantCollection ( object ):
12 return len ( self
.__ entries
)
14 def __getitem__ ( self
, key
):
15 invariant_key
= istring ( key
)
17 if not self
.__ contains
__ ( invariant_key
):
18 raise KeyError ( 'Entry with key %s not present.' % key
)
20 return self
.__ entries
[ invariant_key
]
22 def __setitem__ ( self
, key
, value
):
23 self
.__ entries
[ istring ( key
)] = value
25 def __delitem__ ( self
, key
):
26 invariant_key
= istring ( key
)
28 if not self
.__ contains
__ ( invariant_key
):
29 raise KeyError ( 'Entry with key %s not present.' % key
)
31 del ( self
.__ entries
[ invariant_key
])
34 for entry
in self
.__ entries
:
37 def __contains__ ( self
, item
):
38 if not isinstance ( item
, basestring
):
39 raise TypeError ( ' %s is not an allowed indexing type.' % type ( item
))
41 return istring ( item
) in self
.__ entries
44 return [ self
[ item
] for item
in self
]
46 class CollectionEntity ( object ):
47 def __init__ ( self
, id , ban_source
= None , ban_reason
= None , ban_date
= None , ban_expiry
= None ):
49 self
. ban_source
= ban_source
50 self
. ban_reason
= ban_reason
51 self
. ban_date
= ban_date
52 self
. ban_expiry
= ban_expiry
54 self
. registered
= self
. banned
= False
56 class CollectionManager ( InvariantCollection
):
57 def __init__ ( self
, type ):
58 InvariantCollection
.__ init
__ ( self
)
60 self
.__ deleted
_ items
= []
67 self
. cursor
. execute ( "CREATE TABLE IF NOT EXISTS " + self
. module
. name
+ "_" + self
. name
+ " (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(51) NOT NULL, PRIMARY KEY (id), UNIQUE KEY (name)) ENGINE=InnoDB" )
69 self
. cursor
. execute ( "CREATE TABLE IF NOT EXISTS " + self
. module
. name
+ "_" + self
. name
+ "_options (id INT, name VARCHAR(32) NOT NULL, value TINYTEXT, UNIQUE KEY (id, name)) ENGINE=InnoDB" )
70 #self.cursor.execute("ALTER TABLE " + self.module.name + "_" + self.name + "_options ADD CONSTRAINT FOREIGN KEY IF NOT EXISTS (id) REFERENCES " + self.module.name + "_" + self.name + " (id)")
72 self
. cursor
. execute ( "SELECT id, name FROM " + self
. module
. name
+ "_" + self
. name
)
73 r
= self
. cursor
. fetchall ()
77 name
= istring ( row
[ 1 ])
79 self
. module
. elog
. debug ( 'Loading ' + name
+ ' for ' + self
. module
. name
+ '_' + self
. name
)
81 self
[ name
] = e
= self
.__ type
( id , name
)
83 self
. cursor
. execute ( "SELECT name,value FROM " + self
. module
. name
+ "_" + self
. name
+ "_options WHERE `id` = %s " , ( id ,))
84 r2
= self
. cursor
. fetchall ()
86 setattr ( e
, row2
[ 0 ], row2
[ 1 ])
88 def __get_attributes ( self
, obj
):
89 boring
= dir ( type ( 'dummy' , ( object ,), {}))
90 return [ item
for item
in inspect
. getmembers ( obj
) if item
[ 0 ] not in boring
]
94 deleted
= [( e
. id , ) for e
in self
. list_deleted ()]
95 changed
= [ e
for e
in self
. list_dirty ()]
98 self
. cursor
. executemany ( "DELETE FROM " + self
. module
. name
+ "_" + self
. name
+ "_options WHERE id = %s " , deleted
)
99 self
. cursor
. executemany ( "DELETE FROM " + self
. module
. name
+ "_" + self
. name
+ " WHERE id = %s " , deleted
)
100 self
. module
. elog
. commit ( 'Deleted %d %s from database.' % ( len ( deleted
), self
. name
))
104 self
. cursor
. execute ( "INSERT INTO " + self
. module
. name
+ "_" + self
. name
+ " (name) VALUES( %s )" , ( e
. name
,))
105 e
. id = self
. cursor
. lastrowid
106 else : # delete options as we are aboue to re-flush them
107 self
. cursor
. execute ( "DELETE FROM " + self
. module
. name
+ "_" + self
. name
+ "_options WHERE `id` = %s " , ( e
. id ,))
109 for a
in self
.__ get
_ attributes
( e
):
111 attr
= getattr ( e
, attr_name
)
113 self
. cursor
. execute ( "INSERT INTO " + self
. module
. name
+ "_" + self
. name
+ "_options (id, name, value) VALUES ( %s , %s , %s )" , ( e
. id , attr_name
, attr
))
115 self
. module
. elog
. commit ( 'Committed %d %s to database.' % ( len ( changed
), self
. name
))
119 for e
in self
. list_all ():
121 except Exception , err
:
122 traceback
. print_exc ()
123 self
. module
. elog
. error ( self
. name
+ ' commit failed: @b %s @b' % err
)
125 def check ( self
, item
):
131 if entity
. ban_expiry
!= None and entity
. ban_expiry
<= unix_time ( datetime
. now ()):
134 def is_dirty ( self
, item
):
137 return item
in self
and self
[ item
]. dirty
139 def is_valid ( self
, item
):
142 return item
in self
and self
[ item
]. registered
and not self
[ item
]. banned
144 def is_banned ( self
, item
):
147 return item
in self
and self
[ item
]. banned
149 def get ( self
, item
, attribute
):
153 return getattr ( self
[ item
], attribute
)
155 def set ( self
, item
, attribute
, value
):
156 entity
= self
. add ( item
)
157 old_value
= getattr ( entity
, attribute
)
159 if old_value
!= value
:
160 setattr ( entity
, attribute
, value
)
165 entity
= self
.__ type
(- 1 , item
)
167 entity
. registered
= True
174 def remove ( self
, item
):
180 if entity
. banned
and entity
. registered
:
181 entity
. registered
= False
184 elif not entity
. banned
:
185 if not item
. lower () in self
.__ deleted
_ items
:
186 self
.__ deleted
_ items
. append ( entity
)
190 self
. on_removed ( item
)
192 def ban ( self
, item
, source
, reason
, date
, expiry
):
193 entity
= self
. add ( item
)
195 entity
. ban_source
= source
196 entity
. ban_reason
= reason
197 entity
. ban_date
= date
198 entity
. ban_expiry
= expiry
203 def unban ( self
, item
):
204 if not item
in self
or not self
[ item
]. banned
:
208 entity
. banned
= False
209 entity
. ban_source
= None
210 entity
. ban_reason
= None
211 entity
. ban_date
= None
212 entity
. ban_expiry
= None
214 if not entity
. registered
:
219 self
. on_unbanned ( item
)
221 def on_added ( self
, item
):
224 def on_removed ( self
, item
):
227 def on_banned ( self
, item
):
230 def on_unbanned ( self
, item
):
233 def clear_deleted ( self
):
234 self
.__ deleted
_ items
= []
236 def list_deleted ( self
):
237 return self
.__ deleted
_ items
239 def list_dirty ( self
):
240 items
= [ item
for item
in self
]
241 return [ self
[ item
] for item
in items
if self
. is_dirty ( item
)]
243 def list_valid ( self
):
244 items
= [ item
for item
in self
]
245 return [ self
[ item
] for item
in items
if self
. is_valid ( item
)]
247 def list_banned ( self
):
248 items
= [ item
for item
in self
]
249 return [ self
[ item
] for item
in items
if self
. is_banned ( item
)]