Merge pull request #1 from FredericoFalcao/codex/suggest-project-improvements

Add Python trigger execution utilities
This commit is contained in:
FredericoFalcao 2025-06-07 14:09:36 +03:00 committed by GitHub
commit bdea055654
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 100 additions and 0 deletions

View File

@ -0,0 +1,51 @@
<?php
/**
* Generates Python code for sandbox execution based on provided trigger code and row data.
*
* @param string $functionName The name of the Python function to generate.
* @param string $pyCode The Python code to embed within the generated function.
* @param array $row The row data to pass to the generated function.
*
* @return string The complete Python code ready for sandbox execution.
*/
function generatePythonTriggerCode($functionName, $pyCode, $row) {
// Build constant definitions
$constants = '';
foreach (sql("SELECT Name, Type, Value FROM SYS_PRD_BND.Constants") as $const) {
switch ($const['Type']) {
case 'String':
$val = "'" . str_replace("'", "\\'", $const['Value']) . "'";
break;
case 'Json':
$val = 'json.loads(' . json_encode($const['Value']) . ')';
break;
default: // Int or Double
$val = $const['Value'];
}
$constants .= "{$const['Name']} = {$val}\n";
}
// Prepare imports
$imports = "import json\n" . getPythonImports();
// Prepare row data for Python
$rowJson = str_replace("'", "\\'", json_encode($row));
// Indent user-provided Python code
$indentedCode = implode("\n", array_map(fn($line) => ' ' . $line, explode("\n", $pyCode)));
// Assemble complete Python script
$pythonCode = <<<PY
$imports
$constants
def $functionName(data, error):
$indentedCode
data = json.loads('$rowJson')
error = None
$functionName(data, error)
print(json.dumps(data))
PY;
return $pythonCode;
}

View File

@ -0,0 +1,49 @@
<?php
/**
* Runs dynamically generated Python code in a sandboxed environment.
*
* @param string $code The Python code to execute.
* @param string &$stdout Captured standard output from the execution.
* @param string &$stderr Captured standard error from the execution.
*
* @return int Exit code of the executed Python script (0 means success).
*/
function runSandboxedPython($code, &$stdout = null, &$stderr = null) {
// Create a temporary file to hold the Python code
$tempFile = tempnam(sys_get_temp_dir(), 'sandboxed_') . '.py';
// Write the generated Python code to the temporary file
file_put_contents($tempFile, $code);
// Prepare the command for executing the Python code
$command = "/usr/bin/python3 " . escapeshellarg($tempFile);
// Descriptor spec to capture stdout and stderr
$descriptorspec = [
1 => ['pipe', 'w'], // stdout
2 => ['pipe', 'w'], // stderr
];
// Execute the Python code using proc_open
$process = proc_open($command, $descriptorspec, $pipes);
if (!is_resource($process)) {
unlink($tempFile);
throw new Exception('Failed to execute sandboxed Python code.');
}
// Capture stdout and stderr
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
// Get the exit code
$exitCode = proc_close($process);
// Cleanup temporary file
unlink($tempFile);
return $exitCode;
}