/**
 * Main zTag functions selector
 *
 * <code>
 * zdbal_zexecute($tagId, $tagFunction, $arrayTag, $arrayTagId, $arrayOrder);
 * </code>
 *
 * @param integer $tagId array id of current zTag of $arrayTag array
 * @param string $tagFunction name of zTag function
 * @param array $arrayTag array with all compiled zTags
 * @param array $arrayTagId array with all Ids values
 * @param array $arrayOrder array with zTag executing order
 *
 * @since 1.0
 */
function zdbal_zexecute($tagId, $tagFunction, &$arrayTag, &$arrayTagId, $arrayOrder)
{
    global $dbHandleDefault;
    $arrParam = $arrayTag[$tagId][ztagParam];
    $strId = $arrParam["id"];
    $strUpdate = $arrParam["update"];
    $strDriver = $arrParam["driver"];
    $strHost = $arrParam["host"];
    $strDatabase = $arrParam["database"];
    $strUser = $arrParam["user"];
    $strPassword = $arrParam["password"];
    $strFilename = $arrParam["filename"];
    $strMode = $arrParam["mode"];
    $strUse = $arrParam["use"];
    $strName = $arrParam["name"];
    $strVar = $arrParam["var"];
    $strTransform = $arrParam["transform"];
    $errorMessage = "";
    switch (strtolower($tagFunction)) {
        /*+
         * Open a database connection to defined driver and parameters
         *
         * <code>
         * <zdbal:open id="mysqlConn" driver="mysql" host="#mysqlHost" database="#mysqlDatabase" user="******" password="******" charset="utf8"/>
         *
         * <zdbal:open id="sqliteConn" driver="sqlite" filename="/ZTag/SQLite.db" />
         * </code>
         *
         * @param string id="MySQL Handle Id"
         * @param string driver="mssql|mysql|pgsql|sqlite|firebird"
         * @param string host="Host"
         * @param string database="Database name"
         * @param string user="******"
         * @param string password="******"
         * @param string port="8023"
         * @param string socket="socket"
         * @param string charset="utf8"
         */
        case 'open':
            $strCharset = $arrParam['charset'];
            $strPort = $arrParam['port'];
            $strSocket = $arrParam['charset'];
            $dbalDriver = constant("dbal{$strDriver}");
            if (strlen($strHost)) {
                ztagReturnConstant($strHost);
            }
            if (strlen($strDatabase)) {
                ztagReturnConstant($strDatabase);
            }
            if (strlen($strUser)) {
                ztagReturnConstant($strUser);
            }
            if (strlen($strPassword)) {
                ztagReturnConstant($strPassword);
            }
            $dbalConfig = new \Doctrine\DBAL\Configuration();
            $dbalParams = array('dbname' => $strDatabase, 'user' => $strUser, 'password' => $strPassword, 'host' => $strHost, 'driver' => $dbalDriver);
            /* Connect to the database */
            $dbHandle = \Doctrine\DBAL\DriverManager::getConnection($dbalParams);
            if ($errorMessage) {
                $errorMessage .= "<br />{$strDriver}{$errorMessage}";
            }
            $arrayTagId[$strId][ztagIdHandle] = $dbHandle;
            $arrayTagId[$strId][ztagIdType] = idTypeDBAL;
            $arrayTagId[$strId][ztagIdState] = idStateOpened;
            break;
            /*+
             * Close the Database connection openned with Id.
             *
             * <code>
             * <zdbal:close use="mysqlConn" />
             * </code>
             *
             * @param string use="mysqlConn"
             */
        /*+
         * Close the Database connection openned with Id.
         *
         * <code>
         * <zdbal:close use="mysqlConn" />
         * </code>
         *
         * @param string use="mysqlConn"
         */
        case 'close':
            $errorMessage .= ztagParamCheck($arrParam, "use");
            $arrayTagId[$strUse][ztagIdHandle]->close();
            $arrayTagId[$strUse][ztagIdState] = idStateClosed;
            break;
            /*+
             * Set a SQL query to use with another zdbal Tag.
             *
             * <code>
             * <zdbal:query use="ociConn" id="ociQuery">
             *   SELECT US.NM_USUARIO userLogin
             *   , P.NM_PESSOA userName
             *   , P.CD_PESSOA userId
             *   , US.CD_SESSAO_LOGIN userLoginLast
             *   , US.CD_SESSAO_LOGIN_ERRO userLoginError
             *   , US.NU_LOGIN_ERROS userLoginErrors
             *   , to_char(US.DT_LOGIN_BLOQUEIO,'yyyy/mm/dd hh24:mi:ss') userLoginBlocked
             *   FROM TB_USUARIO_SISTEMA US
             *   LEFT JOIN TB_PESSOA P ON US.CD_PESSOA_USUARIO = P.CD_PESSOA
             *   AND FL_ATIVO = 'S'
             * </zdbal:query>
             * </code>
             *
             * @param string use="ociConn" The Id Handle from a Open zdbal tag
             * @param string id="ociQuery" Id where the Query will be saved
             * @param string update="ociQuery" Id to be updated
             */
        /*+
         * Set a SQL query to use with another zdbal Tag.
         *
         * <code>
         * <zdbal:query use="ociConn" id="ociQuery">
         *   SELECT US.NM_USUARIO userLogin
         *   , P.NM_PESSOA userName
         *   , P.CD_PESSOA userId
         *   , US.CD_SESSAO_LOGIN userLoginLast
         *   , US.CD_SESSAO_LOGIN_ERRO userLoginError
         *   , US.NU_LOGIN_ERROS userLoginErrors
         *   , to_char(US.DT_LOGIN_BLOQUEIO,'yyyy/mm/dd hh24:mi:ss') userLoginBlocked
         *   FROM TB_USUARIO_SISTEMA US
         *   LEFT JOIN TB_PESSOA P ON US.CD_PESSOA_USUARIO = P.CD_PESSOA
         *   AND FL_ATIVO = 'S'
         * </zdbal:query>
         * </code>
         *
         * @param string use="ociConn" The Id Handle from a Open zdbal tag
         * @param string id="ociQuery" Id where the Query will be saved
         * @param string update="ociQuery" Id to be updated
         */
        case 'query':
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTag[$tagId][ztagContentWidth]) {
                $strContent = ztagVars($arrayTag[$tagId][ztagContent], $arrayTagId);
                if (!strlen($strId)) {
                    $errorMessage .= ztagParamCheck($arrParam, "update");
                    $strId = $strUpdate;
                } else {
                    $errorMessage .= ztagParamCheck($arrParam, "id");
                }
                // $dbStatement = $arrayTagId[$strUse][ztagIdHandle]->prepare($strContent);
                if ($strId) {
                    $arrayTagId[$strId][ztagIdValue] = $strContent;
                    $arrayTagId[$strId][ztagIdLength] = strlen($strContent);
                    $arrayTagId[$strId][ztagIdType] = idTypeQuery;
                    $arrayTagId[$strId][ztagIdHandle] = $arrayTagId[$strUse][ztagIdHandle];
                }
            } else {
                $errorMessage .= "<br />Tag Query cannot be empty!";
            }
            break;
            /*+
             * Return TRUE if the current record is at the first
             *
             * <code>
             * <zdbal:bof use="mysqlConn" />
             * </code>
             *
             * @param string use="mysqlConn" - The Id Handle from a Open zdbal tag
             */
        /*+
         * Return TRUE if the current record is at the first
         *
         * <code>
         * <zdbal:bof use="mysqlConn" />
         * </code>
         *
         * @param string use="mysqlConn" - The Id Handle from a Open zdbal tag
         */
        case "bof":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            $arrayTag[$tagId][ztagResult] = dbBOF($arrayTagId[$strUse][ztagIdHandle]);
            break;
            /*+
             * Return TRUE if the current record is at the first
             *
             * <code>
             * <zdbal:eof use="mysqlConn" />
             * </code>
             *
             * use="mysqlConn" - The Id Handle from a Open zdbal tag
             */
        /*+
         * Return TRUE if the current record is at the first
         *
         * <code>
         * <zdbal:eof use="mysqlConn" />
         * </code>
         *
         * use="mysqlConn" - The Id Handle from a Open zdbal tag
         */
        case "eof":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            $arrayTag[$tagId][ztagResult] = dbEOF($arrayTagId[$strUse][ztagIdHandle]);
            break;
            /*+
             * Return TRUE if the current record is at the first
             *
             * <code>
             * <zdbal:field use="mysqlConn" name="NM_NOME" />
             *
             * Or
             *
             * <zdbal:field name="NM_NOME" />
             * </code>
             *
             * @param string use="mysqlConn" - The Id Handle from a Open zdbal tag
             */
        /*+
         * Return TRUE if the current record is at the first
         *
         * <code>
         * <zdbal:field use="mysqlConn" name="NM_NOME" />
         *
         * Or
         *
         * <zdbal:field name="NM_NOME" />
         * </code>
         *
         * @param string use="mysqlConn" - The Id Handle from a Open zdbal tag
         */
        case "field":
            if ($intFather = $arrayTag[$tagId][ztagFather]) {
                $arrParam["use"] = "Field_{$intFather}";
            }
            // echo "<br />intFather=$intFather";
            $errorMessage .= ztagParamCheck($arrParam, "use,name");
            $dbHandle = $arrayTagId[$strUse][ztagIdHandle];
            $dbHandleValue = $dbHandle[dbHandleFetch][$strName];
            if ($strTransform) {
                $dbHandleValue = ztagTransform($dbHandleValue, $strTransform);
            }
            if ($strVar) {
                $arrayTagId['$' . $strVar][ztagIdValue] = $dbHandleValue;
                $arrayTagId['$' . $strVar][ztagIdType] = idTypeField;
            }
            $arrayTag[$tagId][ztagResult] = $dbHandleValue;
            break;
            /*+
             * FieldVar
             *
             * <code>
             * <zdbal:fieldvar use="mysqlConn" name="NM_NOME" var="$NM_NOME" />
             * </code>
             *
             * @param string use="mysqlConn" The Id Handle from a Open zdbal tag
             * @param string name="NM_NOME"
             * @param string var="$NM_NOME"
             */
        /*+
         * FieldVar
         *
         * <code>
         * <zdbal:fieldvar use="mysqlConn" name="NM_NOME" var="$NM_NOME" />
         * </code>
         *
         * @param string use="mysqlConn" The Id Handle from a Open zdbal tag
         * @param string name="NM_NOME"
         * @param string var="$NM_NOME"
         */
        case "fieldvar":
            $errorMessage .= ztagParamCheck($arrParam, "use,name,var");
            $dbHandle = $arrayTagId[$strUse][ztagIdHandle];
            $dbHandleValue = $dbHandle[dbHandleFetch][$strName];
            if ($strTransform) {
                $dbHandleValue = ztagTransform($dbHandleValue, $strTransform);
            }
            if ($strVar) {
                $arrayTagId['$' . $strVar][ztagIdValue] = $dbHandleValue;
                $arrayTagId['$' . $strVar][ztagIdType] = idTypeField;
            }
            break;
            /*+
             * Prepare
             *
             * <code>
             * <zdbal:prepare conn="oracleConn" use="oracleQuery" />
             * </code>
             *
             * @param string conn="oracleConn"
             * @param string use="oracleQuery"
             */
        /*+
         * Prepare
         *
         * <code>
         * <zdbal:prepare conn="oracleConn" use="oracleQuery" />
         * </code>
         *
         * @param string conn="oracleConn"
         * @param string use="oracleQuery"
         */
        case "prepare":
            $errorMessage .= ztagParamCheck($arrParam, "use,conn");
            $dbHandle = $arrayTagId[$strConn][ztagIdHandle];
            $dbQuery = $arrayTagId[$strUse][ztagIdValue];
            dbPrepare($dbHandle, $dbQuery);
            break;
            /*+
             * Prepare
             *
             * <code>
             * <zdbal:param use="query002" param="P_CD_PESSOA_USUARIO" var="" type="PARAM_INT" />
             * </code>
             *
             * @param string use="query002"
             * @param string param="P_CD_PESSOA_USUARIO"
             * @param string var=""
             * @param string type="PARAM_INT"
             */
        /*+
         * Prepare
         *
         * <code>
         * <zdbal:param use="query002" param="P_CD_PESSOA_USUARIO" var="" type="PARAM_INT" />
         * </code>
         *
         * @param string use="query002"
         * @param string param="P_CD_PESSOA_USUARIO"
         * @param string var=""
         * @param string type="PARAM_INT"
         */
        case "param":
            $errorMessage .= ztagParamCheck($arrParam, "id,value");
            $arrayTagId[$strId][ztagIdValue] = $strValue;
            $arrayTagId[$strId][ztagIdLength] = strlen($strValue);
            $arrayTagId[$strId][ztagIdType] = idTypeFVar;
            break;
            /*+
             * Create
             *
             * <code>
             * <zdbal:create use="query002" />
             * </code>
             *
             * @param string use="query002"
             */
        /*+
         * Create
         *
         * <code>
         * <zdbal:create use="query002" />
         * </code>
         *
         * @param string use="query002"
         */
        case "create":
            $errorMessage .= ztagParamCheck($arrParam, "id");
            if ($arrayTag[$tagId][ztagContentWidth]) {
                $strContent = $arrayTag[$tagId][ztagContent];
                $arrayTagId[$strId][ztagIdValue] = $strContent;
                $arrayTagId[$strId][ztagIdLength] = strlen($strContent);
            }
            break;
            /*+
             * Show
             *
             * <code>
             * <zdbal:show use="query002" />
             * </code>
             *
             * @param string use="query002"
             */
        /*+
         * Show
         *
         * <code>
         * <zdbal:show use="query002" />
         * </code>
         *
         * @param string use="query002"
         */
        case "show":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            $arrayTag[$tagId][ztagResult] = $arrayTagId[$strUse][ztagIdValue];
            break;
            /*+
             * List the available databases for this connection
             *
             * <code>
             * <zdbal:listdatabases use="myConn" var="myTables"/>
             * </code>
             *
             * @param string use="myConn"
             * @param string var="myTables"
             */
        /*+
         * List the available databases for this connection
         *
         * <code>
         * <zdbal:listdatabases use="myConn" var="myTables"/>
         * </code>
         *
         * @param string use="myConn"
         * @param string var="myTables"
         */
        case 'listdatabases':
            $errorMessage .= ztagParamCheck($arrParam, 'use,var');
            $smHandle = $arrayTagId[$strUse][ztagIdHandle]->getSchemaManager();
            if (strlen($strVar)) {
                $arrayTagId['$' . $strVar][ztagIdValue] = $smHandle->listDatabases();
                $arrayTagId['$' . $strVar][ztagIdType] = idTypeFVar;
            }
            // echo "<br /><pre>".print_r( $arrayTagId['$'.$strVar][ztagIdValue], 1);
            break;
            /*+
             * List the tables for the connection
             *
             * <code>
             * <zdbal:listtables use="myConn" var="myTables"/>
             * </code>
             *
             * @param string use="myConn"
             * @param string var="myTables"
             */
        /*+
         * List the tables for the connection
         *
         * <code>
         * <zdbal:listtables use="myConn" var="myTables"/>
         * </code>
         *
         * @param string use="myConn"
         * @param string var="myTables"
         */
        case 'listtables':
            $errorMessage .= ztagParamCheck($arrParam, 'use,var');
            $smHandle = $arrayTagId[$strUse][ztagIdHandle]->getSchemaManager();
            if (strlen($strVar)) {
                $arrayTagId['$' . $strVar][ztagIdValue] = $smHandle->listTableNames();
                $arrayTagId['$' . $strVar][ztagIdType] = idTypeFVar;
            }
            // echo "<br /><pre>".print_r( $arrayTagId['$'.$strVar][ztagIdValue], 1);
            break;
            /*+
             * Return a list of all tables in the current database
             *
             * <code>
             * <zdbal:listtablenames use="myConn" var="myTables"/>
             * </code>
             *
             * @param string use="myConn"
             * @param string var="myTables"
             */
        /*+
         * Return a list of all tables in the current database
         *
         * <code>
         * <zdbal:listtablenames use="myConn" var="myTables"/>
         * </code>
         *
         * @param string use="myConn"
         * @param string var="myTables"
         */
        case 'listtablenames':
            $errorMessage .= ztagParamCheck($arrParam, "use,var");
            $smHandle = $arrayTagId[$strUse][ztagIdHandle]->getSchemaManager();
            if (strlen($strVar)) {
                $arrayTagId['$' . $strVar][ztagIdValue] = $smHandle->listTableNames();
                $arrayTagId['$' . $strVar][ztagIdType] = idTypeFVar;
            }
            // echo "<br /><pre>".print_r( $arrayTagId['$'.$strVar][ztagIdValue], 1);
            break;
            /*+
             * List the columns for a given table.
             *
             * <code>
             * <zdbal:listtablecolumns use="myConn" table="tableName" var="myColumns"/>
             * </code>
             *
             * @param string use="myConn"
             * @param string table="tableName"
             * @param string var="myColumns"
             */
        /*+
         * List the columns for a given table.
         *
         * <code>
         * <zdbal:listtablecolumns use="myConn" table="tableName" var="myColumns"/>
         * </code>
         *
         * @param string use="myConn"
         * @param string table="tableName"
         * @param string var="myColumns"
         */
        case 'listtablecolumns':
            $strTable = $arrParam["table"];
            $errorMessage .= ztagParamCheck($arrParam, "use,table,var");
            $smHandle = $arrayTagId[$strUse][ztagIdHandle]->getSchemaManager();
            if (strlen($strVar) && strlen($strTable)) {
                $tableHandle = $smHandle->listTableColumns($strTable);
                foreach ($tableHandle as $key => $value) {
                    $tableValue[$key]['type'] = $value->getType()->getName();
                    $tableValue[$key]['fixed'] = $value->getFixed();
                    $tableValue[$key]['lenght'] = $value->getLength();
                    $tableValue[$key]['precision'] = $value->getPrecision();
                    $tableValue[$key]['scale'] = $value->getScale();
                    $tableValue[$key]['unsigned'] = $value->getUnsigned();
                    $tableValue[$key]['notnull'] = $value->getNotnull();
                    $tableValue[$key]['autoincrement'] = $value->getAutoincrement();
                    $tableValue[$key]['default'] = $value->getDefault();
                    // $tableValue[$key]['comment'] = $value->getComment();
                }
                $arrayTagId['$' . $strVar][ztagIdValue] = $tableValue;
                $arrayTagId['$' . $strVar][ztagIdType] = idTypeFVar;
            }
            // echo "<br /><pre>".print_r( $arrayTagId['$'.$strVar][ztagIdValue], 1);
            break;
        default:
            $errorMessage .= "<br />Undefined function \"{$tagFunction}\"";
    }
    ztagError($errorMessage, $arrayTag, $tagId);
}
/**
 * Main zTag functions selector
 *
 * <code>
 * znosql_execute($tagId, $tagFunction, $arrayTag, $arrayTagId, $arrayOrder);
 * </code>
 *
 * @param integer $tagId array id of current zTag of $arrayTag array
 * @param string $tagFunction name of zTag function
 * @param array $arrayTag array with all compiled zTags
 * @param array $arrayTagId array with all Ids values
 * @param array $arrayOrder array with zTag executing order
 *
 * @since 1.0
 */
