[Beeframework-svn] SF.net SVN: beeframework:[40] trunk/framework/Bee
Brought to you by:
b_hartmann,
m_plomer
|
From: <m_p...@us...> - 2013-06-25 11:44:14
|
Revision: 40
http://sourceforge.net/p/beeframework/code/40
Author: m_plomer
Date: 2013-06-25 11:44:09 +0000 (Tue, 25 Jun 2013)
Log Message:
-----------
- updated Doctrine2 DaoBase
- Doctrine2 Log4PHP implementation of SQLLogger
- minor fix in Context\ParserDelegate
Modified Paths:
--------------
trunk/framework/Bee/Context/Xml/ParserDelegate.php
trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php
Added Paths:
-----------
trunk/framework/Bee/Persistence/Doctrine2/Log4PHPLogger.php
Modified: trunk/framework/Bee/Context/Xml/ParserDelegate.php
===================================================================
--- trunk/framework/Bee/Context/Xml/ParserDelegate.php 2013-06-12 14:14:12 UTC (rev 39)
+++ trunk/framework/Bee/Context/Xml/ParserDelegate.php 2013-06-25 11:44:09 UTC (rev 40)
@@ -462,7 +462,9 @@
if (!$this->isDefaultNamespace($ele->namespaceURI)) {
// todo MP: why is this missing? prevents XMLs with e.g. nested <util:array/> elements from being parsed
- return $this->parseNestedCustomElement($ele, $bd);
+// return $this->parseNestedCustomElement($ele, $bd);
+// return $this->parseCustomElement($ele, $bd);
+ throw new Bee_Context_BeanCreationException($bd->getBeanClassName(), 'Namespaced nested elements are currently not supported');
} else if (Bee_Utils_Dom::nodeNameEquals($ele, self::BEAN_ELEMENT)) {
@@ -630,7 +632,8 @@
/**
* Enter description here...
*
- * @param DOMElement $root
+ * @param DOMElement $ele
+ * @param Bee_Context_Config_IBeanDefinition $containingBd
* @return Bee_Context_Config_IBeanDefinition
*/
public function parseCustomElement(DOMElement $ele, Bee_Context_Config_IBeanDefinition $containingBd = null) {
Modified: trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php
===================================================================
--- trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php 2013-06-12 14:14:12 UTC (rev 39)
+++ trunk/framework/Bee/Persistence/Doctrine2/DaoBase.php 2013-06-25 11:44:09 UTC (rev 40)
@@ -13,20 +13,133 @@
/**
* @var EntityManager
*/
- private $em;
+ private $entityManager;
/**
- * @return EntityManager
+ * @return EntityManager $entityManager
*/
- public function getEm() {
- return $this->em;
+ public function getEntityManager() {
+ return $this->entityManager;
}
/**
- * @param EntityManager $em
+ * @param $entityManager EntityManager
*/
- public function setEm(EntityManager $em) {
- $this->em = $em;
+ public function setEntityManager(EntityManager $entityManager) {
+ $this->entityManager = $entityManager;
+ }
+
+
+
+
+ /**
+ * @param \Doctrine\ORM\QueryBuilder $query
+ * @param \Bee_Persistence_IRestrictionHolder $restrictionHolder
+ * @param \Bee_Persistence_IOrderAndLimitHolder $orderAndLimitHolder
+ * @param array $defaultOrderMapping
+ *
+ * @return array
+ */
+ public function executeListQuery(\Doctrine\ORM\QueryBuilder $queryBuilder, \Bee_Persistence_IRestrictionHolder $restrictionHolder = null, \Bee_Persistence_IOrderAndLimitHolder $orderAndLimitHolder = null, array $defaultOrderMapping) {
+ $this->applyFilterRestrictions($queryBuilder, $restrictionHolder);
+ $this->applyOrderAndLimit($queryBuilder, $orderAndLimitHolder, $defaultOrderMapping);
+ return $queryBuilder->getQuery()->execute();
+ }
+
+ /**
+ * @param \Doctrine\ORM\QueryBuilder $query
+ * @param \Bee_Persistence_IRestrictionHolder $restrictionHolder
+ */
+ protected final function applyFilterRestrictions(\Doctrine\ORM\QueryBuilder &$queryBuilder, \Bee_Persistence_IRestrictionHolder $restrictionHolder = null) {
+ if (is_null($restrictionHolder)) {
+ return;
+ }
+
+ if (!\Bee_Utils_Strings::hasText($restrictionHolder->getFilterString())) {
+ return;
+ }
+
+ $filterTokens = \Bee_Utils_Strings::tokenizeToArray($restrictionHolder->getFilterString(), ' ');
+ foreach ($filterTokens as $no => $token) {
+ $andWhereString = '';
+ $params = array();
+
+ foreach ($restrictionHolder->getFilterableFields() as $fieldName) {
+ // $fieldName MUST BE A DOCTRINE NAME
+ if (\Bee_Utils_Strings::hasText($andWhereString)) {
+ $andWhereString .= ' OR ';
+ }
+
+ $tokenName = 'filtertoken'.$no;
+ $andWhereString .= $fieldName.' LIKE :'.$tokenName;
+ $params[$tokenName] = '%'.$token.'%';
+ }
+
+ if (\Bee_Utils_Strings::hasText($andWhereString)) {
+ $queryBuilder->andWhere($andWhereString);
+
+ foreach ($params as $key => $value) {
+ $queryBuilder->setParameter($key, $value);
+ }
+ }
+ }
+ }
+
+ /**
+ * @param \Doctrine\ORM\QueryBuilder $query
+ * @param \Bee_Persistence_IOrderAndLimitHolder $orderAndLimitHolder
+ * @param array $defaultOrderMapping
+ */
+ protected final function applyOrderAndLimit(\Doctrine\ORM\QueryBuilder &$queryBuilder, \Bee_Persistence_IOrderAndLimitHolder $orderAndLimitHolder = null, array $defaultOrderMapping = array()) {
+ if (is_null($orderAndLimitHolder)) {
+ $orderMapping = $defaultOrderMapping;
+ } else {
+ $orderMapping = count($orderAndLimitHolder->getOrderMapping()) > 0 ? $orderAndLimitHolder->getOrderMapping() : $defaultOrderMapping;
+ }
+
+ foreach ($orderMapping as $orderField => $orderDir) {
+ $queryBuilder->addOrderBy($orderField, $orderDir);
+ }
+
+ if (is_null($orderAndLimitHolder)) {
+ return;
+ }
+
+ if ($orderAndLimitHolder->getPageSize() > 0) {
+ $queryBuilder->setMaxResults($orderAndLimitHolder->getPageSize());
+
+ // TODO: build a performant count-query! This is simply bullshit!
+ $pageCount = ceil(count($queryBuilder->getQuery()->execute()) / $orderAndLimitHolder->getPageSize());
+ $orderAndLimitHolder->setPageCount($pageCount);
+
+ if ($orderAndLimitHolder->getCurrentPage() > $pageCount) {
+ $orderAndLimitHolder->setCurrentPage($pageCount);
+ }
+ $queryBuilder->setFirstResult($orderAndLimitHolder->getCurrentPage() * $orderAndLimitHolder->getPageSize());
+ $queryBuilder->setMaxResults($orderAndLimitHolder->getPageSize());
+ }
+ }
+
+ /**
+ * @param callback $func
+ * @throws \Exception
+ * @return mixed
+ */
+ public function doInTransaction($func) {
+ $this->getDoctrineConnection()->beginTransaction();
+ try {
+ $result = $func($this, self::getLog());
+
+ $this->getDoctrineConnection()->commit();
+ $this->getDoctrineConnection()->flush();
+
+ return $result;
+ } catch(\Exception $e) {
+ self::getLog()->debug('exception caught', $e);
+ $this->getDoctrineConnection()->rollBack();
+ throw $e;
+ }
+
}
}
Added: trunk/framework/Bee/Persistence/Doctrine2/Log4PHPLogger.php
===================================================================
--- trunk/framework/Bee/Persistence/Doctrine2/Log4PHPLogger.php (rev 0)
+++ trunk/framework/Bee/Persistence/Doctrine2/Log4PHPLogger.php 2013-06-25 11:44:09 UTC (rev 40)
@@ -0,0 +1,72 @@
+<?php
+namespace Bee\Persistence\Doctrine2;
+
+/*
+ * Copyright 2008-2010 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+use Doctrine\DBAL\Logging\SQLLogger;
+
+/**
+ * User: mp
+ * Date: 21.06.13
+ * Time: 16:23
+ *
+ * Implementation of the Doctrine 2 SQLLogger interface that logs to Log4PHP
+ */
+class Log4PHPLogger implements SQLLogger {
+
+ /**
+ * @var \Logger
+ */
+ private static $log;
+
+ /**
+ * @var int
+ */
+ private $startTime;
+
+ /**
+ * Logs a SQL statement somewhere.
+ *
+ * @param string $sql The SQL to be executed.
+ * @param array $params The SQL parameters.
+ * @param array $types The SQL parameter types.
+ * @return void
+ */
+ public function startQuery($sql, array $params = null, array $types = null) {
+ self::getLog()->trace('SQL : [' . $sql . '] PARAMS : [' . serialize($params) . '] TYPES: ['. serialize($types) . ']');
+ $this->startTime = microtime(true);
+ }
+
+ /**
+ * Mark the last started query as stopped. This can be used for timing of queries.
+ *
+ * @return void
+ */
+ public function stopQuery() {
+ $dur = microtime(true) - $this->startTime;
+ self::getLog()->trace('.. completed in '. ($dur*1000) . ' ms');
+ }
+
+ /**
+ * @return \Logger
+ */
+ protected static function getLog() {
+ if (!self::$log) {
+ self::$log = \Bee_Framework::getLoggerForClass(__CLASS__);
+ }
+ return self::$log;
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|