text:
<?php

/**
 * Base static class for performing query and update operations on the 'triggerprospectionuser' table.
 *
 *
 *
 * @package propel.generator.api.om
 */
abstract class BaseTriggerprospectionuserPeer
{

    /** the default database name for this class */
    const DATABASE_NAME = 'api';

    /** the table name for this class */
    const TABLE_NAME = 'triggerprospectionuser';

    /** the related Propel class for this table */
    const OM_CLASS = 'Triggerprospectionuser';

    /** the related TableMap class for this table */
    const TM_CLASS = 'TriggerprospectionuserTableMap';

    /** The total number of columns. */
    const NUM_COLUMNS = 3;

    /** The number of lazy-loaded columns. */
    const NUM_LAZY_LOAD_COLUMNS = 0;

    /** The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS) */
    const NUM_HYDRATE_COLUMNS = 3;

    /** the column name for the idtriggerprospectionuser field */
    const IDTRIGGERPROSPECTIONUSER = 'triggerprospectionuser.idtriggerprospectionuser';

    /** the column name for the idtriggerprospection field */
    const IDTRIGGERPROSPECTION = 'triggerprospectionuser.idtriggerprospection';

    /** the column name for the iduser field */
    const IDUSER = 'triggerprospectionuser.iduser';

    /** The default string format for model objects of the related table **/
    const DEFAULT_STRING_FORMAT = 'YAML';

    /**
     * An identity map to hold any loaded instances of Triggerprospectionuser objects.
     * This must be public so that other peer classes can access this when hydrating from JOIN
     * queries.
     * @var        array Triggerprospectionuser[]
     */
    public static $instances = array();

    /**
     * holds an array of fieldnames
     *
     * first dimension keys are the type constants
     * e.g. TriggerprospectionuserPeer::$fieldNames[TriggerprospectionuserPeer::TYPE_PHPNAME][0] = 'Id'
     */
    protected static $fieldNames = array (
        BasePeer::TYPE_PHPNAME => array ('Idtriggerprospectionuser', 'Idtriggerprospection', 'Iduser', ),
        BasePeer::TYPE_STUDLYPHPNAME => array ('idtriggerprospectionuser', 'idtriggerprospection', 'iduser', ),
        BasePeer::TYPE_COLNAME => array (TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER, TriggerprospectionuserPeer::IDTRIGGERPROSPECTION, TriggerprospectionuserPeer::IDUSER, ),
        BasePeer::TYPE_RAW_COLNAME => array ('IDTRIGGERPROSPECTIONUSER', 'IDTRIGGERPROSPECTION', 'IDUSER', ),
        BasePeer::TYPE_FIELDNAME => array ('idtriggerprospectionuser', 'idtriggerprospection', 'iduser', ),
        BasePeer::TYPE_NUM => array (0, 1, 2, )
    );

    /**
     * holds an array of keys for quick access to the fieldnames array
     *
     * first dimension keys are the type constants
     * e.g. TriggerprospectionuserPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0
     */
    protected static $fieldKeys = array (
        BasePeer::TYPE_PHPNAME => array ('Idtriggerprospectionuser' => 0, 'Idtriggerprospection' => 1, 'Iduser' => 2, ),
        BasePeer::TYPE_STUDLYPHPNAME => array ('idtriggerprospectionuser' => 0, 'idtriggerprospection' => 1, 'iduser' => 2, ),
        BasePeer::TYPE_COLNAME => array (TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER => 0, TriggerprospectionuserPeer::IDTRIGGERPROSPECTION => 1, TriggerprospectionuserPeer::IDUSER => 2, ),
        BasePeer::TYPE_RAW_COLNAME => array ('IDTRIGGERPROSPECTIONUSER' => 0, 'IDTRIGGERPROSPECTION' => 1, 'IDUSER' => 2, ),
        BasePeer::TYPE_FIELDNAME => array ('idtriggerprospectionuser' => 0, 'idtriggerprospection' => 1, 'iduser' => 2, ),
        BasePeer::TYPE_NUM => array (0, 1, 2, )
    );

    /**
     * Translates a fieldname to another type
     *
     * @param      string $name field name
     * @param      string $fromType One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME
     *                         BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM
     * @param      string $toType   One of the class type constants
     * @return string          translated name of the field.
     * @throws PropelException - if the specified name could not be found in the fieldname mappings.
     */
    public static function translateFieldName($name, $fromType, $toType)
    {
        $toNames = TriggerprospectionuserPeer::getFieldNames($toType);
        $key = isset(TriggerprospectionuserPeer::$fieldKeys[$fromType][$name]) ? TriggerprospectionuserPeer::$fieldKeys[$fromType][$name] : null;
        if ($key === null) {
            throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(TriggerprospectionuserPeer::$fieldKeys[$fromType], true));
        }