function znosql_zexecute($tagId, $tagFunction, &$arrayTag, &$arrayTagId, $arrayOrder)
{
    $arrParam = $arrayTag[$tagId][ztagParam];
    $strId = $arrParam["id"];
    $strUse = $arrParam["use"];
    $strDatabase = $arrParam["database"];
    $strCollection = $arrParam["collection"];
    $strName = $arrParam["name"];
    $strValue = $arrParam["value"];
    $strVar = $arrParam["var"];
    $strTransform = $arrParam["transform"];
    if ($arrayTag[$tagId][ztagContentWidth]) {
        $strContent = $arrayTag[$tagId][ztagContent];
    }
    $errorMessage = "";
    switch (strtolower($tagFunction)) {
        /*+
         * Open connection to a NoSQL Server
         *
         * <code>
         * <znosql:open id="mongoDB" driver="Mongo" host="username:password@mongodb.zyc.com.br:27017" database="Direito2" collection="pubPaginas" />
         * <znosql:open id="mongoDB" driver="Mongo" host="mongodb.zyc.com.br" username="******" password="******" port="27017" database="Direito2" collection="pubPaginas" />
         * </code>
         *
         * @param string id="mongoDB"
         * @param string driver="Mongo"
         * @param string host="username:password@mongodb.zyc.com.br:27017" <-- mongodb://[username:password@]host1[:port1][,host2[:port2:],...]
         * @param string username="******"
         * @param string password="******"
         * @param int port="27017"
         * @param string options="option=value;option2=value2"
         * @param string database="Direito2"
         * @param string collection="pubPaginas"
         * @param boolean persist="0|1|true|false|x"
         */
        case "open":
            $strDriver = $arrParam["driver"];
            $strHost = $arrParam["host"];
            $strUsername = $arrParam["username"];
            $strPassword = $arrParam["password"];
            $strPort = $arrParam["port"];
            $strPersist = $arrParam["persist"];
            $strOptions = $arrParam["options"];
            ztagReturnConstant($strHost);
            ztagReturnConstant($strDatabase);
            ztagReturnConstant($strUsername);
            ztagReturnConstant($strPassword);
            ztagReturnConstant($strPort);
            $errorMessage .= ztagParamCheck($arrParam, "id,driver,host");
            $strDriver = constant("nosql{$strDriver}");
            if (strlen($strUsername) && strlen($strPassword)) {
                $strHost = "{$strUsername}:{$strPassword}@{$strHost}";
            }
            if (strlen($strPort)) {
                $strHost = "{$strHost}:{$strPort}";
            }
            if (strlen($strOptions)) {
                $strHost = "{$strHost}?{$strOptions}";
            }
            if (extension_loaded('mongo')) {
                try {
                    $nosqlHandle = array();
                    if ($strPersist === "true" || $strPersist === "1" || ($strPersist = "x")) {
                        $dbHandle = new Mongo($strHost, array("persist" => "x"));
                    } else {
                        $dbHandle = new Mongo($strHost);
                    }
                    if ($strDatabase) {
                        $nosqlDB = $nosqlHandle->selectDB($strDatabase);
                    }
                } catch (MongoConnectionException $e) {
                    $errorMessage .= "<br />Cannot connect to {$strDriver} (" . $e->getMessage() . ")";
                }
                if (strlen($strCollection)) {
                    $nosqlColection = $nosqlDB->selectCollection($strCollection);
                }
            } else {
                $errorMessage .= "<br />{$strDriver} extention is not installed!";
            }
            // Set all NoSQL handler structure
            $nosqlHandle[nosqlHandleDriver] = $strDriver;
            $nosqlHandle[nosqlHandleHost] = $strHost;
            $nosqlHandle[nosqlHandleDatabaseName] = $dbDatabase;
            $nosqlHandle[nosqlHandleUser] = $strUsername;
            $nosqlHandle[nosqlHandlePassword] = $strPassword;
            $nosqlHandle[nosqlHandlePort] = $strPort;
            $nosqlHandle[nosqlHandleId] = $dbHandle;
            $nosqlHandle[nosqlHandleState] = dbHandleStateOpen;
            $arrayTagId[$strId][ztagIdHandle] = $nosqlHandle;
            $arrayTagId[$strId][ztagIdType] = idTypeNoSQL;
            $arrayTagId[$strId][ztagIdState] = idStateOpened;
            break;
            /*+
             * Close a Opened NoSQL Handle connection
             *
             * <code>
             * <znosql:close use="mongoDB">
             * </code>
             *
             * @param string use="mongoDB"
             *
             */
        /*+
         * Close a Opened NoSQL Handle connection
         *
         * <code>
         * <znosql:close use="mongoDB">
         * </code>
         *
         * @param string use="mongoDB"
         *
         */
        case "close":
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    $dbHandle = $nosqlHandle[nosqlHandleId];
                    $dbHandle->close();
                    $arrayTagId[$strUse][ztagIdHandle] = $dbHandle;
                    $arrayTagId[$strUse][ztagIdState] = idStateClosed;
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Do an Insert in currente Collection
             *
             * </code>
             * <znosql:insert use="mongoDB">
             *  pagCodigo="1"
             *  , pagNome="Page \"title\""
             *  , pagResumo='Page \'resume\''
             *  , pagDescricao:"Page body"
             *  , pagPalavrasChave:{"example","NoSQL"}
             *  , pagInclusao='2010/10/10'
             *  , pagAtivo=1
             * </znosql:insert>
             *
             * <znosql:insert use="mongoDB" value="$varInsert" />
             * </code>
             *
             *  @param string use="mongoDB"
             *  @param boolean safe="true|false|1|0"
             *  @param boolean fsync="true|false|1|0"
             */
        /*+
         * Do an Insert in currente Collection
         *
         * </code>
         * <znosql:insert use="mongoDB">
         *  pagCodigo="1"
         *  , pagNome="Page \"title\""
         *  , pagResumo='Page \'resume\''
         *  , pagDescricao:"Page body"
         *  , pagPalavrasChave:{"example","NoSQL"}
         *  , pagInclusao='2010/10/10'
         *  , pagAtivo=1
         * </znosql:insert>
         *
         * <znosql:insert use="mongoDB" value="$varInsert" />
         * </code>
         *
         *  @param string use="mongoDB"
         *  @param boolean safe="true|false|1|0"
         *  @param boolean fsync="true|false|1|0"
         */
        case "insert":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleCollection]) {
                        $dbHandle = $nosqlHandle[nosqlHandleId];
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $strCollection = $nosqlHandle[nosqlHandleCollectionName];
                        $dbHandleCollection = $nosqlHandle[nosqlHandleCollection];
                        // Prepare the tag content
                        if (strlen($strContent)) {
                            $contentArray = $strContent;
                        }
                        if (strlen($strValue)) {
                            $contentArray = $strValue;
                        }
                        if (strlen($contentArray)) {
                            $contentArray = ztagVars($contentArray, $arrayTagId);
                        }
                        if (strlen($contentArray)) {
                            $contentArray = ztagRun($contentArray, 0, $arrayTagId);
                        }
                        if (!strlen($strContent) && !strlen($strValue)) {
                            $errorMessage .= ztagParamCheck($arrParam, "value");
                        }
                        if (strlen($strTransform) && strlen($contentArray)) {
                            $contentArray = ztagTransform($contentArray, $strTransform);
                        }
                        $contentArray = znosql_lib_Content2Array($contentArray);
                        // @TODO Think how to manage the safe option and it's MongoCursorException
                        try {
                            $dbResult = $dbHandleCollection->insert($contentArray);
                            // echo "<br /><pre>".print_r($contentArray, 1)."</pre>";
                            if (!strlen($dbResult)) {
                                $errorMessage .= "<br />Cannot insert into collection {$strCollection} at database {$strDatabase}  <pre>" . print_r($dbResult, 1) . "</pre>";
                            }
                        } catch (MongoException $e) {
                            $errorMessage .= "<br />Cannot insert into collection {$strCollection} at database {$strDatabase} (" . $e->getMessage() . ")";
                        }
                        $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Execute a NoSQL commands
             *
             * <code>
             * <znosql:get use="mongoDB">
             *   Commands
             * </znosql:get>
             * </code>
             *
             * @param string use="mongoDB"
             *
             */
        /*+
         * Execute a NoSQL commands
         *
         * <code>
         * <znosql:get use="mongoDB">
         *   Commands
         * </znosql:get>
         * </code>
         *
         * @param string use="mongoDB"
         *
         */
        case "getone":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleCollection]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $strCollection = $nosqlHandle[nosqlHandleCollectionName];
                        $dbHandleCollection = $nosqlHandle[nosqlHandleCollection];
                        // Prepare the tag content
                        if (strlen($strContent)) {
                            $contentArray = $strContent;
                        }
                        if (strlen($strValue)) {
                            $contentArray = $strValue;
                        }
                        if (strlen($contentArray)) {
                            $contentArray = ztagVars($contentArray, $arrayTagId);
                        }
                        if (!strlen($strContent) && !strlen($strValue)) {
                            $errorMessage .= ztagParamCheck($arrParam, "value");
                        }
                        if (strlen($strTransform) && strlen($contentArray)) {
                            $contentArray = ztagTransform($contentArray, $strTransform);
                        }
                        $contentArray = ltrim($contentArray, "\r\n");
                        $contentArray = rtrim($contentArray, "\r\n");
                        preg_match_all("%criteria\\s*{(?P<criteria>(?:\\}|[^}])*?)}(\\s*,\\s*fields\\s*{(?P<fields>(?:\\}|[^}])*?)})?%", $contentArray, $Matches, PREG_OFFSET_CAPTURE);
                        $arrayCriteria = znosql_lib_Content2Array($Matches["criteria"][0][0]);
                        if ($Matches["fields"][0][0]) {
                            $arrayFields = znosql_lib_Content2Array($Matches["fields"][0][0], 1);
                        }
                        // @TODO Think how to manage the safe option and it's MongoCursorException
                        try {
                            if (count($arrayFields)) {
                                $dbResult = $dbHandleCollection->findOne($arrayCriteria, $arrayFields);
                            } else {
                                $dbResult = $dbHandleCollection->findOne($arrayCriteria);
                            }
                            if (strlen($strVar) && count($dbResult)) {
                                $arrayTagId["\$" . $strVar][ztagIdValue] = $value;
                                $arrayTagId["\$" . $strVar][ztagIdType] = idTypeFVar;
                            }
                        } catch (MongoConnectionException $e) {
                            $errorMessage .= "<br />Cannot find the criteria into collection {$strCollection} at database {$strDatabase} (" . $e->getMessage() . ")";
                        }
                        $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Execute a NoSQL commands
             *
             * <code>
             * <znosql:get use="mongoDB">
             *   Commands
             * </znosql:execute>
             * </code>
             *
             * $query - the evaluation or "where" expression
             * $orderby - sort order desired
             * $hint - hint to query optimizer
             * $explain - if true, return explain plan results instead of query results
             * $snapshot - if true, "snapshot mode"
             */
        /*+
         * Execute a NoSQL commands
         *
         * <code>
         * <znosql:get use="mongoDB">
         *   Commands
         * </znosql:execute>
         * </code>
         *
         * $query - the evaluation or "where" expression
         * $orderby - sort order desired
         * $hint - hint to query optimizer
         * $explain - if true, return explain plan results instead of query results
         * $snapshot - if true, "snapshot mode"
         */
        case "getall":
            /*$errorMessage .= ztagParamCheck($arrParam, "use");
            	    // $cursor = $this->collection->find($f);
            
            	    $k = array();
            	    $i = 0;
            
            	    while( $cursor->hasNext())
            	    {
            	        $k[$i] = $cursor->getNext();
            	      $i++;
            	    }
            
            	    // return $k;
            	     *
            	     */
            break;
            /*+
             * Do an Update in currente Collection
             *
             * <code>
             * <znosql:update use="mongoDB">
             *  criteria{pagCodigo="1"}
             *  , set{pagNome="Page \"title\" Updated"
             *  , pagResumo='Page \'resume\''
             *  , pagDescricao:"Page body"
             *  , pagPalavrasChave:{"example","NoSQL"}
             *  , pagInclusao='2010/10/10'
             *  , pagAtivo=1
             *  }
             * </znosql:update>
             *
             * <znosql:update use="mongoDB" criteria="$varCriteria" value="$varInsert" />
             * </code>
             *
             * @param string use="mongoDB"
             * @param boolean upsert="true|false|1|0"
             * @param boolean multiple="true|false|1|0"
             * @param boolean safe="true|false|1|0"
             * @param boolean fsync="true|false|1|0"
             */
        /*+
         * Do an Update in currente Collection
         *
         * <code>
         * <znosql:update use="mongoDB">
         *  criteria{pagCodigo="1"}
         *  , set{pagNome="Page \"title\" Updated"
         *  , pagResumo='Page \'resume\''
         *  , pagDescricao:"Page body"
         *  , pagPalavrasChave:{"example","NoSQL"}
         *  , pagInclusao='2010/10/10'
         *  , pagAtivo=1
         *  }
         * </znosql:update>
         *
         * <znosql:update use="mongoDB" criteria="$varCriteria" value="$varInsert" />
         * </code>
         *
         * @param string use="mongoDB"
         * @param boolean upsert="true|false|1|0"
         * @param boolean multiple="true|false|1|0"
         * @param boolean safe="true|false|1|0"
         * @param boolean fsync="true|false|1|0"
         */
        case "update":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleCollection]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $strCollection = $nosqlHandle[nosqlHandleCollectionName];
                        $dbHandleCollection = $nosqlHandle[nosqlHandleCollection];
                        // Prepare the tag content
                        if (strlen($strContent)) {
                            $contentArray = $strContent;
                        }
                        if (strlen($strValue)) {
                            $contentArray = $strValue;
                        }
                        if (strlen($contentArray)) {
                            $contentArray = ztagVars($contentArray, $arrayTagId);
                        }
                        if (!strlen($strContent) && !strlen($strValue)) {
                            $errorMessage .= ztagParamCheck($arrParam, "value");
                        }
                        if (strlen($strTransform) && strlen($contentArray)) {
                            $contentArray = ztagTransform($contentArray, $strTransform);
                        }
                        $contentArray = ltrim($contentArray, "\r\n");
                        $contentArray = rtrim($contentArray, "\r\n");
                        preg_match_all("%criteria\\s*{(?P<criteria>(?:\\}|[^}])*?)}\\s*,\\s*set\\s*{(?P<set>(?:\\}|[^}])*?)}%", $contentArray, $Matches, PREG_OFFSET_CAPTURE);
                        // echo "<br /><pre>".print_r($Matches, 1)."</pre>";
                        $arrayCriteria = znosql_lib_Content2Array($Matches["criteria"][0][0]);
                        $arraySet = array('$set' => znosql_lib_Content2Array($Matches["set"][0][0]));
                        // @TODO Think how to manage the safe option and it's MongoCursorException
                        try {
                            $dbResult = $dbHandleCollection->update($arrayCriteria, $arraySet);
                            // echo "<br /><pre>".print_r($contentArray, 1)."</pre>";
                            if (!$dbResult) {
                                $errorMessage .= "<br />Cannot update the criteria into collection {$strCollection} at database {$strDatabase}  <pre>" . print_r($dbResult, 1) . "</pre>";
                            }
                        } catch (InvalidArgumentException $e) {
                            $errorMessage .= "<br />Cannot update the criteria into collection {$strCollection} at database {$strDatabase} (" . $e->getMessage() . ")";
                        }
                        $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Delete a criteria at current collection
             *
             * <code>
             * <znosql:delete use="mongoDB">
             *  pagCodigo="1"
             * </znosql:delete>
             *
             * <znosql:delete use="mongoDB" criteria="$varCriteria" />
             * </code>
             *
             * @param string use="mongoDB"
             * @param boolean justone="true|false|1|0"
             * @param boolean safe="true|false|1|0"
             * @param boolean fsync="true|false|1|0"
             */
        /*+
         * Delete a criteria at current collection
         *
         * <code>
         * <znosql:delete use="mongoDB">
         *  pagCodigo="1"
         * </znosql:delete>
         *
         * <znosql:delete use="mongoDB" criteria="$varCriteria" />
         * </code>
         *
         * @param string use="mongoDB"
         * @param boolean justone="true|false|1|0"
         * @param boolean safe="true|false|1|0"
         * @param boolean fsync="true|false|1|0"
         */
        case "delete":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleCollection]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $strCollection = $nosqlHandle[nosqlHandleCollectionName];
                        $dbHandleCollection = $nosqlHandle[nosqlHandleCollection];
                        // Prepare the tag content
                        if (strlen($strContent)) {
                            $contentArray = $strContent;
                        }
                        if (strlen($strValue)) {
                            $contentArray = $strValue;
                        }
                        if (strlen($contentArray)) {
                            $contentArray = ztagVars($contentArray, $arrayTagId);
                        }
                        if (!strlen($strContent) && !strlen($strValue)) {
                            $errorMessage .= ztagParamCheck($arrParam, "value");
                        }
                        if (strlen($strTransform) && strlen($contentArray)) {
                            $contentArray = ztagTransform($contentArray, $strTransform);
                        }
                        $contentArray = znosql_lib_Content2Array($contentArray);
                        // echo "<br /><pre>contentArray=".print_r($contentArray, 1)."</pre>";
                        // @TODO Think how to manage the safe option and it's MongoCursorException
                        try {
                            $dbResult = $dbHandleCollection->remove($contentArray);
                            // echo "<br /><pre>dbResult=".print_r($dbResult, 1)."</pre>";
                            if (!$dbResult) {
                                $errorMessage .= "<br />Cannot delete the criteria into collection {$strCollection} at database {$strDatabase}  <pre>" . print_r($dbResult, 1) . "</pre>";
                            }
                        } catch (InvalidArgumentException $e) {
                            $errorMessage .= "<br />Cannot delete the criteria into collection {$strCollection} at database {$strDatabase} (" . $e->getMessage() . ")";
                        }
                        $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Execute a NoSQL commands
             *
             * <code>
             * <znosql:execute use="mongoDB">
             *   Commands
             * </znosql:execute>
             * </code>
             *
             * @param string use="mongoDB"
             *
             */
        /*+
         * Execute a NoSQL commands
         *
         * <code>
         * <znosql:execute use="mongoDB">
         *   Commands
         * </znosql:execute>
         * </code>
         *
         * @param string use="mongoDB"
         *
         */
        case "execute":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            // Execute Close, but I don't know yet!
            $arrayTagId[$strUse][ztagIdState] = idStateClosed;
            // mongo->execute($cmd);
            break;
            /*+
             * Set a database for current Opened NoSQL connection
             *
             * <code>
             * <znosql:setdatabase use="mongoDB" name="Direito2" />
             * </code>
             *
             * @param string use="mongoDB"
             * @param string name="Direito2" The database name.
             */
        /*+
         * Set a database for current Opened NoSQL connection
         *
         * <code>
         * <znosql:setdatabase use="mongoDB" name="Direito2" />
         * </code>
         *
         * @param string use="mongoDB"
         * @param string name="Direito2" The database name.
         */
        case "setdatabase":
            $errorMessage .= ztagParamCheck($arrParam, "use,name");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    $dbHandle = $nosqlHandle[nosqlHandleId];
                    try {
                        $dbHandleDatabase = $dbHandle->selectDB($strName);
                        $nosqlHandle[nosqlHandleDatabaseName] = $strName;
                        $nosqlHandle[nosqlHandleDatabase] = $dbHandleDatabase;
                    } catch (InvalidArgumentException $e) {
                        $errorMessage .= "<br />Invalid database name {$strName} (" . $e->getMessage() . ")";
                    }
                    $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * List all databases
             *
             * <code>
             * <znosql:listdatabases use="mongoDB" id="mongoDBlist" var="databasesList" total="databasesTotalSize">
             *   <br /><znosql:field use="mongoDBlist" name="name" /> - <znosql:field use="mongoDBlist" name="sizeOnDisk" /> - <znosql:field use="mongoDBlist" name="empty" />
             * </znosql:listdatabases>
             * </code>
             *
             * @param string use="mongoDB" A NoSQL handle
             * @param string id="mongoDBlist" Id with array of each line
             * @param string var="databasesList" Variable with array of each line
             * @param string total="databasesTotalSize" Variable with total size
             */
        /*+
         * List all databases
         *
         * <code>
         * <znosql:listdatabases use="mongoDB" id="mongoDBlist" var="databasesList" total="databasesTotalSize">
         *   <br /><znosql:field use="mongoDBlist" name="name" /> - <znosql:field use="mongoDBlist" name="sizeOnDisk" /> - <znosql:field use="mongoDBlist" name="empty" />
         * </znosql:listdatabases>
         * </code>
         *
         * @param string use="mongoDB" A NoSQL handle
         * @param string id="mongoDBlist" Id with array of each line
         * @param string var="databasesList" Variable with array of each line
         * @param string total="databasesTotalSize" Variable with total size
         */
        case "listdatabases":
            $strTotal = $arrParam["total"];
            $errorMessage .= ztagParamCheck($arrParam, "use,id");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    $dbHandle = $nosqlHandle[nosqlHandleId];
                    $arrayDatabases = $dbHandle->listDBs();
                    $totalDbSize = $arrayDatabases['totalSize'];
                    foreach ($arrayDatabases["databases"] as $key => $value) {
                        if (strlen($strId)) {
                            $arrayTagId[$strId][ztagIdValue] = $arrayDatabases["databases"][$key];
                            $arrayTagId[$strId][ztagIdType] = idTypeValue;
                        }
                        if (strlen($strVar)) {
                            $arrayTagId["\$" . $strVar][ztagIdValue] = $arrayDatabases["databases"][$key];
                            $arrayTagId["\$" . $strVar][ztagIdType] = idTypeFVar;
                        }
                        $strResult = ztagRun($strContent, 0, $arrayTagId);
                        $arrayTag[$tagId][ztagResult] .= $strResult;
                    }
                    if (strlen($strTotal)) {
                        $arrayTagId["\$" . $strTotal][ztagIdValue] = $arrayDatabases[totalSize];
                        $arrayTagId["\$" . $strTotal][ztagIdType] = idTypeFVar;
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Return the server Stats
             *
             * <code>
             * <znosql:getstats use="mongoDB" var="mongoStats" />
             * </code>
             *
             * @param string use="mongoDB"
             * @param string var="mongoStats"
             */
        /*+
         * Return the server Stats
         *
         * <code>
         * <znosql:getstats use="mongoDB" var="mongoStats" />
         * </code>
         *
         * @param string use="mongoDB"
         * @param string var="mongoStats"
         */
        case "getstats":
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    $dbHandle = $nosqlHandle[nosqlHandleId];
                    $arrayDatabases = $dbHandle->listDBs();
                    $dbHandleAdmin = $dbHandle->selectDB('admin');
                    $arrayReturn = array_merge($dbHandleAdmin->command(array('buildinfo' => 1)), $dbHandleAdmin->command(array('serverStatus' => 1)));
                    $profile = $dbHandleAdmin->command(array('profile' => -1));
                    $arrayReturn['profilingLevel'] = $profile['was'];
                    $arrayReturn['mongoDbTotalSize'] = round($totalDbSize / 1000000) . 'mb';
                    $prevError = $dbHandleAdmin->command(array('getpreverror' => 1));
                    if (!$prevError['n']) {
                        $arrayReturn['previousDbErrors'] = 'None';
                    } else {
                        $arrayReturn['previousDbErrors']['error'] = $prevError['err'];
                        $arrayReturn['previousDbErrors']['numberOfOperationsAgo'] = $prevError['nPrev'];
                    }
                    $arrayReturn['globalLock']['totalTime'] .= ' &#0181;Sec';
                    $arrayReturn['uptime'] = round($arrayReturn['uptime'] / 60) . ':' . str_pad($arrayReturn['uptime'] % 60, 2, '0', STR_PAD_LEFT) . ' minutes';
                    $arrayUnshift['mongo'] = $arrayReturn['version'] . ' (' . $arrayReturn['bits'] . '-bit)';
                    $arrayUnshift['mongoPhpDriver'] = Mongo::VERSION;
                    $arrayUnshift['phpMoAdmin'] = '1.0.8';
                    $arrayUnshift['php'] = PHP_VERSION . ' (' . (PHP_INT_MAX > 2200000000.0 ? 64 : 32) . '-bit)';
                    $arrayUnshift['gitVersion'] = $arrayReturn['gitVersion'];
                    unset($arrayReturn['ok'], $arrayReturn['version'], $arrayReturn['gitVersion'], $arrayReturn['bits']);
                    $arrayReturn = array_merge(array('version' => $arrayUnshift), $arrayReturn);
                    $iniIndex = array(-1 => 'Unlimited', 'Off', 'On');
                    $phpIni = array('allow_persistent', 'auto_reconnect', 'chunk_size', 'cmd', 'default_host', 'default_port', 'max_connections', 'max_persistent');
                    foreach ($phpIni as $ini) {
                        $key = 'php_' . $ini;
                        $arrayReturn[$key] = ini_get('mongo.' . $ini);
                        if (isset($iniIndex[$arrayReturn[$key]])) {
                            $arrayReturn[$key] = $iniIndex[$arrayReturn[$key]];
                        }
                    }
                    if (strlen($strVar)) {
                        $arrayTagId["\$" . $strVar][ztagIdValue] = $arrayReturn;
                        $arrayTagId["\$" . $strVar][ztagIdType] = idTypeFVar;
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Repair the current Database
             *
             * <code>
             * <znosql:repairdatabase use="mongoDB" preserveclonedfiles="true" backuporiginalfiles="true" />
             * </code>
             *
             * @param boolean preserveclonedfiles="true|false|1|0"
             * @param boolean backuporiginalfiles="true|false|1|0"
             */
        /*+
         * Repair the current Database
         *
         * <code>
         * <znosql:repairdatabase use="mongoDB" preserveclonedfiles="true" backuporiginalfiles="true" />
         * </code>
         *
         * @param boolean preserveclonedfiles="true|false|1|0"
         * @param boolean backuporiginalfiles="true|false|1|0"
         */
        case "repairdatabase":
            $strPreserveClonedFiles = $arrParam["preserveclonedfiles"];
            $strBackupOriginalFiles = $arrParam["backuporiginalfiles"];
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleDatabase]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $dbHandleDatabase = $nosqlHandle[nosqlHandleDatabase];
                        try {
                            if ($strPreserveClonedFiles === "true" || $strPreserveClonedFiles === "1") {
                                $strPreserveClonedFiles = true;
                            }
                            if ($strBackupOriginalFiles === "true" || $strBackupOriginalFiles === "1") {
                                $strBackupOriginalFiles = true;
                            }
                            if (strlen($strPreserveClonedFiles) && !strlen($strBackupOriginalFiles)) {
                                $dbResult = $dbHandleDatabase->repair($strPreserveClonedFiles);
                            } elseif (strlen($strBackupOriginalFiles)) {
                                $dbResult = $dbHandleDatabase->repair($strPreserveClonedFiles, $strBackupOriginalFiles);
                            } else {
                                $dbResult = $dbHandleDatabase->repair();
                            }
                            if ($dbResult["ok"] != 1) {
                                $errorMessage .= "<br />Cannot repair the {$strDatabase} <pre>" . print_r($dbResult, 1) . "</pre>";
                            }
                        } catch (InvalidArgumentException $e) {
                            $errorMessage .= "<br />Invalid database name {$strDatabase} (" . $e->getMessage() . ")";
                        }
                        $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Drop current database
             *
             * <code>
             * <znosql:dropdatabase use="mongoDB" />
             * </code>
             *
             * @param string use="mongoDB"
             */
        /*+
         * Drop current database
         *
         * <code>
         * <znosql:dropdatabase use="mongoDB" />
         * </code>
         *
         * @param string use="mongoDB"
         */
        case "dropdatabase":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleDatabase]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $dbHandleDatabase = $nosqlHandle[nosqlHandleDatabase];
                        try {
                            $dbResult = $dbHandleDatabase->drop();
                            if ($dbResult["ok"] == 1) {
                                $nosqlHandle[nosqlHandleDatabaseName] = null;
                                $nosqlHandle[nosqlHandleDatabase] = null;
                            } else {
                                $errorMessage .= "<br />Cannot drop the database {$strDatabase} <pre>" . print_r($dbResult, 1) . "</pre>";
                            }
                        } catch (InvalidArgumentException $e) {
                            $errorMessage .= "<br />Cannot drop the database {$strDatabase} (" . $e->getMessage() . ")";
                        }
                        $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Set a collection for current database
             *
             * <code>
             * <znosql:setcollection use="mongoDB" name="pubPaginas" />
             * </code>
             *
             * @param string use="mongoDB"
             * @param string name="pubPaginas"
             */
        /*+
         * Set a collection for current database
         *
         * <code>
         * <znosql:setcollection use="mongoDB" name="pubPaginas" />
         * </code>
         *
         * @param string use="mongoDB"
         * @param string name="pubPaginas"
         */
        case "setcollection":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleDatabase]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $dbHandleDatabase = $nosqlHandle[nosqlHandleDatabase];
                        try {
                            $dbHandleCollection = $dbHandleDatabase->selectCollection($strName);
                            $nosqlHandle[nosqlHandleCollectionName] = $strName;
                            $nosqlHandle[nosqlHandleCollection] = $dbHandleCollection;
                        } catch (InvalidArgumentException $e) {
                            $errorMessage .= "<br />Invalid collection name {$strName} at database {$strDatabase} (" . $e->getMessage() . ")";
                        }
                        $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * List all databases
             *
             * <code>
             * <znosql:listcollections use="mongoDB" id="mongoDBlist" var="databasesList" total="databasesTotalSize">
             *   <br /><znosql:field use="mongoDBlist" name="name" /> - <znosql:field use="mongoDBlist" name="sizeOnDisk" /> - <znosql:field use="mongoDBlist" name="empty" />
             * </znosql:listcollections>
             * </code>
             *
             * @param string use="mongoDB" A NoSQL handle
             * @param string id="mongoDBlist" Id with array of each line
             * @param string var="databasesList" Variable with array of each line
             * @param string total="databasesTotalSize" Variable with total size
             */
        /*+
         * List all databases
         *
         * <code>
         * <znosql:listcollections use="mongoDB" id="mongoDBlist" var="databasesList" total="databasesTotalSize">
         *   <br /><znosql:field use="mongoDBlist" name="name" /> - <znosql:field use="mongoDBlist" name="sizeOnDisk" /> - <znosql:field use="mongoDBlist" name="empty" />
         * </znosql:listcollections>
         * </code>
         *
         * @param string use="mongoDB" A NoSQL handle
         * @param string id="mongoDBlist" Id with array of each line
         * @param string var="databasesList" Variable with array of each line
         * @param string total="databasesTotalSize" Variable with total size
         */
        case "listcollections":
            $strTotal = $arrParam["total"];
            $errorMessage .= ztagParamCheck($arrParam, "use,id");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleDatabase]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $dbHandleDatabase = $nosqlHandle[nosqlHandleDatabase];
                        $arrayCollections = $dbHandleDatabase->listCollections();
                        foreach ($arrayCollections as $dbHandleCollecion) {
                            if ($strId) {
                                $arrayTagId[$strId][ztagIdValue] = array("name" => $dbHandleCollecion->getName());
                                $arrayTagId[$strId][ztagIdType] = idTypeValue;
                            }
                            if ($strVar) {
                                $arrayTagId["\$" . $strVar][ztagIdValue] = array("name" => $dbHandleCollecion->getName());
                                $arrayTagId["\$" . $strVar][ztagIdType] = idTypeFVar;
                            }
                            $strResult = ztagRun($strContent, 0, $arrayTagId);
                            $arrayTag[$tagId][ztagResult] .= $strResult;
                        }
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Drop a collection for current database
             *
             * <code>
             * <znosql:dropcollection use="mongoDB" />
             * </code>
             *
             * @param string use="mongoDB"
             */
        /*+
         * Drop a collection for current database
         *
         * <code>
         * <znosql:dropcollection use="mongoDB" />
         * </code>
         *
         * @param string use="mongoDB"
         */
        case "dropcollection":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleCollection]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $strCollection = $nosqlHandle[nosqlHandleCollectionName];
                        $dbHandleCollection = $nosqlHandle[nosqlHandleCollection];
                        try {
                            $dbResult = $dbHandleCollection->drop();
                            if ($dbResult["ok"] == 1) {
                                $nosqlHandle[nosqlHandleCollectionName] = null;
                                $nosqlHandle[nosqlHandleCollection] = null;
                            } else {
                                $errorMessage .= "<br />Cannot drop the collection {$strCollection} at database {$strDatabase}  <pre>" . print_r($dbResult, 1) . "</pre>";
                            }
                        } catch (InvalidArgumentException $e) {
                            $errorMessage .= "<br />Cannot drop the collection {$strCollection} at database {$strDatabase} (" . $e->getMessage() . ")";
                        }
                        $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Create a collection for current database
             *
             * </code>
             * <znosql:createcollection use="mongoDB" name="pubPaginas" />
             * </code>
             *
             * @param string use="mongoDB"
             * @param string name="pubPaginas" The name of the collection.
             * @param boolean capped="true|false|1|0" If the collection should be a fixed size.
             * @param int  size="10000000" If the collection is fixed size, its size in bytes.
             * @param int max="1000" If the collection is fixed size, the maximum number of elements to store in the collection.
             */
        /*+
         * Create a collection for current database
         *
         * </code>
         * <znosql:createcollection use="mongoDB" name="pubPaginas" />
         * </code>
         *
         * @param string use="mongoDB"
         * @param string name="pubPaginas" The name of the collection.
         * @param boolean capped="true|false|1|0" If the collection should be a fixed size.
         * @param int  size="10000000" If the collection is fixed size, its size in bytes.
         * @param int max="1000" If the collection is fixed size, the maximum number of elements to store in the collection.
         */
        case "createcollection":
            $errorMessage .= ztagParamCheck($arrParam, "use,name");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleDatabase]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $dbHandleDatabase = $nosqlHandle[nosqlHandleDatabase];
                        try {
                            $dbHandleCollection = $dbHandleDatabase->createCollection($strName);
                            $nosqlHandle[nosqlHandleCollectionName] = $strName;
                            $nosqlHandle[nosqlHandleCollection] = $dbHandleCollection;
                        } catch (InvalidArgumentException $e) {
                            $errorMessage .= "<br />Cannot create the collection {$strName} at database {$strDatabase} (" . $e->getMessage() . ")";
                        }
                        $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Create a collection for current database
             *
             * <code>
             * <znosql:createcollection use="mongoDB" from="pubPaginas" to="pubPaginasOld"/>
             * </code>
             *
             * @param string use="mongoDB"
             * @param string from="pubPaginas"
             * @param string to="pubPaginasOld"
             */
        /*+
         * Create a collection for current database
         *
         * <code>
         * <znosql:createcollection use="mongoDB" from="pubPaginas" to="pubPaginasOld"/>
         * </code>
         *
         * @param string use="mongoDB"
         * @param string from="pubPaginas"
         * @param string to="pubPaginasOld"
         */
        case "renamecollection":
            $strFrom = $arrParam["from"];
            $strTo = $arrParam["to"];
            $errorMessage .= ztagParamCheck($arrParam, "use,name");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    $dbHandle = $nosqlHandle[nosqlHandleId];
                    if ($nosqlHandle[nosqlHandleDatabase]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $dbResult = $dbHandle->selectDB('admin')->command(array('renameCollection' => "{$strDatabase}.{$strFrom}", 'to' => "{$strDatabase}.{$strTo}"));
                        echo "<pre>" . print_r($dbResult, 1) . "</pre>";
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * List all indexes for a Collection
             *
             * <code>
             * <znosql:listindexes use="mongoDB" collection="pubPaginas" />
             * </code>
             *
             * @param string use="mongoDB"
             * @param string collection="pubPaginas"
             */
        /*+
         * List all indexes for a Collection
         *
         * <code>
         * <znosql:listindexes use="mongoDB" collection="pubPaginas" />
         * </code>
         *
         * @param string use="mongoDB"
         * @param string collection="pubPaginas"
         */
        case "listindexes":
            return $this->mongo->selectCollection($collection)->getIndexInfo();
            break;
            /*+
             * Ensure a index of current collection
             *
             * <code>
             * <znosql:ensureindex use="mongoDB" />
             * </code>
             *
             * @param string use="mongoDB"
             */
        /*+
         * Ensure a index of current collection
         *
         * <code>
         * <znosql:ensureindex use="mongoDB" />
         * </code>
         *
         * @param string use="mongoDB"
         */
        case "ensureindex":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTagId[$strUse][ztagIdType] === idTypeNoSQL) {
                if ($arrayTagId[$strUse][ztagIdState] === idStateOpened) {
                    $nosqlHandle = $arrayTagId[$strUse][ztagIdHandle];
                    if ($nosqlHandle[nosqlHandleCollection]) {
                        $strDatabase = $nosqlHandle[nosqlHandleDatabaseName];
                        $strCollection = $nosqlHandle[nosqlHandleCollectionName];
                        $dbHandleCollection = $nosqlHandle[nosqlHandleCollection];
                        try {
                            $dbResult = $dbHandleCollection->ensureIndex();
                            $unique = $unique ? true : false;
                            //signature requires a bool in both Mongo v. 1.0.1 and 1.2.0
                            // mongo->selectCollection($collection)->ensureIndex($indexes, $unique);
                            if ($dbResult["ok"] == 1) {
                                $nosqlHandle[nosqlHandleCollectionName] = null;
                                $nosqlHandle[nosqlHandleCollection] = null;
                            } else {
                                $errorMessage .= "<br />Cannot drop the collection {$strCollection} at database {$strDatabase}  <pre>" . print_r($dbResult, 1) . "</pre>";
                            }
                        } catch (InvalidArgumentException $e) {
                            $errorMessage .= "<br />Cannot drop the collection {$strCollection} at database {$strDatabase} (" . $e->getMessage() . ")";
                        }
                        $arrayTagId[$strUse][ztagIdHandle] = $nosqlHandle;
                    } else {
                        $errorMessage .= "<br />The {$strUse} NoSQL handler do not have a database defined!";
                    }
                } else {
                    $errorMessage .= "<br />The {$strUse} NoSQL handler is not Open!";
                }
            } else {
                $errorMessage .= "<br />The {$strUse} type is not a NoSQL!";
            }
            break;
            /*+
             * Delete a index for a Collection
             *
             * <code>
             * <znosql:deleteindex use="mongoDB" collection="pubPaginas" index="pagNome"/>
             * </code>
             *
             * @param string use="mongoDB"
             * @param string collection="pubPaginas"
             * @param string index="pagNome"
             *
             */
        /*+
         * Delete a index for a Collection
         *
         * <code>
         * <znosql:deleteindex use="mongoDB" collection="pubPaginas" index="pagNome"/>
         * </code>
         *
         * @param string use="mongoDB"
         * @param string collection="pubPaginas"
         * @param string index="pagNome"
         *
         */
        case "deleteindex":
            // mongo->selectCollection($collection)->deleteIndex($index);
            break;
            /*+
             * Return the content of name field of current record
             *
             * </code>
             * <zdb:field use="mongoDBlist" name="name" />
             * </code>
             *
             * @param string use="mongoDBlist" - The Id Handle from current array
             * @param string name="name"
             */
        /*+
         * Return the content of name field of current record
         *
         * </code>
         * <zdb:field use="mongoDBlist" name="name" />
         * </code>
         *
         * @param string use="mongoDBlist" - The Id Handle from current array
         * @param string name="name"
         */
        case "field":
            $strVar = $arrParam["var"];
            $errorMessage .= ztagParamCheck($arrParam, "use,name");
            $fieldArray = $arrayTagId[$strUse][ztagIdValue];
            $fieldValue = $fieldArray[$strName];
            if (strlen($strTransform)) {
                $fieldValue = ztagTransform($fieldValue, $strTransform);
            }
            if (strlen($strVar)) {
                $arrayTagId["\$" . $strVar][ztagIdValue] = $fieldValue;
                $arrayTagId["\$" . $strVar][ztagIdType] = idTypeField;
            }
            $arrayTag[$tagId][ztagResult] = $fieldValue;
            break;
        default:
            $errorMessage .= "<br />Undefined function \"{$tagFunction}\"";
    }
    ztagError($errorMessage, $arrayTag, $tagId);
}
Exemple #3
0
/**
 * Main zTag functions selector
 *
 * <code>
 * zdb_zexecute($tagId, $tagFunction, $arrayTag, $arrayTagId, $arrayOrder);
 * </code>
 *
 * @param integer $tagId array id of current zTag of $arrayTag array
 * @param string $tagFunction name of zTag function
 * @param array $arrayTag array with all compiled zTags
 * @param array $arrayTagId array with all Ids values
 * @param array $arrayOrder array with zTag executing order
 *
 * @since 1.0
 */
