public function getPdoConnection($datasource)
 {
     if (!isset($this->pdoConnections[$datasource])) {
         $buildConnection = $this->getConnection($datasource);
         $buildConnection['dsn'] = str_replace("@DB@", $datasource, $buildConnection['dsn']);
         $this->pdoConnections[$datasource] = Propel::initConnection($buildConnection, $datasource);
     }
     return $this->pdoConnections[$datasource];
 }
Example #2
0
 /**
  * @static
  * @param string $connectionName
  * @return PropelPDO
  */
 public static function instanciate($connectionName)
 {
     $propelConfiguration = Propel::getConfiguration();
     if (isset($propelConfiguration['datasources'][$connectionName]['connection'])) {
         $parameters = $propelConfiguration['datasources'][$connectionName]['connection'];
     } else {
         if (isset($propelConfiguration['datasources'][Propel::getDefaultDB()])) {
             $propelConfiguration['datasources'][$connectionName] = $propelConfiguration['datasources'][Propel::getDefaultDB()];
             Propel::setConfiguration(new PropelConfiguration($propelConfiguration));
             $parameters = $propelConfiguration['datasources'][$connectionName]['connection'];
         } else {
             throw new Exception(sprintf("Unable to find connection parameters for connection '%s'", $connectionName));
         }
     }
     return Propel::initConnection($parameters, $connectionName);
 }
Example #3
0
 /**
  * Gets an already-opened read PDO connection or opens a new one for passed-in db name.
  *
  * @param      string $name The datasource name that is used to look up the DSN 
  *                          from the runtime configuation file. Empty name not allowed.
  *
  * @return     PDO A database connection
  *
  * @throws     PropelException - if connection cannot be configured or initialized.
  */
 public static function getSlaveConnection($name)
 {
     if (!isset(self::$connectionMap[$name]['slave'])) {
         $slaveconfigs = isset(self::$configuration['datasources'][$name]['slaves']) ? self::$configuration['datasources'][$name]['slaves'] : null;
         if (empty($slaveconfigs)) {
             // no slaves configured for this datasource
             // fallback to the master connection
             self::$connectionMap[$name]['slave'] = self::getMasterConnection($name);
         } else {
             // Initialize a new slave
             if (isset($slaveconfigs['connection']['dsn'])) {
                 // only one slave connection configured
                 $conparams = $slaveconfigs['connection'];
             } else {
                 // more than one sleve connection configured
                 // pickup a random one
                 $randkey = array_rand($slaveconfigs['connection']);
                 $conparams = $slaveconfigs['connection'][$randkey];
                 if (empty($conparams)) {
                     throw new PropelException('No connection information in your runtime configuration file for SLAVE [' . $randkey . '] to datasource [' . $name . ']');
                 }
             }
             // initialize slave connection
             $con = Propel::initConnection($conparams, $name);
             self::$connectionMap[$name]['slave'] = $con;
         }
     }
     // if datasource slave not set
     return self::$connectionMap[$name]['slave'];
 }
Example #4
0
 /**
  * Gets an already-opened PDO connection or opens a new one for passed-in db name.
  *
  * @param      string $name The datasource name that is used to look up the DSN from the runtime configuation file.
  * @param      string $mode The connection mode (this applies to replication systems).
  *
  * @return     PDO A database connection
  *
  * @throws     PropelException - if connection cannot be configured or initialized.
  */
 public static function getConnection($name = null, $mode = Propel::CONNECTION_WRITE)
 {
     if ($name === null) {
         $name = self::getDefaultDB();
     }
     // IF a WRITE-mode connection was requested
     // or Propel is configured to always use the master connection
     // or the slave for this connection has already been set to FALSE (indicating no slave)
     // THEN return the master connection.
     if ($mode != Propel::CONNECTION_READ || self::$forceMasterConnection || isset(self::$connectionMap[$name]['slave']) && self::$connectionMap[$name]['slave'] === false) {
         if (!isset(self::$connectionMap[$name]['master'])) {
             // load connection parameter for master connection
             $conparams = isset(self::$configuration['datasources'][$name]['connection']) ? self::$configuration['datasources'][$name]['connection'] : null;
             if (empty($conparams)) {
                 throw new PropelException('No connection information in your runtime configuration file for datasource [' . $name . ']');
             }
             // initialize master connection
             $con = Propel::initConnection($conparams, $name);
             self::$connectionMap[$name]['master'] = $con;
         }
         return self::$connectionMap[$name]['master'];
     } else {
         if (!isset(self::$connectionMap[$name]['slave'])) {
             // we've already ensured that the configuration exists, in previous if-statement
             $slaveconfigs = isset(self::$configuration['datasources'][$name]['slaves']) ? self::$configuration['datasources'][$name]['slaves'] : null;
             if (empty($slaveconfigs)) {
                 // no slaves configured for this datasource
                 self::$connectionMap[$name]['slave'] = false;
                 return self::getConnection($name, Propel::CONNECTION_WRITE);
                 // Recurse to get the WRITE connection
             } else {
                 // Initialize a new slave
                 if (isset($slaveconfigs['connection']['dsn'])) {
                     // only one slave connection configured
                     $conparams = $slaveconfigs['connection'];
                 } else {
                     $randkey = array_rand($slaveconfigs['connection']);
                     $conparams = $slaveconfigs['connection'][$randkey];
                     if (empty($conparams)) {
                         throw new PropelException('No connection information in your runtime configuration file for SLAVE [' . $randkey . '] to datasource [' . $name . ']');
                     }
                 }
                 // initialize master connection
                 $con = Propel::initConnection($conparams, $name);
                 self::$connectionMap[$name]['slave'] = $con;
             }
         }
         // if datasource slave not set
         return self::$connectionMap[$name]['slave'];
     }
     // if mode == CONNECTION_WRITE
 }
Example #5
0
    protected static function getAvailableSlaveConnection($name, $configs)
    {
        if (isset($configs['connection']['dsn'])) { // only one slave connection configured
            $servers = array(
                'single' => $configs['connection']
            );
        } else {
            $servers = $configs['connection'];
        }

        $keys = array_keys($servers);
        shuffle($keys);

        // Weed out blatantly broken configurations or blacklisted servers
        foreach ($keys as $i => $key) {
            $conparams = $servers[$key];
            $dsn = $conparams['dsn'];
            if (empty($conparams)) {
                throw new PropelException('No connection information in your runtime configuration file for SLAVE ['.$randkiey.'] to datasource ['.$dsn.']');
            }

            if (self::isServerBlacklisted($dsn)) {
                unset($servers[$key], $keys[$i]);
            }
        }

        $_SERVER['failed-slaves'] = array();
        foreach ($keys as $key) {
            $conparams = $servers[$key];
            $dsn = $conparams['dsn'];
            try {
                return Propel::initConnection($conparams, $name);
            } catch (PropelException $e) {
                $_SERVER['failed-slaves'][] = $dsn;
                self::blacklistServer($dsn);
            }
        }

        throw new PropelException('No valid connection information in your runtime configuration file for slaves on datasource [' . $name . '].');
    }