3
=hA                 @   s   d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZdd	 Zejeje ejeje G d
d deZG dd de
ZeefddZdS )    )
HTTPServerBaseHTTPRequestHandler)FIND_LEAF_PAGE_FROM_ROOT)PAGE_READER)INODE)INDEX)TABLENc             C   s   t d tjd d S )Nz	AT^ AWSL r   )printsysexit)Zsigframe r   ./root/work/ibd2sql-ibd2sql-v2.x/ibd2sql/web.pysignal_15_handler   s    r   c               @   s,   e Zd ZdZdZdd Zdd Zdd ZdS )	
MY_HANDLERzq
	idx:[
		[
			[non-leaf, leaf], # idx1
			[non-leaf, leaf], # idx2
			
		], # filename 1
		[], # filename 2
	]
	Nc             C   s.   t jj| j}t jj|j}|j}| j  d S )N)urllibparseurlparsepathZparse_qsqueryhandle_html_request)selfZurl_componentsr   r   r   r   r   do_GET1   s    zMY_HANDLER.do_GETc             C   sh  t | jd }| jj|}tj|}d}d}d}d}d}d}	g }
| jdkrt |d }|d }|d	 }	|d
 }|dkr| j| d | d
 }|dkr"| j| d | d j|	r| j| d | d }
| j| d | d j	 }| j| d | d j
 }| j| d | d j }nd}n|dkr<| j| d }n|dkr| j| d | d j|	r| j| d | d }
| j| d | d j	 }| j| d | d j
 }| j| d | d j }nd}n
d| }n0| jdkrt |d }dd | j| d D }| jd | jdd | j  tj||||||	| j| d |	|
d	jd}| jj| d S ) NzContent-Length T   l    z/optfilenoidxnopagenolevel   idxr   leafkeyF   ddlrootzunknown error, request:z
/file_basec             S   s*   g | ]"}|d  |d |d |d dqS )namerootnor   r"   )r&   r   r   r"   r   ).0xr   r   r   
<listcomp>_   s    z&MY_HANDLER.do_POST.<locals>.<listcomp>   zContent-typez	text/html)	datastatusr   Zprenextr   r$   currentr"   zutf-8)intZheadersZrfilereadjsonloadsr   IDX	read_pageget_all_rowsread_page_id_nextread_page_id_presend_responsesend_headerend_headersdumpsencodewfilewrite)r   Zcontent_lengthZ	post_datar,   rdatar-   r   Znext_pageidZ
pre_pageidr   r"   r   r   Zrbdatar   r   r   do_POST7   sT    




.zMY_HANDLER.do_POSTc                s^    j d  jdd  j  ddj fddtt jD  d } jj|j	d	 d S )
Nr+   zContent-typez	text/htmlu  

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>DDCW's ibd2sql 2.x web console</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
	body {
		font-family: Arial, sans-serif;
		background-color:#d0d0d0;
	}
	.container{
		height:100%;
	}
	.nav{
		height: 100%;
		width: 180px;
		position: fixed;
		z-index: 1;
		top: 0;
		left: 0;
		// background-color: #111; 
		overflow-x: hidden;
		// padding-top: 20%;
	}
	.content{
		margin-left: 180px;
	}

	button:hover{
		//color:#FFDE59;
		color:yellow;
	}
	button{
		background-color:#8CFF5B; height:50px;font-size:22px;marign:5px;
		//color: white;
		border:2px solid #007bff
	}
	#overlay {
		position: fixed;
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
		background-color: rgba(0, 0, 0, 0.5); /* 半透明背景 */
		display: none; /* 默认隐藏 */
		align-items: center;
		justify-content: center;
		z-index: 1000;
	}
	/* 模态框内容 */
	#popup{
		background-color: #fff;
		padding: 20px;
		border-radius: 4px;
		position: relative;
		min-width: 300px;
		text-align: center;
	}
	/* 关闭按钮 */
	#closebutton{
		position: absolute;
		top: 10px;
		right: 10px;
		background-color: transparent;
		border: none;
		font-size: 18px;
		cursor: pointer;
	}
	/* 模态框显示时 */
	#overlay.show {
		display: flex;
	}
        /* 箭头样式 */
        .arrow {
            width: 30px;
            height: 30px;
            margin-left: -5px; /* 调整箭头位置，使其与按钮靠近 */
            margin-right: -5px;
        }
        /* 调整箭头的颜色 */
        .arrow use {
            fill: #333;
        }

	/*叶子节点*/
	.record_type0{
		background-color:#cfefc1;
	}
	.record_type0:hover{color:red;}
	/*非叶子节点*/
	.record_type1{
		background-color:#90EE90;
	}
	.record_type1:hover{font-size:22px;}
	.bg_red{background-color:red}
