def vote(self, upvote, id, remote_addr): """+1 a given comment. Returns the new like count (may not change because the creater can't vote on his/her own comment and multiple votes from the same ip address are ignored as well).""" rv = self.db.execute( 'SELECT likes, dislikes, voters FROM comments WHERE id=?', (id, )) \ .fetchone() if rv is None: return None likes, dislikes, voters = rv if likes + dislikes >= 142: return {'likes': likes, 'dislikes': dislikes} bf = Bloomfilter(bytearray(voters), likes + dislikes) if remote_addr in bf: return {'likes': likes, 'dislikes': dislikes} bf.add(remote_addr) self.db.execute([ 'UPDATE comments SET', ' likes = likes + 1,' if upvote else 'dislikes = dislikes + 1,', ' voters = ?' 'WHERE id=?;' ], (buffer(bf.array), id)) if upvote: return {'likes': likes + 1, 'dislikes': dislikes} return {'likes': likes, 'dislikes': dislikes + 1}
def vote(self, id, remote_addr): """+1 a given comment. Returns the new like count (may not change because the creater can't vote on his/her own comment and multiple votes from the same ip address are ignored as well).""" rv = self.db.execute( 'SELECT likes, voters FROM comments WHERE id=?', (id, )) \ .fetchone() if rv is None: return None likes, voters = rv if likes >= 142: return {'likes': likes} bf = Bloomfilter(bytearray(voters), likes) if remote_addr in bf: return {'likes': likes} bf.add(remote_addr) self.db.execute([ 'UPDATE comments SET', ' likes = likes + 1,', ' voters = ?' 'WHERE id=?;'], (buffer(bf.array), id)) return {'likes': likes + 1}
def vote(self, upvote, id, remote_addr): """+1 a given comment. Returns the new like count (may not change because the creater can't vote on his/her own comment and multiple votes from the same ip address are ignored as well).""" rv = self.db.execute("SELECT likes, dislikes, voters FROM comments WHERE id=?", (id,)).fetchone() if rv is None: return None likes, dislikes, voters = rv if likes + dislikes >= 142: return {"likes": likes, "dislikes": dislikes} bf = Bloomfilter(bytearray(voters), likes + dislikes) if remote_addr in bf: return {"likes": likes, "dislikes": dislikes} bf.add(remote_addr) self.db.execute( [ "UPDATE comments SET", " likes = likes + 1," if upvote else "dislikes = dislikes + 1,", " voters = ?" "WHERE id=?;", ], (buffer(bf.array), id), ) if upvote: return {"likes": likes + 1, "dislikes": dislikes} return {"likes": likes, "dislikes": dislikes + 1}
def vote(self, upvote, id, remote_addr): """+1 a given comment. Returns the new like count (may not change because the creater can't vote on his/her own comment and multiple votes from the same ip address are ignored as well).""" rv = self.db.fetchone( 'SELECT likes, dislikes, voters FROM comments WHERE id=%s', (id, )) if rv is None: return None likes, dislikes, votersPickle = rv voters = pickle.loads(votersPickle) if likes + dislikes >= 142: return {'likes': likes, 'dislikes': dislikes} bf = Bloomfilter(voters.array, likes + dislikes) if remote_addr in bf: return {'likes': likes, 'dislikes': dislikes} bf.add(remote_addr) self.db.commit([ 'UPDATE comments SET', ' likes = likes + 1,' if upvote else 'dislikes = dislikes + 1,', ' voters = %s' 'WHERE id=%s;'], (pickle.dumps(bf.array), id)) if upvote: return {'likes': likes + 1, 'dislikes': dislikes} return {'likes': likes, 'dislikes': dislikes + 1}
def vote(self, upvote, id, remote_addr): """+1 a given comment. Returns the new like count (may not change because the creater can't vote on his/her own comment and multiple votes from the same ip address are ignored as well).""" rv = self.db.execute( 'SELECT likes, dislikes, voters FROM comments WHERE id=?', (id, )) \ .fetchone() if rv is None: return None operation_name = 'Upvote' if upvote else 'Downvote' likes, dislikes, voters = rv if likes + dislikes >= MAX_LIKES_AND_DISLIKES: message = '{} denied due to a "likes + dislikes" total too high ({} >= {})'.format( operation_name, likes + dislikes, MAX_LIKES_AND_DISLIKES) logger.debug('Comments.vote(id=%s): %s', id, message) return {'likes': likes, 'dislikes': dislikes, 'message': message} bf = Bloomfilter(bytearray(voters), likes + dislikes) if remote_addr in bf: message = '{} denied because a vote has already been registered for this remote address: {}'.format( operation_name, remote_addr) logger.debug('Comments.vote(id=%s): %s', id, message) return {'likes': likes, 'dislikes': dislikes, 'message': message} bf.add(remote_addr) self.db.execute([ 'UPDATE comments SET', ' likes = likes + 1,' if upvote else 'dislikes = dislikes + 1,', ' voters = ?' 'WHERE id=?;' ], (buffer(bf.array), id)) if upvote: return {'likes': likes + 1, 'dislikes': dislikes} return {'likes': likes, 'dislikes': dislikes + 1}