import psycopg2
import os
import threading
import time

dbname  = 'postgres'
user    = 'postgres'
host    = '127.0.0.1'
port    = 5432

conn1 = psycopg2.connect(database=dbname, user=user, host=host, port=port)
conn1.autocommit = True
conn2 = psycopg2.connect(database=dbname, user=user, host=host, port=port)
conn2.autocommit = True

def execute_sql(conn, sql):
    cur = conn.cursor()
    cur.execute(sql)
    try:
        res = cur.fetchall()
    except psycopg2.ProgrammingError as e:
        # ddl, dml will raise 'no results to fetch'
        if 'no results to fetch' in str(e):
            res = []
    cur.close()
    return res

def init_data():
    conn = psycopg2.connect(database=dbname, user=user, host=host, port=port)
    conn.autocommit = True
    for sql in  [
        'DROP TABLE IF EXISTS tbl_part',
        'CREATE TABLE tbl_part (a integer) PARTITION BY RANGE (a)',
        'CREATE TABLE tbl_part_p1 PARTITION OF tbl_part FOR VALUES FROM (0) TO (10)',
        'CREATE INDEX ON tbl_part(a)'
    ]:
        execute_sql(conn=conn1, sql=sql)
    conn.close()

def session1():
    conn = psycopg2.connect(database=dbname, user=user, host=host, port=port)
    conn.autocommit = True
    pg_backend_pid = execute_sql(conn, 'select pg_backend_pid()')[0][0]
    gdb_cmd = "gdb --quiet --batch -p {} -ex 'b index.c:3585' -ex 'c' -ex 'shell sleep 5' &".format(pg_backend_pid)
    os.system(gdb_cmd)
    time.sleep(1)
    execute_sql(conn, 'REINDEX INDEX tbl_part_a_idx')
    time.sleep(5)
    conn.close()

def session2():
    conn = psycopg2.connect(database=dbname, user=user, host=host, port=port)
    conn.autocommit = True
    time.sleep(3)
    execute_sql(conn, 'DROP INDEX tbl_part_a_idx')
    conn.close()

# init table
init_data()
t1 = threading.Thread(target=session1)
t2 = threading.Thread(target=session2)
t1.start()
t2.start()
t1.join()
t2.join()
