[commits] [Wiki] created: ConvertSerializedDataToUTF8
Wiki Guest
wikiguest at horde.org
Fri Nov 20 16:30:21 UTC 2015
guest [134.2.22.132] Fri, 20 Nov 2015 16:30:21 +0000
Created page: http://wiki.horde.org/ConvertSerializedDataToUTF8
<code>
#!/usr/bin/php
# Copyright: 2015 Michael Menge michael.menge(at)uni-tuebingen(dot)de
# http://www.gnu.org/licenses/gpl
<?php
// if you get postgres-errors:
// ALTER TABLE horde_alarms DROP zdv_encoding_id;
// DROP SEQUENCE zdv_encoding_horde_<tablename>_seq;
define('LOG_LEVEL', LOG_INFO);
$errors = array(LOG_ERR=>0, LOG_WARNING=>0, LOG_NOTICE=>0,
LOG_INFO=>0, LOG_DEBUG=>0);
function printLog ($level, $string) {
global $errors;
$errors[$level]++;
if ($level <= LOG_LEVEL) {
echo $string;
}
}
$ar=array("horde_alarms"=>array("cols" =>
array("alarm_internal","alarm_methods","alarm_params")),
"turba_objects"=>array("key" => "object_id", "cols" =>
array("object_members")),
"turba_shares"=>array("key" => "share_id", "cols" =>
array("attribute_params")),
"kronolith_events"=>array("key" => "event_id", "cols" =>
array("event_attendees")),
"ingo_rules"=>array("key" => "rule_id", "cols" => array("rule_conditions")),
"horde_histories"=>array("key"=>"history_id", "cols" =>
array("history_extra")),
"horde_prefs"=>array("cols" => array("pref_value")));
printLog(LOG_INFO, mb_internal_encoding()."\n");
mb_internal_encoding("UTF-8");
printLog(LOG_INFO, mb_internal_encoding()."\n");
$starttime = time();
$horde_db="host=HOSTNAME dbname=horde user=horde password=XXXXX";
$dbconn = pg_connect($horde_db)
or die('Verbindungsaufbau fehlgeschlagen: ' . pg_last_error());
foreach ($ar as $table=>$tabledata) {
$tablekey="";
if (!isset($tabledata["key"])) {
$query="CREATE SEQUENCE zdv_encoding_".$table."_seq; ";
$query.="ALTER TABLE ".$table." ADD COLUMN zdv_encoding_id
INTEGER NOT NULL DEFAULT nextval('zdv_encoding_".$table."_seq'); ";
$query.="CREATE UNIQUE INDEX zdv_encoding_id_idx ON
".$table." (zdv_encoding_id);";
printLog(LOG_NOTICE, "Sec: ".(time()-$starttime).": before
ALTER TABLE $table ADD index COLUMN\n");
$result = pg_query($query) or die('Abfrage fehlgeschlagen: '
. pg_last_error());
printLog(LOG_NOTICE, "Sec: ".(time()-$starttime).": after
ALTER TABLE $table ADD index COLUMN\n");
$tablekey="zdv_encoding_id";
} else {
printLog(LOG_NOTICE, "Sec: ".(time()-$starttime).": key vorhanden\n");
$tablekey=$tabledata["key"];
}
if (isset($tabledata["cols"])) {
$cols=$tabledata["cols"];
foreach ($cols as $col) {
$convert_error=0;
$convert_failed=0;
$convert_converted=0;
$convert_already=0;
$convert_ascii=0;
$my_stmname="my_update_".$table."_".$col;
pg_prepare($my_stmname, "UPDATE ".$table." SET
".$col."=$1 WHERE ".$tablekey."=$2");
$query = "SELECT ".$tablekey.", ".$col." FROM ".$table."
where ".$col." like 'a:%:{%';";
$result = pg_query($query) or die('Abfrage
fehlgeschlagen: ' . pg_last_error());
printLog(LOG_NOTICE, "Sec: ".(time()-$starttime).":
before UPDATE $table:$col\n");
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$value=$line[$col];
$id=$line[$tablekey];
if (!mb_check_encoding($value,"ASCII")) {
$changed_value = mb_convert_encoding ( $value ,
"ISO-8859-15");
$unserial_value=@unserialize($changed_value);
if ($unserial_value != FALSE) {
mb_convert_variables("UTF-8", "ISO-8859-15",
$unserial_value);
$converted_value=serialize($unserial_value);
printLog(LOG_INFO, "Convert $table:$col ID=$id\n");
printLog(LOG_DEBUG, "FROM=$value
TO=$converted_value\n");
$up_result = pg_execute($dbconn, $my_stmname,
array($converted_value, $id));
if (!$up_result) {
printLog(LOG_ERR, "ERROR WITH QUERY: $query\n");
$convert_error++;
} else {
$convert_converted++;
}
} else {
$unserial_value=@unserialize($value);
if ($unserial_value == FALSE) {
printLog(LOG_ERR, "FAILED: Unserialize
ISO and UTF-8 $table:$col VALUE=$value\n");
$convert_failed++;
} else {
printLog(LOG_INFO, "ALREADY Converted:
$table:$col ID=$id\n");
printLog(LOG_DEBUG, "VALUE=$value\n");
$convert_already++;
}
}
} else {
printLog(LOG_DEBUG, "ASCII only $table:$col ID=$id\n");
$convert_ascii++;
}
}
printLog(LOG_NOTICE, "--------\nConverted :
$convert_converted\nASCII : $convert_ascii\nAlready con :
$convert_already\nFailed : $convert_failed\nFehler :
$convert_error\n");
printLog(LOG_NOTICE, "Sec: ".(time()-$starttime).": after
UPDATE $table:$col\n");
}
} else {
printLog(LOG_WARNING, "No Cols for Table $table found\n");
}
if (!isset($tabledata["key"])) {
$query="DROP INDEX zdv_encoding_id_idx; ";
$query.="ALTER TABLE ".$table." DROP COLUMN zdv_encoding_id; ";
$query.="DROP SEQUENCE zdv_encoding_".$table."_seq; ";
printLog(LOG_NOTICE, "Sec: ".(time()-$starttime).": before
ALTER TABLE $table DROP COLUMN\n");
$result = pg_query($query) or die('Abfrage fehlgeschlagen: '
. pg_last_error());
printLog(LOG_NOTICE, "Sec: ".(time()-$starttime).": after
ALTER TABLE $table DROP COLUMN\n");
}
}
printLog(LOG_NOTICE, "Sec: ".(time()-$starttime).": after Convert\n");
printLog(LOG_NOTICE, "Errors: ".$errors[LOG_ERR]."\nWarning:
".$errors[LOG_WARNING]."\n");
?>
</code>
More information about the commits
mailing list