146 lines
4.2 KiB
PHP
146 lines
4.2 KiB
PHP
#!/usr/bin/php
|
||
<?php
|
||
|
||
/*
|
||
This program is free software: you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation, either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
define('N',"\n");
|
||
define('SNAME',basename(__FILE__));
|
||
define('CONFIGFP',__DIR__.'/../../conf/mustard.ini');
|
||
|
||
$help='SYNOPSYS
|
||
'.SNAME.' [options]
|
||
DESCRIPTION
|
||
This is a script to fix and group same languages lang codes in the
|
||
«Languages» table.
|
||
OPTIONS
|
||
-h, --help
|
||
Show this help text and exit.'.N;
|
||
|
||
for ($i=1; $i<$argc; $i++) {
|
||
if ($argv[$i]=='-h' || $argv[$i]=='--help') {
|
||
mexit($help,0);
|
||
} else {
|
||
mexit('Don’t know how to interpret «'.$argv[$i].'», please read the help text using «-h» or «--help» option.'.N,1);
|
||
}
|
||
}
|
||
|
||
use function mysqli_real_escape_string as myesc;
|
||
|
||
$iniarr=@parse_ini_file(CONFIGFP)
|
||
or mexit('Could not open config file «'.CONFIGFP.'».'.N,1);
|
||
|
||
try { $link=@mysqli_connect($iniarr['db_host'],$iniarr['db_admin_name'],$iniarr['db_admin_password'],$iniarr['db_name'],$iniarr['db_port'],$iniarr['db_socket']); }
|
||
catch (Exception $error) { mexit('could not connect to MySQL server: '.mysqli_connect_error().'.'.N,1,true); }
|
||
// for php versions < 8
|
||
if ($link===false) mexit('could not connect to MySQL server: '.mysqli_connect_error().'.'.N,1,true);
|
||
try { $res=mysqli_set_charset($link,'utf8mb4'); }
|
||
catch (Exception $error) { mexit('could not set «utf8mb4» charset for MySQL: '.mysqli_error($link).'.'.N,1,true); }
|
||
// for php versions < 8
|
||
if ($res===false) mexit('could not set MySQL charset: '.mysqli_errno($link).': '.mysqli_error($link).'.'.N,1,true);
|
||
|
||
|
||
$langs=[];
|
||
$wlangs=[];
|
||
$res=myq($link,'SELECT * FROM Languages');
|
||
while ($row=mysqli_fetch_assoc($res)) {
|
||
$langs[]=$row;
|
||
if (locale_canonicalize($row['Code'])!=$row['Code'])
|
||
$wlangs[]=$row;
|
||
}
|
||
|
||
print_r($langs);
|
||
|
||
print_r($wlangs);
|
||
|
||
foreach ($wlangs as $wlang) {
|
||
$oklang=getoklangid($wlang['Code'],$langs);
|
||
if ($oklang!==false) {
|
||
echo('Substituting all records with LangID = '.$wlang['ID'].' ('.$wlang['Code'].') with LangID = '.$oklang['ID'].' ('.$oklang['Code'].') in tables InstLangs and InstOurLangs.'.N);
|
||
myq($link,'UPDATE InstLangs SET LangID='.$oklang['ID'].' WHERE LangID='.$wlang['ID']);
|
||
myq($link,'UPDATE InstOurLangs SET OurLangID='.$oklang['ID'].' WHERE OurLangID='.$wlang['ID']);
|
||
myq($link,'DELETE FROM Languages WHERE ID='.$wlang['ID']);
|
||
} else {
|
||
echo('Languages.ID = '.$wlang['ID'].N);
|
||
myq($link,'UPDATE InstLangs SET LangID=112 WHERE LangID='.$wlang['ID']);
|
||
myq($link,'UPDATE InstOurLangs SET OurLangID=112 WHERE OurLangID='.$wlang['ID']);
|
||
myq($link,'DELETE FROM Languages WHERE ID='.$wlang['ID']);
|
||
}
|
||
}
|
||
|
||
mysqli_close($link);
|
||
exit(0);
|
||
|
||
|
||
// functions
|
||
|
||
function getoklangid($code,&$langs) {
|
||
$cancode=locale_canonicalize($code);
|
||
echo('Canonicalized form for «'.$code.'» is «'.$cancode.'».'.N);
|
||
$oklang=null;
|
||
foreach ($langs as $lang)
|
||
if ($lang['Code']==$cancode) {
|
||
$oklang=$lang;
|
||
break;
|
||
}
|
||
if (is_null($oklang)) {
|
||
echo('[!!!] Could not find a Languages record with Code = '.$cancode.'.'.N);
|
||
return(false);
|
||
} else {
|
||
return($oklang);
|
||
}
|
||
}
|
||
|
||
function myq(&$l,$q) {
|
||
try {
|
||
$res=mysqli_query($l,$q);
|
||
}
|
||
catch (Exception $e) {
|
||
echo('query «'.$q.'» failed: '.$e->getMessage().' (error code: '.$e->getCode().').'.N);
|
||
exit(3);
|
||
}
|
||
if ($res===false) {
|
||
echo('query «'.$q.'» failed: '.mysqli_errno($l).': '.mysqli_error($l).'.'.N);
|
||
exit(3);
|
||
}
|
||
return($res);
|
||
}
|
||
|
||
function mexit($msg,$code) {
|
||
global $link;
|
||
if (isset($link) && $link!==false) mysqli_close($link);
|
||
if ($code>0)
|
||
fwrite(STDERR,$msg);
|
||
else
|
||
echo($msg);
|
||
exit($code);
|
||
}
|
||
|
||
function utstd($val) {
|
||
if (is_null($val)) return(null);
|
||
$val=round($val);
|
||
return(date('Y-m-d H:i:s',$val));
|
||
}
|
||
|
||
function pr($val) {
|
||
if (is_null($val)) return('NULL');
|
||
return($val);
|
||
}
|
||
|
||
function eecho($msg) {
|
||
echo($msg);
|
||
}
|
||
|
||
?>
|