<?php
require_once __DIR__.'/gate.php';
class CDXStatement extends PDOStatement {
 private $bound=[];protected function __construct(){}
 public function bindValue($key,$value,$type=PDO::PARAM_STR){$this->bound[(string)$key]=['value'=>$value,'type'=>$type];return parent::bindValue($key,$value,$type);}
 public function execute($params=null){
  $sql=$this->queryString;$n=count($GLOBALS['CDX_PREPARED']??[]);$GLOBALS['CDX_PREPARED'][$n]=['queryString'=>$sql,'bindings'=>$this->bound,'execute_parameters'=>$params];
  try{
   if(preg_match('/^\s*(SELECT|SHOW|EXPLAIN)\b/i',$sql)||trim($sql)==='CALL SP_TABLEDEF(?, ?)'){$op='READ';if(preg_match('/[;#]|--|\/\*/',$sql))throw new RuntimeException('Read single statement gate');}
   else {if(!isset($GLOBALS['CDX_WRITE_CTX'],$GLOBALS['CDX_OWNER_ORACLE']))throw new RuntimeException('No HTTP write context');if(($GLOBALS['CDX_DML_COUNT']??0)!==0)throw new RuntimeException('One DML per case');$op=cdxWriteGate($sql,$this->bound,$params,$GLOBALS['CDX_WRITE_CTX'],$GLOBALS['CDX_OWNER_ORACLE']);++$GLOBALS['CDX_DML_COUNT'];}
   $GLOBALS['CDX_PREPARED'][$n]['op']=$op;$ok=parent::execute($params);$GLOBALS['CDX_PREPARED'][$n]['ok']=$ok;$GLOBALS['CDX_PREPARED'][$n]['native_rowCount']=$this->rowCount();return $ok;
  }catch(Throwable $e){$GLOBALS['CDX_PREPARED'][$n]['error']=['class'=>get_class($e),'message'=>$e->getMessage()];throw $e;}finally{if(isset($GLOBALS['CDX_WRITE_CTX']['case'])){$file=__DIR__.'/private-case-'.($GLOBALS['CDX_WRITE_CTX']['label']??$GLOBALS['CDX_WRITE_CTX']['case']).'.native.jsonl';file_put_contents($file,json_encode(['ordinal'=>$n]+$GLOBALS['CDX_PREPARED'][$n],JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION)."\n",FILE_APPEND|LOCK_EX);chmod($file,0600);}}
 }
}
