<?php
declare(strict_types=1);
date_default_timezone_set('Asia/Shanghai');
$lane=getenv('CORE_LANE');$dm=getenv('POC_DIALECT')==='dm';$runtime=__DIR__.'/private';$root=__DIR__.'/source';
function ck($ok,$m){if(!$ok)throw new RuntimeException($m);}
function saveOnce($name,$value){global $runtime;ck(!file_exists($runtime.'/'.$name),'Evidence immutable '.$name);$raw=json_encode($value,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRESERVE_ZERO_FRACTION);ck($raw!==false,'Evidence JSON');file_put_contents($runtime.'/'.$name,$raw);chmod($runtime.'/'.$name,0600);}
function event($file,$record){global $runtime;$raw=json_encode($record,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRESERVE_ZERO_FRACTION);ck($raw!==false,'Native event JSON');file_put_contents($runtime.'/'.$file,$raw."\n",FILE_APPEND|LOCK_EX);chmod($runtime.'/'.$file,0600);}
function nativePdo($db){global $dm;static $p=[];if(isset($p[$db]))return $p[$db];$dsn=$dm?'dm:host=127.0.0.1;port='.getenv('POC_'.$db.'_PORT').';schema='.getenv('POC_'.$db.'_SCHEMA'):'mysql:host='.getenv('POC_'.$db.'_HOST').';port='.getenv('POC_'.$db.'_PORT').';dbname='.getenv('POC_'.$db.'_SCHEMA').';charset='.getenv('POC_'.$db.'_CHARSET');return $p[$db]=new PDO($dsn,getenv('POC_'.$db.'_USER'),getenv('POC_'.$db.'_PASSWORD'),[PDO::ATTR_CASE=>PDO::CASE_LOWER,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_ORACLE_NULLS=>PDO::NULL_NATURAL,PDO::ATTR_STRINGIFY_FETCHES=>false,PDO::ATTR_EMULATE_PREPARES=>false]);}
function readNative($db,$sql,$params=[],$secret=false){ck(preg_match('/^SELECT\b/',$sql)===1&&!preg_match('/;|--|\/\*|\b(?:INSERT|UPDATE|DELETE|CREATE|ALTER|DROP|INTO|CALL)\b/i',$sql),'Independent native SELECT');$s=nativePdo($db)->prepare($sql);$bind=[];foreach(array_values($params) as $i=>$v){$s->bindValue($i+1,(string)$v,PDO::PARAM_STR);$bind[]=['position'=>$i+1,'value'=>(string)$v,'pdo_type'=>PDO::PARAM_STR];}try{$ok=$s->execute();$rows=$s->fetchAll(PDO::FETCH_ASSOC);foreach($rows as &$r){foreach($r as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($v);ksort($r);}unset($r);$hash=hash('sha256',json_encode($rows,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRESERVE_ZERO_FRACTION));event('independent-native-store-continue.jsonl',['connection'=>$db,'queryString'=>$s->queryString,'bindValue'=>$bind,'execute'=>$ok,'rowCount'=>$s->rowCount(),'rows'=>$secret?'CONFIG_FULLROW_HASH_ONLY':$rows,'fullrow_sha256'=>$hash]);return $rows;}catch(Throwable $e){event('independent-native-store-continue.jsonl',['connection'=>$db,'queryString'=>$s->queryString,'bindValue'=>$bind,'error'=>['class'=>get_class($e),'message'=>$e->getMessage()]]);throw $e;}}
function oldProtection(){global $lane,$runtime;$pre=json_decode(file_get_contents($runtime.'/preflight-'.$lane.'.json'),true);$ids=$lane==='B'?[44676,97274,107491]:[1836,2642,2182];$data=[];foreach([['AI','user','user_id',$ids[0]],['ZHCT','user','id',$ids[1]],['ZHCT','staff','id',$ids[2]]] as [$db,$t,$pk,$id]){$cols=[];foreach($pre['schema'][$db][$t]['columns'] as $col){$n=strtolower($col['column_name']);if(!preg_match('/password|^pwd$|^salt$|token|secret|openid|unionid|oauth/',$n))$cols[]=$n;}$data[$db.'.'.$t]=readNative($db,'SELECT '.implode(',',$cols).' FROM '.getenv('POC_'.$db.'_PREFIX').$t.' WHERE '.$pk.'=?',[$id]);}
foreach(['account_settlement'=>'settlement_id','user_balance_log'=>'log_id','user_subsidy'=>'id','user_gift_log'=>'log_id'] as $t=>$pk)$data['AI.'.$t]=readNative('AI','SELECT * FROM yoshop_'.$t.' WHERE user_id=? ORDER BY '.$pk,[$ids[0]]);$orders=readNative('ZHCT','SELECT * FROM ydy_meal_order WHERE user_id=? ORDER BY id',[$ids[1]]);$data['ZHCT.meal_order']=$orders;$orderIds=array_column($orders,'id');foreach(['initial_menu','meal_order_pickup'] as $t)$data['ZHCT.'.$t]=$orderIds?readNative('ZHCT','SELECT * FROM ydy_'.$t.' WHERE meal_order_id IN ('.implode(',',array_fill(0,count($orderIds),'?')).') ORDER BY id',$orderIds):[];$data['ZHCT.prepay_order']=readNative('ZHCT','SELECT * FROM ydy_prepay_order WHERE user_id=? ORDER BY id',[$ids[1]]);$data['ZHCT.staff_department']=readNative('ZHCT','SELECT * FROM ydy_staff_department WHERE staff_uuid=? ORDER BY id',[$data['ZHCT.staff'][0]['uuid']]);$config=readNative('ZHCT','SELECT * FROM ydy_config WHERE config_key IN (?,?) ORDER BY id',['one_card','account_deduction_order'],true);$data['ZHCT.exact_config_hashes']=hash('sha256',json_encode($config,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRESERVE_ZERO_FRACTION));return $data;}
function sourceProof(){global $root;$pins=json_decode(file_get_contents(__DIR__.'/source-frozen-sha.json'),true)['files'];foreach($pins as $n=>$h)ck(is_file($root.'/'.$n)&&hash_file('sha256',$root.'/'.$n)===$h,'Full frozen source '.$n);return ['source_files'=>count($pins),'all_sha256_match'=>true];}
function ownSnapshot(){global $runtime;$ids=json_decode(file_get_contents($runtime.'/prepared.json'),true)['ids'];$out=[];foreach([['AI','user','user_id','AI_U1'],['AI','user','user_id','AI_U2'],['ZHCT','staff','id','STORE_S1'],['ZHCT','user','id','STORE_U1'],['ZHCT','user','id','STORE_U2'],['ZHCT','restaurants','id','STORE_R1'],['ZHCT','prepay_order','id','STORE_P1']] as [$db,$table,$pk,$name])$out[$name]=readNative($db,'SELECT * FROM '.($db==='AI'?'yoshop_':'ydy_').$table.' WHERE '.$pk.'=?',[$ids[$name]]);foreach(['account_settlement'=>'settlement_id','user_balance_log'=>'log_id','user_subsidy'=>'id','user_gift_log'=>'log_id'] as $t=>$pk)$out[$t]=readNative('AI','SELECT * FROM yoshop_'.$t.' WHERE user_id IN (?,?) ORDER BY '.$pk,[$ids['AI_U1'],$ids['AI_U2']]);$out['meal_order']=readNative('ZHCT','SELECT * FROM ydy_meal_order WHERE user_id IN (?,?) ORDER BY id',[$ids['STORE_U1'],$ids['STORE_U2']]);foreach(['initial_menu','meal_order_pickup'] as $t){$o=array_column($out['meal_order'],'id');$out[$t]=$o?readNative('ZHCT','SELECT * FROM ydy_'.$t.' WHERE meal_order_id IN ('.implode(',',array_fill(0,count($o),'?')).') ORDER BY id',$o):[];}$out['staff_department']=readNative('ZHCT','SELECT * FROM ydy_staff_department WHERE staff_uuid=? ORDER BY id',[$out['STORE_S1'][0]['uuid']]);$out['one_card_account_map']=readNative('ZHCT','SELECT * FROM ydy_one_card_account_map WHERE (user_id=? OR user_id=? OR staff_uuid=?) AND acc_num<>? ORDER BY id',[$ids['STORE_U1'],$ids['STORE_U2'],$out['STORE_S1'][0]['uuid'],'']);return $out;}
