<?php
declare(strict_types=1);
$lane=getenv('READ12_LANE');$dm=getenv('POC_DIALECT')==='dm';$runtime=__DIR__.'/private';
if(!is_dir($runtime))mkdir($runtime,0700);chmod($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]);
$records=[];$q=static function($sql,$params=[])use($db,&$records){if(strpos($sql,'SELECT ')!==0)throw new RuntimeException('SELECT only');$s=$db->prepare($sql);$s->execute($params);$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);$records[]=['queryString'=>$s->queryString,'execute_array'=>$params,'rows'=>$rows];return $rows;};
$identity=$dm?$q("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') schema_name FROM DUAL"):$q('SELECT DATABASE() schema_name,VERSION() version');
if($identity[0]['schema_name']!==($dm?'AIZHCT_APP':getenv('POC_AI_SCHEMA'))||(!$dm&&strpos($identity[0]['version'],'5.6.')!==0))throw new RuntimeException('Identity drift');
$table=$dm?'YOSHOP_STAFF':'yoshop_staff';
$meta=$dm?$q('SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH,CHAR_LENGTH,CHAR_USED,DATA_PRECISION,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[$table]):$q('SELECT COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,CHARACTER_MAXIMUM_LENGTH,CHARACTER_OCTET_LENGTH,CHARACTER_SET_NAME,COLLATION_NAME,COLUMN_COMMENT,EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$table]);
$out=['lane'=>$lane,'identity_verified'=>true,'metadata'=>$meta,'HTTP'=>0,'DML'=>0,'DDL'=>0];
if($dm){
 $objects=[];
 $objects['indexes']=$q('SELECT INDEX_NAME,INDEX_TYPE,UNIQUENESS,STATUS FROM USER_INDEXES WHERE TABLE_NAME=? ORDER BY INDEX_NAME',[$table]);
 $objects['index_columns']=$q('SELECT INDEX_NAME,COLUMN_NAME,COLUMN_POSITION FROM USER_IND_COLUMNS WHERE TABLE_NAME=? ORDER BY INDEX_NAME,COLUMN_POSITION',[$table]);
 $objects['constraints']=$q('SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,SEARCH_CONDITION,R_CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME=? ORDER BY CONSTRAINT_NAME',[$table]);
 $objects['constraint_columns']=$q('SELECT CONSTRAINT_NAME,COLUMN_NAME,POSITION FROM USER_CONS_COLUMNS WHERE TABLE_NAME=? ORDER BY CONSTRAINT_NAME,POSITION',[$table]);
 $objects['triggers']=$q('SELECT * FROM USER_TRIGGERS WHERE TABLE_NAME=? ORDER BY TRIGGER_NAME',[$table]);
 $out['objects']=$objects;
 $out['ddl']=$q("SELECT DBMS_METADATA.GET_DDL('TABLE',?,'AIZHCT_APP') ddl FROM DUAL",[$table]);
 $cols=[];foreach($meta as $m){$name=$m['column_name'];if(!preg_match('/^[A-Z][A-Z0-9_]*$/D',$name))throw new RuntimeException('Column identity');$numeric=in_array(strtoupper($m['data_type']),['DECIMAL','NUMERIC','NUMBER','BIGINT','INTEGER','INT','SMALLINT','TINYINT'],true);$cols[]=$numeric?'CAST("'.$name.'" AS VARCHAR(128))':'"'.$name.'"';}
 $sql='SELECT '.implode(',',$cols).' FROM AIZHCT_APP.YOSHOP_STAFF ORDER BY ID';
 $s=$db->prepare($sql);$s->execute();$hash=hash_init('sha256');$count=0;
 while($r=$s->fetch(PDO::FETCH_NUM)){foreach($r as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($v);hash_update($hash,serialize($r)."\n");++$count;}
 $out['original_projection']=['sql'=>$s->queryString,'mode'=>'full original20 columns ordered ID; exact numeric text, original date and strings; no row values archived','rows'=>$count,'sha256'=>hash_final($hash)];
}
$out['queries']=$records;$out['SELECT']=count($records)+($dm?1:0);
$path=$runtime.'/img-preflight-'.$lane.'.json';$json=json_encode($out,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION);if($json===false)throw new RuntimeException('Raw encoding failed');file_put_contents($path,$json);chmod($path,0600);
$pub=$out;unset($pub['queries']);file_put_contents(__DIR__.'/img-preflight-'.$lane.'.json',json_encode($pub,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION));
echo json_encode(['lane'=>$lane,'identity_verified'=>true,'column_count'=>count($meta),'SELECT'=>$out['SELECT'],'HTTP'=>0,'DML'=>0,'DDL'=>0,'raw_sha256'=>hash('sha256',$json)]),"\n";
