<?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);
}
?>