<?php
declare(strict_types=1);require __DIR__.'/common.php';$db=smPdo();$lane=getenv('SM7_LANE');
set_exception_handler(static function(Throwable $error):void{smSave('schema-plan-error-private.json',['class'=>get_class($error),'message'=>$error->getMessage()]);echo json_encode(['lane'=>getenv('SM7_LANE'),'status'=>'metadata-tool-error','class'=>get_class($error),'message_sha256'=>hash('sha256',$error->getMessage())]),PHP_EOL;exit(1);});
$dm=$lane==='C';$meta=smRows($db,$dm?'SELECT COLUMN_NAME,DATA_TYPE,DATA_PRECISION,DATA_SCALE,NULLABLE,DATA_DEFAULT,DATA_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID':'SELECT COLUMN_NAME,COLUMN_TYPE,DATA_TYPE,IS_NULLABLE,COLUMN_DEFAULT,COLUMN_COMMENT,ORDINAL_POSITION FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$dm?'YDY_RESTAURANTS':'ydy_restaurants']);
$sourceColumn=[];foreach($meta as $column){if(strtolower($column['column_name'])==='night_snack_position'){$sourceColumn=$column;}}
if($dm){$constraints=smRows($db,'SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION,STATUS,VALIDATED FROM USER_CONSTRAINTS WHERE TABLE_NAME=?',['YDY_RESTAURANTS']);$constraintColumns=smRows($db,'SELECT CONSTRAINT_NAME,COLUMN_NAME,POSITION FROM USER_CONS_COLUMNS WHERE TABLE_NAME=?',['YDY_RESTAURANTS']);$indexes=smRows($db,'SELECT INDEX_NAME,UNIQUENESS FROM USER_INDEXES WHERE TABLE_NAME=?',['YDY_RESTAURANTS']);$indexColumns=smRows($db,'SELECT INDEX_NAME,COLUMN_NAME,COLUMN_POSITION FROM USER_IND_COLUMNS WHERE TABLE_NAME=?',['YDY_RESTAURANTS']);$triggers=smRows($db,'SELECT TRIGGER_NAME,STATUS FROM USER_TRIGGERS WHERE TABLE_NAME=?',['YDY_RESTAURANTS']);$create=null;}
else{$create=smRows($db,'SHOW CREATE TABLE ydy_restaurants');$constraints=smRows($db,'SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',['ydy_restaurants']);$constraintColumns=smRows($db,'SELECT CONSTRAINT_NAME,COLUMN_NAME,ORDINAL_POSITION FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',['ydy_restaurants']);$indexes=smRows($db,'SHOW INDEX FROM ydy_restaurants');$indexColumns=[];$triggers=smRows($db,'SELECT TRIGGER_NAME,ACTION_TIMING,EVENT_MANIPULATION FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',['ydy_restaurants']);}
$count=smRows($db,'SELECT COUNT(*) n FROM ydy_restaurants')[0]['n'];if((int)$count>10000){throw new RuntimeException('DDL table hash cap above 10000');}
$statement=$db->query('SELECT * FROM ydy_restaurants ORDER BY id');$hashes=[];while($row=$statement->fetch(PDO::FETCH_ASSOC)){$row=array_change_key_case($row,CASE_LOWER);foreach($row as &$value){if(is_resource($value)){$value=stream_get_contents($value);}}unset($value);ksort($row);$hashes[(string)$row['id']]=hash('sha256',json_encode($row,JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION|JSON_THROW_ON_ERROR));}
$result=['lane'=>$lane,'table'=>'ydy_restaurants','column_metadata'=>$sourceColumn,'all_columns'=>$meta,'show_create'=>$create,'rows'=>count($hashes),'original_row_sha256_by_pk'=>$hashes,'original_rows_sha256'=>hash('sha256',json_encode($hashes,JSON_THROW_ON_ERROR)),'constraints'=>$constraints,'constraint_columns'=>$constraintColumns,'indexes'=>$indexes,'index_columns'=>$indexColumns,'triggers'=>$triggers,'schema_gate_digest'=>hash('sha256',serialize([$meta,$constraints,$constraintColumns,$indexes,$indexColumns,$triggers])),'business_row_values_persisted'=>false,'database_dml_ddl'=>0];smSave('schema-plan-private.json',$result);
echo json_encode(['lane'=>$lane,'rows'=>count($hashes),'column_present'=>$sourceColumn!==[],'column_metadata'=>$sourceColumn,'original_rows_sha256'=>$result['original_rows_sha256'],'constraint_count'=>count($constraints),'index_count'=>count($indexes),'trigger_count'=>count($triggers),'database_dml_ddl'=>0]),PHP_EOL;
