Files
SGF/scripts/sgf-stock-catalogue-concurrency.php
2026-11-11 09:00:17 +02:00

7 lines
2.6 KiB
PHP

<?php
require __DIR__.'/sgf-stock-catalogue-proof-bootstrap.php';$mode=$argv[1]??'';$directory=$argv[2]??'';if($book!=='regression'||!str_starts_with(str_replace('\\','/',$directory),str_replace('\\','/',$s['root']).'/catalogue-concurrency-'))throw new LogicException('Regression only');
if($mode==='prepare'){$key=(string)Illuminate\Support\Str::uuid();$code='QA-CONC-'.strtoupper(substr($key,0,8));[$proposal]=$catalogueCommand(2,$catalogueInput('prepare',$key,0,['code'=>$code,'name'=>'Artigo fictício de concorrência','unit'=>'UN']));$aKey=(string)Illuminate\Support\Str::uuid();$bKey=(string)Illuminate\Support\Str::uuid();$input=$catalogueInput('review',$key,1,['decision'=>'approved']);$a=$catalogueCall(12,'preview',$input,$aKey);$b=$catalogueCall(12,'preview',$input,$bKey);file_put_contents($directory.'/cuts.json',json_encode(['first'=>$a['value']['preview'],'second'=>$b['value']['preview'],'first_key'=>$aKey,'record_key'=>$key,'code'=>$code]));echo json_encode(['passed'=>true]).PHP_EOL;exit;}
$cuts=json_decode(file_get_contents($directory.'/cuts.json'),true);if($mode==='first'){$host->beginTransaction();$native->beginTransaction();try{$result=$catalogueCall(12,'confirm',['preview'=>$cuts['first']]);if($result['status']!==201)throw new LogicException(json_encode($result));file_put_contents($directory.'/locked.json',json_encode($result));$end=microtime(true)+25;while(!is_file($directory.'/release')&&microtime(true)<$end)usleep(50000);$native->commit();$host->commit();}finally{while($native->transactionLevel()>0)$native->rollBack();while($host->transactionLevel()>0)$host->rollBack();}exit;}
if($mode==='second'){$start=microtime(true);$out=$catalogueCall(12,'confirm',['preview'=>$cuts['second']]);file_put_contents($directory.'/second.json',json_encode($out+['seconds'=>microtime(true)-$start]));echo json_encode($out).PHP_EOL;exit;}
if($mode==='recover'){$actual=null;try{$out=$catalogueCall(12,'confirm',['preview'=>$cuts['second']]);$actual=$out['status'];}catch(Symfony\Component\HttpKernel\Exception\HttpExceptionInterface$e){$actual=$e->getStatusCode();}$again=$catalogueCall(12,'confirm',['preview'=>$cuts['first']]);$proof=['passed'=>$actual===409&&$again['status']===200&&$again['value']['replayed']&&$native->table('stock_items')->where('code',$cuts['code'])->count()===1&&$native->table('sc_catalogue_versions')->where('record_key',$cuts['record_key'])->count()===2,'after_release'=>$actual,'original_replay'=>$again['status'],'one_article'=>$native->table('stock_items')->where('code',$cuts['code'])->count()===1,'regression_only'=>true];file_put_contents($directory.'/recovery.json',json_encode($proof));echo json_encode($proof).PHP_EOL;}