        return $toNames[$key];
    }

    /**
     * Returns an array of field names.
     *
     * @param      string $type The type of fieldnames to return:
     *                      One of the class type constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME
     *                      BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM
     * @return array           A list of field names
     * @throws PropelException - if the type is not valid.
     */
    public static function getFieldNames($type = BasePeer::TYPE_PHPNAME)
    {
        if (!array_key_exists($type, TriggerprospectionuserPeer::$fieldNames)) {
            throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants BasePeer::TYPE_PHPNAME, BasePeer::TYPE_STUDLYPHPNAME, BasePeer::TYPE_COLNAME, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_NUM. ' . $type . ' was given.');
        }

        return TriggerprospectionuserPeer::$fieldNames[$type];
    }

    /**
     * Convenience method which changes table.column to alias.column.
     *
     * Using this method you can maintain SQL abstraction while using column aliases.
     * <code>
     *		$c->addAlias("alias1", TablePeer::TABLE_NAME);
     *		$c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN);
     * </code>
     * @param      string $alias The alias for the current table.
     * @param      string $column The column name for current table. (i.e. TriggerprospectionuserPeer::COLUMN_NAME).
     * @return string
     */
    public static function alias($alias, $column)
    {
        return str_replace(TriggerprospectionuserPeer::TABLE_NAME.'.', $alias.'.', $column);
    }

    /**
     * Add all the columns needed to create a new object.
     *
     * Note: any columns that were marked with lazyLoad="true" in the
     * XML schema will not be added to the select list and only loaded
     * on demand.
     *
     * @param      Criteria $criteria object containing the columns to add.
     * @param      string   $alias    optional table alias
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function addSelectColumns(Criteria $criteria, $alias = null)
    {
        if (null === $alias) {
            $criteria->addSelectColumn(TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER);
            $criteria->addSelectColumn(TriggerprospectionuserPeer::IDTRIGGERPROSPECTION);
            $criteria->addSelectColumn(TriggerprospectionuserPeer::IDUSER);
        } else {
            $criteria->addSelectColumn($alias . '.idtriggerprospectionuser');
            $criteria->addSelectColumn($alias . '.idtriggerprospection');
            $criteria->addSelectColumn($alias . '.iduser');
        }
    }

    /**
     * Returns the number of rows matching criteria.
     *
     * @param      Criteria $criteria
     * @param      boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead.
     * @param      PropelPDO $con
     * @return int Number of matching rows.
     */
    public static function doCount(Criteria $criteria, $distinct = false, PropelPDO $con = null)
    {
        // we may modify criteria, so copy it first
        $criteria = clone $criteria;

        // We need to set the primary table name, since in the case that there are no WHERE columns
        // it will be impossible for the BasePeer::createSelectSql() method to determine which
        // tables go into the FROM clause.
        $criteria->setPrimaryTableName(TriggerprospectionuserPeer::TABLE_NAME);

        if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) {
            $criteria->setDistinct();
        }

        if (!$criteria->hasSelectClause()) {
            TriggerprospectionuserPeer::addSelectColumns($criteria);
        }

        $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count
        $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME); // Set the correct dbName

        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_READ);
        }
        // BasePeer returns a PDOStatement
        $stmt = BasePeer::doCount($criteria, $con);

        if ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $count = (int) $row[0];
        } else {
            $count = 0; // no rows returned; we infer that means 0 matches.
        }
        $stmt->closeCursor();

        return $count;
    }
    /**
     * Selects one object from the DB.
     *
     * @param      Criteria $criteria object used to create the SELECT statement.
     * @param      PropelPDO $con
     * @return Triggerprospectionuser
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function doSelectOne(Criteria $criteria, PropelPDO $con = null)
    {
        $critcopy = clone $criteria;
        $critcopy->setLimit(1);
        $objects = TriggerprospectionuserPeer::doSelect($critcopy, $con);
        if ($objects) {
            return $objects[0];
        }

        return null;
    }
    /**
     * Selects several row from the DB.
     *
     * @param      Criteria $criteria The Criteria object used to build the SELECT statement.
     * @param      PropelPDO $con
     * @return array           Array of selected Objects
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function doSelect(Criteria $criteria, PropelPDO $con = null)
    {
        return TriggerprospectionuserPeer::populateObjects(TriggerprospectionuserPeer::doSelectStmt($criteria, $con));
    }
    /**
     * Prepares the Criteria object and uses the parent doSelect() method to execute a PDOStatement.
     *
     * Use this method directly if you want to work with an executed statement directly (for example
     * to perform your own object hydration).
     *
     * @param      Criteria $criteria The Criteria object used to build the SELECT statement.
     * @param      PropelPDO $con The connection to use
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     * @return PDOStatement The executed PDOStatement object.
     * @see        BasePeer::doSelect()
     */
    public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null)
    {
        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_READ);
        }

        if (!$criteria->hasSelectClause()) {
            $criteria = clone $criteria;
            TriggerprospectionuserPeer::addSelectColumns($criteria);
        }

        // Set the correct dbName
        $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);

        // BasePeer returns a PDOStatement
        return BasePeer::doSelect($criteria, $con);
    }
    /**
     * Adds an object to the instance pool.
     *
     * Propel keeps cached copies of objects in an instance pool when they are retrieved
     * from the database.  In some cases -- especially when you override doSelect*()
     * methods in your stub classes -- you may need to explicitly add objects
     * to the cache in order to ensure that the same objects are always returned by doSelect*()
     * and retrieveByPK*() calls.
     *
     * @param Triggerprospectionuser $obj A Triggerprospectionuser object.
     * @param      string $key (optional) key to use for instance map (for performance boost if key was already calculated externally).
     */
    public static function addInstanceToPool($obj, $key = null)
    {
        if (Propel::isInstancePoolingEnabled()) {
            if ($key === null) {
                $key = (string) $obj->getIdtriggerprospectionuser();
            } // if key === null
            TriggerprospectionuserPeer::$instances[$key] = $obj;
        }
    }

    /**
     * Removes an object from the instance pool.
     *
     * Propel keeps cached copies of objects in an instance pool when they are retrieved
     * from the database.  In some cases -- especially when you override doDelete
     * methods in your stub classes -- you may need to explicitly remove objects
     * from the cache in order to prevent returning objects that no longer exist.
     *
     * @param      mixed $value A Triggerprospectionuser object or a primary key value.
     *
     * @return void
     * @throws PropelException - if the value is invalid.
     */
    public static function removeInstanceFromPool($value)
    {
        if (Propel::isInstancePoolingEnabled() && $value !== null) {
            if (is_object($value) && $value instanceof Triggerprospectionuser) {
                $key = (string) $value->getIdtriggerprospectionuser();
            } elseif (is_scalar($value)) {
                // assume we've been passed a primary key
                $key = (string) $value;
            } else {
                $e = new PropelException("Invalid value passed to removeInstanceFromPool().  Expected primary key or Triggerprospectionuser object; got " . (is_object($value) ? get_class($value) . ' object.' : var_export($value,true)));
                throw $e;
            }

            unset(TriggerprospectionuserPeer::$instances[$key]);
        }
    } // removeInstanceFromPool()

    /**
     * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table.
     *
     * For tables with a single-column primary key, that simple pkey value will be returned.  For tables with
     * a multi-column primary key, a serialize()d version of the primary key will be returned.
     *
     * @param      string $key The key (@see getPrimaryKeyHash()) for this instance.
     * @return Triggerprospectionuser Found object or null if 1) no instance exists for specified key or 2) instance pooling has been disabled.
     * @see        getPrimaryKeyHash()
     */
    public static function getInstanceFromPool($key)
    {
        if (Propel::isInstancePoolingEnabled()) {
            if (isset(TriggerprospectionuserPeer::$instances[$key])) {
                return TriggerprospectionuserPeer::$instances[$key];
            }
        }

        return null; // just to be explicit
    }

    /**
     * Clear the instance pool.
     *
     * @return void
     */
    public static function clearInstancePool($and_clear_all_references = false)
    {
      if ($and_clear_all_references) {
        foreach (TriggerprospectionuserPeer::$instances as $instance) {
          $instance->clearAllReferences(true);
        }
      }
        TriggerprospectionuserPeer::$instances = array();
    }

    /**
     * Method to invalidate the instance pool of all tables related to triggerprospectionuser
     * by a foreign key with ON DELETE CASCADE
     */
    public static function clearRelatedInstancePool()
    {
    }

    /**
     * Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table.
     *
     * For tables with a single-column primary key, that simple pkey value will be returned.  For tables with
     * a multi-column primary key, a serialize()d version of the primary key will be returned.
     *
     * @param      array $row PropelPDO resultset row.
     * @param      int $startcol The 0-based offset for reading from the resultset row.
     * @return string A string version of PK or null if the components of primary key in result array are all null.
     */
    public static function getPrimaryKeyHashFromRow($row, $startcol = 0)
    {
        // If the PK cannot be derived from the row, return null.
        if ($row[$startcol] === null) {
            return null;
        }

        return (string) $row[$startcol];
    }

    /**
     * Retrieves the primary key from the DB resultset row
     * For tables with a single-column primary key, that simple pkey value will be returned.  For tables with
     * a multi-column primary key, an array of the primary key columns will be returned.
     *
     * @param      array $row PropelPDO resultset row.
     * @param      int $startcol The 0-based offset for reading from the resultset row.
     * @return mixed The primary key of the row
     */
    public static function getPrimaryKeyFromRow($row, $startcol = 0)
    {

        return (int) $row[$startcol];
    }

    /**
     * The returned array will contain objects of the default type or
     * objects that inherit from the default.
     *
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function populateObjects(PDOStatement $stmt)
    {
        $results = array();

        // set the class once to avoid overhead in the loop
        $cls = TriggerprospectionuserPeer::getOMClass();
        // populate the object(s)
        while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $key = TriggerprospectionuserPeer::getPrimaryKeyHashFromRow($row, 0);
            if (null !== ($obj = TriggerprospectionuserPeer::getInstanceFromPool($key))) {
                // We no longer rehydrate the object, since this can cause data loss.
                // See http://www.propelorm.org/ticket/509
                // $obj->hydrate($row, 0, true); // rehydrate
                $results[] = $obj;
            } else {
                $obj = new $cls();
                $obj->hydrate($row);
                $results[] = $obj;
                TriggerprospectionuserPeer::addInstanceToPool($obj, $key);
            } // if key exists
        }
        $stmt->closeCursor();

        return $results;
    }
    /**
     * Populates an object of the default type or an object that inherit from the default.
     *
     * @param      array $row PropelPDO resultset row.
     * @param      int $startcol The 0-based offset for reading from the resultset row.
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     * @return array (Triggerprospectionuser object, last column rank)
     */
    public static function populateObject($row, $startcol = 0)
    {
        $key = TriggerprospectionuserPeer::getPrimaryKeyHashFromRow($row, $startcol);
        if (null !== ($obj = TriggerprospectionuserPeer::getInstanceFromPool($key))) {
            // We no longer rehydrate the object, since this can cause data loss.
            // See http://www.propelorm.org/ticket/509
            // $obj->hydrate($row, $startcol, true); // rehydrate
            $col = $startcol + TriggerprospectionuserPeer::NUM_HYDRATE_COLUMNS;
        } else {
            $cls = TriggerprospectionuserPeer::OM_CLASS;
            $obj = new $cls();
            $col = $obj->hydrate($row, $startcol);
            TriggerprospectionuserPeer::addInstanceToPool($obj, $key);
        }

        return array($obj, $col);
    }

    /**
     * Returns the number of rows matching criteria, joining the related Triggerprospection table
     *
     * @param      Criteria $criteria
     * @param      boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead.
     * @param      PropelPDO $con
     * @param      String    $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN
     * @return int Number of matching rows.
     */
    public static function doCountJoinTriggerprospection(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN)
    {
        // we're going to modify criteria, so copy it first
        $criteria = clone $criteria;

        // We need to set the primary table name, since in the case that there are no WHERE columns
        // it will be impossible for the BasePeer::createSelectSql() method to determine which
        // tables go into the FROM clause.
        $criteria->setPrimaryTableName(TriggerprospectionuserPeer::TABLE_NAME);

        if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) {
            $criteria->setDistinct();
        }

        if (!$criteria->hasSelectClause()) {
            TriggerprospectionuserPeer::addSelectColumns($criteria);
        }

        $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count

        // Set the correct dbName
        $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);

        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_READ);
        }

        $criteria->addJoin(TriggerprospectionuserPeer::IDTRIGGERPROSPECTION, TriggerprospectionPeer::IDTRIGGERPROSPECTION, $join_behavior);

        $stmt = BasePeer::doCount($criteria, $con);

        if ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $count = (int) $row[0];
        } else {
            $count = 0; // no rows returned; we infer that means 0 matches.
        }
        $stmt->closeCursor();

        return $count;
    }

    /**
     * Returns the number of rows matching criteria, joining the related User table
     *
     * @param      Criteria $criteria
     * @param      boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead.
     * @param      PropelPDO $con
     * @param      String    $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN
     * @return int Number of matching rows.
     */
    public static function doCountJoinUser(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN)
    {
        // we're going to modify criteria, so copy it first
        $criteria = clone $criteria;

        // We need to set the primary table name, since in the case that there are no WHERE columns
        // it will be impossible for the BasePeer::createSelectSql() method to determine which
        // tables go into the FROM clause.
        $criteria->setPrimaryTableName(TriggerprospectionuserPeer::TABLE_NAME);

        if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) {
            $criteria->setDistinct();
        }

        if (!$criteria->hasSelectClause()) {
            TriggerprospectionuserPeer::addSelectColumns($criteria);
        }

        $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count

        // Set the correct dbName
        $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);

        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_READ);
        }

        $criteria->addJoin(TriggerprospectionuserPeer::IDUSER, UserPeer::IDUSER, $join_behavior);

        $stmt = BasePeer::doCount($criteria, $con);

        if ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $count = (int) $row[0];
        } else {
            $count = 0; // no rows returned; we infer that means 0 matches.
        }
        $stmt->closeCursor();

        return $count;
    }

    /**
     * Selects a collection of Triggerprospectionuser objects pre-filled with their Triggerprospection objects.
     * @param      Criteria  $criteria
     * @param      PropelPDO $con
     * @param      String    $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN
     * @return array           Array of Triggerprospectionuser objects.
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function doSelectJoinTriggerprospection(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN)
    {
        $criteria = clone $criteria;

        // Set the correct dbName if it has not been overridden
        if ($criteria->getDbName() == Propel::getDefaultDB()) {
            $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);
        }

        TriggerprospectionuserPeer::addSelectColumns($criteria);
        $startcol = TriggerprospectionuserPeer::NUM_HYDRATE_COLUMNS;
        TriggerprospectionPeer::addSelectColumns($criteria);

        $criteria->addJoin(TriggerprospectionuserPeer::IDTRIGGERPROSPECTION, TriggerprospectionPeer::IDTRIGGERPROSPECTION, $join_behavior);

        $stmt = BasePeer::doSelect($criteria, $con);
        $results = array();

        while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $key1 = TriggerprospectionuserPeer::getPrimaryKeyHashFromRow($row, 0);
            if (null !== ($obj1 = TriggerprospectionuserPeer::getInstanceFromPool($key1))) {
                // We no longer rehydrate the object, since this can cause data loss.
                // See http://www.propelorm.org/ticket/509
                // $obj1->hydrate($row, 0, true); // rehydrate
            } else {

                $cls = TriggerprospectionuserPeer::getOMClass();

                $obj1 = new $cls();
                $obj1->hydrate($row);
                TriggerprospectionuserPeer::addInstanceToPool($obj1, $key1);
            } // if $obj1 already loaded

            $key2 = TriggerprospectionPeer::getPrimaryKeyHashFromRow($row, $startcol);
            if ($key2 !== null) {
                $obj2 = TriggerprospectionPeer::getInstanceFromPool($key2);
                if (!$obj2) {

                    $cls = TriggerprospectionPeer::getOMClass();

                    $obj2 = new $cls();
                    $obj2->hydrate($row, $startcol);
                    TriggerprospectionPeer::addInstanceToPool($obj2, $key2);
                } // if obj2 already loaded

                // Add the $obj1 (Triggerprospectionuser) to $obj2 (Triggerprospection)
                $obj2->addTriggerprospectionuser($obj1);

            } // if joined row was not null

            $results[] = $obj1;
        }
        $stmt->closeCursor();

        return $results;
    }

    /**
     * Selects a collection of Triggerprospectionuser objects pre-filled with their User objects.
     * @param      Criteria  $criteria
     * @param      PropelPDO $con
     * @param      String    $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN
     * @return array           Array of Triggerprospectionuser objects.
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function doSelectJoinUser(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN)
    {
        $criteria = clone $criteria;

        // Set the correct dbName if it has not been overridden
        if ($criteria->getDbName() == Propel::getDefaultDB()) {
            $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);
        }

        TriggerprospectionuserPeer::addSelectColumns($criteria);
        $startcol = TriggerprospectionuserPeer::NUM_HYDRATE_COLUMNS;
        UserPeer::addSelectColumns($criteria);

        $criteria->addJoin(TriggerprospectionuserPeer::IDUSER, UserPeer::IDUSER, $join_behavior);

        $stmt = BasePeer::doSelect($criteria, $con);
        $results = array();

        while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $key1 = TriggerprospectionuserPeer::getPrimaryKeyHashFromRow($row, 0);
            if (null !== ($obj1 = TriggerprospectionuserPeer::getInstanceFromPool($key1))) {
                // We no longer rehydrate the object, since this can cause data loss.
                // See http://www.propelorm.org/ticket/509
                // $obj1->hydrate($row, 0, true); // rehydrate
            } else {

                $cls = TriggerprospectionuserPeer::getOMClass();

                $obj1 = new $cls();
                $obj1->hydrate($row);
                TriggerprospectionuserPeer::addInstanceToPool($obj1, $key1);
            } // if $obj1 already loaded

            $key2 = UserPeer::getPrimaryKeyHashFromRow($row, $startcol);
            if ($key2 !== null) {
                $obj2 = UserPeer::getInstanceFromPool($key2);
                if (!$obj2) {

                    $cls = UserPeer::getOMClass();

                    $obj2 = new $cls();
                    $obj2->hydrate($row, $startcol);
                    UserPeer::addInstanceToPool($obj2, $key2);
                } // if obj2 already loaded

                // Add the $obj1 (Triggerprospectionuser) to $obj2 (User)
                $obj2->addTriggerprospectionuser($obj1);

            } // if joined row was not null

            $results[] = $obj1;
        }
        $stmt->closeCursor();

        return $results;
    }

    /**
     * Returns the number of rows matching criteria, joining all related tables
     *
     * @param      Criteria $criteria
     * @param      boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead.
     * @param      PropelPDO $con
     * @param      String    $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN
     * @return int Number of matching rows.
     */
    public static function doCountJoinAll(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN)
    {
        // we're going to modify criteria, so copy it first
        $criteria = clone $criteria;

        // We need to set the primary table name, since in the case that there are no WHERE columns
        // it will be impossible for the BasePeer::createSelectSql() method to determine which
        // tables go into the FROM clause.
        $criteria->setPrimaryTableName(TriggerprospectionuserPeer::TABLE_NAME);

        if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) {
            $criteria->setDistinct();
        }

        if (!$criteria->hasSelectClause()) {
            TriggerprospectionuserPeer::addSelectColumns($criteria);
        }

        $criteria->clearOrderByColumns(); // ORDER BY won't ever affect the count

        // Set the correct dbName
        $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);

        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_READ);
        }

        $criteria->addJoin(TriggerprospectionuserPeer::IDTRIGGERPROSPECTION, TriggerprospectionPeer::IDTRIGGERPROSPECTION, $join_behavior);

        $criteria->addJoin(TriggerprospectionuserPeer::IDUSER, UserPeer::IDUSER, $join_behavior);

        $stmt = BasePeer::doCount($criteria, $con);

        if ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $count = (int) $row[0];
        } else {
            $count = 0; // no rows returned; we infer that means 0 matches.
        }
        $stmt->closeCursor();

        return $count;
    }

    /**
     * Selects a collection of Triggerprospectionuser objects pre-filled with all related objects.
     *
     * @param      Criteria  $criteria
     * @param      PropelPDO $con
     * @param      String    $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN
     * @return array           Array of Triggerprospectionuser objects.
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function doSelectJoinAll(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN)
    {
        $criteria = clone $criteria;

        // Set the correct dbName if it has not been overridden
        if ($criteria->getDbName() == Propel::getDefaultDB()) {
            $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);
        }

        TriggerprospectionuserPeer::addSelectColumns($criteria);
        $startcol2 = TriggerprospectionuserPeer::NUM_HYDRATE_COLUMNS;

        TriggerprospectionPeer::addSelectColumns($criteria);
        $startcol3 = $startcol2 + TriggerprospectionPeer::NUM_HYDRATE_COLUMNS;

        UserPeer::addSelectColumns($criteria);
        $startcol4 = $startcol3 + UserPeer::NUM_HYDRATE_COLUMNS;

        $criteria->addJoin(TriggerprospectionuserPeer::IDTRIGGERPROSPECTION, TriggerprospectionPeer::IDTRIGGERPROSPECTION, $join_behavior);

        $criteria->addJoin(TriggerprospectionuserPeer::IDUSER, UserPeer::IDUSER, $join_behavior);

        $stmt = BasePeer::doSelect($criteria, $con);
        $results = array();

        while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $key1 = TriggerprospectionuserPeer::getPrimaryKeyHashFromRow($row, 0);
            if (null !== ($obj1 = TriggerprospectionuserPeer::getInstanceFromPool($key1))) {
                // We no longer rehydrate the object, since this can cause data loss.
                // See http://www.propelorm.org/ticket/509
                // $obj1->hydrate($row, 0, true); // rehydrate
            } else {
                $cls = TriggerprospectionuserPeer::getOMClass();

                $obj1 = new $cls();
                $obj1->hydrate($row);
                TriggerprospectionuserPeer::addInstanceToPool($obj1, $key1);
            } // if obj1 already loaded

            // Add objects for joined Triggerprospection rows

            $key2 = TriggerprospectionPeer::getPrimaryKeyHashFromRow($row, $startcol2);
            if ($key2 !== null) {
                $obj2 = TriggerprospectionPeer::getInstanceFromPool($key2);
                if (!$obj2) {

                    $cls = TriggerprospectionPeer::getOMClass();

                    $obj2 = new $cls();
                    $obj2->hydrate($row, $startcol2);
                    TriggerprospectionPeer::addInstanceToPool($obj2, $key2);
                } // if obj2 loaded

                // Add the $obj1 (Triggerprospectionuser) to the collection in $obj2 (Triggerprospection)
                $obj2->addTriggerprospectionuser($obj1);
            } // if joined row not null

            // Add objects for joined User rows

            $key3 = UserPeer::getPrimaryKeyHashFromRow($row, $startcol3);
            if ($key3 !== null) {
                $obj3 = UserPeer::getInstanceFromPool($key3);
                if (!$obj3) {

                    $cls = UserPeer::getOMClass();

                    $obj3 = new $cls();
                    $obj3->hydrate($row, $startcol3);
                    UserPeer::addInstanceToPool($obj3, $key3);
                } // if obj3 loaded

                // Add the $obj1 (Triggerprospectionuser) to the collection in $obj3 (User)
                $obj3->addTriggerprospectionuser($obj1);
            } // if joined row not null

            $results[] = $obj1;
        }
        $stmt->closeCursor();

        return $results;
    }

    /**
     * Returns the number of rows matching criteria, joining the related Triggerprospection table
     *
     * @param      Criteria $criteria
     * @param      boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead.
     * @param      PropelPDO $con
     * @param      String    $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN
     * @return int Number of matching rows.
     */
    public static function doCountJoinAllExceptTriggerprospection(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN)
    {
        // we're going to modify criteria, so copy it first
        $criteria = clone $criteria;

        // We need to set the primary table name, since in the case that there are no WHERE columns
        // it will be impossible for the BasePeer::createSelectSql() method to determine which
        // tables go into the FROM clause.
        $criteria->setPrimaryTableName(TriggerprospectionuserPeer::TABLE_NAME);

        if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) {
            $criteria->setDistinct();
        }

        if (!$criteria->hasSelectClause()) {
            TriggerprospectionuserPeer::addSelectColumns($criteria);
        }

        $criteria->clearOrderByColumns(); // ORDER BY should not affect count

        // Set the correct dbName
        $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);

        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_READ);
        }

        $criteria->addJoin(TriggerprospectionuserPeer::IDUSER, UserPeer::IDUSER, $join_behavior);

        $stmt = BasePeer::doCount($criteria, $con);

        if ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $count = (int) $row[0];
        } else {
            $count = 0; // no rows returned; we infer that means 0 matches.
        }
        $stmt->closeCursor();

        return $count;
    }

    /**
     * Returns the number of rows matching criteria, joining the related User table
     *
     * @param      Criteria $criteria
     * @param      boolean $distinct Whether to select only distinct columns; deprecated: use Criteria->setDistinct() instead.
     * @param      PropelPDO $con
     * @param      String    $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN
     * @return int Number of matching rows.
     */
    public static function doCountJoinAllExceptUser(Criteria $criteria, $distinct = false, PropelPDO $con = null, $join_behavior = Criteria::LEFT_JOIN)
    {
        // we're going to modify criteria, so copy it first
        $criteria = clone $criteria;

        // We need to set the primary table name, since in the case that there are no WHERE columns
        // it will be impossible for the BasePeer::createSelectSql() method to determine which
        // tables go into the FROM clause.
        $criteria->setPrimaryTableName(TriggerprospectionuserPeer::TABLE_NAME);

        if ($distinct && !in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) {
            $criteria->setDistinct();
        }

        if (!$criteria->hasSelectClause()) {
            TriggerprospectionuserPeer::addSelectColumns($criteria);
        }

        $criteria->clearOrderByColumns(); // ORDER BY should not affect count

        // Set the correct dbName
        $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);

        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_READ);
        }

        $criteria->addJoin(TriggerprospectionuserPeer::IDTRIGGERPROSPECTION, TriggerprospectionPeer::IDTRIGGERPROSPECTION, $join_behavior);

        $stmt = BasePeer::doCount($criteria, $con);

        if ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $count = (int) $row[0];
        } else {
            $count = 0; // no rows returned; we infer that means 0 matches.
        }
        $stmt->closeCursor();

        return $count;
    }

    /**
     * Selects a collection of Triggerprospectionuser objects pre-filled with all related objects except Triggerprospection.
     *
     * @param      Criteria  $criteria
     * @param      PropelPDO $con
     * @param      String    $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN
     * @return array           Array of Triggerprospectionuser objects.
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function doSelectJoinAllExceptTriggerprospection(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN)
    {
        $criteria = clone $criteria;

        // Set the correct dbName if it has not been overridden
        // $criteria->getDbName() will return the same object if not set to another value
        // so == check is okay and faster
        if ($criteria->getDbName() == Propel::getDefaultDB()) {
            $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);
        }

        TriggerprospectionuserPeer::addSelectColumns($criteria);
        $startcol2 = TriggerprospectionuserPeer::NUM_HYDRATE_COLUMNS;

        UserPeer::addSelectColumns($criteria);
        $startcol3 = $startcol2 + UserPeer::NUM_HYDRATE_COLUMNS;

        $criteria->addJoin(TriggerprospectionuserPeer::IDUSER, UserPeer::IDUSER, $join_behavior);

        $stmt = BasePeer::doSelect($criteria, $con);
        $results = array();

        while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $key1 = TriggerprospectionuserPeer::getPrimaryKeyHashFromRow($row, 0);
            if (null !== ($obj1 = TriggerprospectionuserPeer::getInstanceFromPool($key1))) {
                // We no longer rehydrate the object, since this can cause data loss.
                // See http://www.propelorm.org/ticket/509
                // $obj1->hydrate($row, 0, true); // rehydrate
            } else {
                $cls = TriggerprospectionuserPeer::getOMClass();

                $obj1 = new $cls();
                $obj1->hydrate($row);
                TriggerprospectionuserPeer::addInstanceToPool($obj1, $key1);
            } // if obj1 already loaded

                // Add objects for joined User rows

                $key2 = UserPeer::getPrimaryKeyHashFromRow($row, $startcol2);
                if ($key2 !== null) {
                    $obj2 = UserPeer::getInstanceFromPool($key2);
                    if (!$obj2) {

                        $cls = UserPeer::getOMClass();

                    $obj2 = new $cls();
                    $obj2->hydrate($row, $startcol2);
                    UserPeer::addInstanceToPool($obj2, $key2);
                } // if $obj2 already loaded

                // Add the $obj1 (Triggerprospectionuser) to the collection in $obj2 (User)
                $obj2->addTriggerprospectionuser($obj1);

            } // if joined row is not null

            $results[] = $obj1;
        }
        $stmt->closeCursor();

        return $results;
    }

    /**
     * Selects a collection of Triggerprospectionuser objects pre-filled with all related objects except User.
     *
     * @param      Criteria  $criteria
     * @param      PropelPDO $con
     * @param      String    $join_behavior the type of joins to use, defaults to Criteria::LEFT_JOIN
     * @return array           Array of Triggerprospectionuser objects.
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function doSelectJoinAllExceptUser(Criteria $criteria, $con = null, $join_behavior = Criteria::LEFT_JOIN)
    {
        $criteria = clone $criteria;

        // Set the correct dbName if it has not been overridden
        // $criteria->getDbName() will return the same object if not set to another value
        // so == check is okay and faster
        if ($criteria->getDbName() == Propel::getDefaultDB()) {
            $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);
        }

        TriggerprospectionuserPeer::addSelectColumns($criteria);
        $startcol2 = TriggerprospectionuserPeer::NUM_HYDRATE_COLUMNS;

        TriggerprospectionPeer::addSelectColumns($criteria);
        $startcol3 = $startcol2 + TriggerprospectionPeer::NUM_HYDRATE_COLUMNS;

        $criteria->addJoin(TriggerprospectionuserPeer::IDTRIGGERPROSPECTION, TriggerprospectionPeer::IDTRIGGERPROSPECTION, $join_behavior);

        $stmt = BasePeer::doSelect($criteria, $con);
        $results = array();

        while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
            $key1 = TriggerprospectionuserPeer::getPrimaryKeyHashFromRow($row, 0);
            if (null !== ($obj1 = TriggerprospectionuserPeer::getInstanceFromPool($key1))) {
                // We no longer rehydrate the object, since this can cause data loss.
                // See http://www.propelorm.org/ticket/509
                // $obj1->hydrate($row, 0, true); // rehydrate
            } else {
                $cls = TriggerprospectionuserPeer::getOMClass();

                $obj1 = new $cls();
                $obj1->hydrate($row);
                TriggerprospectionuserPeer::addInstanceToPool($obj1, $key1);
            } // if obj1 already loaded

                // Add objects for joined Triggerprospection rows

                $key2 = TriggerprospectionPeer::getPrimaryKeyHashFromRow($row, $startcol2);
                if ($key2 !== null) {
                    $obj2 = TriggerprospectionPeer::getInstanceFromPool($key2);
                    if (!$obj2) {

                        $cls = TriggerprospectionPeer::getOMClass();

                    $obj2 = new $cls();
                    $obj2->hydrate($row, $startcol2);
                    TriggerprospectionPeer::addInstanceToPool($obj2, $key2);
                } // if $obj2 already loaded

                // Add the $obj1 (Triggerprospectionuser) to the collection in $obj2 (Triggerprospection)
                $obj2->addTriggerprospectionuser($obj1);

            } // if joined row is not null

            $results[] = $obj1;
        }
        $stmt->closeCursor();

        return $results;
    }

    /**
     * Returns the TableMap related to this peer.
     * This method is not needed for general use but a specific application could have a need.
     * @return TableMap
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function getTableMap()
    {
        return Propel::getDatabaseMap(TriggerprospectionuserPeer::DATABASE_NAME)->getTable(TriggerprospectionuserPeer::TABLE_NAME);
    }

    /**
     * Add a TableMap instance to the database for this peer class.
     */
    public static function buildTableMap()
    {
      $dbMap = Propel::getDatabaseMap(BaseTriggerprospectionuserPeer::DATABASE_NAME);
      if (!$dbMap->hasTable(BaseTriggerprospectionuserPeer::TABLE_NAME)) {
        $dbMap->addTableObject(new \TriggerprospectionuserTableMap());
      }
    }

    /**
     * The class that the Peer will make instances of.
     *
     *
     * @return string ClassName
     */
    public static function getOMClass($row = 0, $colnum = 0)
    {
        return TriggerprospectionuserPeer::OM_CLASS;
    }

    /**
     * Performs an INSERT on the database, given a Triggerprospectionuser or Criteria object.
     *
     * @param      mixed $values Criteria or Triggerprospectionuser object containing data that is used to create the INSERT statement.
     * @param      PropelPDO $con the PropelPDO connection to use
     * @return mixed           The new primary key.
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function doInsert($values, PropelPDO $con = null)
    {
        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_WRITE);
        }

        if ($values instanceof Criteria) {
            $criteria = clone $values; // rename for clarity
        } else {
            $criteria = $values->buildCriteria(); // build Criteria from Triggerprospectionuser object
        }

        if ($criteria->containsKey(TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER) && $criteria->keyContainsValue(TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER) ) {
            throw new PropelException('Cannot insert a value for auto-increment primary key ('.TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER.')');
        }

        // Set the correct dbName
        $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);

        try {
            // use transaction because $criteria could contain info
            // for more than one table (I guess, conceivably)
            $con->beginTransaction();
            $pk = BasePeer::doInsert($criteria, $con);
            $con->commit();
        } catch (Exception $e) {
            $con->rollBack();
            throw $e;
        }

        return $pk;
    }

    /**
     * Performs an UPDATE on the database, given a Triggerprospectionuser or Criteria object.
     *
     * @param      mixed $values Criteria or Triggerprospectionuser object containing data that is used to create the UPDATE statement.
     * @param      PropelPDO $con The connection to use (specify PropelPDO connection object to exert more control over transactions).
     * @return int             The number of affected rows (if supported by underlying database driver).
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function doUpdate($values, PropelPDO $con = null)
    {
        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_WRITE);
        }

        $selectCriteria = new Criteria(TriggerprospectionuserPeer::DATABASE_NAME);

        if ($values instanceof Criteria) {
            $criteria = clone $values; // rename for clarity

            $comparison = $criteria->getComparison(TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER);
            $value = $criteria->remove(TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER);
            if ($value) {
                $selectCriteria->add(TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER, $value, $comparison);
            } else {
                $selectCriteria->setPrimaryTableName(TriggerprospectionuserPeer::TABLE_NAME);
            }

        } else { // $values is Triggerprospectionuser object
            $criteria = $values->buildCriteria(); // gets full criteria
            $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s)
        }

        // set the correct dbName
        $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);

        return BasePeer::doUpdate($selectCriteria, $criteria, $con);
    }

    /**
     * Deletes all rows from the triggerprospectionuser table.
     *
     * @param      PropelPDO $con the connection to use
     * @return int             The number of affected rows (if supported by underlying database driver).
     * @throws PropelException
     */
    public static function doDeleteAll(PropelPDO $con = null)
    {
        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_WRITE);
        }
        $affectedRows = 0; // initialize var to track total num of affected rows
        try {
            // use transaction because $criteria could contain info
            // for more than one table or we could emulating ON DELETE CASCADE, etc.
            $con->beginTransaction();
            $affectedRows += BasePeer::doDeleteAll(TriggerprospectionuserPeer::TABLE_NAME, $con, TriggerprospectionuserPeer::DATABASE_NAME);
            // Because this db requires some delete cascade/set null emulation, we have to
            // clear the cached instance *after* the emulation has happened (since
            // instances get re-added by the select statement contained therein).
            TriggerprospectionuserPeer::clearInstancePool();
            TriggerprospectionuserPeer::clearRelatedInstancePool();
            $con->commit();

            return $affectedRows;
        } catch (Exception $e) {
            $con->rollBack();
            throw $e;
        }
    }

    /**
     * Performs a DELETE on the database, given a Triggerprospectionuser or Criteria object OR a primary key value.
     *
     * @param      mixed $values Criteria or Triggerprospectionuser object or primary key or array of primary keys
     *              which is used to create the DELETE statement
     * @param      PropelPDO $con the connection to use
     * @return int The number of affected rows (if supported by underlying database driver).  This includes CASCADE-related rows
     *				if supported by native driver or if emulated using Propel.
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
     public static function doDelete($values, PropelPDO $con = null)
     {
        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_WRITE);
        }

        if ($values instanceof Criteria) {
            // invalidate the cache for all objects of this type, since we have no
            // way of knowing (without running a query) what objects should be invalidated
            // from the cache based on this Criteria.
            TriggerprospectionuserPeer::clearInstancePool();
            // rename for clarity
            $criteria = clone $values;
        } elseif ($values instanceof Triggerprospectionuser) { // it's a model object
            // invalidate the cache for this single object
            TriggerprospectionuserPeer::removeInstanceFromPool($values);
            // create criteria based on pk values
            $criteria = $values->buildPkeyCriteria();
        } else { // it's a primary key, or an array of pks
            $criteria = new Criteria(TriggerprospectionuserPeer::DATABASE_NAME);
            $criteria->add(TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER, (array) $values, Criteria::IN);
            // invalidate the cache for this object(s)
            foreach ((array) $values as $singleval) {
                TriggerprospectionuserPeer::removeInstanceFromPool($singleval);
            }
        }

        // Set the correct dbName
        $criteria->setDbName(TriggerprospectionuserPeer::DATABASE_NAME);

        $affectedRows = 0; // initialize var to track total num of affected rows

        try {
            // use transaction because $criteria could contain info
            // for more than one table or we could emulating ON DELETE CASCADE, etc.
            $con->beginTransaction();

            $affectedRows += BasePeer::doDelete($criteria, $con);
            TriggerprospectionuserPeer::clearRelatedInstancePool();
            $con->commit();

            return $affectedRows;
        } catch (Exception $e) {
            $con->rollBack();
            throw $e;
        }
    }

    /**
     * Validates all modified columns of given Triggerprospectionuser object.
     * If parameter $columns is either a single column name or an array of column names
     * than only those columns are validated.
     *
     * NOTICE: This does not apply to primary or foreign keys for now.
     *
     * @param Triggerprospectionuser $obj The object to validate.
     * @param      mixed $cols Column name or array of column names.
     *
     * @return mixed TRUE if all columns are valid or the error message of the first invalid column.
     */
    public static function doValidate($obj, $cols = null)
    {
        $columns = array();

        if ($cols) {
            $dbMap = Propel::getDatabaseMap(TriggerprospectionuserPeer::DATABASE_NAME);
            $tableMap = $dbMap->getTable(TriggerprospectionuserPeer::TABLE_NAME);

            if (! is_array($cols)) {
                $cols = array($cols);
            }

            foreach ($cols as $colName) {
                if ($tableMap->hasColumn($colName)) {
                    $get = 'get' . $tableMap->getColumn($colName)->getPhpName();
                    $columns[$colName] = $obj->$get();
                }
            }
        } else {

        }

        return BasePeer::doValidate(TriggerprospectionuserPeer::DATABASE_NAME, TriggerprospectionuserPeer::TABLE_NAME, $columns);
    }

    /**
     * Retrieve a single object by pkey.
     *
     * @param int $pk the primary key.
     * @param      PropelPDO $con the connection to use
     * @return Triggerprospectionuser
     */
    public static function retrieveByPK($pk, PropelPDO $con = null)
    {

        if (null !== ($obj = TriggerprospectionuserPeer::getInstanceFromPool((string) $pk))) {
            return $obj;
        }

        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_READ);
        }

        $criteria = new Criteria(TriggerprospectionuserPeer::DATABASE_NAME);
        $criteria->add(TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER, $pk);

        $v = TriggerprospectionuserPeer::doSelect($criteria, $con);

        return !empty($v) > 0 ? $v[0] : null;
    }

    /**
     * Retrieve multiple objects by pkey.
     *
     * @param      array $pks List of primary keys
     * @param      PropelPDO $con the connection to use
     * @return Triggerprospectionuser[]
     * @throws PropelException Any exceptions caught during processing will be
     *		 rethrown wrapped into a PropelException.
     */
    public static function retrieveByPKs($pks, PropelPDO $con = null)
    {
        if ($con === null) {
            $con = Propel::getConnection(TriggerprospectionuserPeer::DATABASE_NAME, Propel::CONNECTION_READ);
        }

        $objs = null;
        if (empty($pks)) {
            $objs = array();
        } else {
            $criteria = new Criteria(TriggerprospectionuserPeer::DATABASE_NAME);
            $criteria->add(TriggerprospectionuserPeer::IDTRIGGERPROSPECTIONUSER, $pks, Criteria::IN);
            $objs = TriggerprospectionuserPeer::doSelect($criteria, $con);
        }

        return $objs;
    }

} // BaseTriggerprospectionuserPeer

