| LEFT | RIGHT | 
|---|
| 1 # coding: utf-8 | 1 # coding: utf-8 | 
| 2 | 2 | 
| 3 # This file is part of the Adblock Plus web scripts, | 3 # This file is part of the Adblock Plus web scripts, | 
| 4 # Copyright (C) 2006-2015 Eyeo GmbH | 4 # Copyright (C) 2006-2015 Eyeo GmbH | 
| 5 # | 5 # | 
| 6 # Adblock Plus is free software: you can redistribute it and/or modify | 6 # Adblock Plus is free software: you can redistribute it and/or modify | 
| 7 # it under the terms of the GNU General Public License version 3 as | 7 # it under the terms of the GNU General Public License version 3 as | 
| 8 # published by the Free Software Foundation. | 8 # published by the Free Software Foundation. | 
| 9 # | 9 # | 
| 10 # Adblock Plus is distributed in the hope that it will be useful, | 10 # Adblock Plus is distributed in the hope that it will be useful, | 
| 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| 13 # GNU General Public License for more details. | 13 # GNU General Public License for more details. | 
| 14 # | 14 # | 
| 15 # You should have received a copy of the GNU General Public License | 15 # You should have received a copy of the GNU General Public License | 
| 16 # along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 16 # along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| 17 | 17 | 
| 18 import itertools | 18 import itertools | 
|  | 19 | 
| 19 import MySQLdb | 20 import MySQLdb | 
| 20 | 21 | 
| 21 from sitescripts.utils import get_config | 22 from sitescripts.utils import get_config | 
| 22 |  | 
| 23 testing = False |  | 
| 24 | 23 | 
| 25 def connect(): | 24 def connect(): | 
| 26   config = get_config() | 25   config = get_config() | 
| 27   return MySQLdb.connect( | 26   return MySQLdb.connect( | 
| 28     user=config.get("filterhitstats", "dbuser"), | 27     user=config.get("filterhitstats", "dbuser"), | 
| 29     passwd=config.get("filterhitstats", "dbpassword"), | 28     passwd=config.get("filterhitstats", "dbpassword"), | 
| 30     db=config.get("filterhitstats", "test_database" if testing else "database"), | 29     db=config.get("filterhitstats", "database"), | 
| 31     use_unicode=True, charset="utf8" | 30     use_unicode=True, charset="utf8" | 
| 32   ) | 31   ) | 
| 33 | 32 | 
| 34 def query(db, sql, *params, **kwargs): | 33 def query(db, sql, *params, **kwargs): | 
| 35   """ | 34   """ | 
| 36   Executes the query given by the provided SQL and returns the results. | 35   Executes the query given by the provided SQL and returns the results. | 
| 37   If dict_result keyword argument is provided + True the results will be | 36   If dict_result keyword argument is provided + True the results will be | 
| 38   returned as a tuple of dictionaries, otherwise a tuple of tuples. | 37   returned as a tuple of dictionaries, otherwise a tuple of tuples. | 
| 39   """ | 38   """ | 
| 40   if kwargs.pop('dict_result', False): | 39   if kwargs.get("dict_result"): | 
| 41     cursor = db.cursor(MySQLdb.cursors.DictCursor) | 40     cursor = db.cursor(MySQLdb.cursors.DictCursor) | 
| 42   else: | 41   else: | 
| 43     cursor = db.cursor() | 42     cursor = db.cursor() | 
| 44   try: | 43   try: | 
| 45     cursor.execute(sql, params) | 44     cursor.execute(sql, params) | 
| 46     db.commit() | 45     db.commit() | 
| 47     return cursor.fetchall() | 46     return cursor.fetchall() | 
| 48   finally: | 47   finally: | 
| 49     cursor.close() | 48     cursor.close() | 
| 50 | 49 | 
| 51 def write(db, queries): | 50 def write(db, queries): | 
| 52   """ | 51   """ | 
| 53   This writes a given iteratable object of tuples containing SQL | 52   This writes a given iteratable object of tuples containing SQL | 
| 54   strings and any required parameters to the database. All queries will | 53   strings and any required parameters to the database. All queries will | 
| 55   be run as one transaction and rolled back on error. | 54   be run as one transaction and rolled back on error. | 
| 56   """ | 55   """ | 
| 57   try: | 56   try: | 
| 58     cursor = db.cursor() | 57     cursor = db.cursor() | 
| 59     try: | 58     try: | 
| 60       for query in queries: | 59       for query in queries: | 
| 61         sql, params = query[0], query[1:] | 60         sql, params = query[0], query[1:] | 
| 62         cursor.execute(sql, params) | 61         cursor.execute(sql, params) | 
| 63       db.commit() | 62       db.commit() | 
| 64     finally: | 63     finally: | 
| 65       cursor.close() | 64       cursor.close() | 
| 66   except MySQLdb.Error: | 65   except MySQLdb.Error: | 
| 67     db.rollback() | 66     db.rollback() | 
| 68     raise | 67     raise | 
| LEFT | RIGHT | 
|---|