#!/usr/bin/php . */ 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); } ?>