RPA Toolkit
added error handling.
authorMartin Stoilov <martin@rpasearch.com>
Sun, 19 Jun 2011 06:09:55 +0000 (23:09 -0700)
committerMartin Stoilov <martin@rpasearch.com>
Sun, 19 Jun 2011 06:09:55 +0000 (23:09 -0700)
phpext/prpa/php_prpa.h
phpext/prpa/prpa.c
phpext/prpa/tests/009.phpt

index 7d5b5e9..a3c08bf 100644 (file)
@@ -53,11 +53,14 @@ PHP_FUNCTION(rpa_dbex_first);
 PHP_FUNCTION(rpa_dbex_last);
 PHP_FUNCTION(rpa_dbex_cfgset);
 PHP_FUNCTION(rpa_dbex_dumpproductions);
+PHP_FUNCTION(rpa_dbex_error);
 
 PHP_FUNCTION(rpa_stat_create);
 PHP_FUNCTION(rpa_stat_scan);
 PHP_FUNCTION(rpa_stat_match);
 PHP_FUNCTION(rpa_stat_parse);
+PHP_FUNCTION(rpa_stat_error);
+
 
 #if 0
 PHP_FUNCTION(rpa_records_create);
index af55283..3868b3c 100644 (file)
@@ -98,10 +98,12 @@ zend_function_entry prpa_functions[] = {
     PHP_FE(rpa_dbex_last, NULL)
     PHP_FE(rpa_dbex_cfgset, NULL)
     PHP_FE(rpa_dbex_dumpproductions, NULL)
+    PHP_FE(rpa_dbex_error, NULL)
     PHP_FE(rpa_stat_create, NULL)
     PHP_FE(rpa_stat_match, NULL)
     PHP_FE(rpa_stat_scan, NULL)
     PHP_FE(rpa_stat_parse, NULL)
+    PHP_FE(rpa_stat_error, NULL)
 
 
 #if 0
@@ -522,6 +524,134 @@ PHP_FUNCTION(rpa_dbex_cfgset)
 }
 
 
