/**
     * Finds project by path.
     *
     * @param string $path Path.
     *
     * @return integer
     * @throws \InvalidArgumentException When project can't be found.
     */
    protected function getProject($path)
    {
        $sql = 'SELECT Id
				FROM Projects
				WHERE Path = :path';
        $project_id = $this->database->fetchValue($sql, array('path' => $path));
        if ($project_id === false) {
            throw new \InvalidArgumentException('The project with "' . $path . '" path not found.');
        }
        return $project_id;
    }
    /**
     * Checks, that database table contains given number of records.
     *
     * @param string  $table_name            Table name.
     * @param integer $expected_record_count Expected record count.
     *
     * @return void
     */
    protected function assertTableCount($table_name, $expected_record_count)
    {
        $profiler = $this->database->getProfiler();
        if (is_object($profiler)) {
            $profiler->setActive(false);
        }
        $sql = 'SELECT COUNT(*)
				FROM ' . $table_name;
        $actual_record_count = $this->database->fetchValue($sql);
        if (is_object($profiler)) {
            $profiler->setActive(true);
        }
        $this->assertEquals($expected_record_count, $actual_record_count, 'The "' . $table_name . '" table contains ' . $expected_record_count . ' records');
    }
    /**
     * Adds a relation.
     *
     * @param integer $class_id      Class ID.
     * @param string  $related_class Related class.
     * @param integer $relation_type Relation type.
     * @param boolean $is_internal   Is internal.
     * @param array   $old_relations Old relations.
     *
     * @return string
     */
    protected function addRelation($class_id, $related_class, $relation_type, $is_internal, array $old_relations)
    {
        $insert_sql = '	INSERT INTO ClassRelations (ClassId, RelatedClass, RelatedClassId, RelationType)
						VALUES (:class_id, :related_class, :related_class_id, :relation_type)';
        $update_sql = ' UPDATE ClassRelations
						SET RelationType = :relation_type
						WHERE ClassId = :class_id AND RelatedClassId = :related_class_id';
        if ($is_internal) {
            $related_class_id = 0;
        } else {
            $related_class_file = realpath(ReflectionEngine::locateClassFile($related_class));
            $sql = 'SELECT Id
					FROM Classes
					WHERE FileId = :file_id AND Name = :name';
            $related_class_id = $this->db->fetchValue($sql, array('file_id' => $this->processFile($related_class_file), 'name' => $related_class));
        }
        $this->db->perform(in_array($related_class, $old_relations) ? $update_sql : $insert_sql, array('class_id' => $class_id, 'related_class' => $related_class, 'related_class_id' => $related_class_id, 'relation_type' => $relation_type));
        return $related_class;
    }
 /**
  *
  * Fetches the very first value (i.e., first column of the first row).
  *
  * @param string $statement The SQL statement to prepare and execute.
  *
  * @param array $values Values to bind to the query.
  *
  * @return mixed
  *
  */
 public function fetchValue($statement, array $values = array())
 {
     $result = $this->pdo->fetchValue($statement, $values);
     $this->logProfiles(__FUNCTION__);
     return $result;
 }