// This is the static code needed to register the TableMap for this table with the main Propel class.
//
BaseTriggerprospectionuserPeer::buildTableMap();

redpajama_set_name: RedPajamaGithub


ScreenPressor - Lossless video codec for screen capture providing the best compression.
ScreenPressor allows you to record screen activities to a very small video file with 100% quality. It's the best solution for making video tutorials and presentations. ScreenPressor is a video codec designed specifically for screen capture. It is lossless which means it always keeps 100% quality (no artifacts at all!) and it has the best compression in its field, making your video files smaller than other codecs. It can be used with any screen capture application like the free CamStudio or commercial HyperCam etc. Tests show that on a typical screen capture ScreenPressor makes even smaller video files than MPEG4 codecs like DivX or XviD while keeping perfect visual quality.
Video Enhancer - Video Enhancer allows you to increase resolution of your video with unbelievable quality (you can convert your SD video to good looking HD!), use hundreds of VirtualDub video filters and re-compress processed video with any codec.
SuperResolution plugin - Video upsizing plug-in for Adobe After Effects 6.5+ and Premiere Pro 2.0. Uses information from neighbor frames to upsize current frame. It provides more details and sharper image than any known upsize method. Now you can convert SD video to HD!
Nano Screen Capture Codec - Nano Screen Capture Codec was designed to offer users lossless image quality coupled with excellent compression ratios.
iSCC - inno Screen Capture Codec(iSCC) is the most optimized codec for screen recording.
Cool Screen Capture - Cool Screen Capture is an excellent tool designed to accommodate customers' need. Professional technique and intuitive interface make it suitable for every customer. Customers can capture video or image from DV, TV Tuner and other devices.
Kahlown Screen Capture Video Recorder - Kahlown SCVR screen capture and video recording software.
MSU Screen Capture Lossless Codec - Free lossless codec for video captured from screen. It has the best compression ratio among free lossless video codecs (on this kind of video). Can be used to make software presentations, videolessons and tutorials. Works in RGB24 colorspace.
Shareware Connection periodically updates pricing and software information of 'ScreenPressor' from company source 'Dee Mon' , so some information may be slightly out-of-date. You should confirm all information before relying on it. Software piracy is theft, Using 'ScreenPressor' crack, password, serial numbers, registration codes, key generators is illegal and prevent future development of ScreenPressor.


