From 77d1de44731b1aa51649a3e0a4a0550488dea63c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?GOLDERWEB=20=E2=80=93=20Jonathan=20Golder?= Date: Wed, 24 Aug 2016 23:53:10 +0200 Subject: [PATCH 1/2] Add a tablename prefix depending on Site To be able to run the bot on different wikis the db tables should be named pywikibot.Site dependend and changed automatically Related Task: [https://fs.golderweb.de/index.php?do=details&task_id=79 FS#79] --- lib/mysqlred.py | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/lib/mysqlred.py b/lib/mysqlred.py index 77eae35..9eb7f4b 100644 --- a/lib/mysqlred.py +++ b/lib/mysqlred.py @@ -33,6 +33,7 @@ except ImportError: import atexit +import pywikibot from pywikibot import config import jogobot @@ -53,6 +54,7 @@ class MysqlRed: db_username = config.db_username db_password = config.db_password db_name = config.db_username + jogobot.config['db_suffix'] + db_table_prefix = pywikibot.Site().family.dbName(pywikibot.Site().code) # Class variables for storing cached querys _cached_update_data = [] @@ -136,12 +138,14 @@ class MysqlRedPage( MysqlRed ): # Class variables for storing cached querys _cached_update_data = [] - _update_query = 'UPDATE `red_pages` \ -SET `page_title` = ?, `rev_id` = ?, `status`= ? WHERE `page_id` = ?;' + _update_query = 'UPDATE `{pre}_red_pages` \ +SET `page_title` = ?, `rev_id` = ?, `status`= ? WHERE `page_id` = ?;'.format( + pre=MysqlRed.db_table_prefix) _cached_insert_data = {} - _insert_query = 'INSERT INTO `red_pages` \ -( page_id, page_title, rev_id, status ) VALUES ( ?, ?, ?, ? );' + _insert_query = 'INSERT INTO `{pre}_red_pages` \ +( page_id, page_title, rev_id, status ) VALUES ( ?, ?, ?, ? );'.format( + pre=MysqlRed.db_table_prefix) def __init__( self, page_id ): """ @@ -169,8 +173,10 @@ SET `page_title` = ?, `rev_id` = ?, `status`= ? WHERE `page_id` = ?;' cursor = type( self ).connection.cursor(mysqldb.DictCursor) - cursor.execute( 'SELECT * FROM `red_pages` WHERE `page_id` = ?;', - ( self.__page_id, ) ) + cursor.execute( + 'SELECT * FROM `{pre}_red_pages` WHERE `page_id` = ?;'.format( + pre=MysqlRed.db_table_prefix), ( self.__page_id, ) ) + res = cursor.fetchone() if res: @@ -221,15 +227,17 @@ class MysqlRedFam( MysqlRed ): # Class variables for storing cached querys _cached_update_data = [] - _update_query = 'UPDATE `red_families` \ + _update_query = 'UPDATE `{pre}_red_families` \ SET `red_page_id` = ?, `heading` = ?, `beginning` = ?, `ending` = ?, \ -`status`= ? WHERE `fam_hash` = ?;' +`status`= ? WHERE `fam_hash` = ?;'.format( + pre=MysqlRed.db_table_prefix) _cached_insert_data = {} - _insert_query = 'INSERT INTO `red_families` \ + _insert_query = 'INSERT INTO `{pre}_red_families` \ ( fam_hash, red_page_id, beginning, ending, status, heading, \ article0, article1, article2, article3, article4, article5, article6, \ -article7 ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );' +article7 ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );'.format( + pre=MysqlRed.db_table_prefix) def __init__( self ): """ @@ -252,8 +260,10 @@ article7 ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );' cursor = type( self ).connection.cursor( mysqldb.DictCursor ) - cursor.execute( 'SELECT * FROM `red_families` WHERE `fam_hash` = ?;', - ( fam_hash, ) ) + cursor.execute( + 'SELECT * FROM `{pre}_red_families` WHERE `fam_hash` = ?;'.format( + pre=MysqlRed.db_table_prefix), ( fam_hash, ) ) + self.data = cursor.fetchone() def add_fam( self, articlesList, heading, red_page_id, @@ -301,8 +311,9 @@ article7 ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );' cursor = type( self ).connection.cursor( mysqldb.DictCursor ) - cursor.execute( 'SELECT * FROM `red_families` WHERE `status` = ?;', - ( status, ) ) + cursor.execute( + 'SELECT * FROM `{pre}_red_families` WHERE `status` = ?;'.format( + pre=type( self ).db_table_prefix), ( status, ) ) while True: res = cursor.fetchmany( 1000 ) From 71b99b5f5837e43af1cc57f1890bfbf6d4d0e382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?GOLDERWEB=20=E2=80=93=20Jonathan=20Golder?= Date: Thu, 25 Aug 2016 13:06:32 +0200 Subject: [PATCH 2/2] Delay definition of db_table_prefix db_table_prefix should be defined at init of MysqlRed and not at import to have cmdline args already parsed Otherwise it uses default family Related Task: [https://fs.golderweb.de/index.php?do=details&task_id=79 FS#79] --- lib/mysqlred.py | 53 ++++++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/lib/mysqlred.py b/lib/mysqlred.py index 9eb7f4b..499816f 100644 --- a/lib/mysqlred.py +++ b/lib/mysqlred.py @@ -54,7 +54,7 @@ class MysqlRed: db_username = config.db_username db_password = config.db_password db_name = config.db_username + jogobot.config['db_suffix'] - db_table_prefix = pywikibot.Site().family.dbName(pywikibot.Site().code) + db_table_prefix = False # Class variables for storing cached querys _cached_update_data = [] @@ -69,6 +69,14 @@ class MysqlRed: @returns mysql-stream MySQL Connection """ + # Needs to be generated after Parsing of Args (not at import time) + if not type(self).db_table_prefix: + type(self).db_table_prefix = \ + pywikibot.Site().family.dbName(pywikibot.Site().code) + + # Now we can setup prepared queries + self._prepare_queries() + # Connect to mysqldb only once if not type( self ).connection: @@ -89,6 +97,15 @@ class MysqlRed: type( self ).connection.close() + def _prepare_queries( self ): + """ + Used to replace placeholders in prepared queries + """ + type(self)._update_query = type(self)._update_query.format( + prefix=type(self).db_table_prefix) + type(self)._insert_query = type(self)._insert_query.format( + prefix=type(self).db_table_prefix) + @classmethod def flush( cls ): """ @@ -137,15 +154,14 @@ class MysqlRedPage( MysqlRed ): """ # Class variables for storing cached querys + # '{prefix}' will be replaced during super().__init__() _cached_update_data = [] - _update_query = 'UPDATE `{pre}_red_pages` \ -SET `page_title` = ?, `rev_id` = ?, `status`= ? WHERE `page_id` = ?;'.format( - pre=MysqlRed.db_table_prefix) + _update_query = 'UPDATE `{prefix}_red_pages` \ +SET `page_title` = ?, `rev_id` = ?, `status`= ? WHERE `page_id` = ?;' _cached_insert_data = {} - _insert_query = 'INSERT INTO `{pre}_red_pages` \ -( page_id, page_title, rev_id, status ) VALUES ( ?, ?, ?, ? );'.format( - pre=MysqlRed.db_table_prefix) + _insert_query = 'INSERT INTO `{prefix}_red_pages` \ +( page_id, page_title, rev_id, status ) VALUES ( ?, ?, ?, ? );' def __init__( self, page_id ): """ @@ -174,8 +190,8 @@ SET `page_title` = ?, `rev_id` = ?, `status`= ? WHERE `page_id` = ?;'.format( cursor = type( self ).connection.cursor(mysqldb.DictCursor) cursor.execute( - 'SELECT * FROM `{pre}_red_pages` WHERE `page_id` = ?;'.format( - pre=MysqlRed.db_table_prefix), ( self.__page_id, ) ) + 'SELECT * FROM `{prefix}_red_pages` WHERE `page_id` = ?;'.format( + prefix=type(self).db_table_prefix), ( self.__page_id, ) ) res = cursor.fetchone() @@ -227,17 +243,14 @@ class MysqlRedFam( MysqlRed ): # Class variables for storing cached querys _cached_update_data = [] - _update_query = 'UPDATE `{pre}_red_families` \ + _update_query = 'UPDATE `{prefix}_red_families` \ SET `red_page_id` = ?, `heading` = ?, `beginning` = ?, `ending` = ?, \ -`status`= ? WHERE `fam_hash` = ?;'.format( - pre=MysqlRed.db_table_prefix) - +`status`= ? WHERE `fam_hash` = ?;' _cached_insert_data = {} - _insert_query = 'INSERT INTO `{pre}_red_families` \ + _insert_query = 'INSERT INTO `{prefix}_red_families` \ ( fam_hash, red_page_id, beginning, ending, status, heading, \ article0, article1, article2, article3, article4, article5, article6, \ -article7 ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );'.format( - pre=MysqlRed.db_table_prefix) +article7 ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );' def __init__( self ): """ @@ -261,8 +274,8 @@ article7 ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );'.format( cursor = type( self ).connection.cursor( mysqldb.DictCursor ) cursor.execute( - 'SELECT * FROM `{pre}_red_families` WHERE `fam_hash` = ?;'.format( - pre=MysqlRed.db_table_prefix), ( fam_hash, ) ) + 'SELECT * FROM `{prefix}_red_families` WHERE `fam_hash` = ?;'. + format( prefix=type(self).db_table_prefix), ( fam_hash, ) ) self.data = cursor.fetchone() @@ -312,8 +325,8 @@ article7 ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );'.format( cursor = type( self ).connection.cursor( mysqldb.DictCursor ) cursor.execute( - 'SELECT * FROM `{pre}_red_families` WHERE `status` = ?;'.format( - pre=type( self ).db_table_prefix), ( status, ) ) + 'SELECT * FROM `{prefix}_red_families` WHERE `status` = ?;'.format( + prefix=type( self ).db_table_prefix), ( status, ) ) while True: res = cursor.fetchmany( 1000 )