"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

php: hilfe beim debuggen.

wergor 15.10.2014 - 12:38 2470 3
Posts

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: graz
Posts: 4028
um meinen unikalender in meiner owncloud aktuell zu halten, benutze ich ein skript von dieser quelle:
Code: PHP
<?php  
//Hier den Pfad zur Owncloud-Installation einfügen  
define('OWNCLOUD_DIR', '/var/www/html/owncloud');  
 
require_once(OWNCLOUD_DIR . '/lib/base.php');  
require_once(OWNCLOUD_DIR . '/apps/calendar/lib/import.php');  
require_once(OWNCLOUD_DIR . '/apps/calendar/lib/object.php');
require_once(OWNCLOUD_DIR . '/apps/calendar/lib/calendar.php');
require_once(OWNCLOUD_DIR . '/apps/calendar/lib/app.php');
 
/*  
* Hier die verschiedenen zu importierenden Feeds eintragen  
* userid:      Der Benutzername auf dessen Konto der Kalender importiert werden soll  
* displayname: Der Name des Kalenders in der Owncloud (muss vorher angelegt werden)  
* filename:    Die URL zum ICAL-Feed  
*/  
$Import = array( 
 
	//TUG Kalender
	array(
		"userid" => "mein username",
		"displayname" => "TUG",
		"filename" => "https://online.tugraz.at/tug_onlinej/ws/termin/ical?pStud=restvomlink"
	),
);
 
foreach($Import AS $cal)
{
	//Nachsehen ob der Kalender auf der Owncloud auch existiert
	try {
		$stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*clndr_calendars` WHERE `userid` = ? AND `displayname` = ?' );
		$result = $stmt->execute(array($cal["userid"], $cal["displayname"]));
		$row = $result->fetchRow();
		$calendar_id = $row['id'];
		if (!$calendar_id) {
			echo "No calendar for userid " . $cal["userid"] . " with displayname '" . $cal["displayname"] . "'";
		}
	} catch (Exception $e) {
		echo "DB exception: " . $e;
	}
 
	// Daten aus dem Feed laden
	$file = file_get_contents($cal["filename"]);
	if ($file === FALSE) {
		echo "Couldn't read file: ".$cal["filename"];
	}
 
	//Import durchführen
	$import = new OC_Calendar_Import($file);
 
	$import->setUserID($cal["userid"]);
	$import->setTimeZone(OC_Calendar_App::$tz);
	$import->setCalendarID($calendar_id);
	$import->setOverwrite(true);
 
	OC_User::setUserId($cal["userid"]);
 
	try {
		$import->import();
		$count = $import->getCount();
		echo "Imported ".$count." objects in Calendar ".$cal["displayname"]."(".$cal["userid"].")\n";
	} catch (Exception $e) {
		echo "Import failed: " . $e;
	}
}
?>

der code wird mit cron alle 20min ausgefährt. leider wirft mir der code in ca 3/4 der fälle folgenden fehler:
Code:
Import failed: exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 5 database is locked' in /var/www/html/owncloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Statement.php:138
Stack trace:
#0 /var/www/html/owncloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Statement.php(138): PDOStatement->execute(Array)
#1 /var/www/html/owncloud/lib/private/db/statementwrapper.php(63): Doctrine\DBAL\Statement->execute(Array)
#2 /var/www/html/owncloud/apps/calendar/lib/object.php(285): OC_DB_StatementWrapper->execute(Array)
#3 /var/www/html/owncloud/apps/calendar/lib/import.php(119): OC_Calendar_Object::delete('287')
#4 /storage/owncloud/icalFeedImport.php(60): OC_Calendar_Import->import()
#5 {main}

Next exception 'Doctrine\DBAL\DBALException' with message 'An exception occurred while executing 'DELETE FROM "oc_clndr_objects" WHERE "id" = ?':

SQLSTATE[HY000]: General error: 5 database is locked' in /var/www/html/owncloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:47
Stack trace:
#0 /var/www/html/owncloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Statement.php(140): Doctrine\DBAL\DBALException::driverExceptionDuringQuery(Object(PDOException), 'DELETE FROM "oc...', Array)
#1 /var/www/html/owncloud/lib/private/db/statementwrapper.php(63): Doctrine\DBAL\Statement->execute(Array)
#2 /var/www/html/owncloud/apps/calendar/lib/object.php(285): OC_DB_StatementWrapper->execute(Array)
#3 /var/www/html/owncloud/apps/calendar/lib/import.php(119): OC_Calendar_Object::delete('287')
#4 /storage/owncloud/icalFeedImport.php(60): OC_Calendar_Import->import()
#5 {main}

dadurch kommt es manchmal vor, dass viele der termine aus dem (owncloud) kalender gelöscht werden.

ich habe schon einen kommentar auf der seite hinterlassen, der wartet aber seit fast 10 tagen auf freischaltung. weis vielleicht einer von euch wie das problem zu lösen wäre?

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4260
Welche DB? Für mich klingt das nach einem DB-Problem.

edit: Google bietet viele Hits, wenn man nach dem Fehler (SQLSTATE[HY000]: General error: 5 database is locked) sucht.
Bearbeitet von kleinerChemiker am 15.10.2014, 13:25

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Das liegt daran, dass gerade eine Doctrine-Transaction offen ist.
Am einfachsten wird es sein, den Doctrine-Querybuilder einzubinden und die Statements dann über diesen (mit Transaktion) laufen zu lassen.

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: graz
Posts: 4028
Zitat von Obermotz
Das liegt daran, dass gerade eine Doctrine-Transaction offen ist.
Am einfachsten wird es sein, den Doctrine-Querybuilder einzubinden und die Statements dann über diesen (mit Transaktion) laufen zu lassen.
danke für den tipp.
passiert das nur wenn beim starten des skripts schon eine doctrine-transaction läuft oder kann eine transaction auch während des importvorgangs starten?
ich habe leider noch nie was mit php gemacht, könnte also länger dauern bis das gelöst ist :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz