Email sent in asynchronous mode (established the base for an application internal CRON, task queue, etc.) with adjustable configuration (disable by default). Also improved the OQL: IS_NULL() and REGEXP have been added.

SVN:trunk[1132]
This commit is contained in:
Romain Quetiez
2011-03-18 11:15:09 +00:00
parent 7989cf622f
commit b8b20f82d7
13 changed files with 840 additions and 557 deletions

View File

@@ -24,6 +24,7 @@
*/
require_once(APPROOT.'/core/asynctask.class.inc.php');
require_once(APPROOT.'/core/email.class.inc.php');
/**
@@ -219,120 +220,82 @@ class ActionEmail extends ActionNotification
public function DoExecute($oTrigger, $aContextArgs)
{
$this->m_iRecipients = 0;
$this->m_aMailErrors = array();
$bRes = false; // until we do succeed in sending the email
try
{
// Determine recicipients
//
$sTo = $this->FindRecipients('to', $aContextArgs);
$sCC = $this->FindRecipients('cc', $aContextArgs);
$sBCC = $this->FindRecipients('bcc', $aContextArgs);
$sFrom = $this->Get('from');
$sReplyTo = $this->Get('reply_to');
$sSubject = MetaModel::ApplyParams($this->Get('subject'), $aContextArgs);
$sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs);
$oObj = $aContextArgs['this->object()'];
$sServerIP = $_SERVER['SERVER_ADDR']; //gethostbyname(gethostname());
$sReference = '<iTop/'.get_class($oObj).'/'.$oObj->GetKey().'@'.$sServerIP.'>';
$oEmail = new EMail();
if ($this->IsBeingTested())
{
$oEmail->SetSubject('TEST['.$sSubject.']');
$sTestBody = $sBody;
$sTestBody .= "<div style=\"border: dashed;\">\n";
$sTestBody .= "<h1>Testing email notification ".$this->GetHyperlink()."</h1>\n";
$sTestBody .= "<p>The email should be sent with the following properties\n";
$sTestBody .= "<ul>\n";
$sTestBody .= "<li>TO: $sTo</li>\n";
$sTestBody .= "<li>CC: $sCC</li>\n";
$sTestBody .= "<li>BCC: $sBCC</li>\n";
$sTestBody .= "<li>From: $sFrom</li>\n";
$sTestBody .= "<li>Reply-To: $sReplyTo</li>\n";
$sTestBody .= "<li>References: $sReference</li>\n";
$sTestBody .= "</ul>\n";
$sTestBody .= "</p>\n";
$sTestBody .= "</div>\n";
$oEmail->SetBody($sTestBody);
$oEmail->SetRecipientTO($this->Get('test_recipient'));
$oEmail->SetRecipientFrom($this->Get('test_recipient'));
$oEmail->SetReferences($sReference);
}
else
{
$oEmail->SetSubject($sSubject);
$oEmail->SetBody($sBody);
$oEmail->SetRecipientTO($sTo);
$oEmail->SetRecipientCC($sCC);
$oEmail->SetRecipientBCC($sBCC);
$oEmail->SetRecipientFrom($sFrom);
$oEmail->SetRecipientReplyTo($sReplyTo);
$oEmail->SetReferences($sReference);
}
if (empty($this->m_aMailErrors))
{
if ($this->m_iRecipients == 0)
{
$this->m_aMailErrors[] = 'No recipient';
}
else
{
$oKPI = new ExecutionKPI();
$this->m_aMailErrors = array_merge($this->m_aMailErrors, $oEmail->Send());
$oKPI->ComputeStats('Send mail', $sTo);
}
}
}
catch (Exception $e)
{
$this->m_aMailErrors[] = $e->getMessage();
}
if (MetaModel::IsLogEnabledNotification())
{
$oLog = new EventNotificationEmail();
if (empty($this->m_aMailErrors))
if ($this->IsBeingTested())
{
if ($this->IsBeingTested())
{
$oLog->Set('message', 'TEST - Notification sent ('.$this->Get('test_recipient').')');
}
else
{
$oLog->Set('message', 'Notification sent');
}
$oLog->Set('message', 'TEST - Notification sent ('.$this->Get('test_recipient').')');
}
else
{
if (is_array($this->m_aMailErrors) && count($this->m_aMailErrors) > 0)
{
$sError = implode(', ', $this->m_aMailErrors);
}
else
{
$sError = 'Unknown reason';
}
if ($this->IsBeingTested())
{
$oLog->Set('message', 'TEST - Notification was not sent: '.$sError);
}
else
{
$oLog->Set('message', 'Notification was not sent: '.$sError);
}
$oLog->Set('message', 'Notification pending');
}
$oLog->Set('userinfo', UserRights::GetUser());
$oLog->Set('trigger_id', $oTrigger->GetKey());
$oLog->Set('action_id', $this->GetKey());
$oLog->Set('object_id', $aContextArgs['this->object()']->GetKey());
// Must be inserted now so that it gets a valid id that will make the link
// between an eventual asynchronous task (queued) and the log
$oLog->DBInsertNoReload();
}
else
{
$oLog = null;
}
try
{
$sRes = $this->_DoExecute($oTrigger, $aContextArgs, $oLog);
if ($this->IsBeingTested())
{
$sPrefix = 'TEST ('.$this->Get('test_recipient').') - ';
}
else
{
$sPrefix = '';
}
$oLog->Set('message', $sPrefix.$sRes);
}
catch (Exception $e)
{
if ($oLog)
{
$oLog->Set('message', 'Error: '.$e->getMessage());
}
}
if ($oLog)
{
$oLog->DBUpdate();
}
}
protected function _DoExecute($oTrigger, $aContextArgs, &$oLog)
{
$this->m_iRecipients = 0;
$this->m_aMailErrors = array();
$bRes = false; // until we do succeed in sending the email
// Determine recicipients
//
$sTo = $this->FindRecipients('to', $aContextArgs);
$sCC = $this->FindRecipients('cc', $aContextArgs);
$sBCC = $this->FindRecipients('bcc', $aContextArgs);
$sFrom = $this->Get('from');
$sReplyTo = $this->Get('reply_to');
$sSubject = MetaModel::ApplyParams($this->Get('subject'), $aContextArgs);
$sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs);
$oObj = $aContextArgs['this->object()'];
$sServerIP = $_SERVER['SERVER_ADDR']; //gethostbyname(gethostname());
$sReference = '<iTop/'.get_class($oObj).'/'.$oObj->GetKey().'@'.$sServerIP.'>';
if (!is_null($oLog))
{
// Note: we have to secure this because those values are calculated
// inside the try statement, and we would like to keep track of as
// many data as we could while some variables may still be undefined
@@ -342,7 +305,77 @@ class ActionEmail extends ActionNotification
if (isset($sFrom)) $oLog->Set('from', $sFrom);
if (isset($sSubject)) $oLog->Set('subject', $sSubject);
if (isset($sBody)) $oLog->Set('body', $sBody);
$oLog->DBInsertNoReload();
}
$oEmail = new EMail();
if ($this->IsBeingTested())
{
$oEmail->SetSubject('TEST['.$sSubject.']');
$sTestBody = $sBody;
$sTestBody .= "<div style=\"border: dashed;\">\n";
$sTestBody .= "<h1>Testing email notification ".$this->GetHyperlink()."</h1>\n";
$sTestBody .= "<p>The email should be sent with the following properties\n";
$sTestBody .= "<ul>\n";
$sTestBody .= "<li>TO: $sTo</li>\n";
$sTestBody .= "<li>CC: $sCC</li>\n";
$sTestBody .= "<li>BCC: $sBCC</li>\n";
$sTestBody .= "<li>From: $sFrom</li>\n";
$sTestBody .= "<li>Reply-To: $sReplyTo</li>\n";
$sTestBody .= "<li>References: $sReference</li>\n";
$sTestBody .= "</ul>\n";
$sTestBody .= "</p>\n";
$sTestBody .= "</div>\n";
$oEmail->SetBody($sTestBody);
$oEmail->SetRecipientTO($this->Get('test_recipient'));
$oEmail->SetRecipientFrom($this->Get('test_recipient'));
$oEmail->SetReferences($sReference);
}
else
{
$oEmail->SetSubject($sSubject);
$oEmail->SetBody($sBody);
$oEmail->SetRecipientTO($sTo);
$oEmail->SetRecipientCC($sCC);
$oEmail->SetRecipientBCC($sBCC);
$oEmail->SetRecipientFrom($sFrom);
$oEmail->SetRecipientReplyTo($sReplyTo);
$oEmail->SetReferences($sReference);
}
if (empty($this->m_aMailErrors))
{
if ($this->m_iRecipients == 0)
{
return 'No recipient';
}
else
{
$iRes = $oEmail->Send($aErrors, false, $oLog); // allow asynchronous mode
switch ($iRes)
{
case EMAIL_SEND_OK:
return "Sent";
case EMAIL_SEND_PENDING:
return "Pending";
case EMAIL_SEND_ERROR:
return "Errors: ".implode(', ', $aErrors);
}
}
}
else
{
if (is_array($this->m_aMailErrors) && count($this->m_aMailErrors) > 0)
{
$sError = implode(', ', $this->m_aMailErrors);
}
else
{
$sError = 'Unknown reason';
}
return 'Notification was not sent: '.$sError;
}
}
}

View File

@@ -63,6 +63,7 @@ define('DEL_MANUAL', 1);
* @package iTopORM
*/
define('DEL_AUTO', 2);
define('DEL_SILENT', 2);
/**

View File

@@ -59,6 +59,8 @@ require_once('dbobject.class.php');
require_once('dbobjectsearch.class.php');
require_once('dbobjectset.class.php');
require_once('backgroundprocess.inc.php');
require_once('asynctask.class.inc.php');
require_once('dbproperty.class.inc.php');
// db change tracking data model

View File

@@ -56,7 +56,7 @@ class CMDBSource
self::$m_sDBUser = $sUser;
self::$m_sDBPwd = $sPwd;
self::$m_sDBName = $sSource;
if (!self::$m_resDBLink = @mysql_pconnect($sServer, $sUser, $sPwd))
if (!self::$m_resDBLink = @mysql_connect($sServer, $sUser, $sPwd))
{
throw new MySQLException('Could not connect to the DB server', array('host'=>$sServer, 'user'=>$sUser));
}
@@ -243,6 +243,26 @@ class CMDBSource
return false;
}
public static function QueryToScalar($sSql)
{
$result = mysql_query($sSql, self::$m_resDBLink);
if (!$result)
{
throw new MySQLException('Failed to issue SQL query', array('query' => $sSql));
}
if ($aRow = mysql_fetch_array($result, MYSQL_BOTH))
{
$res = $aRow[0];
}
else
{
mysql_free_result($result);
throw new MySQLException('Found no result for query', array('query' => $sSql));
}
mysql_free_result($result);
return $res;
}
public static function QueryToArray($sSql)
{
$aData = array();

View File

@@ -253,6 +253,30 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'cron_max_execution_time' => array(
'type' => 'integer',
'description' => 'Duration (seconds) of the page cron.php, must be shorter than php setting max_execution_time and shorter than the web server response timeout',
'default' => 60,
'value' => 60,
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'cron_sleep' => array(
'type' => 'integer',
'description' => 'Duration (seconds) before cron.php checks again if something must be done',
'default' => 2,
'value' => 2,
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'email_asynchronous' => array(
'type' => 'bool',
'description' => 'If set, the emails are sent off line, which requires cron.php to be activated. Exception: some features like the email test utility will force the serialized mode',
'default' => false,
'value' => false,
'source_of_value' => '',
'show_in_conf_sample' => true,
),
);
public function IsProperty($sPropCode)

View File

@@ -24,6 +24,11 @@
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
define ('EMAIL_SEND_OK', 0);
define ('EMAIL_SEND_PENDING', 1);
define ('EMAIL_SEND_ERROR', 2);
class EMail
{
protected $m_sBody;
@@ -31,15 +36,14 @@ class EMail
protected $m_sTo;
protected $m_aHeaders; // array of key=>value
public function __construct()
public function __construct($sTo = '', $sSubject = '', $sBody = '', $aHeaders = array())
{
$this->m_sTo = '';
$this->m_sSubject = '';
$this->m_sBody = '';
$this->m_aHeaders = array();
$this->m_sTo = $sTo;
$this->m_sSubject = $sSubject;
$this->m_sBody = $sBody;
$this->m_aHeaders = $aHeaders;
}
// Errors management : not that simple because we need that function to be
// executed in the background, while making sure that any issue would be reported clearly
protected $m_aMailErrors; //array of strings explaining the issues
@@ -50,9 +54,22 @@ class EMail
$this->m_aMailErrors[] = $sCleanMessage;
}
protected function SendAsynchronous(&$aIssues, $oLog = null)
{
try
{
AsyncSendEmail::AddToQueue($this->m_sTo, $this->m_sSubject, $this->m_sBody, $this->m_aHeaders, $oLog);
}
catch(Exception $e)
{
$aIssues = array($e->GetMessage());
return EMAIL_SEND_ERROR;
}
$aIssues = array();
return EMAIL_SEND_PENDING;
}
// returns a list of issues if any
public function Send()
protected function SendSynchronous(&$aIssues, $oLog = null)
{
$sHeaders = 'MIME-Version: 1.0' . "\r\n";
// ! the case is important for MS-Outlook
@@ -79,7 +96,36 @@ class EMail
{
$this->m_aMailErrors[] = 'Unknown reason';
}
return $this->m_aMailErrors;
if (count($this->m_aMailErrors) > 0)
{
$aIssues = $this->m_aMailErrors;
return EMAIL_SEND_ERROR;
}
else
{
$aIssues = array();
return EMAIL_SEND_OK;
}
}
public function Send(&$aIssues, $bForceSynchronous = false, $oLog = null)
{
if ($bForceSynchronous)
{
return $this->SendSynchronous($aIssues, $oLog);
}
else
{
$bConfigASYNC = MetaModel::GetConfig()->Get('email_asynchronous');
if ($bConfigASYNC)
{
return $this->SendAsynchronous($aIssues, $oLog);
}
else
{
return $this->SendSynchronous($aIssues, $oLog);
}
}
}
protected function AddToHeader($sKey, $sValue)

View File

@@ -25,7 +25,7 @@
* @license http://www.opensource.org/licenses/gpl-3.0.html LGPL
*/
class Event extends cmdbAbstractObject
class Event extends DBObject implements iDisplay
{
public static function Init()
{
@@ -46,14 +46,77 @@ class Event extends cmdbAbstractObject
MetaModel::Init_AddAttribute(new AttributeText("message", array("allowed_values"=>null, "sql"=>"message", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeDateTime("date", array("allowed_values"=>null, "sql"=>"date", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeString("userinfo", array("allowed_values"=>null, "sql"=>"userinfo", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
// MetaModel::Init_AddAttribute(new AttributeString("userinfo", array("allowed_values"=>null, "sql"=>"userinfo", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('message', 'date', 'userinfo')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details', array('date', 'message', 'userinfo')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('date', 'finalclass', 'message')); // Attributes to be displayed for a list
// Search criteria
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
/**
* Maps the given context parameter name to the appropriate filter/search code for this class
* @param string $sContextParam Name of the context parameter, i.e. 'org_id'
* @return string Filter code, i.e. 'customer_id'
*/
public static function MapContextParam($sContextParam)
{
if ($sContextParam == 'menu')
{
return null;
}
else
{
return $sContextParam;
}
}
/**
* This function returns a 'hilight' CSS class, used to hilight a given row in a table
* There are currently (i.e defined in the CSS) 4 possible values HILIGHT_CLASS_CRITICAL,
* HILIGHT_CLASS_WARNING, HILIGHT_CLASS_OK, HILIGHT_CLASS_NONE
* To Be overridden by derived classes
* @param void
* @return String The desired higlight class for the object/row
*/
public function GetHilightClass()
{
// Possible return values are:
// HILIGHT_CLASS_CRITICAL, HILIGHT_CLASS_WARNING, HILIGHT_CLASS_OK, HILIGHT_CLASS_NONE
return HILIGHT_CLASS_NONE; // Not hilighted by default
}
public static function GetUIPage()
{
return '../pages/UI.php';
}
function DisplayDetails(WebPage $oPage, $bEditMode = false)
{
// Object's details
//$this->DisplayBareHeader($oPage, $bEditMode);
$oPage->AddTabContainer(OBJECT_PROPERTIES_TAB);
$oPage->SetCurrentTabContainer(OBJECT_PROPERTIES_TAB);
$oPage->SetCurrentTab(Dict::S('UI:PropertiesTab'));
$this->DisplayBareProperties($oPage, $bEditMode);
}
function DisplayBareProperties(WebPage $oPage, $bEditMode = false)
{
if ($bEditMode) return; // Not editable
$aDetails = array();
$sClass = get_class($this);
$aZList = MetaModel::FlattenZlist(MetaModel::GetZListItems($sClass, 'details'));
foreach( $aZList as $sAttCode)
{
$sDisplayValue = $this->GetAsHTML($sAttCode);
$aDetails[] = array('label' => '<span title="'.MetaModel::GetDescription($sClass, $sAttCode).'">'.MetaModel::GetLabel($sClass, $sAttCode).'</span>', 'value' => $sDisplayValue);
}
$oPage->Details($aDetails);
}
}
class EventNotification extends Event
@@ -79,8 +142,8 @@ class EventNotification extends Event
MetaModel::Init_AddAttribute(new AttributeInteger("object_id", array("allowed_values"=>null, "sql"=>"object_id", "default_value"=>0, "is_null_allowed"=>false, "depends_on"=>array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('date', 'userinfo', 'trigger_id', 'action_id', 'object_id')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('date', 'userinfo')); // Attributes to be displayed for a list
MetaModel::Init_SetZListItems('details', array('date', 'message', 'userinfo', 'trigger_id', 'action_id', 'object_id')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('date', 'message')); // Attributes to be displayed for a list
// Search criteria
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
@@ -115,7 +178,7 @@ class EventNotificationEmail extends EventNotification
// Display lists
MetaModel::Init_SetZListItems('details', array('date', 'userinfo', 'message', 'trigger_id', 'action_id', 'object_id', 'to', 'cc', 'bcc', 'from', 'subject', 'body')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('date', 'userinfo', 'message', 'to', 'subject')); // Attributes to be displayed for a list
MetaModel::Init_SetZListItems('list', array('date', 'message', 'to', 'subject')); // Attributes to be displayed for a list
// Search criteria
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form

View File

@@ -122,6 +122,7 @@ class OQLLexerRaw
'/^,/',
'/^\\(/',
'/^\\)/',
'/^REGEXP/',
'/^=/',
'/^!=/',
'/^>/',
@@ -136,6 +137,7 @@ class OQLLexerRaw
'/^IF/',
'/^ELT/',
'/^COALESCE/',
'/^ISNULL/',
'/^CONCAT/',
'/^SUBSTR/',
'/^TRIM/',
@@ -338,204 +340,214 @@ class OQLLexerRaw
function yy_r1_16($yy_subpatterns)
{
$this->token = OQLParser::EQ;
$this->token = OQLParser::REGEXP;
}
function yy_r1_17($yy_subpatterns)
{
$this->token = OQLParser::NOT_EQ;
$this->token = OQLParser::EQ;
}
function yy_r1_18($yy_subpatterns)
{
$this->token = OQLParser::GT;
$this->token = OQLParser::NOT_EQ;
}
function yy_r1_19($yy_subpatterns)
{
$this->token = OQLParser::LT;
$this->token = OQLParser::GT;
}
function yy_r1_20($yy_subpatterns)
{
$this->token = OQLParser::GE;
$this->token = OQLParser::LT;
}
function yy_r1_21($yy_subpatterns)
{
$this->token = OQLParser::LE;
$this->token = OQLParser::GE;
}
function yy_r1_22($yy_subpatterns)
{
$this->token = OQLParser::LIKE;
$this->token = OQLParser::LE;
}
function yy_r1_23($yy_subpatterns)
{
$this->token = OQLParser::NOT_LIKE;
$this->token = OQLParser::LIKE;
}
function yy_r1_24($yy_subpatterns)
{
$this->token = OQLParser::IN;
$this->token = OQLParser::NOT_LIKE;
}
function yy_r1_25($yy_subpatterns)
{
$this->token = OQLParser::NOT_IN;
$this->token = OQLParser::IN;
}
function yy_r1_26($yy_subpatterns)
{
$this->token = OQLParser::INTERVAL;
$this->token = OQLParser::NOT_IN;
}
function yy_r1_27($yy_subpatterns)
{
$this->token = OQLParser::F_IF;
$this->token = OQLParser::INTERVAL;
}
function yy_r1_28($yy_subpatterns)
{
$this->token = OQLParser::F_ELT;
$this->token = OQLParser::F_IF;
}
function yy_r1_29($yy_subpatterns)
{
$this->token = OQLParser::F_COALESCE;
$this->token = OQLParser::F_ELT;
}
function yy_r1_30($yy_subpatterns)
{
$this->token = OQLParser::F_CONCAT;
$this->token = OQLParser::F_COALESCE;
}
function yy_r1_31($yy_subpatterns)
{
$this->token = OQLParser::F_SUBSTR;
$this->token = OQLParser::F_ISNULL;
}
function yy_r1_32($yy_subpatterns)
{
$this->token = OQLParser::F_TRIM;
$this->token = OQLParser::F_CONCAT;
}
function yy_r1_33($yy_subpatterns)
{
$this->token = OQLParser::F_DATE;
$this->token = OQLParser::F_SUBSTR;
}
function yy_r1_34($yy_subpatterns)
{
$this->token = OQLParser::F_DATE_FORMAT;
$this->token = OQLParser::F_TRIM;
}
function yy_r1_35($yy_subpatterns)
{
$this->token = OQLParser::F_CURRENT_DATE;
$this->token = OQLParser::F_DATE;
}
function yy_r1_36($yy_subpatterns)
{
$this->token = OQLParser::F_NOW;
$this->token = OQLParser::F_DATE_FORMAT;
}
function yy_r1_37($yy_subpatterns)
{
$this->token = OQLParser::F_TIME;
$this->token = OQLParser::F_CURRENT_DATE;
}
function yy_r1_38($yy_subpatterns)
{
$this->token = OQLParser::F_TO_DAYS;
$this->token = OQLParser::F_NOW;
}
function yy_r1_39($yy_subpatterns)
{
$this->token = OQLParser::F_FROM_DAYS;
$this->token = OQLParser::F_TIME;
}
function yy_r1_40($yy_subpatterns)
{
$this->token = OQLParser::F_YEAR;
$this->token = OQLParser::F_TO_DAYS;
}
function yy_r1_41($yy_subpatterns)
{
$this->token = OQLParser::F_MONTH;
$this->token = OQLParser::F_FROM_DAYS;
}
function yy_r1_42($yy_subpatterns)
{
$this->token = OQLParser::F_DAY;
$this->token = OQLParser::F_YEAR;
}
function yy_r1_43($yy_subpatterns)
{
$this->token = OQLParser::F_HOUR;
$this->token = OQLParser::F_MONTH;
}
function yy_r1_44($yy_subpatterns)
{
$this->token = OQLParser::F_MINUTE;
$this->token = OQLParser::F_DAY;
}
function yy_r1_45($yy_subpatterns)
{
$this->token = OQLParser::F_SECOND;
$this->token = OQLParser::F_HOUR;
}
function yy_r1_46($yy_subpatterns)
{
$this->token = OQLParser::F_DATE_ADD;
$this->token = OQLParser::F_MINUTE;
}
function yy_r1_47($yy_subpatterns)
{
$this->token = OQLParser::F_DATE_SUB;
$this->token = OQLParser::F_SECOND;
}
function yy_r1_48($yy_subpatterns)
{
$this->token = OQLParser::F_ROUND;
$this->token = OQLParser::F_DATE_ADD;
}
function yy_r1_49($yy_subpatterns)
{
$this->token = OQLParser::F_FLOOR;
$this->token = OQLParser::F_DATE_SUB;
}
function yy_r1_50($yy_subpatterns)
{
$this->token = OQLParser::F_INET_ATON;
$this->token = OQLParser::F_ROUND;
}
function yy_r1_51($yy_subpatterns)
{
$this->token = OQLParser::F_INET_NTOA;
$this->token = OQLParser::F_FLOOR;
}
function yy_r1_52($yy_subpatterns)
{
$this->token = OQLParser::NUMVAL;
$this->token = OQLParser::F_INET_ATON;
}
function yy_r1_53($yy_subpatterns)
{
$this->token = OQLParser::STRVAL;
$this->token = OQLParser::F_INET_NTOA;
}
function yy_r1_54($yy_subpatterns)
{
$this->token = OQLParser::NAME;
$this->token = OQLParser::NUMVAL;
}
function yy_r1_55($yy_subpatterns)
{
$this->token = OQLParser::VARNAME;
$this->token = OQLParser::STRVAL;
}
function yy_r1_56($yy_subpatterns)
{
$this->token = OQLParser::NAME;
}
function yy_r1_57($yy_subpatterns)
{
$this->token = OQLParser::VARNAME;
}
function yy_r1_58($yy_subpatterns)
{
$this->token = OQLParser::DOT;

View File

@@ -94,6 +94,7 @@ math_plus = "+"
math_minus = "-"
log_and = "AND"
log_or = "OR"
regexp = "REGEXP"
eq = "="
not_eq = "!="
gt = ">"
@@ -108,6 +109,7 @@ interval = "INTERVAL"
f_if = "IF"
f_elt = "ELT"
f_coalesce = "COALESCE"
f_isnull = "ISNULL"
f_concat = "CONCAT"
f_substr = "SUBSTR"
f_trim = "TRIM"
@@ -186,6 +188,9 @@ par_open {
par_close {
$this->token = OQLParser::PAR_CLOSE;
}
regexp {
$this->token = OQLParser::REGEXP;
}
eq {
$this->token = OQLParser::EQ;
}
@@ -228,6 +233,9 @@ f_elt {
f_coalesce {
$this->token = OQLParser::F_COALESCE;
}
f_isnull {
$this->token = OQLParser::F_ISNULL;
}
f_concat {
$this->token = OQLParser::F_CONCAT;
}

View File

@@ -133,43 +133,45 @@ class OQLParserRaw#line 102 "oql-parser.php"
const NAME = 20;
const NUMVAL = 21;
const STRVAL = 22;
const NOT_EQ = 23;
const LOG_AND = 24;
const LOG_OR = 25;
const MATH_DIV = 26;
const MATH_MULT = 27;
const MATH_PLUS = 28;
const MATH_MINUS = 29;
const GT = 30;
const LT = 31;
const GE = 32;
const LE = 33;
const LIKE = 34;
const NOT_LIKE = 35;
const IN = 36;
const NOT_IN = 37;
const F_IF = 38;
const F_ELT = 39;
const F_COALESCE = 40;
const F_CONCAT = 41;
const F_SUBSTR = 42;
const F_TRIM = 43;
const F_DATE = 44;
const F_DATE_FORMAT = 45;
const F_CURRENT_DATE = 46;
const F_NOW = 47;
const F_TIME = 48;
const F_TO_DAYS = 49;
const F_FROM_DAYS = 50;
const F_DATE_ADD = 51;
const F_DATE_SUB = 52;
const F_ROUND = 53;
const F_FLOOR = 54;
const F_INET_ATON = 55;
const F_INET_NTOA = 56;
const YY_NO_ACTION = 234;
const YY_ACCEPT_ACTION = 233;
const YY_ERROR_ACTION = 232;
const REGEXP = 23;
const NOT_EQ = 24;
const LOG_AND = 25;
const LOG_OR = 26;
const MATH_DIV = 27;
const MATH_MULT = 28;
const MATH_PLUS = 29;
const MATH_MINUS = 30;
const GT = 31;
const LT = 32;
const GE = 33;
const LE = 34;
const LIKE = 35;
const NOT_LIKE = 36;
const IN = 37;
const NOT_IN = 38;
const F_IF = 39;
const F_ELT = 40;
const F_COALESCE = 41;
const F_ISNULL = 42;
const F_CONCAT = 43;
const F_SUBSTR = 44;
const F_TRIM = 45;
const F_DATE = 46;
const F_DATE_FORMAT = 47;
const F_CURRENT_DATE = 48;
const F_NOW = 49;
const F_TIME = 50;
const F_TO_DAYS = 51;
const F_FROM_DAYS = 52;
const F_DATE_ADD = 53;
const F_DATE_SUB = 54;
const F_ROUND = 55;
const F_FLOOR = 56;
const F_INET_ATON = 57;
const F_INET_NTOA = 58;
const YY_NO_ACTION = 238;
const YY_ACCEPT_ACTION = 237;
const YY_ERROR_ACTION = 236;
/* Next are that tables used to determine what action to take based on the
** current state and lookahead token. These tables are used to implement
@@ -221,173 +223,179 @@ class OQLParserRaw#line 102 "oql-parser.php"
** shifting non-terminals after a reduce.
** self::$yy_default Default action for each state.
*/
const YY_SZ_ACTTAB = 425;
const YY_SZ_ACTTAB = 455;
static public $yy_action = array(
/* 0 */ 16, 55, 29, 141, 141, 69, 27, 96, 7, 33,
/* 10 */ 95, 100, 53, 105, 132, 133, 129, 5, 82, 81,
/* 20 */ 86, 87, 10, 60, 23, 25, 94, 93, 85, 84,
/* 30 */ 51, 19, 49, 8, 50, 114, 115, 92, 91, 90,
/* 40 */ 88, 89, 107, 108, 127, 126, 125, 123, 124, 128,
/* 50 */ 131, 130, 122, 121, 113, 112, 7, 120, 6, 2,
/* 60 */ 63, 63, 132, 133, 129, 101, 82, 81, 86, 87,
/* 70 */ 38, 9, 119, 24, 102, 103, 54, 118, 116, 117,
/* 80 */ 134, 65, 56, 61, 58, 92, 91, 90, 88, 89,
/* 90 */ 107, 108, 127, 126, 125, 123, 124, 128, 131, 130,
/* 100 */ 122, 121, 113, 112, 7, 63, 106, 3, 26, 59,
/* 110 */ 132, 133, 129, 12, 82, 81, 86, 87, 11, 70,
/* 120 */ 42, 105, 24, 24, 80, 110, 30, 68, 31, 28,
/* 130 */ 27, 20, 111, 92, 91, 90, 88, 89, 107, 108,
/* 140 */ 127, 126, 125, 123, 124, 128, 131, 130, 122, 121,
/* 150 */ 113, 112, 233, 109, 99, 55, 63, 63, 63, 46,
/* 160 */ 63, 96, 43, 34, 95, 100, 53, 67, 8, 13,
/* 170 */ 22, 79, 15, 41, 40, 44, 24, 83, 24, 55,
/* 180 */ 94, 93, 85, 84, 51, 96, 35, 34, 95, 100,
/* 190 */ 53, 47, 104, 17, 22, 55, 15, 4, 40, 98,
/* 200 */ 62, 52, 77, 55, 94, 93, 85, 84, 51, 96,
/* 210 */ 35, 34, 95, 100, 53, 186, 1, 27, 22, 81,
/* 220 */ 15, 71, 40, 45, 51, 193, 57, 55, 94, 93,
/* 230 */ 85, 84, 51, 96, 39, 34, 95, 100, 53, 193,
/* 240 */ 193, 193, 22, 193, 15, 193, 40, 193, 193, 48,
/* 250 */ 97, 55, 94, 93, 85, 84, 51, 96, 43, 34,
/* 260 */ 95, 100, 53, 193, 193, 193, 22, 55, 15, 193,
/* 270 */ 40, 193, 66, 52, 193, 55, 94, 93, 85, 84,
/* 280 */ 51, 96, 18, 34, 95, 100, 53, 193, 193, 193,
/* 290 */ 22, 55, 15, 193, 40, 193, 51, 64, 193, 55,
/* 300 */ 94, 93, 85, 84, 51, 96, 36, 34, 95, 100,
/* 310 */ 53, 193, 193, 193, 22, 193, 15, 193, 40, 193,
/* 320 */ 51, 193, 193, 55, 94, 93, 85, 84, 51, 96,
/* 330 */ 32, 34, 95, 100, 53, 193, 193, 193, 22, 193,
/* 340 */ 15, 193, 40, 193, 193, 193, 193, 55, 94, 93,
/* 350 */ 85, 84, 51, 96, 193, 34, 95, 100, 53, 193,
/* 360 */ 193, 193, 22, 193, 15, 193, 37, 193, 193, 193,
/* 370 */ 193, 55, 94, 93, 85, 84, 51, 96, 193, 34,
/* 380 */ 95, 100, 53, 193, 193, 193, 22, 193, 14, 74,
/* 390 */ 73, 72, 75, 76, 78, 55, 94, 93, 85, 84,
/* 400 */ 51, 96, 105, 34, 95, 100, 53, 193, 193, 193,
/* 410 */ 21, 193, 193, 193, 193, 193, 193, 193, 193, 193,
/* 420 */ 94, 93, 85, 84, 51,
/* 0 */ 17, 6, 29, 143, 143, 28, 23, 56, 5, 120,
/* 10 */ 12, 2, 107, 10, 133, 134, 135, 102, 83, 82,
/* 20 */ 87, 88, 103, 104, 121, 119, 115, 116, 106, 105,
/* 30 */ 117, 118, 136, 66, 58, 59, 60, 57, 93, 92,
/* 40 */ 91, 89, 90, 108, 109, 128, 127, 126, 124, 125,
/* 50 */ 129, 130, 131, 132, 123, 122, 114, 113, 5, 35,
/* 60 */ 7, 3, 24, 70, 133, 134, 135, 106, 83, 82,
/* 70 */ 87, 88, 4, 75, 74, 73, 76, 77, 79, 62,
/* 80 */ 52, 69, 30, 20, 26, 63, 55, 106, 93, 92,
/* 90 */ 91, 89, 90, 108, 109, 128, 127, 126, 124, 125,
/* 100 */ 129, 130, 131, 132, 123, 122, 114, 113, 5, 54,
/* 110 */ 64, 64, 64, 64, 133, 134, 135, 8, 83, 82,
/* 120 */ 87, 88, 71, 43, 16, 24, 24, 31, 25, 81,
/* 130 */ 111, 27, 188, 19, 53, 23, 49, 50, 93, 92,
/* 140 */ 91, 89, 90, 108, 109, 128, 127, 126, 124, 125,
/* 150 */ 129, 130, 131, 132, 123, 122, 114, 113, 237, 110,
/* 160 */ 100, 52, 64, 64, 9, 68, 64, 97, 46, 32,
/* 170 */ 96, 101, 51, 44, 45, 84, 21, 24, 15, 38,
/* 180 */ 40, 13, 24, 82, 11, 52, 95, 94, 86, 85,
/* 190 */ 54, 97, 39, 32, 96, 101, 51, 47, 112, 1,
/* 200 */ 21, 23, 15, 8, 40, 99, 80, 72, 78, 52,
/* 210 */ 95, 94, 86, 85, 54, 97, 39, 32, 96, 101,
/* 220 */ 51, 42, 197, 197, 21, 52, 15, 197, 40, 197,
/* 230 */ 67, 55, 61, 52, 95, 94, 86, 85, 54, 97,
/* 240 */ 36, 32, 96, 101, 51, 197, 197, 197, 21, 197,
/* 250 */ 15, 197, 40, 197, 54, 48, 98, 52, 95, 94,
/* 260 */ 86, 85, 54, 97, 46, 32, 96, 101, 51, 197,
/* 270 */ 197, 197, 21, 52, 15, 197, 40, 197, 197, 65,
/* 280 */ 197, 52, 95, 94, 86, 85, 54, 97, 41, 32,
/* 290 */ 96, 101, 51, 197, 197, 197, 21, 197, 15, 197,
/* 300 */ 40, 197, 54, 197, 197, 52, 95, 94, 86, 85,
/* 310 */ 54, 97, 33, 32, 96, 101, 51, 197, 197, 197,
/* 320 */ 21, 197, 15, 197, 40, 197, 197, 197, 197, 52,
/* 330 */ 95, 94, 86, 85, 54, 97, 18, 32, 96, 101,
/* 340 */ 51, 197, 197, 197, 21, 197, 15, 197, 40, 197,
/* 350 */ 197, 197, 197, 52, 95, 94, 86, 85, 54, 97,
/* 360 */ 197, 32, 96, 101, 51, 197, 197, 197, 21, 197,
/* 370 */ 15, 197, 37, 197, 197, 197, 197, 52, 95, 94,
/* 380 */ 86, 85, 54, 97, 197, 32, 96, 101, 51, 197,
/* 390 */ 197, 197, 21, 197, 14, 197, 197, 197, 197, 197,
/* 400 */ 197, 52, 95, 94, 86, 85, 54, 97, 197, 32,
/* 410 */ 96, 101, 51, 197, 197, 197, 22, 197, 197, 197,
/* 420 */ 197, 197, 197, 197, 197, 52, 95, 94, 86, 85,
/* 430 */ 54, 97, 197, 34, 96, 101, 51, 197, 197, 197,
/* 440 */ 197, 197, 197, 197, 197, 197, 197, 197, 197, 197,
/* 450 */ 95, 94, 86, 85, 54,
);
static public $yy_lookahead = array(
/* 0 */ 1, 61, 2, 3, 4, 63, 6, 67, 9, 69,
/* 10 */ 70, 71, 72, 25, 15, 16, 17, 4, 19, 20,
/* 20 */ 21, 22, 79, 10, 3, 4, 86, 87, 88, 89,
/* 30 */ 90, 61, 61, 82, 64, 92, 93, 38, 39, 40,
/* 0 */ 1, 4, 2, 3, 4, 2, 6, 10, 9, 8,
/* 10 */ 7, 4, 10, 81, 15, 16, 17, 10, 19, 20,
/* 20 */ 21, 22, 37, 38, 23, 24, 94, 95, 26, 77,
/* 30 */ 29, 30, 31, 32, 33, 34, 35, 36, 39, 40,
/* 40 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
/* 50 */ 51, 52, 53, 54, 55, 56, 9, 8, 11, 4,
/* 60 */ 90, 90, 15, 16, 17, 10, 19, 20, 21, 22,
/* 70 */ 62, 81, 23, 65, 36, 37, 61, 28, 29, 30,
/* 80 */ 31, 32, 33, 34, 35, 38, 39, 40, 41, 42,
/* 90 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
/* 100 */ 53, 54, 55, 56, 9, 90, 10, 5, 2, 24,
/* 110 */ 15, 16, 17, 7, 19, 20, 21, 22, 77, 62,
/* 120 */ 62, 25, 65, 65, 26, 27, 2, 61, 61, 61,
/* 130 */ 6, 61, 91, 38, 39, 40, 41, 42, 43, 44,
/* 140 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
/* 150 */ 55, 56, 58, 59, 60, 61, 90, 90, 90, 18,
/* 160 */ 90, 67, 68, 69, 70, 71, 72, 63, 82, 7,
/* 170 */ 76, 85, 78, 62, 80, 62, 65, 90, 65, 61,
/* 180 */ 86, 87, 88, 89, 90, 67, 68, 69, 70, 71,
/* 190 */ 72, 73, 75, 8, 76, 61, 78, 9, 80, 63,
/* 200 */ 66, 67, 84, 61, 86, 87, 88, 89, 90, 67,
/* 210 */ 68, 69, 70, 71, 72, 18, 9, 6, 76, 20,
/* 220 */ 78, 63, 80, 74, 90, 94, 84, 61, 86, 87,
/* 230 */ 88, 89, 90, 67, 68, 69, 70, 71, 72, 94,
/* 240 */ 94, 94, 76, 94, 78, 94, 80, 94, 94, 83,
/* 250 */ 60, 61, 86, 87, 88, 89, 90, 67, 68, 69,
/* 260 */ 70, 71, 72, 94, 94, 94, 76, 61, 78, 94,
/* 270 */ 80, 94, 66, 67, 94, 61, 86, 87, 88, 89,
/* 280 */ 90, 67, 68, 69, 70, 71, 72, 94, 94, 94,
/* 290 */ 76, 61, 78, 94, 80, 94, 90, 67, 94, 61,
/* 300 */ 86, 87, 88, 89, 90, 67, 68, 69, 70, 71,
/* 310 */ 72, 94, 94, 94, 76, 94, 78, 94, 80, 94,
/* 320 */ 90, 94, 94, 61, 86, 87, 88, 89, 90, 67,
/* 330 */ 68, 69, 70, 71, 72, 94, 94, 94, 76, 94,
/* 340 */ 78, 94, 80, 94, 94, 94, 94, 61, 86, 87,
/* 350 */ 88, 89, 90, 67, 94, 69, 70, 71, 72, 94,
/* 360 */ 94, 94, 76, 94, 78, 94, 80, 94, 94, 94,
/* 370 */ 94, 61, 86, 87, 88, 89, 90, 67, 94, 69,
/* 380 */ 70, 71, 72, 94, 94, 94, 76, 94, 78, 12,
/* 390 */ 13, 14, 15, 16, 17, 61, 86, 87, 88, 89,
/* 400 */ 90, 67, 25, 69, 70, 71, 72, 94, 94, 94,
/* 410 */ 76, 94, 94, 94, 94, 94, 94, 94, 94, 94,
/* 420 */ 86, 87, 88, 89, 90,
/* 50 */ 51, 52, 53, 54, 55, 56, 57, 58, 9, 64,
/* 60 */ 11, 5, 67, 65, 15, 16, 17, 26, 19, 20,
/* 70 */ 21, 22, 9, 12, 13, 14, 15, 16, 17, 25,
/* 80 */ 63, 63, 63, 63, 63, 68, 69, 26, 39, 40,
/* 90 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
/* 100 */ 51, 52, 53, 54, 55, 56, 57, 58, 9, 92,
/* 110 */ 92, 92, 92, 92, 15, 16, 17, 84, 19, 20,
/* 120 */ 21, 22, 64, 64, 8, 67, 67, 3, 4, 27,
/* 130 */ 28, 2, 18, 63, 63, 6, 66, 63, 39, 40,
/* 140 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
/* 150 */ 51, 52, 53, 54, 55, 56, 57, 58, 60, 61,
/* 160 */ 62, 63, 92, 92, 83, 65, 92, 69, 70, 71,
/* 170 */ 72, 73, 74, 18, 64, 92, 78, 67, 80, 64,
/* 180 */ 82, 7, 67, 20, 79, 63, 88, 89, 90, 91,
/* 190 */ 92, 69, 70, 71, 72, 73, 74, 75, 93, 9,
/* 200 */ 78, 6, 80, 84, 82, 65, 87, 65, 86, 63,
/* 210 */ 88, 89, 90, 91, 92, 69, 70, 71, 72, 73,
/* 220 */ 74, 76, 96, 96, 78, 63, 80, 96, 82, 96,
/* 230 */ 68, 69, 86, 63, 88, 89, 90, 91, 92, 69,
/* 240 */ 70, 71, 72, 73, 74, 96, 96, 96, 78, 96,
/* 250 */ 80, 96, 82, 96, 92, 85, 62, 63, 88, 89,
/* 260 */ 90, 91, 92, 69, 70, 71, 72, 73, 74, 96,
/* 270 */ 96, 96, 78, 63, 80, 96, 82, 96, 96, 69,
/* 280 */ 96, 63, 88, 89, 90, 91, 92, 69, 70, 71,
/* 290 */ 72, 73, 74, 96, 96, 96, 78, 96, 80, 96,
/* 300 */ 82, 96, 92, 96, 96, 63, 88, 89, 90, 91,
/* 310 */ 92, 69, 70, 71, 72, 73, 74, 96, 96, 96,
/* 320 */ 78, 96, 80, 96, 82, 96, 96, 96, 96, 63,
/* 330 */ 88, 89, 90, 91, 92, 69, 70, 71, 72, 73,
/* 340 */ 74, 96, 96, 96, 78, 96, 80, 96, 82, 96,
/* 350 */ 96, 96, 96, 63, 88, 89, 90, 91, 92, 69,
/* 360 */ 96, 71, 72, 73, 74, 96, 96, 96, 78, 96,
/* 370 */ 80, 96, 82, 96, 96, 96, 96, 63, 88, 89,
/* 380 */ 90, 91, 92, 69, 96, 71, 72, 73, 74, 96,
/* 390 */ 96, 96, 78, 96, 80, 96, 96, 96, 96, 96,
/* 400 */ 96, 63, 88, 89, 90, 91, 92, 69, 96, 71,
/* 410 */ 72, 73, 74, 96, 96, 96, 78, 96, 96, 96,
/* 420 */ 96, 96, 96, 96, 96, 63, 88, 89, 90, 91,
/* 430 */ 92, 69, 96, 71, 72, 73, 74, 96, 96, 96,
/* 440 */ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
/* 450 */ 88, 89, 90, 91, 92,
);
const YY_SHIFT_USE_DFLT = -13;
const YY_SHIFT_USE_DFLT = -16;
const YY_SHIFT_MAX = 55;
static public $yy_shift_ofst = array(
/* 0 */ -1, 47, 47, 95, 95, 95, 95, 95, 95, 95,
/* 10 */ 95, 95, 199, 199, 49, 49, 199, 199, 377, 0,
/* 20 */ 124, 98, 98, 199, 211, 199, 199, 199, 211, 199,
/* 30 */ 199, 211, 96, 38, 38, -12, -12, 85, 102, -12,
/* 40 */ 85, 102, 102, -12, 102, 188, 199, 55, 13, 106,
/* 50 */ 21, 197, 185, 207, 162, 141,
/* 0 */ -1, 49, 49, 99, 99, 99, 99, 99, 99, 99,
/* 10 */ 99, 99, 163, 163, 1, 1, 163, 163, 61, 0,
/* 20 */ 129, 102, 102, 163, 195, 163, 195, 163, 163, 163,
/* 30 */ 195, 163, -15, 2, -15, 56, 41, 54, 56, 41,
/* 40 */ 54, 41, 63, 56, 163, 56, 41, 7, -3, 124,
/* 50 */ 3, 190, 155, 174, 114, 116,
);
const YY_REDUCE_USE_DFLT = -61;
const YY_REDUCE_USE_DFLT = -69;
const YY_REDUCE_MAX = 46;
static public $yy_reduce_ofst = array(
/* 0 */ 94, 118, 142, 190, 166, 238, 214, 262, 286, 310,
/* 10 */ 334, -60, 206, 134, -57, -57, -30, 230, 86, 113,
/* 20 */ 111, 41, 41, 70, 57, 66, 15, -29, 58, 67,
/* 30 */ 68, 8, -49, 149, 149, -49, -49, -10, 158, -49,
/* 40 */ -10, 104, -58, -49, 136, 117, 87,
/* 0 */ 98, 122, 146, 194, 170, 242, 218, 266, 290, 314,
/* 10 */ 338, 362, 162, 17, -68, -68, 210, 70, 119, 115,
/* 20 */ 110, 105, 105, 74, 58, 18, -5, 19, 71, 21,
/* 30 */ 59, 20, 145, 33, 145, 142, 33, 81, 140, 33,
/* 40 */ 81, 33, -48, -2, 83, 100, 33,
);
static public $yyExpectedTokens = array(
/* 0 */ array(1, 9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 1 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 2 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 3 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 4 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 5 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 6 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 7 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 8 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 9 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 10 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 11 */ array(9, 15, 16, 17, 19, 20, 21, 22, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, ),
/* 0 */ array(1, 9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 1 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 2 */ array(9, 11, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 3 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 4 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 5 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 6 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 7 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 8 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 9 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 10 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 11 */ array(9, 15, 16, 17, 19, 20, 21, 22, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, ),
/* 12 */ array(20, ),
/* 13 */ array(20, ),
/* 14 */ array(8, 23, 28, 29, 30, 31, 32, 33, 34, 35, ),
/* 15 */ array(8, 23, 28, 29, 30, 31, 32, 33, 34, 35, ),
/* 14 */ array(8, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, ),
/* 15 */ array(8, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, ),
/* 16 */ array(20, ),
/* 17 */ array(20, ),
/* 18 */ array(12, 13, 14, 15, 16, 17, 25, ),
/* 18 */ array(12, 13, 14, 15, 16, 17, 26, ),
/* 19 */ array(2, 3, 4, 6, ),
/* 20 */ array(2, 6, ),
/* 21 */ array(26, 27, ),
/* 22 */ array(26, 27, ),
/* 21 */ array(27, 28, ),
/* 22 */ array(27, 28, ),
/* 23 */ array(20, ),
/* 24 */ array(6, ),
/* 25 */ array(20, ),
/* 26 */ array(20, ),
/* 26 */ array(6, ),
/* 27 */ array(20, ),
/* 28 */ array(6, ),
/* 28 */ array(20, ),
/* 29 */ array(20, ),
/* 30 */ array(20, ),
/* 31 */ array(6, ),
/* 32 */ array(10, 25, ),
/* 33 */ array(36, 37, ),
/* 34 */ array(36, 37, ),
/* 35 */ array(25, ),
/* 36 */ array(25, ),
/* 37 */ array(24, ),
/* 30 */ array(6, ),
/* 31 */ array(20, ),
/* 32 */ array(37, 38, ),
/* 33 */ array(10, 26, ),
/* 34 */ array(37, 38, ),
/* 35 */ array(5, ),
/* 36 */ array(26, ),
/* 37 */ array(25, ),
/* 38 */ array(5, ),
/* 39 */ array(25, ),
/* 40 */ array(24, ),
/* 41 */ array(5, ),
/* 42 */ array(5, ),
/* 43 */ array(25, ),
/* 44 */ array(5, ),
/* 45 */ array(9, ),
/* 46 */ array(20, ),
/* 39 */ array(26, ),
/* 40 */ array(25, ),
/* 41 */ array(26, ),
/* 42 */ array(9, ),
/* 43 */ array(5, ),
/* 44 */ array(20, ),
/* 45 */ array(5, ),
/* 46 */ array(26, ),
/* 47 */ array(4, 10, ),
/* 48 */ array(4, 10, ),
/* 49 */ array(2, 7, ),
/* 50 */ array(3, 4, ),
/* 51 */ array(18, ),
/* 52 */ array(8, ),
/* 53 */ array(9, ),
/* 54 */ array(7, ),
/* 55 */ array(18, ),
/* 49 */ array(3, 4, ),
/* 50 */ array(2, 7, ),
/* 51 */ array(9, ),
/* 52 */ array(18, ),
/* 53 */ array(7, ),
/* 54 */ array(18, ),
/* 55 */ array(8, ),
/* 56 */ array(),
/* 57 */ array(),
/* 58 */ array(),
@@ -467,22 +475,24 @@ static public $yy_action = array(
/* 132 */ array(),
/* 133 */ array(),
/* 134 */ array(),
/* 135 */ array(),
/* 136 */ array(),
);
static public $yy_default = array(
/* 0 */ 232, 169, 232, 232, 232, 232, 232, 232, 232, 232,
/* 10 */ 232, 232, 232, 232, 163, 162, 232, 232, 232, 147,
/* 20 */ 147, 161, 160, 232, 146, 232, 232, 232, 147, 232,
/* 30 */ 232, 147, 232, 159, 158, 172, 168, 165, 144, 167,
/* 40 */ 164, 144, 144, 151, 144, 232, 232, 232, 232, 232,
/* 50 */ 232, 184, 232, 232, 232, 232, 205, 171, 207, 196,
/* 60 */ 166, 206, 148, 186, 150, 204, 149, 139, 142, 140,
/* 70 */ 145, 138, 176, 175, 174, 177, 178, 170, 179, 173,
/* 80 */ 198, 188, 187, 185, 183, 182, 189, 190, 213, 214,
/* 90 */ 212, 211, 210, 181, 180, 152, 153, 143, 137, 136,
/* 100 */ 154, 155, 208, 209, 157, 197, 156, 215, 216, 135,
/* 110 */ 199, 191, 231, 230, 192, 193, 201, 202, 200, 195,
/* 120 */ 194, 229, 228, 220, 221, 219, 218, 217, 222, 223,
/* 130 */ 227, 226, 225, 224, 203,
/* 0 */ 236, 171, 236, 236, 236, 236, 236, 236, 236, 236,
/* 10 */ 236, 236, 236, 236, 165, 164, 236, 236, 236, 149,
/* 20 */ 149, 162, 163, 236, 148, 236, 149, 236, 236, 236,
/* 30 */ 149, 236, 160, 236, 161, 146, 169, 167, 146, 174,
/* 40 */ 166, 170, 236, 146, 236, 146, 153, 236, 236, 236,
/* 50 */ 236, 236, 236, 236, 186, 236, 168, 210, 207, 208,
/* 60 */ 209, 173, 199, 150, 188, 152, 206, 151, 141, 144,
/* 70 */ 142, 147, 140, 178, 177, 176, 179, 180, 172, 181,
/* 80 */ 175, 201, 190, 189, 187, 185, 184, 191, 192, 216,
/* 90 */ 217, 215, 214, 213, 183, 182, 154, 155, 145, 139,
/* 100 */ 138, 156, 157, 211, 212, 159, 200, 158, 218, 219,
/* 110 */ 137, 202, 193, 235, 234, 194, 195, 203, 204, 198,
/* 120 */ 197, 196, 233, 232, 223, 224, 222, 221, 220, 225,
/* 130 */ 226, 230, 231, 229, 228, 227, 205,
);
/* The next thing included is series of defines which control
** various aspects of the generated parser.
@@ -499,11 +509,11 @@ static public $yy_action = array(
** self::YYERRORSYMBOL is the code number of the error symbol. If not
** defined, then do no error processing.
*/
const YYNOCODE = 95;
const YYNOCODE = 97;
const YYSTACKDEPTH = 100;
const YYNSTATE = 135;
const YYNRULE = 97;
const YYERRORSYMBOL = 57;
const YYNSTATE = 137;
const YYNRULE = 99;
const YYERRORSYMBOL = 59;
const YYERRSYMDT = 'yy0';
const YYFALLBACK = 0;
/** The next table maps tokens into fallback tokens. If a construct
@@ -590,25 +600,25 @@ static public $yy_action = array(
'EQ', 'PAR_OPEN', 'PAR_CLOSE', 'INTERVAL',
'F_SECOND', 'F_MINUTE', 'F_HOUR', 'F_DAY',
'F_MONTH', 'F_YEAR', 'DOT', 'VARNAME',
'NAME', 'NUMVAL', 'STRVAL', 'NOT_EQ',
'LOG_AND', 'LOG_OR', 'MATH_DIV', 'MATH_MULT',
'MATH_PLUS', 'MATH_MINUS', 'GT', 'LT',
'GE', 'LE', 'LIKE', 'NOT_LIKE',
'IN', 'NOT_IN', 'F_IF', 'F_ELT',
'F_COALESCE', 'F_CONCAT', 'F_SUBSTR', 'F_TRIM',
'F_DATE', 'F_DATE_FORMAT', 'F_CURRENT_DATE', 'F_NOW',
'F_TIME', 'F_TO_DAYS', 'F_FROM_DAYS', 'F_DATE_ADD',
'F_DATE_SUB', 'F_ROUND', 'F_FLOOR', 'F_INET_ATON',
'F_INET_NTOA', 'error', 'result', 'query',
'condition', 'class_name', 'join_statement', 'where_statement',
'class_list', 'join_item', 'join_condition', 'field_id',
'expression_prio4', 'expression_basic', 'scalar', 'var_name',
'func_name', 'arg_list', 'list_operator', 'list',
'expression_prio1', 'operator1', 'expression_prio2', 'operator2',
'expression_prio3', 'operator3', 'operator4', 'list_items',
'argument', 'interval_unit', 'num_scalar', 'str_scalar',
'num_value', 'str_value', 'name', 'num_operator1',
'num_operator2', 'str_operator',
'NAME', 'NUMVAL', 'STRVAL', 'REGEXP',
'NOT_EQ', 'LOG_AND', 'LOG_OR', 'MATH_DIV',
'MATH_MULT', 'MATH_PLUS', 'MATH_MINUS', 'GT',
'LT', 'GE', 'LE', 'LIKE',
'NOT_LIKE', 'IN', 'NOT_IN', 'F_IF',
'F_ELT', 'F_COALESCE', 'F_ISNULL', 'F_CONCAT',
'F_SUBSTR', 'F_TRIM', 'F_DATE', 'F_DATE_FORMAT',
'F_CURRENT_DATE', 'F_NOW', 'F_TIME', 'F_TO_DAYS',
'F_FROM_DAYS', 'F_DATE_ADD', 'F_DATE_SUB', 'F_ROUND',
'F_FLOOR', 'F_INET_ATON', 'F_INET_NTOA', 'error',
'result', 'query', 'condition', 'class_name',
'join_statement', 'where_statement', 'class_list', 'join_item',
'join_condition', 'field_id', 'expression_prio4', 'expression_basic',
'scalar', 'var_name', 'func_name', 'arg_list',
'list_operator', 'list', 'expression_prio1', 'operator1',
'expression_prio2', 'operator2', 'expression_prio3', 'operator3',
'operator4', 'list_items', 'argument', 'interval_unit',
'num_scalar', 'str_scalar', 'num_value', 'str_value',
'name', 'num_operator1', 'num_operator2', 'str_operator',
);
/**
@@ -675,44 +685,46 @@ static public $yy_action = array(
/* 56 */ "operator1 ::= num_operator1",
/* 57 */ "operator2 ::= num_operator2",
/* 58 */ "operator2 ::= str_operator",
/* 59 */ "operator2 ::= EQ",
/* 60 */ "operator2 ::= NOT_EQ",
/* 61 */ "operator3 ::= LOG_AND",
/* 62 */ "operator4 ::= LOG_OR",
/* 63 */ "num_operator1 ::= MATH_DIV",
/* 64 */ "num_operator1 ::= MATH_MULT",
/* 65 */ "num_operator2 ::= MATH_PLUS",
/* 66 */ "num_operator2 ::= MATH_MINUS",
/* 67 */ "num_operator2 ::= GT",
/* 68 */ "num_operator2 ::= LT",
/* 69 */ "num_operator2 ::= GE",
/* 70 */ "num_operator2 ::= LE",
/* 71 */ "str_operator ::= LIKE",
/* 72 */ "str_operator ::= NOT_LIKE",
/* 73 */ "list_operator ::= IN",
/* 74 */ "list_operator ::= NOT_IN",
/* 75 */ "func_name ::= F_IF",
/* 76 */ "func_name ::= F_ELT",
/* 77 */ "func_name ::= F_COALESCE",
/* 78 */ "func_name ::= F_CONCAT",
/* 79 */ "func_name ::= F_SUBSTR",
/* 80 */ "func_name ::= F_TRIM",
/* 81 */ "func_name ::= F_DATE",
/* 82 */ "func_name ::= F_DATE_FORMAT",
/* 83 */ "func_name ::= F_CURRENT_DATE",
/* 84 */ "func_name ::= F_NOW",
/* 85 */ "func_name ::= F_TIME",
/* 86 */ "func_name ::= F_TO_DAYS",
/* 87 */ "func_name ::= F_FROM_DAYS",
/* 88 */ "func_name ::= F_YEAR",
/* 89 */ "func_name ::= F_MONTH",
/* 90 */ "func_name ::= F_DAY",
/* 91 */ "func_name ::= F_DATE_ADD",
/* 92 */ "func_name ::= F_DATE_SUB",
/* 93 */ "func_name ::= F_ROUND",
/* 94 */ "func_name ::= F_FLOOR",
/* 95 */ "func_name ::= F_INET_ATON",
/* 96 */ "func_name ::= F_INET_NTOA",
/* 59 */ "operator2 ::= REGEXP",
/* 60 */ "operator2 ::= EQ",
/* 61 */ "operator2 ::= NOT_EQ",
/* 62 */ "operator3 ::= LOG_AND",
/* 63 */ "operator4 ::= LOG_OR",
/* 64 */ "num_operator1 ::= MATH_DIV",
/* 65 */ "num_operator1 ::= MATH_MULT",
/* 66 */ "num_operator2 ::= MATH_PLUS",
/* 67 */ "num_operator2 ::= MATH_MINUS",
/* 68 */ "num_operator2 ::= GT",
/* 69 */ "num_operator2 ::= LT",
/* 70 */ "num_operator2 ::= GE",
/* 71 */ "num_operator2 ::= LE",
/* 72 */ "str_operator ::= LIKE",
/* 73 */ "str_operator ::= NOT_LIKE",
/* 74 */ "list_operator ::= IN",
/* 75 */ "list_operator ::= NOT_IN",
/* 76 */ "func_name ::= F_IF",
/* 77 */ "func_name ::= F_ELT",
/* 78 */ "func_name ::= F_COALESCE",
/* 79 */ "func_name ::= F_ISNULL",
/* 80 */ "func_name ::= F_CONCAT",
/* 81 */ "func_name ::= F_SUBSTR",
/* 82 */ "func_name ::= F_TRIM",
/* 83 */ "func_name ::= F_DATE",
/* 84 */ "func_name ::= F_DATE_FORMAT",
/* 85 */ "func_name ::= F_CURRENT_DATE",
/* 86 */ "func_name ::= F_NOW",
/* 87 */ "func_name ::= F_TIME",
/* 88 */ "func_name ::= F_TO_DAYS",
/* 89 */ "func_name ::= F_FROM_DAYS",
/* 90 */ "func_name ::= F_YEAR",
/* 91 */ "func_name ::= F_MONTH",
/* 92 */ "func_name ::= F_DAY",
/* 93 */ "func_name ::= F_DATE_ADD",
/* 94 */ "func_name ::= F_DATE_SUB",
/* 95 */ "func_name ::= F_ROUND",
/* 96 */ "func_name ::= F_FLOOR",
/* 97 */ "func_name ::= F_INET_ATON",
/* 98 */ "func_name ::= F_INET_NTOA",
);
/**
@@ -1077,103 +1089,105 @@ static public $yy_action = array(
* </pre>
*/
static public $yyRuleInfo = array(
array( 'lhs' => 58, 'rhs' => 1 ),
array( 'lhs' => 58, 'rhs' => 1 ),
array( 'lhs' => 59, 'rhs' => 4 ),
array( 'lhs' => 59, 'rhs' => 6 ),
array( 'lhs' => 59, 'rhs' => 6 ),
array( 'lhs' => 59, 'rhs' => 8 ),
array( 'lhs' => 64, 'rhs' => 1 ),
array( 'lhs' => 64, 'rhs' => 3 ),
array( 'lhs' => 63, 'rhs' => 2 ),
array( 'lhs' => 63, 'rhs' => 0 ),
array( 'lhs' => 62, 'rhs' => 2 ),
array( 'lhs' => 62, 'rhs' => 1 ),
array( 'lhs' => 62, 'rhs' => 0 ),
array( 'lhs' => 65, 'rhs' => 6 ),
array( 'lhs' => 65, 'rhs' => 4 ),
array( 'lhs' => 66, 'rhs' => 3 ),
array( 'lhs' => 60, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 4 ),
array( 'lhs' => 69, 'rhs' => 3 ),
array( 'lhs' => 69, 'rhs' => 3 ),
array( 'lhs' => 76, 'rhs' => 1 ),
array( 'lhs' => 76, 'rhs' => 3 ),
array( 'lhs' => 60, 'rhs' => 1 ),
array( 'lhs' => 61, 'rhs' => 4 ),
array( 'lhs' => 61, 'rhs' => 6 ),
array( 'lhs' => 61, 'rhs' => 6 ),
array( 'lhs' => 61, 'rhs' => 8 ),
array( 'lhs' => 66, 'rhs' => 1 ),
array( 'lhs' => 66, 'rhs' => 3 ),
array( 'lhs' => 65, 'rhs' => 2 ),
array( 'lhs' => 65, 'rhs' => 0 ),
array( 'lhs' => 64, 'rhs' => 2 ),
array( 'lhs' => 64, 'rhs' => 1 ),
array( 'lhs' => 64, 'rhs' => 0 ),
array( 'lhs' => 67, 'rhs' => 6 ),
array( 'lhs' => 67, 'rhs' => 4 ),
array( 'lhs' => 68, 'rhs' => 3 ),
array( 'lhs' => 62, 'rhs' => 1 ),
array( 'lhs' => 71, 'rhs' => 1 ),
array( 'lhs' => 71, 'rhs' => 1 ),
array( 'lhs' => 71, 'rhs' => 1 ),
array( 'lhs' => 71, 'rhs' => 4 ),
array( 'lhs' => 71, 'rhs' => 3 ),
array( 'lhs' => 71, 'rhs' => 3 ),
array( 'lhs' => 78, 'rhs' => 1 ),
array( 'lhs' => 78, 'rhs' => 3 ),
array( 'lhs' => 80, 'rhs' => 1 ),
array( 'lhs' => 80, 'rhs' => 3 ),
array( 'lhs' => 68, 'rhs' => 1 ),
array( 'lhs' => 68, 'rhs' => 3 ),
array( 'lhs' => 82, 'rhs' => 1 ),
array( 'lhs' => 82, 'rhs' => 3 ),
array( 'lhs' => 70, 'rhs' => 1 ),
array( 'lhs' => 70, 'rhs' => 3 ),
array( 'lhs' => 77, 'rhs' => 3 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 3 ),
array( 'lhs' => 75, 'rhs' => 0 ),
array( 'lhs' => 75, 'rhs' => 1 ),
array( 'lhs' => 75, 'rhs' => 3 ),
array( 'lhs' => 83, 'rhs' => 1 ),
array( 'lhs' => 83, 'rhs' => 3 ),
array( 'lhs' => 73, 'rhs' => 0 ),
array( 'lhs' => 73, 'rhs' => 1 ),
array( 'lhs' => 73, 'rhs' => 3 ),
array( 'lhs' => 84, 'rhs' => 1 ),
array( 'lhs' => 84, 'rhs' => 3 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 85, 'rhs' => 1 ),
array( 'lhs' => 70, 'rhs' => 1 ),
array( 'lhs' => 70, 'rhs' => 1 ),
array( 'lhs' => 86, 'rhs' => 1 ),
array( 'lhs' => 86, 'rhs' => 3 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 67, 'rhs' => 1 ),
array( 'lhs' => 67, 'rhs' => 3 ),
array( 'lhs' => 61, 'rhs' => 1 ),
array( 'lhs' => 71, 'rhs' => 1 ),
array( 'lhs' => 90, 'rhs' => 1 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 87, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 88, 'rhs' => 1 ),
array( 'lhs' => 89, 'rhs' => 1 ),
array( 'lhs' => 77, 'rhs' => 1 ),
array( 'lhs' => 79, 'rhs' => 1 ),
array( 'lhs' => 79, 'rhs' => 1 ),
array( 'lhs' => 79, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 1 ),
array( 'lhs' => 69, 'rhs' => 3 ),
array( 'lhs' => 63, 'rhs' => 1 ),
array( 'lhs' => 73, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 90, 'rhs' => 1 ),
array( 'lhs' => 91, 'rhs' => 1 ),
array( 'lhs' => 79, 'rhs' => 1 ),
array( 'lhs' => 81, 'rhs' => 1 ),
array( 'lhs' => 82, 'rhs' => 1 ),
array( 'lhs' => 91, 'rhs' => 1 ),
array( 'lhs' => 91, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 92, 'rhs' => 1 ),
array( 'lhs' => 81, 'rhs' => 1 ),
array( 'lhs' => 81, 'rhs' => 1 ),
array( 'lhs' => 81, 'rhs' => 1 ),
array( 'lhs' => 81, 'rhs' => 1 ),
array( 'lhs' => 83, 'rhs' => 1 ),
array( 'lhs' => 84, 'rhs' => 1 ),
array( 'lhs' => 93, 'rhs' => 1 ),
array( 'lhs' => 93, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 94, 'rhs' => 1 ),
array( 'lhs' => 95, 'rhs' => 1 ),
array( 'lhs' => 95, 'rhs' => 1 ),
array( 'lhs' => 76, 'rhs' => 1 ),
array( 'lhs' => 76, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 74, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
array( 'lhs' => 72, 'rhs' => 1 ),
);
/**
@@ -1235,7 +1249,6 @@ static public $yy_action = array(
49 => 49,
50 => 50,
51 => 51,
75 => 51,
76 => 51,
77 => 51,
78 => 51,
@@ -1257,6 +1270,8 @@ static public $yy_action = array(
94 => 51,
95 => 51,
96 => 51,
97 => 51,
98 => 51,
52 => 52,
53 => 53,
54 => 54,
@@ -1279,6 +1294,7 @@ static public $yy_action = array(
72 => 54,
73 => 54,
74 => 54,
75 => 54,
55 => 55,
);
/* Beginning here are the reduction cases. A typical example
@@ -1289,44 +1305,44 @@ static public $yy_action = array(
*/
#line 29 "oql-parser.y"
function yy_r0(){ $this->my_result = $this->yystack[$this->yyidx + 0]->minor; }
#line 1296 "oql-parser.php"
#line 1312 "oql-parser.php"
#line 32 "oql-parser.y"
function yy_r2(){
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor));
}
#line 1301 "oql-parser.php"
#line 1317 "oql-parser.php"
#line 35 "oql-parser.y"
function yy_r3(){
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor));
}
#line 1306 "oql-parser.php"
#line 1322 "oql-parser.php"
#line 39 "oql-parser.y"
function yy_r4(){
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -4]->minor);
}
#line 1311 "oql-parser.php"
#line 1327 "oql-parser.php"
#line 42 "oql-parser.y"
function yy_r5(){
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -6]->minor);
}
#line 1316 "oql-parser.php"
#line 1332 "oql-parser.php"
#line 47 "oql-parser.y"
function yy_r6(){
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
}
#line 1321 "oql-parser.php"
#line 1337 "oql-parser.php"
#line 50 "oql-parser.y"
function yy_r7(){
array_push($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor;
}
#line 1327 "oql-parser.php"
#line 1343 "oql-parser.php"
#line 55 "oql-parser.y"
function yy_r8(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; }
#line 1330 "oql-parser.php"
#line 1346 "oql-parser.php"
#line 56 "oql-parser.y"
function yy_r9(){ $this->_retvalue = null; }
#line 1333 "oql-parser.php"
#line 1349 "oql-parser.php"
#line 58 "oql-parser.y"
function yy_r10(){
// insert the join statement on top of the existing list
@@ -1334,67 +1350,67 @@ static public $yy_action = array(
// and return the updated array
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
}
#line 1341 "oql-parser.php"
#line 1357 "oql-parser.php"
#line 64 "oql-parser.y"
function yy_r11(){
$this->_retvalue = Array($this->yystack[$this->yyidx + 0]->minor);
}
#line 1346 "oql-parser.php"
#line 1362 "oql-parser.php"
#line 70 "oql-parser.y"
function yy_r13(){
// create an array with one single item
$this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
}
#line 1352 "oql-parser.php"
#line 1368 "oql-parser.php"
#line 75 "oql-parser.y"
function yy_r14(){
// create an array with one single item
$this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
}
#line 1358 "oql-parser.php"
#line 1374 "oql-parser.php"
#line 80 "oql-parser.y"
function yy_r15(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, '=', $this->yystack[$this->yyidx + 0]->minor); }
#line 1361 "oql-parser.php"
#line 1377 "oql-parser.php"
#line 82 "oql-parser.y"
function yy_r16(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; }
#line 1364 "oql-parser.php"
#line 1380 "oql-parser.php"
#line 87 "oql-parser.y"
function yy_r20(){ $this->_retvalue = new FunctionOqlExpression($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor); }
#line 1367 "oql-parser.php"
#line 1383 "oql-parser.php"
#line 88 "oql-parser.y"
function yy_r21(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; }
#line 1370 "oql-parser.php"
#line 1386 "oql-parser.php"
#line 89 "oql-parser.y"
function yy_r22(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); }
#line 1373 "oql-parser.php"
#line 1389 "oql-parser.php"
#line 104 "oql-parser.y"
function yy_r31(){
$this->_retvalue = new ListOqlExpression($this->yystack[$this->yyidx + -1]->minor);
}
#line 1378 "oql-parser.php"
#line 1394 "oql-parser.php"
#line 115 "oql-parser.y"
function yy_r34(){
$this->_retvalue = array();
}
#line 1383 "oql-parser.php"
#line 1399 "oql-parser.php"
#line 126 "oql-parser.y"
function yy_r38(){ $this->_retvalue = new IntervalOqlExpression($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); }
#line 1386 "oql-parser.php"
#line 1402 "oql-parser.php"
#line 138 "oql-parser.y"
function yy_r47(){ $this->_retvalue = new ScalarOqlExpression($this->yystack[$this->yyidx + 0]->minor); }
#line 1389 "oql-parser.php"
#line 1405 "oql-parser.php"
#line 141 "oql-parser.y"
function yy_r49(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor); }
#line 1392 "oql-parser.php"
#line 1408 "oql-parser.php"
#line 142 "oql-parser.y"
function yy_r50(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -2]->minor); }
#line 1395 "oql-parser.php"
#line 1411 "oql-parser.php"
#line 143 "oql-parser.y"
function yy_r51(){ $this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; }
#line 1398 "oql-parser.php"
#line 1414 "oql-parser.php"
#line 146 "oql-parser.y"
function yy_r52(){ $this->_retvalue = new VariableOqlExpression(substr($this->yystack[$this->yyidx + 0]->minor, 1)); }
#line 1401 "oql-parser.php"
#line 1417 "oql-parser.php"
#line 148 "oql-parser.y"
function yy_r53(){
if ($this->yystack[$this->yyidx + 0]->minor[0] == '`')
@@ -1407,13 +1423,13 @@ static public $yy_action = array(
}
$this->_retvalue = new OqlName($name, $this->m_iColPrev);
}
#line 1414 "oql-parser.php"
#line 1430 "oql-parser.php"
#line 160 "oql-parser.y"
function yy_r54(){$this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; }
#line 1417 "oql-parser.php"
#line 1433 "oql-parser.php"
#line 161 "oql-parser.y"
function yy_r55(){$this->_retvalue=stripslashes(substr($this->yystack[$this->yyidx + 0]->minor, 1, strlen($this->yystack[$this->yyidx + 0]->minor) - 2)); }
#line 1420 "oql-parser.php"
#line 1436 "oql-parser.php"
/**
* placeholder for the left hand side in a reduce operation.
@@ -1528,7 +1544,7 @@ static public $yy_action = array(
#line 25 "oql-parser.y"
throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN);
#line 1536 "oql-parser.php"
#line 1552 "oql-parser.php"
}
/**
@@ -1680,7 +1696,7 @@ throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCo
}
} while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
}
}#line 211 "oql-parser.y"
}#line 213 "oql-parser.y"
class OQLParserException extends OQLException
@@ -1745,4 +1761,4 @@ class OQLParser extends OQLParserRaw
}
}
#line 1755 "oql-parser.php"
#line 1771 "oql-parser.php"

View File

@@ -164,6 +164,7 @@ str_value(A) ::= STRVAL(X). {A=stripslashes(substr(X, 1, strlen(X) - 2));}
operator1(A) ::= num_operator1(X). {A=X;}
operator2(A) ::= num_operator2(X). {A=X;}
operator2(A) ::= str_operator(X). {A=X;}
operator2(A) ::= REGEXP(X). {A=X;}
operator2(A) ::= EQ(X). {A=X;}
operator2(A) ::= NOT_EQ(X). {A=X;}
operator3(A) ::= LOG_AND(X). {A=X;}
@@ -187,6 +188,7 @@ list_operator(A) ::= NOT_IN(X). {A=X;}
func_name(A) ::= F_IF(X). { A=X; }
func_name(A) ::= F_ELT(X). { A=X; }
func_name(A) ::= F_COALESCE(X). { A=X; }
func_name(A) ::= F_ISNULL(X). { A=X; }
func_name(A) ::= F_CONCAT(X). { A=X; }
func_name(A) ::= F_SUBSTR(X). { A=X; }
func_name(A) ::= F_TRIM(X). { A=X; }

View File

@@ -158,18 +158,25 @@ function DisplayStep2(SetupWebPage $oP, $sFrom, $sTo)
$oEmail->SetRecipientFrom($sFrom);
$oEmail->SetSubject("Test iTop");
$oEmail->SetBody("<p>Hello,</p><p>The email function is now working fine.</p><p>You may now be able to use the notification function.</p><p>iTop</p>");
$aIssues = $oEmail->send();
if (count($aIssues) > 0)
$iRes = $oEmail->Send($aIssues, true /* force synchronous exec */);
switch ($iRes)
{
foreach ($aIssues as $sError)
{
$oP->error($sError);
}
$oP->add("<button onClick=\"window.history.back();\"><< Back</button>\n");
}
else
{
$oP->ok("The email has been sent, you may now check that the email will arrive...");
case EMAIL_SEND_OK:
$oP->ok("The email has been sent, you may now check that the email will arrive...");
break;
case EMAIL_SEND_PENDING:
$oP->ok("Email queued");
$oP->add("<button onClick=\"window.history.back();\"><< Back</button>\n");
break;
case EMAIL_SEND_ERROR:
foreach ($aIssues as $sError)
{
$oP->error($sError);
}
$oP->add("<button onClick=\"window.history.back();\"><< Back</button>\n");
break;
}
}

View File

@@ -2997,35 +2997,36 @@ class TestTriggerAndEmail extends TestBizModel
protected function DoExecute()
{
$oMyPerson = MetaModel::NewObject("bizPerson");
$oMyPerson = MetaModel::NewObject("Person");
$oMyPerson->Set("name", "testemail1");
$oMyPerson->Set("first_name", "theodore");
$oMyPerson->Set("org_id", "1");
$oMyPerson->Set("email", "romain.quetiez@hp.com");
$oMyPerson->Set("email", "romain.quetiez@combodo.com");
$iPersonId = $this->ObjectToDB($oMyPerson, true);
$oMyPerson = MetaModel::NewObject("bizPerson");
$oMyPerson = MetaModel::NewObject("Person");
$oMyPerson->Set("name", "testemail2");
$oMyPerson->Set("first_name", "theodore");
$oMyPerson->Set("org_id", "1");
$oMyPerson->Set("email", "denis.flaven@hp.com");
$oMyPerson->Set("email", "denis.flaven@combodo.com");
$iPersonId = $this->ObjectToDB($oMyPerson, true);
$oMyPerson = MetaModel::NewObject("bizPerson");
$oMyPerson = MetaModel::NewObject("Person");
$oMyPerson->Set("name", "testemail3");
$oMyPerson->Set("first_name", "theodore");
$oMyPerson->Set("org_id", "1");
$oMyPerson->Set("email", "erwan.taloc@hp.com");
$oMyPerson->Set("email", "erwan.taloc@combodo.com");
$iPersonId = $this->ObjectToDB($oMyPerson, true);
$oMyServer = MetaModel::NewObject("bizServer");
$oMyServer = MetaModel::NewObject("Server");
$oMyServer->Set("name", "wfr.terminator.com");
$oMyServer->Set("severity", "low");
$oMyServer->Set("status", "production");
$oMyServer->Set("org_id", 2);
$oMyServer->Set("location_id", 2);
$iServerId = $this->ObjectToDB($oMyServer, true);
$oMyTrigger = MetaModel::NewObject("TriggerOnStateEnter");
$oMyTrigger->Set("description", "Testor");
$oMyTrigger->Set("target_class", "bizServer");
$oMyTrigger->Set("target_class", "Server");
$oMyTrigger->Set("state", "Shipped");
$iTriggerId = $this->ObjectToDB($oMyTrigger, true);
@@ -3035,9 +3036,9 @@ class TestTriggerAndEmail extends TestBizModel
(
$oMyTrigger,
'test',
"SELECT bizPerson WHERE naime = 'Dali'",
"SELECT bizServer",
'romain.quetiez@hp.com'
"SELECT Person WHERE naime = 'Dali'",
"SELECT Server",
'romain.quetiez@combodo.com'
);
// Error: no recipient
@@ -3048,7 +3049,7 @@ class TestTriggerAndEmail extends TestBizModel
'test',
"",
"",
'romain.quetiez@hp.com'
'romain.quetiez@combodo.com'
);
// Test
@@ -3057,9 +3058,9 @@ class TestTriggerAndEmail extends TestBizModel
(
$oMyTrigger,
'test',
"SELECT bizPerson WHERE name LIKE 'testemail%'",
"SELECT bizPerson",
'romain.quetiez@hp.com'
"SELECT Person WHERE name LIKE 'testemail%'",
"SELECT Person",
'romain.quetiez@combodo.com'
);
// Test failing because of a wrong test recipient address
@@ -3068,7 +3069,7 @@ class TestTriggerAndEmail extends TestBizModel
(
$oMyTrigger,
'test',
"SELECT bizPerson WHERE name LIKE 'testemail%'",
"SELECT Person WHERE name LIKE 'testemail%'",
"",
'toto@walibi.bg'
);
@@ -3079,9 +3080,9 @@ class TestTriggerAndEmail extends TestBizModel
(
$oMyTrigger,
'enabled',
"SELECT bizPerson WHERE name LIKE 'testemail%'",
"SELECT Person WHERE name LIKE 'testemail%'",
"",
'romain.quetiez@hp.com'
'romain.quetiez@combodo.com'
);
// Does nothing, because it is disabled
@@ -3090,9 +3091,9 @@ class TestTriggerAndEmail extends TestBizModel
(
$oMyTrigger,
'disabled',
"SELECT bizPerson WHERE name = 'testemail%'",
"SELECT Person WHERE name = 'testemail%'",
"",
'romain.quetiez@hp.com'
'romain.quetiez@combodo.com'
);
$oMyTrigger->DoActivate($oMyServer->ToArgs('this'));
@@ -3219,4 +3220,52 @@ class TestSetLinkset extends TestBizModel
}
}
class TestEmailAsynchronous extends TestBizModel
{
static public function GetName()
{
return 'Itop - Asynchronous email';
}
static public function GetDescription()
{
return 'Queues a request to send an email';
}
static public function GetConfigFile() {return '/config-itop.php';}
protected function DoExecute()
{
for ($i = 0 ; $i < 2 ; $i++)
{
$oMail = new Email();
$oMail->SetRecipientTO('romain.quetiez@combodo.com');
//$oMail->SetRecipientFrom('romain.quetiez@combodo.com');
$oMail->SetRecipientCC('romainquetiez@yahoo.fr');
$oMail->SetSubject('automated test - '.$i);
$oMail->SetBody('this is one is entirely working fine '.time());
$iRes = $oMail->Send($aIssues, false);
switch ($iRes)
{
case EMAIL_SEND_OK:
echo "EMAIL_SEND_OK<br/>\n";
break;
case EMAIL_SEND_PENDING:
echo "EMAIL_SEND_PENDING<br/>\n";
break;
case EMAIL_SEND_ERROR:
echo "EMAIL_SEND_ERROR: <br/>\n";
foreach($aIssues as $sIssue)
{
echo "Issue: $sIssue<br/>\n";
}
break;
}
}
}
}
?>