</style>
<script>
	console.log('ibd2sql 2.x')
	console.log('https://github.com/ddcw/ibd2sql')
	CURRENT_FILE = 0;
	CURRENT_INDEX = 0;
	CURRENT_PAGE  = 0;
	CURRENT_PAGE_PRE = 0;
	CURRENT_PAGE_NEXT = 0;
	CURRENT_PAGE_TOP = 0;
	CURRENT_LEVEL = 0;
	CURRENT_DDL = '';
	CURRENT_PAGE_DETAIL = '';
	UP_PAGE = [4294967295,];
	function query_data(opt){
		//alert(CURRENT_PAGE)
		data = {'fileno':CURRENT_FILE,'pageno':CURRENT_PAGE,'idxno':CURRENT_INDEX,'level':CURRENT_LEVEL};
		var xhr = new XMLHttpRequest();
		xhr.open('POST', opt, true);
		xhr.setRequestHeader("Content-Type", "application/json");
		xhr.onreadystatechange = function () {
			if (xhr.readyState === 4 && xhr.status === 200) {
				var rdata = JSON.parse(xhr.responseText);
				if (rdata.status){
					//alert(JSON.stringify(rdata.data,null,2))
					if (typeof rdata.data === 'string'){
						v = "<textarea style='marign-top: 20%; ' rows='40' cols='120'>" + rdata.data + "</textarea>"
						//document.getElementById('content').innerHTML = v
						showmsg(rdata.data)
					}else{
						CURRENT_DDL = rdata.ddl
						CURRENT_LEVEL = rdata.level
						CURRENT_PAGE = rdata.current
						CURRENT_PAGE_PRE = rdata.pre
						CURRENT_PAGE_NEXT = rdata.next
						CURRENT_PAGE_DETAIL = rdata
						if (opt == '/file_base'){
							init_select(rdata)
							//init_page(rdata)
							document.getElementById('idxno').children[0].click()
						}
						else if(opt == '/opt'){
							init_page(rdata)
						}
						else(showmsg(rdata))
					}
				}
			}
		}
		xhr.send(JSON.stringify(data));
	}

	function showddl(){
		showmsg(CURRENT_DDL)
	}

	function init_select(data){
		idx_button = ''
		data.data.forEach(function(item, index){
			idx_button = idx_button + "<button style='width:180px; background-color:#5DE2E7; height:50px;font-size:20px;marign:5px;' onclick='init_index("+index+","+item.pageno+","+item.level+")' title='"+item.key+"'>"+item.name+"("+item.key+")</button>";
		});
		CURRENT_PAGE = data.data[0].pageno
		CURRENT_LEVEL = data.data[0].level
		document.getElementById('idxno').innerHTML= idx_button;
	}

	function init_page(data){

		//showmsg(data);
		// init banner
		//alert(CURRENT_PAGE)
		page_current = CURRENT_PAGE;
		page_top = UP_PAGE.at(-1);
		page_pre = data.pre;
		page_next = data.next;
		//showmsg([page_current,page_top,page_pre,page_next]);
		document.getElementById('query_page_top').innerHTML = '<button title="parent page('+page_top+')" onclick="query_page_top()">UP-PAGE('+page_top+')</button>'
		document.getElementById('select_page').innerHTML = '<button title="pre page" onclick="query_page_bro('+page_pre+')">PRE-PAGE('+page_pre+')</button>' + 
		'<button title="level:'+ data.level + '" onclick="show_current_page()">CURRENT-PAGE(' + page_current + ') ROWS('+data.data.length+')</button>' + 
		'<button title="next page" onclick="query_page_bro('+page_next+')">NEXT-PAGE('+page_next+')</button>'
		
		// init page
		container = document.getElementById('page_detail');
		container.innerHTML = '';
		data.data.forEach(function(item, index){
			var button = document.createElement('button');
			button.classList.add("record_type" + data.level);
			if (item.deleted) {
				button.classList.add(".bg_red");
			}
			v = ""
			for (const k in item.data){
				if (data.key.includes(k)){
					v += k+":"+item.data[k].data + "	"
				}
			}
			if (CURRENT_LEVEL > 0){ // non leaf page
				button.addEventListener('click',function(){
					query_page_child(item['pageid'])
				})
				button.title = "pageid:"+item.pageid
			}else{
				button.addEventListener('click',function(){
					showmsg(item)
				})
				button.title = "pageid:"+page_current
			}
			
			button.innerHTML = v
			container.appendChild(button);
			if (index < data.data.length -1) {
				var svgNS = "http://www.w3.org/2000/svg";
				var svg = document.createElementNS(svgNS, "svg");
				svg.setAttribute("class", "arrow");
				var use = document.createElementNS(svgNS, "use");
				use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#arrowSymbol');
				svg.appendChild(use);
				container.appendChild(svg);
			}
			//showmsg(data)
			
		})

	}

	function show_current_page(){
		showmsg(CURRENT_PAGE_DETAIL)
	}

	function showmsg(msg){
		if (typeof msg === 'string'){
			data = msg
		}else{data = JSON.stringify(msg,null,2)}
		document.getElementById('msg').innerHTML= data; //设置相关数据信息
		document.getElementById('overlay').classList.add('show'); //设置显示
	}

	function closemsg(){document.getElementById('overlay').classList.remove('show');}

	function init_index(idxno,pageno,level){
		//showmsg([idxno,pageno,level,])
		CURRENT_INDEX = idxno;
		CURRENT_LEVEL = level;
		CURRENT_PAGE = pageno;
		for (item of document.getElementById('idxno').children){
			item.style.border='2px solid #007bff';
		}
		query_page_bro(pageno);
		document.getElementById('idxno').children[idxno].style.border='2px solid red';
		//showmsg(idxno,pageno,level);
	}

	function query_page_bro(pageno){
		if (pageno < 4294967295){
			CURRENT_PAGE = pageno;
			query_data('/opt');
		}
	}

	function query_page_child(pageno){
		UP_PAGE.push(CURRENT_PAGE);
		//CURRENT_PAGE = pageno;
		CURRENT_LEVEL = CURRENT_LEVEL - 1
		query_page_bro(pageno);
	}

	function query_page_top(){
		if (UP_PAGE.at(-1) == 4294967295){
			showmsg('current page('+CURRENT_PAGE+') is root')
			return ''
		}
		CURRENT_LEVEL = CURRENT_LEVEL + 1;
		query_page_bro(UP_PAGE.pop());
	}

	function init_file(fileno){
		CURRENT_FILE = fileno;
		query_data('/file_base');
	}
