<?php
declare(strict_types=1);
$lane=getenv('COMMENT_LANE');$dm=getenv('POC_DIALECT')==='dm';$runtime=getenv('COMMENT_RUNTIME');if(!is_dir($runtime))mkdir($runtime,0700);
$db=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='.getenv('POC_AI_CHARSET'),getenv('POC_AI_USER'),getenv('POC_AI_PASSWORD'),[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER]);
if($dm?$db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()!=='AIZHCT_APP':($db->query('SELECT DATABASE()')->fetchColumn()!==getenv('POC_AI_SCHEMA')||strpos($db->query('SELECT VERSION()')->fetchColumn(),'5.6.')!==0))throw new RuntimeException('Actual approved DB identity drift');
$q=static function($sql,$p=[])use($db){if(!preg_match('/^\s*SELECT\b/i',$sql)||preg_match('/\b(INTO|FOR\s+UPDATE|CALL|OUTFILE)\b/i',$sql))throw new RuntimeException('Only SELECT metadata precheck');$s=$db->prepare($sql);$s->execute($p);$rows=$s->fetchAll(PDO::FETCH_ASSOC);foreach($rows as &$row)foreach($row as &$v)if(is_resource($v))$v=stream_get_contents($v);return $rows;};
$out=['lane'=>$lane,'identity_verified'=>true,'HTTP'=>0,'DML'=>0,'DDL'=>0,'tables'=>[]];
foreach(['user_points_log','user_balance_log','user_feedback','user','upload_file','user_grade'] as $name){$table='yoshop_'.$name;$upper=strtoupper($table);$cols=$dm?$q('SELECT COLUMN_NAME,DATA_TYPE,NULLABLE,DATA_DEFAULT,DATA_LENGTH,DATA_PRECISION,DATA_SCALE FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[$upper]):$q('SELECT COLUMN_NAME,DATA_TYPE,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE,EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$table]);if(!$cols)throw new RuntimeException('Missing table schema '.$name);foreach($cols as &$c)$c['column_name']=strtolower($c['column_name']);unset($c);$fk=$dm?$q("SELECT COUNT(*) n FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE='R' AND (TABLE_NAME=? OR R_CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME=?))",[$upper,$upper]):$q('SELECT COUNT(*) n FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND (TABLE_NAME=? OR REFERENCED_TABLE_NAME=?)',[$table,$table]);$tr=$dm?$q('SELECT COUNT(*) n FROM USER_TRIGGERS WHERE TABLE_NAME=?',[$upper]):$q('SELECT COUNT(*) n FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$table]);$unique=$dm?$q("SELECT c.CONSTRAINT_NAME,c.CONSTRAINT_TYPE,cc.COLUMN_NAME,cc.POSITION FROM USER_CONSTRAINTS c JOIN USER_CONS_COLUMNS cc ON c.CONSTRAINT_NAME=cc.CONSTRAINT_NAME WHERE c.TABLE_NAME=? AND c.CONSTRAINT_TYPE IN ('P','U') ORDER BY c.CONSTRAINT_NAME,cc.POSITION",[$upper]):$q('SELECT INDEX_NAME,NON_UNIQUE,COLUMN_NAME,SEQ_IN_INDEX FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? AND NON_UNIQUE=0 ORDER BY INDEX_NAME,SEQ_IN_INDEX',[$table]);$out['tables'][$name]=['columns'=>$cols,'foreign_keys'=>(int)$fk[0]['n'],'triggers'=>(int)$tr[0]['n'],'unique'=>$unique,'own_rows'=>(int)$q('SELECT COUNT(*) n FROM '.$table.' WHERE store_id IN (2147001111,2147001112)')[0]['n']];}
$priorPath='/tmp/cdx-ai-admin-device-dishes-read5-20261011/private/evidence/final-original.json';$prior=json_decode(file_get_contents($priorPath),true)['original'];$users=$q('SELECT * FROM yoshop_user WHERE store_id IN (2147001111,2147001112) ORDER BY user_id');foreach($users as &$r)ksort($r);unset($r);if($users!==$prior['user'])throw new RuntimeException('Prior marked users all-column drift');
$out['old_marked_users_exact']=true;$out['old_user_projection']=array_map(static function($r){return array_intersect_key($r,array_flip(['user_id','store_id','nick_name','avatar_id','grade_id','is_delete']));},$users);$out['prior_file_sha256']=hash_file('sha256',$priorPath);
$out['marker_check_pending_schema']=true;
$s=json_encode($out,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);file_put_contents(__DIR__.'/structure-'.$lane.'.json',$s);echo $s,"\n";
