from http.server import HTTPServer, BaseHTTPRequestHandler from ibd2sql.ibd2sql import FIND_LEAF_PAGE_FROM_ROOT from ibd2sql.innodb_page.page import PAGE_READER from ibd2sql.innodb_page.inode import INODE from ibd2sql.innodb_page.index import INDEX from ibd2sql.innodb_page.table import TABLE import urllib.parse import datetime import signal import struct import json import sys import os """ ------------------ ------------------------------------------------- | """ + "\n".join([ f"" for x in range(len(self.IDX)) ]) + """





""" self.wfile.write(html_content.encode('utf-8')) class IBD2SQL_WEB(INDEX): def read_page_id_next(self,): return struct.unpack('>L',self.data[12:16])[0] def read_page_id_pre(self,): return struct.unpack('>L',self.data[8:12])[0] def read_page(self,pageid): data = self.pg.read(pageid) if data != b'': self.init_data(data) return True else: return False def read_page_next(self,): return self.read_page(self.read_page_id_next()) def read_page_pre(self): return self.read_page(self.read_page_id_pre()) def RUN_IBD2SQL_WEB(file_list,opt,log,server_class=HTTPServer, handler_class=MY_HANDLER): BIND_HOST = '0.0.0.0' if 'host' not in opt else opt['host'] BIND_PORT = 8080 if 'port' not in opt else opt['port'] log.info(f'listen {BIND_HOST}:{BIND_PORT}') IDX = [] for file_base in file_list: table = TABLE(file_base['sdi']) pg = PAGE_READER(page_size=file_base['pagesize'],filename=file_base['filename'],encryption=file_base['encryption'],key=file_base['key'],iv=file_base['iv']) log.info('init',file_base['filename']) inode = INODE(pg) inode = inode.seg[1:] if file_base['fsp_flags']['SDI'] == 1 else inode.seg[0:] idx = [] for x in table.index: idxname = table.index[x]['name'] log.info('init',file_base['filename'],'idxname:',idxname) is_primary = True if idxname == 'PRIMARY' else False rootno = inode[x][0]['FSEG_FRAG_ARR'][0] if table.mysql_version_id <= 50744 else int(table.index[x]['root']) try: leafno = FIND_LEAF_PAGE_FROM_ROOT(pg,rootno,table,'PK_NON_LEAF' if is_primary else 'KEY_NON_LEAF',x) except Exception as e: log.info(e,'skit it') continue rootdata = pg.read(rootno) leafdata = pg.read(leafno) idx_root = IBD2SQL_WEB() idx_root.init_index(table=table,idxid=x,pg=pg,page_type='PK_NON_LEAF' if is_primary else 'KEY_NON_LEAF' ) idx_root.init_data(rootdata) idx_leaf = IBD2SQL_WEB() idx_leaf.init_index(table=table,idxid=x,pg=pg,page_type='PK_LEAF' if is_primary else 'KEY_LEAF' ) idx_leaf.init_data(leafdata) #if rootno == leafno: # idx_root = idx_leaf #key = [ table.column[y['column_opx']]['name'] for y in table.index[x]['elements'] ] key = [] for y in table.index[x]['elements']: kname = table.column[y['column_opx']]['name'] if kname in ['DB_TRX_ID','DB_ROLL_PTR']: break key.append(kname) idx.append({ 'rootno':rootno, 'leafno':leafno, 'root':idx_root, 'leaf':idx_leaf, 'primary':is_primary, 'name':idxname, 'idxno':x, 'level':struct.unpack('>H',rootdata[64:66])[0], 'key':key }) filename = file_base['filename'] IDX.append({ 'filename':file_base['filename'], 'idx':idx, 'schema':table.schema, 'name':table.name, 'ddl':table.get_ddl(False,False,False) }) # for i in range(10): # if IDX[0]['idx'][0]['leaf'].read_page_next(): # print(IDX[0]['idx'][0]['leaf'].get_all_rows()) # else: # break handler_class.IDX = IDX server_address = (BIND_HOST,BIND_PORT) httpd = server_class(server_address, handler_class) msg = f''' ############################### # ibd2sql web console # ############################### http://{BIND_HOST}:{BIND_PORT} ''' print(msg) httpd.serve_forever()