</script>
</head>
<body>

<div class="container">
	<div class="nav" id="nav">
		<div id='fileno'>
			<select id="fileno", onchange="init_file(this.options[this.options.selectedIndex].value)">

c          	      s8   g | ]0}d | d j | d  d j | d  dqS )z<option value='z'>schema.r&   z	</option>)r7   )r(   r)   )r   r   r   r*     s    z2MY_HANDLER.handle_html_request.<locals>.<listcomp>u  
			</select>
			</br></br></br></br>
		</div>
		<div id='ddl'><button style="width:180px; background-color:#5E5BFF; height:50px;font-size:20px;marign:5px;" onclick="showddl()">GET DDL</button></div>
		<div id="idxno">
			<button style="width:180px; background-color:#5DE2E7; height:50px;font-size:20px;marign:5px;" onclick="query_page_bro(1)">PRIMARY (id)</button>
		</div>
	</div>


	<div class="content" id="content">
		<div align="center" id="query_page_top"><button title="up" onclick="query_page_top()">UP(pageid)</button></div>
		<div align="center" id="select_page">
			<button title="pre page" onclick="query_page_bro(1152)">PRE-PAGE(1152)</button>
			<button>CURRENT-PAGE(123) ROWS(3213)</button>
			<button title="next page" onclick="query_page_bro(495)">NEXT-PAGE(495)</button>
			<br><br>
		</div>
		<div id="page_detail">
			<button class="record_type0" title="OFFSET:8302">k:50161,id:12311,</button>
			<svg class="arrow"><use href="#arrowSymbol"></use></svg>
			<button class="record_type0" title="OFFSET:6404">k:50169,id:97092,</button>
			<svg class="arrow"><use href="#arrowSymbol"></use></svg>
			<button class="record_type0" title="OFFSET:7860">k:50169,id:98244,</button>
		</div>
	</div>
</div>

<svg style="display: none;">
    <symbol id="arrowSymbol" viewBox="0 0 30 30">
        <!-- draw arrow -->
        <line x1="0" y1="15" x2="20" y2="15" stroke="#333" stroke-width="2"></line>
        <polygon points="20,10 30,15 20,20" fill="#333"></polygon>
    </symbol>
