<?php
$lane=getenv('SS_LANE');$root=getenv('SS_ROOT');$cfg=(static function($file){return require $file;})($root.'/application/database.php');
if($lane==='B'){$local=require '/workspace/zhct/zhctproject/store/application/config/local/database.php';foreach(['hostname','database','username','password']as $key)if((string)$cfg[$key]!==$local[$key])throw new RuntimeException('Not code local');$dsn='mysql:host='.$cfg['hostname'].';port='.($cfg['hostport']?:3306).';dbname='.$cfg['database'].';charset=utf8mb4';}
else{if($cfg['hostname']!=='127.0.0.1'||(string)$cfg['hostport']!=='5237'||$cfg['database']!=='ZHCT_APP')throw new RuntimeException('Not nonprod5237/ZHCT_APP');$dsn='dm:host=127.0.0.1;port=5237;schema=ZHCT_APP';}
$db=new PDO($dsn,$cfg['username'],$cfg['password'],[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER,PDO::ATTR_STRINGIFY_FETCHES=>false,PDO::ATTR_EMULATE_PREPARES=>false]);$journal=[];
$q=static function($sql,$args=[])use($db,&$journal){if(!preg_match('/^SELECT\b/i',$sql))throw new RuntimeException('SELECT only');$item=['SQL'=>$sql,'bindings'=>$args];try{$s=$db->prepare($sql);$s->execute($args);$rows=$s->fetchAll(PDO::FETCH_ASSOC);if(count($rows)>1000)throw new RuntimeException('Metadata/aggregate cap1000');foreach($rows as &$row){$row=array_change_key_case($row,CASE_LOWER);foreach($row as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($v);}unset($row);$item['ok']=true;$journal[]=$item;return $rows;}catch(Throwable $e){$item['error']=$e->getMessage();$journal[]=$item;return ['read_error'=>$e->getMessage()];}};

$out=['lane'=>$lane,'DML'=>0,'DDL'=>0,'HTTP'=>0,'tests'=>[]];
if($lane!=='C')exit(78);
foreach(['A','a','A ','','汉😀']as $value){
 $out['tests']['rtrim_'.bin2hex($value)]=$q("SELECT RTRIM(?,' ') AS V,RAWTOHEX(CHARTOBIN(RTRIM(?,' '))) AS H,LENGTHB(RTRIM(?,' ')) AS N FROM DUAL",[$value,$value,$value]);
}
foreach(['case'=>['A','a'],'tail'=>['A','A '],'empty'=>['',' '],'accent'=>['e','é'],'full128'=>[str_repeat('😀',127).'A',str_repeat('😀',127).'a']]as $name=>$pair){
 $out['tests']['binary_pad_'.$name]=$q("SELECT CASE WHEN BINARY(RTRIM(?,' '))=BINARY(RTRIM(?,' ')) THEN 1 ELSE 0 END AS EQ FROM DUAL",$pair);
 $out['tests']['hex_pad_'.$name]=$q("SELECT CASE WHEN NVL(RAWTOHEX(CHARTOBIN(RTRIM(?,' '))),'#')=NVL(RAWTOHEX(CHARTOBIN(RTRIM(?,' '))),'#') THEN 1 ELSE 0 END AS EQ FROM DUAL",$pair);
}
$out['tests']['direct_hex_case']=$q("SELECT RAWTOHEX(CHARTOBIN(?)) AS H1,RAWTOHEX(CHARTOBIN(?)) AS H2,CASE WHEN RAWTOHEX(CHARTOBIN(?))=RAWTOHEX(CHARTOBIN(?)) THEN 1 ELSE 0 END AS EQ FROM DUAL",['A','a','A','a']);
$out['tests']['binary_tail']=$q("SELECT CASE WHEN BINARY(?)=BINARY(?) THEN 1 ELSE 0 END AS EQ FROM DUAL",['A','A ']);
$out['tests']['clob_chunk_hex_case']=$q("SELECT RAWTOHEX(CHARTOBIN(DBMS_LOB.SUBSTR(TO_CLOB(?),256,1))) AS H1,RAWTOHEX(CHARTOBIN(DBMS_LOB.SUBSTR(TO_CLOB(?),256,1))) AS H2 FROM DUAL",['A','a']);
$out['journal']=$journal;echo json_encode($out,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION),"\n";

