| 
#!/usr/bin/env php<?php
 error_reporting(E_ALL);
 ini_set("display_errors", "On");
 $opts = getopt("", [
 "host:",
 "port:",
 "dbname:",
 "unix_socket:",
 "charset:",
 "user:",
 "password:",
 "table:",
 "class:",
 "file:",
 "defaults:",
 "auto:",
 "config:",
 "noconfig",
 "yes",
 ]);
 
 $noConfig = isset($opts["noconfig"]);
 if ($noConfig) {
 $settings = [];
 } else {
 $configFileRelPath = $opts["config"] ?? ".tinyorm";
 if ("/" === $configFileRelPath[0]) {
 $configFileAbsPath = $configFileRelPath;
 } else {
 $configFileAbsPath = getcwd() . "/" . $configFileRelPath;
 }
 
 if (is_readable($configFileAbsPath)) {
 $settings = @json_decode(file_get_contents($configFileAbsPath), true) ?: [];
 } elseif (file_exists($configFileAbsPath)) {
 fwrite(STDERR, "Configuration file $configFileRelPath is not readable");
 exit(1);
 } else {
 $settings = [];
 }
 }
 
 $opts = ($opts ?: []) + $settings;
 
 $updatedSettings = array_intersect_key(
 $opts,
 [
 "host" => 1,
 "port" => 1,
 "dbname" => 1,
 "unix_socket" => 1,
 "charset" => 1,
 "user" => 1,
 "password" => 1,
 ]
 );
 
 $autoloads = [__DIR__ . "/../../../autoload.php", __DIR__ . "/../vendor/autoload.php"];
 $autoloadFound = false;
 foreach ($autoloads as $autoload) {
 if (is_file($autoload)) {
 include_once $autoload;
 $autoloadFound = true;
 break;
 }
 }
 
 if (!$autoloadFound) {
 echo "autoload.php not found! Searched:\n\t" . join("\n\t", $autoloads) . "\n";
 exit(1);
 }
 
 $generator = new \tinyorm\scaffold\EntityGenerator();
 $phpCode = $generator->setHost(@$opts["host"])
 ->setPort(@$opts["port"])
 ->setDbname(@$opts["dbname"])
 ->setUnixSocket(@$opts["unix_socket"])
 ->setCharset(@$opts["charset"])
 ->setUser(@$opts["user"])
 ->setPassword(@$opts["password"])
 ->setTable(@$opts["table"])
 ->setClass(@$opts["class"])
 ->setFile(@$opts["file"])
 ->setDefaults(@$opts["defaults"])
 ->setAuto(@$opts["auto"])
 ->generate();
 if (isset($opts["file"])) {
 if (!is_writable($opts["file"])) {
 echo "{$opts["file"]} is not writable\n";
 exit(1);
 }
 $fp = fopen($opts["file"], "w");
 } else {
 $fp = STDOUT;
 }
 fwrite($fp, $phpCode);
 
 if ($noConfig) {
 exit(0);
 }
 
 if ($updatedSettings != $settings) {
 $settingsJson = json_encode($updatedSettings);
 $silentUpdate = isset($opts["yes"]);
 if ($silentUpdate) {
 $overwriteConfig = true;
 } else {
 fwrite(STDERR, "\n\nUpdate settings with $settingsJson? Y/N [Y]\n");
 $answer = trim(fgets(STDIN));
 if (!trim($answer)) {
 $answer = "Y";
 }
 switch (strtolower($answer)) {
 case "y":
 case "yes":
 $overwriteConfig = true;
 break;
 default:
 $overwriteConfig = false;
 break;
 }
 }
 if ($overwriteConfig) {
 if (!file_put_contents($configFileAbsPath, $settingsJson)) {
 fwrite(STDERR, "$configFileRelPath is not writable\n");
 exit(1);
 }
 }
 }
 
 |