diff options
Diffstat (limited to 'srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/src/merge.php')
| -rw-r--r-- | srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/src/merge.php | 472 |
1 files changed, 472 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/src/merge.php b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/src/merge.php new file mode 100644 index 0000000..471cab1 --- /dev/null +++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/src/merge.php @@ -0,0 +1,472 @@ +<?php +declare(strict_types = 1); +$dataDir = __DIR__."/../data/"; +$files = glob("$dataDir*.json"); + +/** + * Compare 2 variables + * + * @param mixed $var1 First + * @param mixed $var2 Second + * @return bool + */ +function JSONcompare($var1, $var2): bool +{ + return json_encode($var1) === json_encode($var2); +} + +/** + * Fix key=range + * + * @param stdClass $current Current value + * @param stdClass $cache Cache value + * @return void + */ +function fixRange(stdClass &$current, stdClass &$cache): void +{ + global $newData, $key, $nbrConflictsSolved; + $currentHasFrom = isset($current->from); + $cacheHasFrom = isset($cache->from); + $currentHasTo = isset($current->to); + $cacheHasTo = isset($cache->to); + if ($currentHasFrom === false && $cacheHasFrom === true) { + $current->from = $cache->from; + if (JSONcompare($cache, $current)) { + $newData->$key = $current; + if (JSONcompare($current, $cache)) { + $nbrConflictsSolved++; + } else { + fixRange($current, $cache); + } + } + } elseif ($currentHasFrom === true && $cacheHasFrom === false) { + $cache->from = $current->from; + if (JSONcompare($cache, $current)) { + $newData->$key = $cache; + if (JSONcompare($current, $cache)) { + $nbrConflictsSolved++; + } else { + fixRange($current, $cache); + } + } + } elseif ($currentHasTo === false && $cacheHasTo === true) { + $current->to = $cache->to; + if (JSONcompare($cache, $current)) { + $newData->$key = $current; + if (JSONcompare($current, $cache)) { + $nbrConflictsSolved++; + } else { + fixRange($current, $cache); + } + } + } elseif ($currentHasTo === true && $cacheHasTo === false) { + $cache->to = $current->to; + if (JSONcompare($cache, $current)) { + $newData->$key = $cache; + if (JSONcompare($current, $cache)) { + $nbrConflictsSolved++; + } else { + fixRange($current, $cache); + } + } + } elseif (( $currentHasFrom === true && $currentHasFrom === true ) + && ( $cache->from === $current->from ) + ) { + $onlyFrom = new stdClass(); + $onlyFrom->from = $current->from; + $newData->$key = $onlyFrom; + $nbrConflictsSolved++; + echo '[WARN] conflict range to - '.json_encode($cache).' - '.json_encode($current).PHP_EOL; + } else { + echo '[ERROR] conflict range - '.json_encode($cache).' - '.json_encode($current).PHP_EOL; + } +} + +$variables = array(); + +$nbr = 0; +$nbrConflicts = 0; +$nbrConflictsSolved = 0; +foreach ($files as $file) { + $fileData = json_decode(file_get_contents($file)); + if (isset($fileData->data) === false) { + continue; + } else { + $data = $fileData->data; + } + + foreach ($data as $doc) { + $identifier = $doc->name; + if (isset($identifier)) { + if (isset($variables[$identifier]) === false) { + if (isset($doc->ids) === false) { + $doc->ids = array(); + } + $variables[$identifier] = $doc; + $kbEntry = new stdClass(); + $kbEntry->anchor = $doc->id; + $kbEntry->url = $fileData->url; + $doc->ids[] = $kbEntry; + unset($doc->id); + } else { + if (isset($doc->ids) === false) { + $doc->ids = array(); + } + $kbEntry = new stdClass(); + $kbEntry->anchor = $doc->id; + $kbEntry->url = $fileData->url; + $doc->ids[] = $kbEntry; + unset($doc->id); + //echo $identifier." duplicate ! in ".str_replace($dataDir, "", $file).PHP_EOL; + $newData = new stdClass(); + foreach ((array) $doc as $key => $val) { + if (isset($variables[$identifier]->$key)) { + $cacheValue = $variables[$identifier]->$key; + $docValue = $doc->$key; + if (( strtoupper(json_encode($cacheValue)) === strtoupper(json_encode($docValue))) + && ( json_encode($cacheValue) !== json_encode($docValue)) + ) { + $nbrConflicts++; + $nbrConflictsSolved++; + //echo 'upper conflict '.$key.' - '.json_encode($cacheValue).' - '.json_encode($docValue).PHP_EOL; + $docValue = strtoupper(json_encode($docValue)); + } elseif (json_encode($cacheValue) !== json_encode($docValue)) { + $nbrConflicts++; + if ($key === "type") { + $realTypes = array( + "string", + "boolean", + "integer", + "numeric", + "enumeration", + "set", + "directory name", + "file name", + "byte" + ); + if (in_array($cacheValue, $realTypes)// original + && in_array($docValue, $realTypes) === false// dupe + ) {//original type valid + echo 'original type valid : '.$cacheValue.PHP_EOL; + } elseif (in_array($cacheValue, $realTypes) === false// original + && in_array($docValue, $realTypes)// dupe + ) {// dupe type valid + $newData->$key = $docValue; + //echo 'dupe type valid : '.$docValue.PHP_EOL; + $nbrConflictsSolved++; + } else { + if (( json_encode($cacheValue) === '"numeric"' + && json_encode($docValue) === '"integer"') + || ( json_encode($cacheValue) === '"integer"' + && json_encode($docValue) === '"numeric"') + ) {// numeric vs integer + //echo "integer wins !".PHP_EOL; + $newData->$key = "integer"; + $nbrConflictsSolved++; + } else { + echo 'type conflict : '.json_encode($cacheValue).' - '.json_encode($docValue).PHP_EOL; + } + } + } elseif ($key === "ids") { + /*if (isset($newData->ids) === false) { + $newData->ids = array(); + }*/ + $newData->ids = array_merge($cacheValue, $docValue); + /*$source = array("_", "option-mysqld-", "sysvar-", ); + $destination = array("-", "",""); + if (// Replace prefix to see if same id + str_replace($source, $destination, $docValue) + === + str_replace($source, $destination, $cacheValue) + ) { + $newData->$key = str_replace($source, $destination, $docValue); + $nbrConflictsSolved++;// TODO: check if good idea + } else { + echo '[ERROR] conflict id : ' + .json_encode($cacheValue) + .' - ' + .json_encode($docValue) + .' - ' + .str_replace($source, $destination, $docValue) + .' - ' + .str_replace($source, $destination, $cacheValue) + .PHP_EOL; + }*/ + } elseif ($key === "default") { + $originalValues = array("on", "off", "ON", "OFF", "true", "false", "TRUE", "FALSE"); + $destinationValues = array("1", "0", "1", "0", "1", "0", "1", "0"); + $docValue = str_replace($originalValues, $destinationValues, $docValue); + $cacheValue = str_replace($originalValues, $destinationValues, $cacheValue); + if ($docValue === $cacheValue) { + $newData->$key = $docValue; + $nbrConflictsSolved++; + } else { + if (is_array($cacheValue) === false + && is_array($docValue) === false + ) { + if (floatval($cacheValue) === floatval($docValue)) { + $newData->$key = $docValue; + $nbrConflictsSolved++; + } else { + echo '[ERROR] conflict default, not array : '.json_encode($cacheValue).' - '.json_encode($docValue).PHP_EOL; + } + } else { + echo '[ERROR] conflict default : '.json_encode($cacheValue).' - '.json_encode($docValue).PHP_EOL; + } + } + } elseif ($key === "validValues") { + if (is_array($cacheValue) === false) { + $cacheValue = array($cacheValue); + } + if (is_array($docValue) === false) { + $docValue = array($docValue); + } + $intersecValidValues = array_intersect($docValue, $cacheValue); + if (count($intersecValidValues) === count($docValue) + && count($intersecValidValues) === count($cacheValue) + ) {// No variables were lost in process + $newData->$key = $intersecValidValues; + $nbrConflictsSolved++; + } elseif (array_values(array_diff($docValue, $cacheValue)) === array("32768","65536") + ) {// Missing translation (in bytes) for 32k and 64k + $intersecValidValues[] = "32768"; + $intersecValidValues[] = "65536"; + $newData->$key = array_values($intersecValidValues); + $nbrConflictsSolved++; + } elseif (strtoupper(json_encode(ksort($docValue))) === strtoupper(json_encode(ksort($cacheValue))) + ) {// uppercase / lowercase + ksort($cacheValue); + $newData->$key = json_decode(json_encode($cacheValue)); + $nbrConflictsSolved++; + } else { + echo '[ERROR] conflict validValues : ' + .json_encode($cacheValue) + .' - ' + .json_encode($docValue) + .' - ' + .json_encode($intersecValidValues) + .' - ' + .json_encode(array_values(array_diff($docValue, $cacheValue))).PHP_EOL; + } + } elseif ($key === "cli") { + $replaceSource = array("file", "dir_name", "-- ", "_"); + $replaceDest = array("path", "path", "--", "-"); + $replacedDocValue = str_replace($replaceSource, $replaceDest, $docValue); + $replacedCacheValue = str_replace($replaceSource, $replaceDest, $cacheValue); + if (str_replace($replaceSource, $replaceDest, $docValue) === str_replace($replaceSource, $replaceDest, $cacheValue) + ) {//Try replacements + $newData->$key = str_replace($replaceSource, $replaceDest, $docValue); + $nbrConflictsSolved++; + } elseif (str_replace("--", "", $docValue) === str_replace("--", "", $cacheValue) + ) {// Doc not well formated, missing -- before cli command + $newData->$key = "--".str_replace("--", "", $docValue); + $nbrConflictsSolved++; + } elseif (strlen(str_replace(str_replace("#", "", $docValue), "", $cacheValue)) !== strlen($cacheValue) + ) {// More precise doc, value hint, eg: --blablabla={0|1} + $newData->$key = $cacheValue; + $nbrConflictsSolved++; + } elseif (strlen( + str_replace( + str_replace( + array("#"), + array(""), + $replacedDocValue + ), "", $replacedCacheValue + ) + ) !== strlen($replacedCacheValue) + ) {// More precise doc, value hint, eg: --blablabla={0|1} using replaced values + $newData->$key = $replacedCacheValue; + $nbrConflictsSolved++; + } elseif (strlen( + str_replace( + str_replace( + array("#"), + array(""), + $replacedCacheValue + ), "", $replacedDocValue + ) + ) !== strlen($replacedDocValue) + ) {// More precise doc, value hint, eg: --blablabla={0|1} using replaced values, reversed: cache/doc + $newData->$key = $replacedDocValue; + $nbrConflictsSolved++; + } elseif (strlen(str_replace(str_replace(array("#"), array(""), $docValue), "", $cacheValue)) !== strlen($cacheValue) + ) {// More precise doc, value hint, eg: --blablabla={0|1} + $newData->$key = $cacheValue; + $nbrConflictsSolved++; + } elseif (strlen(str_replace($cacheValue, "", $docValue)) !== strlen($docValue) + ) {// contained in cache + $newData->$key = $docValue; + $nbrConflictsSolved++; + } elseif (strlen(str_replace($docValue, "", $cacheValue)) !== strlen($cacheValue) + ) {// contained in conflict + $newData->$key = $cacheValue; + $nbrConflictsSolved++; + } else { + echo '[ERROR] conflict cli : cacheValue: ' + .json_encode($cacheValue) + .' - docValue: ' + .json_encode($docValue) + .' - docValue: ' + .str_replace($replaceSource, $replaceDest, $docValue) + .' - cacheValue: ' + .str_replace($replaceSource, $replaceDest, $cacheValue) + .PHP_EOL; + } + } elseif ($key === "range") { + $current = $docValue; + $cache = $cacheValue; + fixRange($current, $cache); + } else { + echo '[ERROR] conflict '.$key.' + '.$identifier.' - '.json_encode($cacheValue).' - '.json_encode($docValue).PHP_EOL; + } + } else { + $newData->$key = $val; + } + } else { + $newData->$key = $val; + } + } + //print_r($newData); + $variables[$identifier] = $newData; + } + } + } + $nbr += count($data); +} +echo "NBR: ".$nbr.PHP_EOL; +echo "NBR_UNIQUE: ".count($variables).PHP_EOL; +echo "NBR_CONFLICTS: ".$nbrConflicts.PHP_EOL; +echo "NBR_CONFLICTS_SOLVED: ".$nbrConflictsSolved.PHP_EOL; +echo "NBR_CONFLICTS_REMAINING: ".($nbrConflicts - $nbrConflictsSolved).PHP_EOL; + +$fileOut = new stdClass(); +$fileOut->vars = json_decode(json_encode($variables)); +$fileOut->version = 1.0; + +$md = "# Variables and options".PHP_EOL; +foreach ($fileOut->vars as $id => $doc) { + //$md .= "## ".$doc->url.PHP_EOL; + $md .= "## ".$doc->name.PHP_EOL; + $md .= "|name|value|".PHP_EOL; + $md .= "|----|-----|".PHP_EOL; + if (isset($doc->name)) { + $md .= "|Name|`$doc->name`|".PHP_EOL; + } + if (isset($doc->cli)) { + $md .= "|Command line|`$doc->cli`|".PHP_EOL; + } + if (isset($doc->type)) { + $md .= "|Type of variable|`$doc->type`|".PHP_EOL; + } + if (isset($doc->scope)) { + $md .= "|Scope|`".implode("`, `", $doc->scope)."`|".PHP_EOL; + } + if (isset($doc->default)) { + $md .= "|Default value|`$doc->default`|".PHP_EOL; + } + if (isset($doc->dynamic)) { + $md .= "|Dynamic|`".( ($doc->dynamic) ? 'true' : 'false')."`|".PHP_EOL; + } + if (empty($doc->validValues) === false) { + $md .= "|Valid value(s)|`".implode("`, `", $doc->validValues)."`|".PHP_EOL; + } + if (isset($doc->range)) { + $r = ''; + if (isset($doc->range->from)) { + $r .= "from: `".$doc->range->from."`"; + } + + if (isset($doc->range->to)) { + if (isset($doc->range->from)) { + $r .= " "; + } + $r .= "to: `".$doc->range->to."`"; + } + $md .= "|Range|$r|".PHP_EOL; + } + $md .= PHP_EOL; + $md .= "### Documentation(s)".PHP_EOL; + $md .= "|source|anchor name|".PHP_EOL; + $md .= "|------|----|".PHP_EOL; + foreach ($doc->ids as &$kbEntry) { + $matchs = array(); + preg_match("/:\/\/([a-z.]+)/i", $kbEntry->url, $matchs); + $md .= "|$matchs[1]|[$kbEntry->anchor]($kbEntry->url#$kbEntry->anchor)|".PHP_EOL; + } + $md .= PHP_EOL; +} + +file_put_contents(__DIR__."/../dist/merged-raw.md", $md.PHP_EOL); + +file_put_contents(__DIR__."/../dist/merged-raw.json", json_encode($fileOut, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES).PHP_EOL); + +$fileOut->urls = array(); + +foreach ($fileOut->vars as $id => $doc) { + foreach ($doc->ids as &$kbEntry) { + $urlId = array_search($kbEntry->url, $fileOut->urls, true); + if ($urlId === false) { + $urlId = array_push($fileOut->urls, $kbEntry->url); + } + $kbEntry->url = $urlId; + $kbEntry = "$urlId#$kbEntry->anchor"; + } +} +$fileOut->version = 1.0; +file_put_contents(__DIR__."/../dist/merged-slim.json", json_encode($fileOut, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES).PHP_EOL); + +$fileOut->vars = json_decode(json_encode($variables)); +$fileOut->types = array( "MYSQL" => 1, "MARIADB" => 2 ); +$fileOut->varTypes = array( + "string" => 1, + "boolean" => 2, + "integer" => 3, + "numeric" => 4, + "enumeration" => 5, + "set" => 6, + "directory name" => 7, + "file name" => 8, + "byte" => 9 +); +foreach ($fileOut->vars as $id => &$doc) { + $data = new stdClass(); + if (isset($doc->dynamic)) { + $data->d = $doc->dynamic; + } + if (isset($doc->type)) { + $data->t = $fileOut->varTypes[$doc->type]; + } + $data->a = array(); + foreach ($doc->ids as &$kbEntry) { + $urlId = array_search($kbEntry->url, $fileOut->urls, true); + if ($urlId === false) { + $urlId = array_push($fileOut->urls, $kbEntry->url); + } + $kbEntryMin = new stdClass(); + $kbEntryMin->a = $kbEntry->anchor; + + $kbEntryMin->u = $urlId; + if (preg_match("/mysql\.com/", $kbEntry->url)) { + $kbEntryMin->t = $fileOut->types["MYSQL"]; + } elseif (preg_match("/mariadb\.com/", $kbEntry->url)) { + $kbEntryMin->t = $fileOut->types["MARIADB"]; + } + $data->a[] = $kbEntryMin; + } + $doc = $data; +} +$fileOut->types = array_flip($fileOut->types); +$fileOut->varTypes = array_flip($fileOut->varTypes); +$fileOut->version = 1.0; +file_put_contents(__DIR__."/../dist/merged-ultraslim.json", json_encode($fileOut, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES).PHP_EOL); + +$content = '<?php'.PHP_EOL.'$data = '.json_encode($fileOut, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES).';'.PHP_EOL; + +$content = str_replace( + array("{", "}", ":"), + array("[", "]", "=>"), + $content +); + +file_put_contents(__DIR__."/../dist/merged-ultraslim.php", $content); +echo "Files merged !".PHP_EOL; |
