#!/usr/bin/env python3

"""
完成批量删除行的功能
"""

import os
import re
import sys
import time
import logging
import argparse
from mysql import connector
from mysql.connector import errorcode

name = os.path.basename(__file__)


logging.basicConfig(format="%(asctime)s %(levelname)s %(message)s",level=logging.INFO)


def parser_cmd_args() -> argparse.ArgumentParser:
    """
    处理命令行参数
    """
    parser = argparse.ArgumentParser(name)
    parser.add_argument('--host',type=str,default='127.0.0.1',help='mysql host')
    parser.add_argument('--port',type=int,default=3306,help="mysql port")
    parser.add_argument('--user',type=str,default="opsuser",help="mysql user")
    parser.add_argument('--password',type=str,default="mtls0352",help="mysql user's password")
    parser.add_argument('--sleep-time',type=int,default=1,help="sleep time per batch")
    parser.add_argument('--rows',type=int,default=1000,help="rows per batch")
    parser.add_argument('--sql-file',type=str,default="/tmp/dlt.sql",help="file containt sql statement")
    parser.add_argument('--encoding',type=str,default='utf8',help='sql file encoding default utf8')
    parser.add_argument('action',type=str,choices=['view','exec'],default="view")
    args = parser.parse_args()
    return args



def batch_delete_rows(args:argparse.ArgumentParser):
    """
    实现批量删除行
    """
    # 测试文件是否存在
    if not os.path.isfile(args.sql_file):
        logging.error(f"file '{args.sql_file}' not exists.")
        sys.exit(1)

    # 处理文件中的 SQL 语句
    sqls = []
    try:
        with open(args.sql_file,'r',encoding=args.encoding) as file_obj:
            for line in file_obj:
                line = line.strip()
                if line.endswith(';'):
                    line = line.replace(';',f" limit {args.rows};")
                else:
                    line = line + f" limit {args.rows};"
                sqls.append(line)
    except UnicodeDecodeError as err:
        logging.error(str(err))
        sys.exit(2)
    
    if args.action == 'view':
        for sql in sqls:
            logging.info(f"formatted sql statement : {sql}")
        sys.exit(0)
    
    # 建立连接并执行 SQL 语句
    cnx = None
    try:
        cnx = connector.connect(host=args.host,port=args.port,user=args.user,password=args.password)
        cursor = cnx.cursor()
        i = 0
        for sql in sqls:
            while True:
                cursor.execute(sql)
                cnx.commit()
                if cursor.rowcount == 0:
                    break
                logging.info(f"{cursor.rowcount} row(s) affected by {sql} ")
                time.sleep(args.sleep_time)
        logging.info("compelete")
                
    except connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            logging.error(f" access denied user={args.user} password={args.password} host={args.host} port={args.port}")
        else:
            logging.error(str(err))
    finally:
        if cnx != None and hasattr(cnx,'close'):
            cnx.close()

def main():
    args = parser_cmd_args()
    batch_delete_rows(args)

if __name__ == "__main__":
    main()