function zdb_zexecute($tagId, $tagFunction, &$arrayTag, &$arrayTagId, $arrayOrder)
{
    global $dbHandleDefault;
    $arrParam = $arrayTag[$tagId][ztagParam];
    $strId = $arrParam["id"];
    $strUpdate = $arrParam["update"];
    $strDriver = $arrParam["driver"];
    $strHost = $arrParam["host"];
    $strDatabase = $arrParam["database"];
    $strUser = $arrParam["user"];
    $strPassword = $arrParam["password"];
    $strFilename = $arrParam["filename"];
    $strMode = $arrParam["mode"];
    $strUse = $arrParam["use"];
    $strName = $arrParam["name"];
    $strTransform = $arrParam["transform"];
    $errorMessage = "";
    switch (strtolower($tagFunction)) {
        /*+
         * Open a database connection to defined driver and parameters
         *
         * <code>
         * <zdb:open id="mysqlConn" driver="mysql" host="#mysqlHost" database="#mysqlDatabase" user="******" password="******" charset="utf8"/>
         *
         * <zdb:open id="sqliteConn" driver="sqlite" filename="/ZTag/SQLite.db" />
         * </code>
         *
         * @param string id="MySQL Handle Id"
         * @param string driver="mssql|mysql|pgsql|sqlite|firebird"
         * @param string host="Host"
         * @param string database="Database name"
         * @param string user="******"
         * @param string password="******"
         * @param string charset="utf8"
         */
        case "open":
            $strCharset = $arrParam["charset"];
            $strDriver = constant("db{$strDriver}");
            switch ($strDriver) {
                case dbOCI:
                    $blnDatabase = 0;
                    break;
                default:
                    $blnDatabase = 1;
            }
            if (strlen($strHost)) {
                ztagReturnConstant($strHost);
            }
            if (strlen($strDatabase)) {
                ztagReturnConstant($strDatabase);
            }
            if (strlen($strUser)) {
                ztagReturnConstant($strUser);
            }
            if (strlen($strPassword)) {
                ztagReturnConstant($strPassword);
            }
            switch ($strDriver) {
                case dbSQLite:
                    if (strlen($strFilename)) {
                        ztagReturnConstant($strFilename);
                    }
                    if (strlen($strMode)) {
                        ztagReturnConstant($strMode);
                    }
                    if (!$strMode) {
                        $strMode = 0666;
                    }
                    $errorMessage .= ztagParamCheck($arrParam, "id,driver,filename");
                    $dbHandle = dbOpenFile($strDriver, $strFilename, $strMode);
                    if ($arrParam["name"]) {
                        $dbHandleDefault = $dbHandle;
                    }
                    break;
                case dbFirebird:
                    // @TODO melhorar o esquema de retornar as variáveis, podemos usar o @@ para todas as variáveis, inclusive as constantes
                    $errorMessage .= ztagParamCheck($arrParam, "id,driver,user,password,database");
                    $dbHandle = dbOpen($strDriver, $strHost, $strDatabase, $strUser, $strPassword);
                    break;
                case dbMySQL:
                    // @TODO melhorar o esquema de retornar as variáveis, podemos usar o @@ para todas as variáveis, inclusive as constantes
                    if (!$strDatabase && $blnDatabase) {
                        $checkParam .= ",database";
                    }
                    $errorMessage .= ztagParamCheck($arrParam, "id,driver,host,user,password{$checkParam}");
                    $dbHandle = dbOpen($strDriver, $strHost, $strDatabase, $strUser, $strPassword, $strCharset);
                default:
                    // @TODO melhorar o esquema de retornar as variáveis, podemos usar o @@ para todas as variáveis, inclusive as constantes
                    if (!$strDatabase && $blnDatabase) {
                        $checkParam .= ",database";
                    }
                    $errorMessage .= ztagParamCheck($arrParam, "id,driver,host,user,password{$checkParam}");
                    $dbHandle = dbOpen($strDriver, $strHost, $strDatabase, $strUser, $strPassword);
            }
            if ($errorMessage) {
                $errorMessage .= "<br />{$strDriver}{$errorMessage}";
            }
            $arrayTagId[$strId][ztagIdHandle] = $dbHandle;
            $arrayTagId[$strId][ztagIdType] = idTypeDB;
            $arrayTagId[$strId][ztagIdState] = idStateOpened;
            break;
            /*+
             * Close the Database connection openned with Id.
             *
             * <code>
             * <zdb:close use="mysqlConn" />
             * </code>
             *
             * @param string use="mysqlConn"
             */
        /*+
         * Close the Database connection openned with Id.
         *
         * <code>
         * <zdb:close use="mysqlConn" />
         * </code>
         *
         * @param string use="mysqlConn"
         */
        case "close":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            dbClose($arrayTagId[$strUse][ztagIdHandle]);
            $arrayTagId[$strUse][ztagIdState] = idStateClosed;
            break;
            /*+
             * Set a SQL query to use with another zDB Tag.
             *
             * <code>
             * <zdb:query use="ociConn" id="ociQuery">
             *   SELECT US.NM_USUARIO userLogin
             *   , P.NM_PESSOA userName
             *   , P.CD_PESSOA userId
             *   , US.CD_SESSAO_LOGIN userLoginLast
             *   , US.CD_SESSAO_LOGIN_ERRO userLoginError
             *   , US.NU_LOGIN_ERROS userLoginErrors
             *   , to_char(US.DT_LOGIN_BLOQUEIO,'yyyy/mm/dd hh24:mi:ss') userLoginBlocked
             *   FROM TB_USUARIO_SISTEMA US
             *   LEFT JOIN TB_PESSOA P ON US.CD_PESSOA_USUARIO = P.CD_PESSOA
             *   AND FL_ATIVO = 'S'
             * </zdb:query>
             * </code>
             *
             * @param string use="ociConn" The Id Handle from a Open zDB tag
             * @param string id="ociQuery" Id where the Query will be saved
             * @param string update="ociQuery" Id to be updated
             */
        /*+
         * Set a SQL query to use with another zDB Tag.
         *
         * <code>
         * <zdb:query use="ociConn" id="ociQuery">
         *   SELECT US.NM_USUARIO userLogin
         *   , P.NM_PESSOA userName
         *   , P.CD_PESSOA userId
         *   , US.CD_SESSAO_LOGIN userLoginLast
         *   , US.CD_SESSAO_LOGIN_ERRO userLoginError
         *   , US.NU_LOGIN_ERROS userLoginErrors
         *   , to_char(US.DT_LOGIN_BLOQUEIO,'yyyy/mm/dd hh24:mi:ss') userLoginBlocked
         *   FROM TB_USUARIO_SISTEMA US
         *   LEFT JOIN TB_PESSOA P ON US.CD_PESSOA_USUARIO = P.CD_PESSOA
         *   AND FL_ATIVO = 'S'
         * </zdb:query>
         * </code>
         *
         * @param string use="ociConn" The Id Handle from a Open zDB tag
         * @param string id="ociQuery" Id where the Query will be saved
         * @param string update="ociQuery" Id to be updated
         */
        case "query":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            if ($arrayTag[$tagId][ztagContentWidth]) {
                $strContent = ztagVars($arrayTag[$tagId][ztagContent], $arrayTagId);
                if (!strlen($strId)) {
                    $errorMessage .= ztagParamCheck($arrParam, "update");
                    $strId = $strUpdate;
                } else {
                    $errorMessage .= ztagParamCheck($arrParam, "id");
                }
                if ($strId) {
                    $arrayTagId[$strId][ztagIdValue] = $strContent;
                    $arrayTagId[$strId][ztagIdLength] = strlen($strContent);
                    $arrayTagId[$strId][ztagIdType] = idTypeQuery;
                    $arrayTagId[$strId][ztagIdHandle] = $arrayTagId[$strUse][ztagIdHandle];
                }
                dbQuery($arrayTagId[$strId][ztagIdHandle], $strContent);
            } else {
                $errorMessage .= "<br />Tag Query cannot be empty!";
            }
            break;
            /*+
             * Return TRUE if the current record is at the first
             *
             * <code>
             * <zdb:bof use="mysqlConn" />
             * </code>
             *
             * @param string use="mysqlConn" - The Id Handle from a Open zDB tag
             */
        /*+
         * Return TRUE if the current record is at the first
         *
         * <code>
         * <zdb:bof use="mysqlConn" />
         * </code>
         *
         * @param string use="mysqlConn" - The Id Handle from a Open zDB tag
         */
        case "bof":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            $arrayTag[$tagId][ztagResult] = dbBOF($arrayTagId[$strUse][ztagIdHandle]);
            break;
            /*+
             * Return TRUE if the current record is at the first
             *
             * <code>
             * <zdb:eof use="mysqlConn" />
             * </code>
             *
             * use="mysqlConn" - The Id Handle from a Open zDB tag
             */
        /*+
         * Return TRUE if the current record is at the first
         *
         * <code>
         * <zdb:eof use="mysqlConn" />
         * </code>
         *
         * use="mysqlConn" - The Id Handle from a Open zDB tag
         */
        case "eof":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            $arrayTag[$tagId][ztagResult] = dbEOF($arrayTagId[$strUse][ztagIdHandle]);
            break;
            /*+
             * Return TRUE if the current record is at the first
             *
             * <code>
             * <zdb:field use="mysqlConn" name="NM_NOME" />
             *
             * Or
             *
             * <zdb:field name="NM_NOME" />
             * </code>
             *
             * @param string use="mysqlConn" - The Id Handle from a Open zDB tag
             */
        /*+
         * Return TRUE if the current record is at the first
         *
         * <code>
         * <zdb:field use="mysqlConn" name="NM_NOME" />
         *
         * Or
         *
         * <zdb:field name="NM_NOME" />
         * </code>
         *
         * @param string use="mysqlConn" - The Id Handle from a Open zDB tag
         */
        case "field":
            if ($intFather = $arrayTag[$tagId][ztagFather]) {
                $arrParam["use"] = "Field_{$intFather}";
            }
            // echo "<br />intFather=$intFather";
            $strVar = $arrParam["var"];
            $errorMessage .= ztagParamCheck($arrParam, "use,name");
            $dbHandle = $arrayTagId[$strUse][ztagIdHandle];
            $dbHandleValue = $dbHandle[dbHandleFetch][$strName];
            if ($strTransform) {
                $dbHandleValue = ztagTransform($dbHandleValue, $strTransform);
            }
            if ($strVar) {
                $arrayTagId["\$" . $strVar][ztagIdValue] = $dbHandleValue;
                $arrayTagId["\$" . $strVar][ztagIdType] = idTypeField;
            }
            $arrayTag[$tagId][ztagResult] = $dbHandleValue;
            break;
            /*+
             * FieldVar
             *
             * <code>
             * <zdb:fieldvar use="mysqlConn" name="NM_NOME" var="$NM_NOME" />
             * </code>
             *
             * @param string use="mysqlConn" The Id Handle from a Open zDB tag
             * @param string name="NM_NOME"
             * @param string var="$NM_NOME"
             */
        /*+
         * FieldVar
         *
         * <code>
         * <zdb:fieldvar use="mysqlConn" name="NM_NOME" var="$NM_NOME" />
         * </code>
         *
         * @param string use="mysqlConn" The Id Handle from a Open zDB tag
         * @param string name="NM_NOME"
         * @param string var="$NM_NOME"
         */
        case "fieldvar":
            $strVar = $arrParam["var"];
            $errorMessage .= ztagParamCheck($arrParam, "use,name,var");
            $dbHandle = $arrayTagId[$strUse][ztagIdHandle];
            $dbHandleValue = $dbHandle[dbHandleFetch][$strName];
            if ($strTransform) {
                $dbHandleValue = ztagTransform($dbHandleValue, $strTransform);
            }
            if ($strVar) {
                $arrayTagId["\$" . $strVar][ztagIdValue] = $dbHandleValue;
                $arrayTagId["\$" . $strVar][ztagIdType] = idTypeField;
            }
            break;
            /*+
             * Prepare
             *
             * <code>
             * <zdb:prepare conn="oracleConn" use="oracleQuery" />
             * </code>
             *
             * @param string conn="oracleConn"
             * @param string use="oracleQuery"
             */
        /*+
         * Prepare
         *
         * <code>
         * <zdb:prepare conn="oracleConn" use="oracleQuery" />
         * </code>
         *
         * @param string conn="oracleConn"
         * @param string use="oracleQuery"
         */
        case "prepare":
            $errorMessage .= ztagParamCheck($arrParam, "use,conn");
            $dbHandle = $arrayTagId[$strConn][ztagIdHandle];
            $dbQuery = $arrayTagId[$strUse][ztagIdValue];
            dbPrepare($dbHandle, $dbQuery);
            break;
            /*+
             * Prepare
             *
             * <code>
             * <zdb:param use="query002" param="P_CD_PESSOA_USUARIO" var="" type="PARAM_INT" />
             * </code>
             *
             * @param string use="query002"
             * @param string param="P_CD_PESSOA_USUARIO"
             * @param string var=""
             * @param string type="PARAM_INT"
             */
        /*+
         * Prepare
         *
         * <code>
         * <zdb:param use="query002" param="P_CD_PESSOA_USUARIO" var="" type="PARAM_INT" />
         * </code>
         *
         * @param string use="query002"
         * @param string param="P_CD_PESSOA_USUARIO"
         * @param string var=""
         * @param string type="PARAM_INT"
         */
        case "param":
            $errorMessage .= ztagParamCheck($arrParam, "id,value");
            $arrayTagId[$strId][ztagIdValue] = $strValue;
            $arrayTagId[$strId][ztagIdLength] = strlen($strValue);
            $arrayTagId[$strId][ztagIdType] = idTypeFVar;
            break;
            /*+
             * Create
             *
             * <code>
             * <zdb:create use="query002" />
             * </code>
             *
             * @param string use="query002"
             */
        /*+
         * Create
         *
         * <code>
         * <zdb:create use="query002" />
         * </code>
         *
         * @param string use="query002"
         */
        case "create":
            $errorMessage .= ztagParamCheck($arrParam, "id");
            if ($arrayTag[$tagId][ztagContentWidth]) {
                $strContent = $arrayTag[$tagId][ztagContent];
                $arrayTagId[$strId][ztagIdValue] = $strContent;
                $arrayTagId[$strId][ztagIdLength] = strlen($strContent);
            }
            break;
            /*+
             * Show
             *
             * <code>
             * <zdb:show use="query002" />
             * </code>
             *
             * @param string use="query002"
             */
        /*+
         * Show
         *
         * <code>
         * <zdb:show use="query002" />
         * </code>
         *
         * @param string use="query002"
         */
        case "show":
            $errorMessage .= ztagParamCheck($arrParam, "use");
            $arrayTag[$tagId][ztagResult] = $arrayTagId[$strUse][ztagIdValue];
            break;
        default:
            $errorMessage .= "<br />Undefined function \"{$tagFunction}\"";
    }
    ztagError($errorMessage, $arrayTag, $tagId);
}
Exemple #4
0
/**
 * Processa as variáveis de todos os parâmetros da matriz
 *
 * <code>
 * ztagVarsParam($arrParam, $arrayTagId);
 * </code>
 *
 * @param array $arrParam array com os parâmetros
 * @param array $arrayTagId matriz com todas as variáveis
 *
 * @return array matriz $arrParam atualizada
 *
 * @since 1.0
 */
