<?php
declare(strict_types=1);
date_default_timezone_set('Asia/Shanghai');$lane=(string)getenv('CATEGORY_LANE');$runtime=(string)getenv('CATEGORY_RUNTIME');$base=(string)getenv('CATEGORY_BASE');$root=(string)getenv('CATEGORY_ROOT');$dm=getenv('POC_DIALECT')==='dm';$marker='CDXCS10B4C8';$tenants=['store'=>2147001421,'terminal'=>2147001422];$tables=['h5_setting','wxapp_setting'];$owned=array_fill_keys($tables,[]);
$check=static function(bool $ok,string $why):void{if(!$ok)throw new RuntimeException($why);};$check(in_array($lane,['B','C'],true)&&preg_match('#^http://127\.0\.0\.1:1832[12]$#D',$base)===1,'Private loopback');
$connect=static function()use($dm):PDO{try{return new PDO($dm?'dm:host=127.0.0.1;port=5238;schema=AIZHCT_APP':'mysql:host='.getenv('POC_AI_HOST').';port='.getenv('POC_AI_PORT').';dbname='.getenv('POC_AI_SCHEMA').';charset=utf8',getenv('POC_AI_USER'),getenv('POC_AI_PASSWORD'),[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER]);}catch(Throwable $e){throw new RuntimeException('Client settings private DB identity connection failed');}};
$db=$connect();if($dm)$check($db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()==='AIZHCT_APP','DM identity');else $check(strpos((string)$db->query('SELECT VERSION()')->fetchColumn(),'5.6.')===0&&$db->query('SELECT DATABASE()')->fetchColumn()===getenv('POC_AI_SCHEMA'),'Code local MySQL5.6');
$query=static function(string $sql,array $args=[])use($db):array{$s=$db->prepare($sql);$s->execute($args);$rows=$s->fetchAll(PDO::FETCH_ASSOC);foreach($rows as &$r)foreach($r as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($r,$v);return $rows;};$qkey=$dm?'"KEY"':'`key`';$qvalues=$dm?'"VALUES"':'`values`';
$gate=json_decode((string)file_get_contents(__DIR__.'/structure-'.$lane.'.json'),true);$check($gate['lane']===$lane&&$gate['business_dml']===0&&$gate['foreign_keys']===0&&$gate['triggers']===0,'Live two-table metadata gate');foreach($tables as $t){$cols=array_map('strtolower',array_column($gate['metadata'][$t]['columns'],'column_name'));$want=['key','describe','values','store_id','update_time'];sort($cols);sort($want);$check($cols===$want,'Exact KV fields '.$t);$unique=[];foreach($gate['metadata'][$t]['indexes'] as $i){if($dm?strtoupper($i['uniqueness'])==='UNIQUE':(int)$i['non_unique']===0)$unique[$i['index_name']][]=strtolower($i['column_name']);}$found=false;foreach($unique as $columns){sort($columns);if($columns===['key','store_id'])$found=true;}$check($found,'Actual unique (key,store_id), no fabricated id PK');foreach($gate['metadata'][$t]['columns'] as $c){$k=strtolower($c['column_name']);$type=strtolower($c['data_type']);if($k==='values')$check(in_array($type,['text','mediumtext','clob'],true),'Actual JSON MEDIUMTEXT/CLOB oracle');if($k==='update_time')$check(in_array($type,['int','integer','bigint'],true)&&(int)($dm?$c['data_scale']:$c['numeric_scale'])===0,'Actual Unix integer update time');}}
$snapshot=static function()use($connect,$dm,$tables,$qkey,&$owned):array{$scan=$connect();if(!$dm)$scan->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,false);$out=[];foreach($tables as $t){$s=$scan->query('SELECT * FROM yoshop_'.$t.' ORDER BY '.$qkey.',store_id');$h=hash_init('sha256');$n=0;while($r=$s->fetch(PDO::FETCH_ASSOC)){if(isset($owned[$t][(string)$r['store_id']][$r['key']]))continue;foreach($r as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($v);hash_update($h,serialize($r));$n++;}$s->closeCursor();$out[$t]=['natural_rows'=>$n,'sha256'=>hash_final($h)];}return $out;};
$boundary=($argv[1]??'')==='finalize'?json_decode(file_get_contents($runtime.'/report.json'),true)['loaded_boundary']:json_decode((string)file_get_contents($base.'/__poc_boundary'),true);$hashes=['store_h5_sha'=>'ed40df92452b4691fedb6e71e6139fa135cefd91f46313bcfdf976a8dc1d9caf','terminal_h5_sha'=>'cbe1c1cfe2c01c2ff6bf50e468c862875d3be7c18a2582792f2050b38336287d','common_h5_sha'=>'aac40b1122bf4f6819de96121dc276b1e190d95218c17d288d7247e100b5f66f','store_wx_sha'=>'02f751f8a9d3415c0b50d8916fd76fd93f0861517ca4890b16a1f017a1b3c65b','terminal_wx_sha'=>'655dae869531258cd0c3015f59e66a1e37b34b459e1e74b683cb0d58a7720cc4','common_wx_sha'=>'7751d2dc29d5856080ec693ffef06468739e5c833975324ea13af56b8e69af0f','base_model_sha'=>'15b09472d9152906bd3f6cfa6b98ea87b1952abcc9587e7e72526fff73ab78c6'];foreach($hashes as $k=>$v)$check(($boundary[$k]??'')===$v,'Actual prewrite source '.$k);$check($boundary['external_stubs']===true&&$boundary['private_cache']===true&&$boundary['all_external_calls_forbidden']===true,'Private runtime boundary');