</svg>
<!-- display overlay -->
<div id="overlay" class="">
	<div id="popup">
		<button id="closebutton" onclick="closemsg()">×</button>
		<textarea rows="40" cols="100" id="msg">{
			text
		}
		</textarea>
	</div>
</div>
<script>
// close overlay when onclick
document.getElementById('overlay').addEventListener('click', function(event) {
	if (event.target === overlay) {
		closemsg()
	}
});
</script>

<script>window.onload = function() {init_file(0)}</script>
</body></html>
zutf-8)
r<   r=   r>   joinrangelenr7   rA   rB   r@   )r   Zhtml_contentr   )r   r   r   g   s    
  $9zMY_HANDLER.handle_html_request)__name__
__module____qualname____doc__r7   r   rD   r   r   r   r   r   r   $   s
   
0r   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )IBD2SQL_WEBc             C   s   t jd| jdd d S )Nz>L      r   )structunpackr,   )r   r   r   r   r:     s    zIBD2SQL_WEB.read_page_id_nextc             C   s   t jd| jdd d S )Nz>L   rP   r   )rR   rS   r,   )r   r   r   r   r;     s    zIBD2SQL_WEB.read_page_id_prec             C   s*   | j j|}|dkr"| j| dS dS d S )N    TF)pgr4   	init_data)r   pageidr,   r   r   r   r8     s
    
zIBD2SQL_WEB.read_pagec             C   s   | j | j S )N)r8   r:   )r   r   r   r   read_page_next  s    zIBD2SQL_WEB.read_page_nextc             C   s   | j | j S )N)r8   r;   )r   r   r   r   read_page_pre  s    zIBD2SQL_WEB.read_page_preN)rK   rL   rM   r:   r;   r8   rY   rZ   r   r   r   r   rO     s
   rO   c             C   s  d|krdn|d }d|kr dn|d }|j d| d|  g }xh| D ]^}t|d }	t|d |d	 |d
 |d |d d}
|j d|d	  t|
}|d d dkr|jdd  n|jdd  }g }x|	jD ]}|	j| d }|j d|d	 d| |dkr
dnd}|	jdkr.|| d d d nt|	j| d }yt|
||	|rTdnd|}W n2 t	k
r } z|j |d wW Y d d }~X nX |
j
|}|
j
|}t }|j|	||
|rdndd |j| t }|j|	||
|rdnd d |j| g }x@|	j| d! D ].}|	j|d"  d }|d,kr4P |j| qW |j|||||||tjd%|d&d' d |d(	 qW |d	 }|j|d	 ||	j|	j|	jdddd) qJW ||_||f}|||}d*| d| d+}t| |j  d S )-Nhostz0.0.0.0porti  zlisten :sdipagesizefilename
encryptionr"   iv)	page_sizer`   ra   r"   rb   init	fsp_flagsSDIr#   r   r&   zidxname:PRIMARYTFi8  FSEG_FRAG_ARRr%   PK_NON_LEAFKEY_NON_LEAFzskit it)tableidxidrV   	page_typePK_LEAFKEY_LEAFelements
column_opx	DB_TRX_IDDB_ROLL_PTRz>H@   B   )	r'   leafnor%   r!   Zprimaryr&   r   r   r"   )r`   r    rF   r&   r$   zi
###############################
#     ibd2sql web console     #
###############################

http://z

)rr   rs   )infor   r   r   segindexmysql_version_idr3   r   	Exceptionr4   rO   
init_indexrW   columnappendrR   rS   rF   r&   get_ddlr7   r	   Zserve_forever)	file_listoptlogZserver_classZhandler_classZ	BIND_HOSTZ	BIND_PORTr7   	file_baserk   rV   inoder    r)   idxnameZ
is_primaryr'   rv   eZrootdataZleafdataZidx_rootZidx_leafr"   yZknamer`   Zserver_addressZhttpdmsgr   r   r   RUN_IBD2SQL_WEB  st    &,2




	
	r   )Zhttp.serverr   r   ibd2sql.ibd2sqlr   ibd2sql.innodb_page.pager   ibd2sql.innodb_page.inoder   ibd2sql.innodb_page.indexr   ibd2sql.innodb_page.tabler   Zurllib.parser   datetimesignalrR   r5   r
   osr   SIGTERMSIGINTr   rO   r   r   r   r   r   <module>   s*      !