function ztagVarsParam($arrParam, $arrayTagId)
{
    /* @TODO incluir o transform nas varíaveis no momento da leitura incluindo o -> mais os comandos, como:
     * $pagNome->upper()spacify()
     * $pagNome->lower->spacify->truncate()
     * $pagNome->lower->truncate(30)->spacify()
     * $pagNome->lower->spacify->truncate(30:, ". . .")
     *
     * Novas:
     * capitalize - mesmo que o sentence
     * count(blnSpaces=1) - Conta caracteres blnSpaces = false, não inclui espaços
     * cat("Concaternar") - Concatena o texto na variável
     * countP() ou countParagraphs - Conta parágrafos
     * countS() ou countSentences - Conta sentenças
     * countW() ou countWords - Conta palavras
     * dateFormat("formato") - Formata data como no PHP
     * default(valor default) - Valor default para uma variável
     * escape() - retorna os caracteres deixando a apresentação do HTML contido
     * indent()(quantidade, "caracter) - indenta a "quantidade" de caracteres, sendo 4 o padrão e " " o padrão do caracter
     * lower() ou toLower - converte todas as letras para minúculas
     * upper() ou toUpper - converte todas as letras para minúsculas
     * nl2br() - converte todos os \r\n para <br />
     * nl2p() - converte todos os \r\n para <p>conteúdo da linha</p>
     * nl2Tag("tag") - converte todos os \r\n para a <tag>conteúdo da linha</tag> ou somente <tag>
     * regexReplate(expressão, resultado) - executa o replace usando regEx
     * replace(find, replace) - executa o replace
     * spacify(int, caracter) - inclui espaços entre cada caracter da variável
     * stringFormtat("string no formato do printf") - formata a string com o formato do printf
     * strip("caracter") troca \s+ \n+ \t+ pelo caracter definido
     * stripTags() - some com todas as tags <...>
     * truncate(limit, "texto adicional", blnWord=0) - trunca os caracteres no limite e poderá incluir o texto adicional e/ou truncar na palavra.
     * wordWrap(limit, "\n") - inclui no limite \n sempre no limite definido ou com a string definida
     *
     * <zconfig:Load file="Arquivo" section="Sessão" />
     *
     * <zc:foreach from="array" item="" key="chave" var="variável do for each">
     * <foreach:first /> - se estiver na 1a
     * <foreach:last /> - se for a última
     * </zc:foreach>
     *
     * <foreach:total /> - número de iterações do foreach
     *
     * <zc:if expression="Expressão">
     *   Conteúdo que será executado/apresentado no then
     *   <zc:elseif expression="Expressão" />
     *   Conteúdo que será apresentado no else
     *   <zc:else />
     *   Conteúdo que será apresentado no else
     * </zc:if>
     *
     * <zc:switch expression="expressão">
     *   <zc:case expression="expressão" />
     *     Valor que será executado no case
     *
     *   <zc:case expression="expressão" />
     *     Valor que será executado no case
     *
     *   <zc:defaiçt />
     *     Valor que será executado no caso de nenhum case ter dado
     * </zc:switch>
     *
     * <zliteral:create id="id">
     *   Bloco que será apresentado sem processamento
     * </zliteral:create>
     *
     * <zcounter:set id="Nome do contador" />
     *
     * Ou talvez usando o {$varInt++}
     * Ou talvez usando o {$varInt--}
     *
     * Define uma variável cíclica... todas as vezes que você usar o valor, ele trocará o valor circularmente
     * <zvar:cicle id="bgColor" cicles="gray,lightgray,yellow" />
     * <tr bgcolor="$bgColor"> <-- Mostra o gray
     * <tr bgcolor="$bgColor"> <-- Mostra o lightgray
     * <tr bgcolor="$bgColor"> <-- Mostra o yellow
     *
     * <zeval />
     *
     * <ztextformat:set wrap="valor" indent="4">
     * </ztextformat:set>
     *
     *
     * @TODO Estudar uma forma de colocar no código variáveis e fórmulas
     *
     * Talvez usando o
     * Mostrar {$nomeVariavel}
     * Operações {$nomeVariavel * $nomeVariavel}
     * Atribuição {$variavelString = "Conteúdo"}
     * Atribuição {$variavelInt1  = 1}
     * Atribuição {$variavelInt2  = 2}
     * Comparação {$variavelInt1 === $variavelInt2}
     * Transformação {$variavelString->sentence()->substr(1, 2)}
     */
    if (is_array($arrParam)) {
        foreach ($arrParam as $keyParam => $valueParam) {
            // Seleciona somente os parâmetros que tiveram variáveis
            preg_match_all("%(?P<var>(?P<type>[\$@#!])[\\w_-]+)(?P<param>(\\[([\"]?.*?[\"]?|['].*?['])?\\])*)?%si", $valueParam, $Matches, PREG_OFFSET_CAPTURE);
            if (preg_last_error()) {
                debugError("<b>preg_last_error</b>:" . preg_last_error());
            }
            $patterns = array();
            $replacements = array();
            $i = 0;
            foreach ($Matches[0] as $key => $value) {
                $strVar = $Matches["var"][$key][0];
                $strType = $Matches["type"][$key][0];
                $patterns[$i] = "/\\{$strVar}/";
                if ($strType === "#") {
                    $replacements[$i++] = ztagReturnConstant($strVar);
                } else {
                    if ($strType === "!") {
                        $replacements[$i++] = $_SESSION[substr($strVar, 1, strlen($strVar))];
                    } else {
                        $strParam = $Matches["param"][$key][0];
                        // Processa as matrizes
                        if ($strParam) {
                            // Recupera a array que será utilizada
                            $varVar = $arrayTagId[$strVar][ztagIdValue];
                            if (is_array($varVar)) {
                                // Localiza cada um dos parâmetros para o processamento
                                preg_match_all("%\\[(?P<inner>[\"']?(?P<param>.+?)[\"']?)\\]%si", $strParam, $MatchesParam, PREG_OFFSET_CAPTURE);
                                // debugError($MatchesParam, 1);
                                $strEval = "return \$varVar";
                                $strPaternParam = "";
                                foreach ($MatchesParam[0] as $keyInner => $valueInner) {
                                    $strParamContent = ztagVars($MatchesParam["param"][$keyInner][0], $arrayTagId);
                                    if (preg_match("/\\d+/", $strParamContent)) {
                                        $strEval .= "[{$strParamContent}]";
                                    } else {
                                        $strEval .= "[\"{$strParamContent}\"]";
                                    }
                                    $strPaternParam .= "\\[" . $MatchesParam["inner"][$keyInner][0] . "\\]";
                                }
                                $strEval .= ";";
                                $patterns[$i] = "/\\{$strVar}{$strPaternParam}/";
                                $replacements[$i++] = eval($strEval);
                            } else {
                                return "The {$strVar} is not a array!";
                            }
                        } else {
                            $replacements[$i++] = $arrayTagId[$strVar][ztagIdValue];
                        }
                    }
                }
            }
            $arrParam[$keyParam] = preg_replace($patterns, $replacements, $valueParam);
        }
    }
    return $arrParam;
}