<?php
declare(strict_types=1);$root=$argv[1]??__DIR__.'/source';require $root.'/vendor/autoload.php';spl_autoload_register(static function($class)use($root){foreach(['app\\'=>'app/','cores\\'=>'cores/'] as $p=>$d)if(strpos($class,$p)===0){$file=$root.'/'.$d.str_replace('\\','/',substr($class,strlen($p))).'.php';if(is_file($file))require $file;}});require __DIR__.'/NativePdo.php';
$cases=json_decode(file_get_contents(__DIR__.'/cases.json'),true);RopeSqlGate::$scenario='ADD_A';RopeSqlGate::$case=$cases['ADD_A'];RopeSqlGate::$started=time();$assertions=0;$reject=static function($fn)use(&$assertions){$failed=false;try{$fn();}catch(RuntimeException $e){$failed=true;}if(!$failed)throw new RuntimeException('Gate accepted negative');$assertions++;};
foreach(['SELECT * FROM yoshop_rope_skipping WHERE user_id = :x','SELECT * FROM ydy_user WHERE ai_user_id = :x','SHOW FULL COLUMNS FROM `yoshop_rope_skipping`'] as $sql){RopeSqlGate::kind($sql);$assertions++;}
foreach(['DELETE FROM yoshop_rope_skipping','UPDATE yoshop_store SET is_delete=0','INSERT INTO yoshop_user VALUES(1)','SELECT * FROM yoshop_order','SELECT 1; SELECT 2','SELECT * INTO abc FROM yoshop_user','CALL SP_TABLEDEF(?, ?)','DROP TABLE yoshop_user','SELECT sleep(1)','SELECT 1 -- x'] as $sql)$reject(static function()use($sql){RopeSqlGate::kind($sql);});
foreach([['ZHCT_APP','YDY_USER'],['AIZHCT_APP','YOSHOP_ROPE_SKIPPING']] as $values){RopeSqlGate::metadata('CALL SP_TABLEDEF(?, ?)',array_map(static function($v){return [$v,PDO::PARAM_STR];},$values));if(RopeSqlGate::kind('CALL SP_TABLEDEF(?, ?)')!=='metadata_CALL')throw new RuntimeException('Exact metadata');$assertions++;}
foreach([[['AIZHCT_APP',PDO::PARAM_INT],['YOSHOP_USER',PDO::PARAM_STR]],[['OTHER',PDO::PARAM_STR],['YOSHOP_USER',PDO::PARAM_STR]],[['ZHCT_APP',PDO::PARAM_STR],['YOSHOP_USER',PDO::PARAM_STR]],[['AIZHCT_APP',PDO::PARAM_STR],['YOSHOP_ORDER',PDO::PARAM_STR]]] as $b)$reject(static function()use($b){RopeSqlGate::metadata('CALL SP_TABLEDEF(?, ?)',$b);});
$f=$cases['ADD_A']['form'];$u=getenv('ROPE_LANE')==='B'?46914:1928;$values=['user_id'=>$u,'store_id'=>2147001111,'mac'=>$f['mac'],'mode'=>'free','mode_label'=>'CDX精确跳绳','stopped_at'=>(int)$f['stoppedAt'],'date_key'=>$f['dateKey'],'date_label'=>'2097 marker','time_label'=>'12:34:56','count'=>101,'duration'=>61,'calories'=>12.25,'fat_burn_efficiency'=>0.125,'avg_freq'=>100,'max_freq'=>120,'most_jump'=>90,'rope_trips'=>2,'target_seconds'=>60,'data'=>json_encode($f['data'],JSON_UNESCAPED_UNICODE),'create_time'=>time(),'update_time'=>time()];$bind=[];foreach($values as $key=>$v)$bind['data__'.$key]=[$v,is_int($v)?PDO::PARAM_INT:PDO::PARAM_STR];
$sql='INSERT INTO `yoshop_rope_skipping` (`'.implode('`,`',array_keys($values)).'`) VALUES (:data__'.implode(',:data__',array_keys($values)).')';RopeSqlGate::writePlan($sql,$bind);$assertions++;
if(getenv('ROPE_LANE')==='B'){$sets=[];foreach($values as $k=>$v)$sets[]='`'.$k.'` = :data__'.$k;$mysql='INSERT INTO `yoshop_rope_skipping` SET '.implode(' , ',$sets);RopeSqlGate::writePlan($mysql,$bind);$assertions++;foreach([$mysql.' ON DUPLICATE KEY UPDATE id=1',str_replace('`mac` = :data__mac',"`mac` = 'natural'",$mysql),$mysql.', `id` = :data__id',str_replace('`user_id` = :data__user_id','`store_id` = :data__user_id',$mysql)] as $bad)$reject(static function()use($bad,$bind){RopeSqlGate::writePlan($bad,$bind);});}
foreach(['user_id'=>1,'store_id'=>2147001112,'mac'=>'NATURAL','stopped_at'=>9007199254740992,'date_key'=>'2097-11-03','data'=>'[]','create_time'=>0,'count'=>999] as $key=>$bad){$b=$bind;$b['data__'.$key][0]=$bad;$reject(static function()use($sql,$b){RopeSqlGate::writePlan($sql,$b);});}
RopeSqlGate::$scenario='LATEST_A';$reject(static function()use($sql,$bind){RopeSqlGate::writePlan($sql,$bind);});RopeSqlGate::$scenario='ADD_A';RopeSqlGate::$writes=1;$reject(static function()use($sql,$bind){RopeSqlGate::writePlan($sql,$bind);});
echo json_encode(['assertions'=>$assertions,'HTTP'=>0,'DML'=>0,'DDL'=>0,'business_connections'=>0]),"\n";