Our mobility and healthcare website offers hundreds of daily living aids and mobility products online.
When visiting our online store you'll find an extensive range of high quality mobility, healthcare and household products all designed to make life easier. Enabling customers to enjoy independence and comfort, Phelans Mobility Aids supplies the general public with an expert service. With our shop on the Kinsale Road Roundabout Cork (Phelans Midnight Pharmacy) and our online store and expert sales staff, our mission is to make life easier for all of our customers.


text:
College football national championship: Georgia routs TCU in blowout for back-to-back titles
Yahoo Sports Staff
January 10, 2023, 12:26 a.m. ·1 min read
Georgia bookended the 2022 season with dominance.
The No. 1 Bulldogs crushed No. 3 TCU, 65-7, to win their second national title in as many seasons on Monday night at SoFi Stadium. Georgia is the first team since Alabama in 2011 and 2012 to win back-to-back national titles and the first team in the College Football Playoff era to accomplish the feat.
It didn't take long for Georgia to make it clear that TCU's chances of winning the game were very slim. After TCU cut the lead to 10-7 in the first quarter after a coverage bust in the Georgia secondary set up a long pass play, the Bulldogs reeled off 24 straight points to end the first half thanks to a couple of Javon Bullard interceptions.
The Bulldogs scored a TD with 1:09 to go in the second quarter to go up 31-7 after Bullard intercepted Max Duggan on a wildly overthrown deep pass to Quentin Johnston. Bullard then picked off Duggan on a third and long deep in Georgia territory with 36 seconds to go before the half. AD Mitchell made a fantastic contested catch two plays later for a 38-7 halftime lead.
Georgia's 58-point win is the biggest margin of victory in any national championship game dating back to the start of the BCS era in 1998, eclipsing USC's 55-19 win over Oklahoma in January of 2005.
Read the rest of Nick Bromberg's title game recap right here.
Pair found guilty in beating of Mississauga father, family says act showed 'darkest side of humanity'
WestJet cancels direct flights between 3 Canadian cities and Europe for summer 2023
Ukrainian authorities raid home of billionaire Kolomoiskiy
Kenneth Esson gets full parole 36 years after Miramichi-area murders
No security threat from RCMP's dealings with China-linked firm, minister tells MPs
OTTAWA — Public Safety Minister Marco Mendicino says there is no reason to believe Canada's national security was under threat at any time due to the RCMP's dealings with an Ontario company that has links to China. Mendicino tried on Monday to reassure members of a House of Commons committee who are looking at the RCMP's standing offer with Sinclair Technologies for radio-frequency filtering equipment. The standing offer was suspended and a stop-work order for undelivered goods was issued last m
Rain pounds northern New Zealand; further flooding expected
WELLINGTON, New Zealand (AP) — Auckland prepared for another round of flooding as rain battered northern New Zealand's Northland region, which declared an emergency Tuesday afternoon in anticipation of the deluge. A state of emergency was already in place for Auckland, which saw deadly record rainfall Friday. Officials had closed schools for the week and were asking people to work from home if possible as the nation's largest city braced for more flooding. On Friday, the amount of rain that woul
CAKE IN RICE COOKER | 3 Ingredients | No Oven, Soft and Fluffy
CAKE IN RICE COOKER | 3 Ingredients | No Oven, Soft and Fluffy INGREDIENTS: 4 large eggs 1 cup white sugar (80g) 1 cup cake flour (or all-purpose flour) 1 tsp vanilla flavor (optional) #noovencake #ricecookercake
DES MOINES, Iowa (AP) — By this time four years ago, at least a dozen Democratic presidential hopefuls eager to make their case against Donald Trump had either visited Iowa or announced plans to soon visit the leadoff voting state ahead of the 2020 election. Iowa's campaign landscape is markedly different this year, with a Republican field seemingly frozen by Trump's early announcement of a 2024 campaign. So far, only former Arkansas Gov. Asa Hutchinson has visited this year, and U.S. Sen. Tim S
Windsor-Essex officials issue opioid warning after 11 overdoses in a week
Health officials in Windsor-Essex have issued an alert about a recent spike in opioid overdoses — the second alert this month. The Windsor-Essex Community Opioid and Substance Strategy (WECOSS) says there were 11 opioid overdoses recorded between Jan. 20 and Jan. 26. WECOSS says nine of the overdoses that week involved fentanyl. Following that week — from Jan. 28 to Jan. 29 — there were eight emergency department visits due to opioid overdoses, with an additional nine paramedic calls for a suspe
News bulletin 2023/01/31 23:11
News bulletin 2023/01/31 23:11View on euronews
PESHAWAR, Pakistan (AP) — The death toll from previous day's suicide bombing at a mosque in northwest Pakistan on Tuesday jumped to 74 after rescuers retrieved 15 more bodies from the rubble, police and rescue official said. Bilal Faizi, the chief rescue official, said they were still removing the rubble after the mosque's roof caved following the attack. He said the bombing in the northwestern city of Peshawar also wounded more than 150 people. It was not clear how the bomber was able to slip i
Fernandez signing caps big-spending Chelsea's latest spree
Chelsea completed another staggering spending spree by its new American ownership — more than $350 million this time — by signing Argentina midfielder Enzo Fernandez for a British-record fee on the final day of the January transfer window on Tuesday. A day of negotiations between Benfica and Chelsea's co-owners ended with the Premier League club agreeing to pay the release clause of 106.7 million pounds ($131.4 million) in the 22-year-old World Cup winner's contract. The Portuguese club announce
Canadian doctors spend 18.5 million hours on unnecessary paperwork, says new report
HALIFAX — Canadian doctors spend 18.5 million hours per year on unnecessary administrative work — the equivalent of more than 55 million patient visits — a report published Monday by the Canadian Federation of Independent Business says. Dr. Leisha Hawker, president of Doctors Nova Scotia, which represents all licensed physicians in the province, said eliminating paperwork redundancies and shortening medical forms can improve patient care and reduce burnout experienced by doctors. "A lot of physi
China raps Czech president-elect over Taiwan call
BEIJING (Reuters) -China condemned on Tuesday a phone call between Czech President-elect Petr Pavel and Taiwan President Tsai Ing-Wen, saying he ignored Beijing's repeated attempts at dissuasion. The Czech government, though, said as a sovereign country, it made its own decisions on who it talked to, while the call did not mark a change in its policy toward China which remained aligned with western allies. Most countries avoid high-level public interactions with Taiwan and its president, not wishing to provoke China, the world's second largest economy.
MATCHDAY: Newcastle aims for cup final; Inter vs. Atalanta
A look at what's happening in European soccer on Tuesday: ENGLAND Newcastle is looking to reach its first domestic cup final this century when the Saudi-owned team takes a 1-0 lead over Southampton into the second leg of the League Cup semifinals. Joelinton scored the only goal of the first leg last week. Newcastle hasn't won a major trophy since the FA Cup in 1955 and has only played in the League Cup final once — in 1976 when the team lost to Manchester City. Newcastle's last cup final appeara
Birds fill the sky in unusual formation in U.K.
The skies above Tewkesbury, U.K., recently played host to thousands of birds swooping about in unpredictable patterns and shapes.
New national standards for long-term care homes unveiled
The federal government has released new national standards for long-term care homes, after COVID-19 ravaged these facilities. Heather Yourex-West looks at the new guidelines, while Mercedes Stephenson explains how they're not mandatory, and how the NDP is reacting to the recommendations.
General Motors Co shares jumped early on Tuesday after it reported higher net income for the fourth quarter, forecast stronger-than-expected earnings for 2023 and said it would cut $2 billion in costs. The automaker, the top in the United States by sales, forecast that it could hold its pre-tax margins steady between 8% and 10% through 2025, despite a price war that Tesla Inc has triggered in the electric vehicle segment. GM shares opened up 7.1%.
Toronto residents shocked to see coyote running through the streets, 'steps from the CN Tower'
A coyote was spotted running around Toronto on Monday morning.
A former N.W.T. MLA lost his son to fentanyl. He wants to talk about it
Wally Schumann was shocked when he got the call. It was the Hay River RCMP, asking if he could meet them at his house. "Out in the driveway, the RCMP officer — you know, bless his soul — had to tell me that our son had passed away and he didn't know the details at that exact moment. He was just asked to come do this." Schumann, a long-time resident of Hay River, N.W.T., and a former territorial cabinet minister, had spoken to his son on the phone that morning, in one of their usual early-bird ch
Community steps up to replace athlete's lost equipment | The Moment
After Bradley Bartlett's hockey equipment didn't make it on his flight to Fort McMurray for the Arctic Winter Games, community members jumped into action to get him on the ice.
Witnesses tell murder trial they saw a dead man in William Sandeson's apartment
The fourth week of the first-degree murder trial of William Sandeson started with some dramatic testimony from a witness who said he saw a man with a bullet hole in his head slumped over in Sandeson's apartment on the evening of Aug. 15, 2015. Sandeson is accused of killing Taylor Samson, 22, in a drug deal at Sandeson's apartment in south-end Halifax on the evening of Aug. 15, 2015. Sandeson was 23 at the time. Justin Blades testified in Nova Scotia Supreme Court on Monday that he was at a frie
Gold medallists call for resignations at Gymnastics Canada as MPs question CEO about misconduct claims
Three of Canada's most accomplished gymnasts called on senior leaders of Gymnastics Canada to step down just as the embattled organization's CEO was being grilled by a parliamentary committee over his handling of misconduct allegations. Kyle Shewfelt, Rosie MacLennan and Ellie Black wrote a letter to Gymnastics Canada's board of directors saying that leaders need to instill confidence, take action and show good judgment when they head up national sporting organizations. "Based on these key needs
Ontario hospital nurses start contract talks, plan 'escalating actions'
TORONTO — The Ontario Nurses' Association started negotiating a new contract Monday for hospital nurses and the union is planning to take its push for higher wages beyond the bargaining table. The nurses, and other broader public sector workers, have been subject for three years to a wage restraint law known as Bill 124, which capped increases at one per cent a year. Bernie Robinson, the interim president of the ONA, said the last contract left nurses feeling disrespected and devalued. "Safe to