+static rchar *dbexmsg[] = {
+       "OK",
+       "Out of memory",
+       "Invalid input.",
+       "Expression database is not open.",
+       "Expression database is not closed.",
+       "Expression name is not found.",
+       "Syntax error.",
+       "Unresolved expression name.",
+       "Invalid parameter.",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+};
+
+
+static rchar *statmsg[] = {
+       "OK",
+       "Execution error.",
+       "Execution aborted by user.",
+       "Aborted on expression.",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+};
+
+
+static void rpa_dbex_getdbexerrorstr(rpadbex_t *dbex, char *buffer, size_t size)
+{
+       long n = 0;
+       char *ptr = buffer;
+       rpa_errinfo_t errorinfo;
+
+       memset(&errorinfo, 0, sizeof(errorinfo));
+    rpa_dbex_lasterrorinfo(dbex, &errorinfo);
+
+    if (errorinfo.mask & RPA_ERRINFO_CODE) {
+        n += snprintf(ptr + n, size - n, "%s Code: %ld. ", dbexmsg[errorinfo.code - 1000], errorinfo.code);
+    }
+    if (errorinfo.mask & RPA_ERRINFO_LINE) {
+        n += snprintf(ptr + n, size - n, "Line: %ld. ", errorinfo.line);
+    }
+    if (errorinfo.mask & RPA_ERRINFO_OFFSET) {
+        n += snprintf(ptr + n, size - n, "Offset: %ld. ", errorinfo.offset);
+    }
+    if (errorinfo.mask & RPA_ERRINFO_RULEID) {
+        n += snprintf(ptr + n, size - n, "RuleId: %ld. ", errorinfo.ruleid);
+    }
+    if (errorinfo.mask & RPA_ERRINFO_NAME) {
+        n += snprintf(ptr + n, size - n, "Name: %s. ", errorinfo.name);
+    }
+
+}
+
+
+PHP_FUNCTION(rpa_dbex_error)
+{
+       zval *zres;
+       char buffer[2000];
+    php_rpa_dbex *pPhpDbex;
+
+       memset(buffer, 0, sizeof(buffer));
+    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zres) == FAILURE) {
+               RETURN_LONG(-1);
+    }
+
+    ZEND_FETCH_RESOURCE(pPhpDbex, php_rpa_dbex*, &zres, -1, PHP_RPA_DBEX_RES_NAME, le_rpa_dbex);
+    rpa_dbex_getdbexerrorstr(pPhpDbex->hDbex, buffer, sizeof(buffer));
+
+       RETURN_STRING(buffer, 1);
+}
+
+
+static void rpa_dbex_getstaterrorstr(rpastat_t *stat, char *buffer, size_t size)
+{
+       long n = 0;
+       char *ptr = buffer;
+       rpa_errinfo_t errorinfo;
+
+       memset(&errorinfo, 0, sizeof(errorinfo));
+    rpa_stat_lasterrorinfo(stat, &errorinfo);
+
+    if (errorinfo.mask & RPA_ERRINFO_CODE) {
+        n += snprintf(ptr + n, size - n, "%s Code: %ld. ", dbexmsg[errorinfo.code - 2000], errorinfo.code);
+    }
+    if (errorinfo.mask & RPA_ERRINFO_LINE) {
+        n += snprintf(ptr + n, size - n, "Line: %ld. ", errorinfo.line);
+    }
+    if (errorinfo.mask & RPA_ERRINFO_OFFSET) {
+        n += snprintf(ptr + n, size - n, "Offset: %ld. ", errorinfo.offset);
+    }
+    if (errorinfo.mask & RPA_ERRINFO_RULEID) {
+        n += snprintf(ptr + n, size - n, "RuleId: %ld. ", errorinfo.ruleid);
+    }
+    if (errorinfo.mask & RPA_ERRINFO_NAME) {
+        n += snprintf(ptr + n, size - n, "Name: %s. ", errorinfo.name);
+    }
+
+}
+
+
+PHP_FUNCTION(rpa_stat_error)
+{
+       zval *zres;
+       char buffer[2000];
+    php_rpa_stat *phpstat;
+
+       memset(buffer, 0, sizeof(buffer));
+    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zres) == FAILURE) {
+               RETURN_LONG(-1);
+    }
+
+    ZEND_FETCH_RESOURCE(phpstat, php_rpa_stat*, &zres, -1, PHP_RPA_STAT_RES_NAME, le_rpa_stat);
+    rpa_stat_geterrorstr(phpstat->stat, buffer, sizeof(buffer));
+
+       RETURN_STRING(buffer, 1);
+}
+
+
 PHP_FUNCTION(rpa_stat_create)
 {
        zval *zres;
index d10ec45..6f817c3 100644 (file)
@@ -7,16 +7,24 @@ rpa_dbex_parse($hDbex, $pattern, $myname)
        $hDbex = rpa_dbex_create();
        $records = 0;
        rpa_dbex_open($hDbex);
-       rpa_dbex_load($hDbex, "#!emitid first 1");
-       rpa_dbex_load($hDbex, "#!emitid last 2");
-       rpa_dbex_load($hDbex, "#!emitid name 3");       
-       rpa_dbex_load($hDbex, "first ::= [a-z]+");      
-       rpa_dbex_load($hDbex, "last ::= [a-z]+");       
-       rpa_dbex_load($hDbex, "name ::= <first> ' '+ <last>");  
+
+       $bnf = "#!emitid first 1\n" .
+       "#!emitid last 2\n" .
+       "#!emitid name 3\n" .
+       "first ::= [a-z]+\n" .
+       "last ::= [a-z]+\n" .
+       "name ::= <first> ' '+ <last>\n";
+       if (rpa_dbex_load($hDbex, $bnf) < 0) {
+               echo("rpa_dbex_load failed.\n");
+               echo(rpa_dbex_error($hDbex) . "\n");
+       }
        
-       rpa_dbex_close($hDbex);
+//     rpa_dbex_close($hDbex);
        rpa_dbex_compile($hDbex);
        $pattern = rpa_dbex_lookup($hDbex, "name");
+       if ($pattern == -1) {
+               die(rpa_dbex_error($hDbex). "\n");
+       }
        $myname = "Kosko Stoilov";
        $stat = rpa_stat_create($hDbex, 0);