<?php // (2022.9.18, 차재복, Cha Jae Bok, http://www.ktword.co.kr)
// 해당 id의 소스 파일의 날짜,코드 최신으로 업데이트
function sourceFileUpdate($id, $dbi) {
// 해당 id의 소스 파일 내역 select
$query = "select a.name as name,b.name as parent_name,a.date
from src_files_v3 a left join src_files_v3 b on a.parent=b.id
where a.id=?";
$stmt = mysqli_prepare($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_bind_param($stmt, "i", $id);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_execute($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$result = mysqli_stmt_get_result($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$matched = mysqli_fetch_assoc($result);
// 디렉토리 내 해당 파일 날짜,내용 추출
$file_pos = '../'.$matched['parent_name'].'/'.$matched['name'];
$file_timestamp = filemtime($file_pos);
$file_date = date('Y-m-d H:i:s',$file_timestamp);
$file_code = file_get_contents($file_pos);
// $file_code = mysqli_real_escape_string($dbi, $file_code);
$tbl_date = date('Y-m-d H:i:s',$matched['date']);
// 날짜 비교
$date_diff = strtotime($matched['date']) - $file_timestamp;
if($date_diff < 0) {
$query = "update src_files_v3 set date=?, code=? where id=? limit 1";
$stmt = mysqli_prepare($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
// if (mysqli_errno($dbi)) { echo mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_bind_param($stmt, "ssi", $file_date, $file_code, $id);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
// if (mysqli_errno($dbi)) { echo mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_execute($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
// if (mysqli_errno($dbi)) { echo mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
}
$affected = mysqli_stmt_affected_rows($stmt) > 0 ? true : false ;
$return = array('affected'=>$affected,'err_msg'=>$err_msg);
// 송출
echo json_encode($return, JSON_UNESCAPED_UNICODE);
}
function addSrcFile($parent, $current, $dbi) {
$parent = str_replace(array("'","\"","\\","/"),'',$parent);
$current = str_replace(array("'","\"","\\","/"),'',$current);
if(mb_strlen($parent)>30 or mb_strlen($current)>30) exit('긴 파일명');
// db table 내 기등록된 소스 디렉토리,파일명 추출하여 배열 전환하고,
// 이를 소스 디렉토리 내 디렉토리,파일 스캔한 배열과 일치 여부 확인
// (해킹 방어)
include_once "naviFetch_source.php";
$srcTblArr = tblSrcArr($dbi);
$srcTree = recSrcScanDir('../', $srcTblArr);
if($srcTree[$parent][$current]!='nonregistered')
exit("실제 디렉토리,파일 존재 확인 안됨");
// 주어진 parent가 기존 db에 미 등록된 상태이면, 부모 디렉토리 등록
include_once "naviUpdate_utils.php"; // findEmptyId()
if(empty($srcTblArr[$parent])) {
$empty_id = findEmptyId ('src_files_v3', $dbi); // id : 비어있는 id 번호 찾기
$query = "select max(seq) into @max_seq from src_files_v3 where parent=0";
$result = mysqli_query($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$query = "insert into src_files_v3
(id, parent, name, type, seq, child)
values
({$empty_id}, 0, '{$parent}', 'dir', (@max_seq+1), 0)";
$result = mysqli_query($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
}
// id : 비어있는 id 번호 찾기
$empty_id = findEmptyId ('src_files_v3', $dbi);
// parent=id, seq=(child+1) 추출
$query = "select id,child
from src_files_v3
where name=? and type='dir'
limit 1";
$stmt = mysqli_prepare($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_bind_param($stmt, "s", $parent);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_execute($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$result = mysqli_stmt_get_result($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$matched = mysqli_fetch_assoc($result);
$parent_id = $matched[id];
$child = $matched[child];
// name = $current
// date : filemtime(path),code : file_get_contents(path)
$path = '../'.$parent.'/'.$current;
$date = date('Y-m-d H:i:s', filemtime($path));
$code = file_get_contents($path);
$code = mysqli_real_escape_string($dbi, $code);
// 파일 정보 insert
$query = "insert into src_files_v3
(id, parent, name, type, seq, child, date, code)
values
({$empty_id}, {$parent_id}, ?, 'file', ({$child}+1), 0, '{$date}', '{$code}')";
$stmt = mysqli_prepare($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_bind_param($stmt, "s", $current);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_execute($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
// parent child + 1 setting
$query = "update src_files_v3 set child=({$child}+1) where id={$parent_id} limit 1";
mysqli_query($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
if(empty($err_msg)) $result = true;
$return = array('result'=>$result,'parent'=>$parent_id,'current'=>$empty_id,'err_msg'=>$err_msg);
// 송출
echo json_encode($return, JSON_UNESCAPED_UNICODE);
}
function deleteSrcFile($id, $parent_id, $dbi) {
// 자식 있는 (child>0) 부모(디렉토리)일 경우 거부
$query = "select count(*) as cnt from src_files_v3 where parent=?";
$stmt = mysqli_prepare($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_bind_param($stmt, "i", $id);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_execute($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$result = mysqli_stmt_get_result($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$matched = mysqli_fetch_assoc($result);
$children = $matched[cnt];
if($children > 0) exit('산하 자식 존재');
// 해당 id 소스 row 삭제
$query = "delete from src_files_v3 where id=? limit 1";
$stmt = mysqli_prepare($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_bind_param($stmt, "i", $id);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_execute($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
if(mysqli_stmt_affected_rows($stmt)>0) $extra_msg .= "삭제 성공";
else $err_msg .= "삭제 실패";
// 해당 id 부모의 child 조정
$query = "update src_files_v3
set child=(select count(*)
from src_files_v3 where parent=?) where id=? limit 1";
$stmt = mysqli_prepare($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_bind_param($stmt, "ii", $parent_id, $parent_id);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$result = mysqli_stmt_execute($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
if($result) $extra_msg .= "해당 id 부모 산하 자식 수 계산 후 넣기 성공";
else $extra_msg .= "해당 id 부모 산하 자식 수 감소 실패";
// 형제 seq 조정
$query = "set @rank = 0"; // mysql 변수 @rank 설정
$stmt = mysqli_prepare($dbi, $query);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$result = mysqli_stmt_execute($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$query = "update src_files_v3
set seq=@rank:=@rank+1
where parent=?
order by seq";
$stmt = mysqli_prepare($dbi, $query);
// if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
if (mysqli_errno($dbi)) { echo mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
mysqli_stmt_bind_param($stmt, "i", $parent_id);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
$result = mysqli_stmt_execute($stmt);
if (mysqli_errno($dbi)) { $err_msg .= mysqli_errno($dbi)." : ".mysqli_error($dbi)."\n"; }
if(mysqli_stmt_affected_rows($stmt) > 0) $extra_msg .= "형제 seq 차례로 업데이트 성공";
else $extra_msg .= "형제 seq 차례로 업데이트 실패";
$return = array('extra_msg'=>$extra_msg,'err_msg'=>$err_msg);
// 송출
echo json_encode($return, JSON_UNESCAPED_UNICODE);
}
function editSrcFileFetch($id, $dbi){
// 기존 db table 내 디렉토리,파일명 추출하여 배열화
include_once "naviFetch_source.php";
$tblSrcArr = tblSrcArr($dbi);
// 배열 내 주어진 값과 일치하는 키를 찾는 재귀적 함수
$dir = array_recursive_search_key_map($id, $tblSrcArr);
$pathFileName = '../'.$dir[0].'/'.$dir[1];
// 파일 불러서, 배열화
$code = file_get_contents($pathFileName);
$return = array('code'=>$code);
// 송출
echo json_encode($return, JSON_UNESCAPED_UNICODE);
}
function editSrcFileUpdate($id, $msg, $dbi){
// 소스코드 바이트 수 제한
$msg_len = strlen($msg);
if( $msg_len > 10000 ) exit("10000 바이트 이상 제한 : {$msg_len}");
// 기존 db table 내 디렉토리,파일명 추출하여 배열화
include_once "naviFetch_source.php";
$tblSrcArr = tblSrcArr($dbi);
// 배열 내 주어진 값과 일치하는 키를 찾는 재귀적 함수
$dir = array_recursive_search_key_map($id, $tblSrcArr);
$pathFileName = '../'.$dir[0].'/'.$dir[1];
if(file_exists($pathFileName))
if(!copy($pathFileName, $pathFileName.'.bak'))
$err_msg .= "기존 파일 백업 실패";
else
$writtenBytes = file_put_contents($pathFileName, $msg);
if($writtenBytes) $success .= '쓰여진 바이트 수 : '.$writtenBytes;
else $err_msg .= "파일 업데이트 실패";
$return = array('success' => $success, 'err_msg' => $err_msg);
// 송출
echo json_encode($return, JSON_UNESCAPED_UNICODE);
}
function array_recursive_search_key_map($needle, $haystack) {
foreach($haystack as $first_level_key=>$value) {
if ($needle === $value) {
return array($first_level_key);
} elseif (is_array($value)) {
$callback = array_recursive_search_key_map($needle, $value);
if ($callback) {
return array_merge(array($first_level_key), $callback);
}
}
}
return false;
}
?>