redpajama_set_name: RedPajamaCommonCrawl


It refers to the ability to send a short message service (SMS) text to local 9-1-1 call centers during an emergency.
Why is Text to 9-1-1 needed now?
Simply put, text messaging is one of the primary ways people communicate today, especially younger generations and members of the hearing and speech disabilities community. According to Forrester Research, an estimated six billion messages are sent every day in the United States. The 9-1-1 community is constantly striving to meet the evolving needs of the public.
What are the benefits of Text to 9-1-1?
There are many significant benefits, especially if you cannot communicate verbally. For example, Text to 9-1-1 is very useful to the approximately 34 million Americans who are hard of hearing, deaf, or speech-impaired. Text to 9-1-1 could also help in situations when a crime is in progress, a caller is facing domestic abuse or is injured and cannot speak, and in many other similar situations.
Wireless carriers provide Text to 9-1-1 services in the format requested by local 9-1-1 call centers, for example through TTY, Internet Protocol (IP), or other technologies. Carriers provide the service based on the call centers' requests.
Should I call or text 9-1-1?
If you can call, do it. Only text if you cannot call.
Push the "Send" button. Be prepared to answer questions and follow instructions from the 9-1-1 call taker.
Text in simple words; do not use abbreviations.
Always call 9-1-1 if you can. Text location information is not equal to current location technology. As with all text messages, 9-1-1 messages can take longer to receive, can get out of order, or may not be received.
If texting to 9-1-1 is temporarily unavailable, you will receive a message indicating that texting 9-1-1 is not available and to contact 9-1-1 by other means.
Texts sent to 9-1-1 have the same 160 character limit as other text messages.
Text to 9-1-1 cannot include more than one person. Do not send your emergency text to anyone other than 9-1-1.
Do emergency texts receive priority?
Cell providers treat messages to 9-1-1 like any other text message, so your texts will be subject to the same service speeds and/or delays, depending on network strength in your area.
Will GM 9-1-1 know my location when texting 9-1-1?
We will receive the cell tower location, provider, and phone number in this process. Providers will only be providing limited information. As they expand these capabilities, we anticipate this information to become more detailed. As with all emergency interactions, GM 9-1-1 will verify the location of a text within the first few seconds of contact.
As part of the deaf and hard of hearing community, do I need to do anything different to now text 9-1-1?
No, all you need is a text-capable phone with a data plan.
Will GM 9-1-1 be able to translate text in Spanish or another foreign language?
No. Non-English speaking residents will be directed to call 9-1-1. If in the event they cannot, GM 9-1-1 will contact its translation provider to assist.
Will I be able to send pictures to 9-1-1 of an accident or suspicious activity during an emergency text? If not when will I be able to?
No. The "Big 4" providers (see "When will Text to 9-1-1 be more widely available?" below) only support standard alphanumeric text messages with no multimedia attachments like audio, pictures or video. At some point in the next few years, providers will allow for multimedia. Initially, however, they are only providing the basic messaging. Once this is developed and the infrastructure is in place, we will move to this technology.
Will the text conversation drop as I move between cell tower locations?
No, you are connected to the 9-1-1 center until we release the conversation. Depending on the cellular provider, delays with text messages could be experienced.
Can my text be transferred to another agency just like my phone call can?
Yes, GM 9-1-1 can transfer your text to another agency.
I use a pre-paid wireless service. Will I be able to text 9-1-1?
Some pre-paid services may work via the "Big 4" providers (see below). Consult with your pre-paid phone vendor to determine if you are able to Text to 9-1-1 as it may depend on your service package.
When will Text to 9-1-1 be more widely available?
Under an historic agreement reached in December 2012 between National Emergency Number Association, the "Big 4" wireless carriers (AT&T, Sprint, T-Mobile, and Verizon), and the Association of Public Safety Communications Officials International, Text to 9-1-1 capabilities were in place on those four carriers' networks in May 2014. However, this does not mean that Text to 9-1-1 service was available to all consumers at that time. The actual availability hinges on the deployment of new systems and training at more than 6,000 9-1-1 centers across the country.
Note: Until Text to 9-1-1 service is implemented in a given area, texters in those areas will receive an automatic "bounce back" message indicating that the service is not yet available and advising them to use another method to contact emergency authorities.
Even when Text to 9-1-1 becomes widely available, the best way to contact 9-1-1 will continue to be via voice communications whenever possible.
What are the major challenges to making Text to 9-1-1 work nationwide?
As noted above, the widespread availability of Text to 9-1-1 will depend not only on telecommunications carriers but also on the ability of more than 6,000 9-1-1 centers to implement new systems and training. A key challenge facing 9-1-1 call centers is selecting the Text to 9-1-1 platform that works best in their individual centers, out of more than a dozen solutions available today. Emergency call centers and authorities need to conduct extensive research and testing to select the option that best fits their needs.


