APIDatabaseError class for SQL error, which send debug info to slim\log
authorGu1 <gu1@aeroxteam.fr>
Sat, 29 Jun 2013 02:57:07 +0000 (04:57 +0200)
committerGu1 <gu1@aeroxteam.fr>
Sat, 29 Jun 2013 02:57:07 +0000 (04:57 +0200)
adherents.php
index.php
misc.php

index 8041668..3837561 100644 (file)
@@ -138,8 +138,10 @@ function adherent_populate($data, $adh=null) {
 
     if(array_key_exists('adhtype', $data)) {
         $typeid = adhtype_byname($data['adhtype']);
-        if(is_null($typeid) || $typeid < 1) {
+        if(is_null($typeid)) {
             $ex->addError(new APIInvalidParamError('adhtype', 'Invalid adherent type'));
+        } elseif($typeid < 1) {
+            throw new APIException(array(new APIDatabaseError('Could not fetch adherent type', $db)));
         }
         $data['adhtype_id']=$typeid;
     } else {
@@ -148,15 +150,19 @@ function adherent_populate($data, $adh=null) {
 
     if(array_key_exists('honorific', $data)) {
         $honorific = honorific_bycode($data['honorific']);
-        if(is_null($honorific) || $honorific < 1) {
+        if(is_null($honorific)) {
             $ex->addError(new APIInvalidParamError('honorific', 'Invalid honorific'));
+        } elseif($honorific < 1) {
+            throw new APIException(array(new APIDatabaseError('Could not fetch honorific', $db)));
         }
     }
 
     if(array_key_exists('country', $data)) {
         $countryid = country_byname($data['country']);
-        if(is_null($countryid) || $countryid < 1) {
+        if(is_null($countryid)) {
             $ex->addError(new APIInvalidParamError('country', 'Invalid country'));
+        } elseif($countryid < 1) {
+            throw new APIException(array(new APIDatabaseError('Could not fetch country', $db)));
         }
         $data['country_id']=$countryid;
     } else {
@@ -255,9 +261,9 @@ $app->options('/v1/adherents/:id/', add_allow('GET', 'HEAD', 'PATCH'), function(
 
 $app->get('/v1/adherents/:id/', function($id) use ($app, $db) {
     $adh=new Adherent($db);
-    $r=$adh->fetch((int)$id);
+    $r=$adh->fetch($id);
     if($r < 0) {
-        halt_error(500, new APIError('Adherent could not be fetched'));
+        halt_error(500, new APIDatabaseError('Adherent could not be fetched', $db));
     } elseif($r === 0) {
         halt_error(404, new APIObjectNotFoundError('Adherent not found'));
     }
@@ -284,7 +290,7 @@ $app->map('/v1/adherents/:id/', function($id) use ($app, $db) {
     $adh=new Adherent($db);
     $r=$adh->fetch((int)$id);
     if($r < 0) {
-        halt_error(500, new APIError('Adherent could not be fetched'));
+        halt_error(500, new APIDatabaseError('Adherent could not be fetched', $db));
     } elseif($r === 0) {
         halt_error(404, new APIObjectNotFoundError('Adherent not found'));
     }
@@ -300,15 +306,16 @@ $app->map('/v1/adherents/:id/', function($id) use ($app, $db) {
     }
 
     $ret=$adh->update(new User($db));
-    if($ret < 1 || is_null($ret)) {
-        //$adh->error
-        halt_error(500, new APIError('Adherent could not be updated'));
+    if($ret < 1) {
+        halt_error(500, new APIDatabaseError('Adherent could not be updated', $db, $adh->error, $ret));
     }
 
     $adh=new Adherent($db);
     $ret=$adh->fetch((int)$id);
-    if($ret < 1 || is_null($ret)) {
-        halt_error(500, new APIError('The created adherent could not be fetched back from database ?!'));
+    if($ret < 0) {
+        halt_error(500, new APIDatabaseError('The created adherent could not be fetched back from database', $db));
+    } elseif($r === 0) {
+        halt_error(500, new APIObjectNotFoundError('Adherent not found... but we just created it ?'));
     }
 
     $app->response()->status(201);
@@ -331,7 +338,7 @@ $app->post('/v1/adherents/', function() use ($app, $db) {
     $adh=new Adherent($db);
     $adh->fetch_login($data['login']);
     if($adh->error) {
-        halt_error(500, new APIError('Could not verify login uniqueness'));
+        halt_error(500, new APIDatabaseError('Could not verify login uniqueness', $db));
     } elseif($adh->id != NULL) {
         halt_error(409, new APIError('Login already taken'));
     }
@@ -353,20 +360,22 @@ $app->post('/v1/adherents/', function() use ($app, $db) {
     }
 
     $ret=$adh->create(new User($db));
-    if($ret < 1 || is_null($ret)) {
-        //$adh->error
-        halt_error(500, new APIError('Adherent could not be created'));
+    if($ret < 1) {
+        halt_error(500, new APIDatabaseError('Adherent could not be created', $db, $adh->error, $ret));
     }
 
     $rowid=$adh->id;
     $adh=new Adherent($db);
     $ret=$adh->fetch($rowid);
-    if($ret < 1 || is_null($ret)) {
-        halt_error(500, new APIError('The created adherent could not be fetched back from database ?!'));
+    if($ret < 1) {
+        halt_error(500, new APIDatabaseError('The created adherent could not be fetched back from database ?!', $db));
     }
 
     $soc=new Societe($db);
     $ret=$soc->create_from_member($adh, gen_thirdparty_name($adh));
+    if($ret < 1) {
+        halt_error(500, new APIDatabaseError('Unable to create a third-party linked to the adherent', $db, $adh->error, $ret));
+    }
 
     $app->response()->status(201);
     $app->lastModified($adh->datem);
@@ -386,7 +395,7 @@ $app->get('/v1/adherents/login/:login/', function($login) use ($app, $db) {
     $adh=new Adherent($db);
     $r=$adh->fetch_login($login);
     if($adh->error) {
-        halt_error(500, new APIError('Adherent could not be fetched'));
+        halt_error(500, new APIDatabaseError('Adherent could not be fetched', $db));
     } elseif($adh->id == NULL) {
         halt_error(404, new APIObjectNotFoundError('Adherent not found'));
     }
@@ -426,7 +435,7 @@ $app->get('/v1/adherents/types/', function() use ($app, $db) {
             $res[] = adherent_type_response($obj);
         }
     } else {
-        halt_error(500, new APIError('Adherent types could not be fetched'));
+        halt_error(500, new APIDatabaseError('Adherent types could not be fetched', $db));
     }
 
     $app->response()->body(
index 507a041..2b54ee1 100644 (file)
--- a/index.php
+++ b/index.php
@@ -16,6 +16,12 @@ require 'mediatypehandler.php';
 
 $app = new \Slim\Slim();
 
+$app->config('debug', true);
+
+$log = $app->getLog();
+$log->setEnabled(true);
+$log->setLevel(\Slim\Log::WARN);
+
 // automatically negociate content-type and decode data and encode response
 $app->add(new MediaTypeMiddleware());
 
@@ -119,6 +125,38 @@ class APIInvalidParamError extends APIError {
     }
 }
 
+class APIInternalError extends APIError {
+    const error='dolibarr.api.InternalError';
+    const error_code=1020;
+}
+
+class APIDatabaseError extends APIError {
+    const error='dolibarr.api.DatabaseError';
+    const error_code=1021;
+    public function __construct($message, $db, $error='', $code=0) {
+        global $log, $app;
+        $debug_mode=$app->config('debug');
+
+        $trace=(new Exception)->getTraceAsString();
+        $log->error("Database Error:\n".
+                    "\tclient: ".$app->request()->getIp()."\n".
+                    "\tpath: ".$app->request()->getPath()."\n".
+                    "\tdata: ".@json_encode($app->request()->getBody())."\n".
+                    "\terr msg: ".$message."\n".
+                    "\tinfo: error=\"".$error."\" code=".$code."\n".
+                    "\tsql error: ".$db->lasterrno.'; '.$db->lasterror."\n".
+                    "\tquery: ".$db->lastqueryerror."\n".
+                    "\ttrace:\n".preg_replace("/^#0 .*?\n/", '', $trace)."\n");
+
+        if($debug_mode)
+            parent::__construct($message, self::error, self::error_code);
+        else
+            /* Mask database errors on production... */
+            parent::__construct("", APIInternalError::error, APIInternalError::error_code);
+    }
+
+}
+
 
 function halt_error($status, $rest_error) {
     $app = \Slim\Slim::getInstance();
index 8a1baef..b933b23 100644 (file)
--- a/misc.php
+++ b/misc.php
@@ -29,7 +29,7 @@ $app->get('/v1/countries/', function() use ($app, $db) {
             );
         }
     } else {
-        halt_error(500, new APIError('Countries could not be fetched'));
+        halt_error(500, new APIDatabaseError('Countries could not be fetched', $db));
     }
 
     $app->response()->body(
@@ -91,7 +91,7 @@ $app->get('/v1/countries/:name/states/', function($name) use ($app, $db) {
             );
         }
     } else {
-        halt_error(500, new APIError('States could not be fetched'));
+        halt_error(500, new APIDatabaseError('States could not be fetched', $db));
     }
 
     $app->response()->body(
@@ -153,7 +153,7 @@ $app->get('/v1/honorifics/', function() use ($app, $db) {
             );
         }
     } else {
-        halt_error(500, new APIError('Honorifics could not be fetched'));
+        halt_error(500, new APIDatabaseError('Honorifics could not be fetched', $db));
     }
 
     $app->response()->body(