001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
<?php // (2022.9.18, 차재복, Cha Jae Bok, http://www.ktword.co.kr) # (Ajax : 소스 폴더 파일 리스트) 소스 파일 id에 대해, 해당 자식 id들을 쿼리하여, JSON 변환시켜 송출 // (대상 테이블 : src_files_v3) function ajaxFetchChildFile ($id, $dbi) { $query = "select parent,id,name,seq,child,yoyak,type,(select name from src_files_v3 where id=$id and type='dir') as dir from src_files_v3 where parent=$id order by seq,name"; $result = mysqli_query($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } if (!empty($err_msg)){ $return = array('err_msg'=>$err_msg); } else { while ( $matched = mysqli_fetch_assoc($result) ) { $data[] = array('parent'=>$matched['parent'], 'id'=>$matched['id'], 'name'=>$matched['name'], 'child'=>$matched['child'], 'seq'=>$matched['seq'], 'desc'=>$matched['yoyak'], 'item_type'=>$matched['type'], 'dir'=>$matched['dir']); } if (count($data)<1) $return = array('err_msg'=>'해당 id 없음!'); else $return = array('data' => $data); } echo json_encode($return, JSON_UNESCAPED_UNICODE); } # id에 해당하는 파일 내용(필드명:code) 및 날짜 정보 송출 function ajaxFetchSourceView($id, $dbi) { $query = "select a.name,b.name as parent_name,a.child,a.code,a.date from src_files_v3 a left join src_files_v3 b on a.parent=b.id where a.id=$id limit 1"; $result = mysqli_query($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } $matched = mysqli_fetch_assoc($result); if($matched['child']<=0) { $data['dir'] = $matched['parent_name']; $data['file'] = $matched['name']; $data['code'] = $matched['code']; $data['dateInTbl'] = date_format(date_create($matched['date']),'Y-m-d'); $file_date = filemtime('../'.$matched['parent_name'].'/'.$matched['name']); $data['dateInDir'] = date('Y-m-d',$file_date); $data['dateDiff'] = strtotime($matched['date']) - $file_date; } else $return = array('err_msg'=>$err_msg.' 해당 소스 id 없음!'); $return = array('data' => $data, 'err_msg'=>$err_msg); echo json_encode($return, JSON_UNESCAPED_UNICODE); } # (Ajax : 소스 역할 트리) 소스 역할 트리(src_tree) id에 대해, 해당 자식 id 또는 src_files_v2의 id를 쿼리하여, JSON 변환시켜 송출 // (대상 테이블 : src_tree) function ajaxFetchChildSrcTree ($id, $dbi) { $query = "select a.id,a.name as name_a,a.yoyak as yoyak_a,a.child,a.link, b.name as name_b,b.yoyak as yoyak_b from src_tree a left join src_files_v2 b on a.link=b.id where a.parent=$id order by a.sub_seq"; $result = mysqli_query($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } if (!empty($err_msg)){ $return = array('err_msg'=>$err_msg); } else { while ( $matched = mysqli_fetch_assoc($result) ) { if(empty($matched['link'])) { $name = $matched['name_a']; $yoyak = $matched['yoyak_a']; } else { $name = $matched['name_b']; $yoyak = $matched['yoyak_b']; } $data[] = array('id'=>$matched['id'], 'name'=>$name, 'desc'=>$yoyak, 'child'=>$matched['child']); } $return = array('data' => $data); } echo json_encode($return, JSON_UNESCAPED_UNICODE); } // 기존 db table 내 디렉토리,파일명 추출하여 배열화 function tblSrcArr($dbi) { $query = "select a.parent,b.name as parent_name,a.id,a.name from src_files_v3 a left join src_files_v3 b on a.parent=b.id"; $result = mysqli_query($dbi, $query); if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; } while ( $matched = mysqli_fetch_assoc($result) ) { $srcTblArr[$matched['parent_name']][$matched['name']] = $matched['id']; } return $srcTblArr; } // 서버 내 특정 디렉토리 산하의 하위 디렉토리 파일 스캔 후 JSON 형식으로 송출 function srcScanDir($dbi) { // db에 기 등록된 디렉토리,파일 목록을 배열화 $srcTblArr = tblSrcArr($dbi); // 재귀 함수 호출 $srcTree = recSrcScanDir('../', $srcTblArr); $return = array('srcTree'=>$srcTree,'count'=>count($srcTree)); // 리턴되는 디렉토리 파일 배열을 JSON 형식으로 송출 echo json_encode($return, JSON_UNESCAPED_UNICODE); } // 재귀 함수 구현 function recSrcScanDir($path, &$srcTblArr = '') { $srcTree = []; foreach(scandir($path) as $val) { if($val=='.' or $val=='..' or substr(strrchr($val, '.'),1)=='bak' or !mb_check_encoding($val, 'UTF-8')) continue; if(is_dir($path.'/'.$val)) { $ancestor_path = (mb_substr($path,-1)=='/' ? $path.$val : $path.'/'.$val); $srcTree[$val] = recSrcScanDir($ancestor_path, $srcTblArr); } else { $parent = substr(strrchr($path,'/'),1); $srcTree[$val] = ( $srcTblArr[$parent][$val] ? $srcTblArr[$parent][$val] : 'nonregistered'); } } return $srcTree; // 리턴되는 배열 형태 => [ 디렉토리명 : [ 하위 디렉토리 배열 ], 파일명 : (`src_files_v3 내 레코드 번호` 또는 `false`), ... ] } function srcSearch($sh, $dbi){ include_once "naviUpdate_utils.php"; // prepare statement $query = "select b.name as parent_name,b.id as parent_id,a.name,a.code,a.id,a.seq,b.seq from src_files_v3 a left join (select id,name,seq from src_files_v3) b on a.parent=b.id where a.type != 'dir' and a.code like concat('%',?,'%') order by b.seq,a.seq"; $types = "s"; $parms_arr = array($sh); $resultArr = prepare_sql($dbi, $query, $types, $parms_arr); $i = 1; while ( $matched = mysqli_fetch_assoc($resultArr['result']) ) { $path = $matched['parent_id'].','.$matched['id']; $html .= $matched['parent_name'].'>'.$matched['name'].' : '; // 줄 단위 처리 $lines = preg_split("/\r\n|\n|\r/",$matched['code']); foreach($lines as $key=>$val){ if(stripos($val,$sh)!==false) { $line = ($key+1); $html_append .= " "."<a href='{$path}:{$line}' class='srcPathLineNo' data-path='{$path}' data-line='{$line}' title='".htmlspecialchars($val,ENT_QUOTES)."'>"; // rawurlencode($val), htmlentities($val) $html_append .= ($key+1).'줄'; $html_append .= "</a>"." "; } } $html .= $html_append; $html .= "<br>"; // $line_no = array(); $i += 1; $html_append = ''; } $html = substr($html,0,strrpos($html,'<br>')); // JSON 형식으로 송출 $return = array('html'=>$html,'err_msg'=>$err_msg); echo json_encode($return, JSON_UNESCAPED_UNICODE); } ?>