Summary: Tello Mobile is a Sprint MVNO (Mobile Virtual Network Operator, aka reseller). I've used Tello since 2017, and it works fine. More importantly, Tello pricing is very good and their customer service (if needed) is great. Assuming your area has decent Sprint coverage, Tello offers a good solution for low-use users through either their low-cost monthly plans or through their pay-as-you-go plan for people who are very low-use users. Tello is also a great low-cost option for a kid's first cell phone. Tello Mobile has some of the best and highest rated customer service and satisfaction in the industry. If you think you need to pay a lot to get good cellular service, think again. In my opinion, the big four (AT&T, Verizon, T-Mobile, and Sprint) are taking advantage of most people, and people are paying a lot more than they should. With the advent of low cost MVNO operators like Tello, there are lots of cheaper options for service today, and Tello is one you should definitely consider. If you are looking for the lowest cost "low use" reliable, hassle-free solution and you have good Sprint coverage, Tello is probably one of best solutions available today.
HOT! Get a $25 credit when you join Tello!
On October 18, 2017, Tello updated all of their monthly plan options to cut their prices and now includes unlimited texts in every plan.
Prepaid is becoming the most competitive category in wireless. Tello Mobile set the trend, with its flexible approach to custom plans and massive price drops. This spring, Tello Mobile announces a new line up of lower (unbeatable) prices that will satisfy every money savvy need: most of our phone plans get up to 35% drop in cost.
* For instance, if a customer want a plan including unlimited minutes & text plus 1GB of data, they can have it now at only $14/mo., instead of $19. If they need more data, they can choose 2GB instead of 1GB to the same combo and they will end up paying only $19 for what used to be $25/month.
* The new prices are available for both newcomers and existing customers. The people who join Tello Mobile will benefit from the cut prices upon signing up, whereas for the ones already enrolled in Tello, the extra benefits take effect immediately and the lower price at their next billing cycle.
* At Tello, customers can choose the number of minutes & data they need, unlimited texts are included in every plan, free of charge. Phone plans start as low as $5/mo. up to $39/mo., and now they can even choose a 4GB data plan option. Cell phone plans can be upgraded, downgraded, or renewed at any time, for no charge at all.
* The "no fees whatsoever" policy, outstanding 24/7 customer service & free calls to Canada, Mexico & China included in any plan make Tello stand out from other MVNOs. Other great freebies: tethering, unlimited text, voicemail.
* Besides being flexible when it comes to plans, Tello is also the only wireless carrier rated as "Excellent", as a result of more than 1400 reviews from its customers on Trustpilot, a famous review website getting roughly 500,000 genuine testimonials about thousands of businesses each month.
Tello started providing cellular service in the UK in 2014, and then began offering cellular service here in the US in 2016. The parent company of Tello is KeepCalling, which has been in the US since 2002. Tello uses Sprint as their cellular service provider, so you need to have a Sprint-capable (CDMA) phone, or you can buy a phone from Tello. Tello usually has a traditional flip phone available for $29, as well as smart phones starting as low as $49. Of course, Tello also sells more expensive phones, including iPhones, Samsung phones, and Motorola phones. So you can buy a phone from Tello, or you can use your own phone as long as it is CDMA capable (they have a phone checker on their website so you can confirm your phone will work on their network). If your phone doesn't already have a Sprint sim in it, you can purchase a Sprint sim from Tello for $10 with free shipping. With Tello, you can either use Pay-As-You-Go or have a monthly service plan.
With Pay-As-You-Go, there are no monthly fees. You simply add money to your credit balance ($10 to start), and then you pay 1 cent per text, 3 cents per voice minute, and 2 cents per MB of cellular data. If or when your credit balance gets low or runs out, you just add more to it. Your credit balance will never expire, as long as you do something at least once every three months (like send a text). Thus, for example, if you only use your phone to text and you don't send very many texts, an $10 credit could last almost indefinitely (1000 texts). Just remember to make a call or send a text (or you can send a text to your Tello number) at least once every three months to keep your credit balance from expiring. If you don't want to burn up your pay-as-you-go balance using cellular data, you can turn off cellular data on your account (and only enable it when you need it). Then you'll only be charged for calls and texts, and you can use wifi for data. If you don't call or text very much, a $10 credit can last a long time.
With Build-Your-Own monthly plans, you can configure a monthly plan with the number of voice minutes and/or the amount of cellular data that you want. You can update and change your plan whenever you want. All monthly plans include unlimited texts for free. The prices for the number of minutes or amount of cellular data are shown above. For example, you can get unlimited talk and text for $15 $11! If you add both voice minutes and cellular data, the monthly price is discounted even more. You can use their custom-plan-builder on their website to easily see what your options are and how much they would cost. For people who don't use their phones very much, Tello offers some of the lowest price monthly plans available anywhere.
* Tello uses Sprint for cellular service only (you can check your local coverage with the Tello coverage checker). There is no roaming. If you have good Sprint coverage, you will be fine, but if you have spotty or no Sprint coverage in your area, you should consider a different carrier.
I won't review a product or service unless I have actually tried it, so with that in mind, even though I don't really need another phone or phone number, I set up my Moto G4 on a Tello Pay-As-You-Go account and got a Tello phone number to test and evaluate, and then to use as a secondary/backup phone and phone number. For reference, the Moto G4 is both GSM and CDMA capable, which allows it to be used with any of the big four carriers (AT&T, Verizon, T-Mobile, and Sprint). Most importantly, the Moto G4 is CDMA capable, which means it can be used on Tello since it will work with Sprint (which requires a CDMA phone). I had to get a Sprint sim card (sim model SIMGLW446C) for my Moto G4. If you want to use your own Sprint-capable (CDMA) phone and you need a Sprint sim for it, you can get a Sprint sim card from Tello for $10. Once I had a Sprint sim for my Sprint-capable Moto G4 phone, I was ready to set up a new Tello account and "bring my own phone".
Ordering and setting up the new service on Tello was simple. They have an excellent, intuitive, easy to use website interface.
✔ The first thing they ask you when you are signing up is if you want to order a phone from them (which is the simplest way to go) or "bring your own phone". I selected the "Bring My Own Phone" option. I was then prompted to enter my Moto G4 phone's IMEI number (you can find this by dialing *#06# or by looking under settings > about phone > status > IMEI Information (my IMEI is 3541240712xxxxx).
✔ The next thing you are asked (if you are bringing your own phone) is if you have a Sprint sim, or need a sim (Tello sells sims for $10). I selected that I already had a sim, and was then prompted to enter the sim ICCID (you can also find this under your phone settings if the sim is in your phone, or printed on the sim card) (my sim ICCID is 890112010005328xxxxx).
✔ I was then asked if I wanted to port my old number into Tello or get a new number from Tello. I got a new phone number.
✔ I was then asked to pick a monthly plan or add a Pay-As-You-Go credit (or do both). I chose [ADD CREDIT] to add a Pay As You Go credit, and selected a $10 credit.
✔ I then entered my credit card information and submitted my order, and received my email confirmations.
After finishing and placing my order, I logged back into my Tello account to confirm I had the $10 credit and to see what my new phone number was. I immediately had my son send me a text, which didn't work. I probably just needed to wait a couple of minutes, but instead we turned the phone off and on, and did a carrier reset and a couple of other things, and then the new number worked. Again, I probably just needed to wait a few minutes and turn the phone off and on one time, but I was impatient. Once the phone was working, I called my son (standing next to me) and he called me, and we sent texts to each other. Overall, it was quite simple, and I now had a new phone number with a $10 Tello credit.
I also logged onto my Tello account and went to my dashboard, where I turned the 4G LTE cellular data off. I'm okay with only having data available when I'm on wifi, and I don't want to accidentally burn through all my credit by using cellular data. I do now have a working phone number for calls and texts, and will pay 3 cents a minute for calls and 1 cent per text. I'll update this review as I have time and as I have a chance to use my Tello number a bit more. In the meantime, from what I have read and my own limited experience, I believe Tello is a great option for people who are happy with Sprint coverage and who don't use their phones a lot, and who are looking for a low-cost, reliable, easy-to-use option for cellular service.
August 24, 2017 update: I've used Tello for a couple of weeks for sending and receiving texts and calls, and to occasionally check email (I turned my Tello cellular data back on). Tello works just as expected... which is great. As long as you have good local Sprint Coverage, Tello works just fine. Their pay-as-you-go credit (which is what I've been using) is a great way to go for really low-use people, or to test them out as I've been doing. Otherwise, their custom monthly plans are a good value. You can get unlimited texts and 100 voice minutes $5. You can add 200MB of LTE data for $4, or $9 total. If your monthly LTE data runs out, you still get unlimited (but slow) 2G data, or you can use a pay-as-you go credit to supplement your monthly plan data.
October 20, 2017 update: Tello is still working fine. I've been using the service for talking, texting, and light internet use, and it works, as expected. Our local Sprint coverage is just fine. And although I haven't needed to contact customer service for anything, I see that they continue to get high marks and great reviews for their customer service and support. If your local Sprint coverage is good and you're looking for an inexpensive option for cell phone service, I highly recommend that you consider Tello.
March 1, 2018 update: Tello continues to work as expected. I don't use it very much, but when I do use it, it works just fine. I continue to recommend Tello as an extremely affordable service for light users who are in an area with good Sprint coverage.
March 1, 2018 update: Important update for Pay-As-You-Go users. You need to use your pay-go balance every 90 days or less or it will expire. The Tello policy used to be that you needed to use your balance at least every 6 months, but they changed it to at least every 3 months or 90 days last fall. If you go more than 90 days with no use on your account, your pay-go balance will expire and your Tello phone number will be lost. Any call, text, or data used counts as usage, whether sent or received. Thus, to keep your balance active, all you need to do is send your number a text every 89 days or less. After you send or receive the text, check your dashboard to make sure your balance has dropped by a penny (the text costs one cent), and you'll be good to go for another 89 days. I wouldn't actually wait 89 days, but would send or receive a text every two months, unless you are regularly using your Tello service, in which case, you don't need to worry.
To my mind, one of the best things about Tello is their customer service, as they have some of the highest rated customer service in the industry. If you have any problems with your order, or your phone, or your service, they will respond quickly and efficiently, and will do everything they can to solve your problem. Tello uses TrustPilot to let their customers review their service. The nice thing about TrustPilot is that they have real reviews, and Tello can't delete the bad review. The reviews you see are the real unfiltered reviews. And the thing about real reviews is, when people are unhappy they'll often post a bad review, but when things work the way they should, people often don't take the time to write a review or say anything. So I am used to seeing negative comments (on companies that have poor products or service), but it's not very common to see that many positive reviews (because most people won't take the time to leave positive reviews) unless a company really is exceptional and really deserves all the positive reviews. The cool (and amazing) thing about Tello is that not only do they not have many (or any?) negative reviews, but they have lots of positive reviews (which is uncommon). Check out the latest Tello TrustPilot reviews here. Based on all the happy customers (and reviews) that Tello has, they really do have great customer service.
Hello Steve, Good overall Tello overview, I have also used it for a few months. Just a slight observation about the calls to Canada/Mexico, the calls are not exactly free, they are simply charged the same rate as in-US calls, meaning the rate of the calls is taken from your remaining minutes/balance.
I have been satisfied with Tello using a monthly plan, and I put my mother on the Pay-as-you-go plan. The pay-as-you-go plan is very convenient and affordable for someone who does not talk/text or use data a lot. You can get a plan for $10, my mom got 2 months out of it using the service almost every day for a few short calls and texts. People who rarely call or texts, or want to have a backup phone can get way longer mileage out of the $10. You can even turn off your data in the website to prevent unintentional data use/expense. You also get an itemized list of calls and texts received/made and voice mail is included.
The monthly plans are great too, you can get the lowest possible 4G (high speed) data of 200 MBs, and after you run out of it, you get unlimited reduced speed data at 64k, which is good enough for GPS apps, and even Uber app, checking emails, and sending MMS, although as expected such activities will take longer to accomplish, but considering that it is unlimited AND included at no extra charge if you use a monthly plan, I can not complain about it.
Additionally, if you don't use all your call minutes, and you manually renew your plan (instead of letting it renew itself automatically at end of cycle) you can roll those unused minutes over to the next month, and you can continue accumulating unused calling minutes. I had been using a combo of 100 minutes, unlimited texts, and 200MB, and the price was only $10 plus taxes, which is very affordable I think for reliable cellular (not VOIP) phone service. Of course, being a Sprint MVNO, the coverage will not be as extensive as the other 3 major networks, but I have not had trouble at all with it. Customer service is also great, I had to contact them via email twice, and I got a response with 5 minutes both times. You can use almost any Sprint phone I believe even the FreedomPop Sprint devices with Tello, you can use the tool in their website to make sure your used phone is compatible with it before signing up. I have used it with a Moto G4 Play, just had to find the correct Sprint sim card for it, and got it for a fraction of the cost from eBay. The first month after I ran out of 4G data, I found out I had to go to the "Cellular Network Settings" on the phone to change from LTE to 3G, in order to access the 2G speed data. Definitely a reliable and affordable phone service.
Hi Dave, Wow! Thanks for your detailed real-world report on using Tello, and for pointing out some additional benefits and tips. Best comment I've gotten in a long time. Thank you! I'll add your info into my review, and clarify that calls to Mexico and Canada aren't really "free" but they are included and treated the same as domestic US calls. Your experience with getting unlimited slow 2G data after you hit your data limit on a monthly plan is great to know. So your data never gets cut off, it just gets slowed down, but it still useable for checking email, etc. Thanks again!
Glad you found useful info in my experience with Tello, before I forget, if you ever need to port out, you would have to contact them to get your account number, as that information is not available in the website. Also, Tello does not use a pin number for the accounts, but most other companies require a pin number when porting in, the pin you would provide is 0000.
About the unlimited 2G data, it is indeed very useful to have, and at no additional cost it is a win for sure, but you might have to play around with the "Cellular Network Settings" depending on what phone you have as mentioned previously. I was able to even send picture messages, although it took sometime. I successfully used Waze and Google Maps, as well as WhatsApp, Uber, and Gmail app. Regular web surfing definitely is not an enjoyable experience at this speed, but if you need to do a quick Google search, it is better than not having data at all.
Be aware that with monthly plans, the renewal date does not fall on the same day every month, so if you want to renew manually to roll-over the used minutes, then you must keep track of the due date. The unused minutes from the ending month will not roll-over if you let the system renew your plan. I renewed my plan a day before just in case.
You can also download their app for more convenient access to your account.
Most of the reviews I came across merely highlight the monetary aspects of the provider, neglecting the customer support / technical support aspects. I started my cellular adventures with RingPlus, (R.I.P.) - they NEVER answered an eMail or a telephone call. From there I wandered to FreedomPOP; The sold me a Galaxy S4 that did not have any signal strength, and failed to call many times. Their tech support was moronic and laughable. After divorced them, miracle of all miracles, signal strength jumped from 0 to -80 dbm!!!
Now I've landed in TELLO Mobile land. I had a caller-ID problem, called them and the guy picked up the phone on the 2nd. ring. (!!!) They followed-up with an eMail AND with few phone calls to make sure I'm satisfied. Where else can one expect such a service nowadays?!!! I would highly recommend TELLO!
Hi Reuven, Thanks for your comment and for sharing your own personal experience with Tello. I agree that Tello's superior customer service is one of their strengths. From my own experience, when I was placing my order with Tello, I had a question and clicked on the online chat button on their website. Someone responded in under a minute. The person was very knowledgeable and answered my question quickly and efficiently. I believe Tello has one of the highest customer service ratings of any cellular service provider based on their TrustPilot rating. That's also the impression I get from just about everything I've read about Tello. I think they truly go the extra mile on their customer service.
Do you have a comment or question? Would you like to share your own experience with Tello Mobile?