/** * Load the sql file and then execute it * * @throws BuildException */ public function main() { $conf = new GeneratorConfig(); $conf->setBuildProperties($this->getProject()->getProperties()); $this->setBuildConnections($conf->getBuildConnections()); if ($this->sqldbmap === null || $this->getSqlDbMap()->exists() === false) { throw new BuildException("You haven't provided an sqldbmap, or " . "the one you specified doesn't exist: " . $this->sqldbmap->getPath()); } if ($this->url === null) { throw new BuildException("DSN url attribute must be set!"); } // get an ordered list of SQL files to execute $databases = $this->getFilesToExecute(); $this->log(sprintf('Reading SQL files...')); foreach ($databases as $database => $files) { $statements[$database] = array(); foreach ($files as $fileName) { $fullFileName = $this->srcDir ? $this->srcDir . DIRECTORY_SEPARATOR . $fileName : $fileName; if (file_exists($fullFileName)) { $this->log(sprintf(' Loading statements from "%s"', $fullFileName)); $fileStatements = PropelSQLParser::parseFile($fullFileName); $this->log(sprintf(' %d statements to execute', count($fileStatements)), Project::MSG_VERBOSE); $statements[$database] = array_merge($statements[$database], $fileStatements); } else { $this->log(sprintf('File "%s" in sqldbmap does not exist, skipping it.', $fullFileName)); } } } $successfullStatements = 0; $this->log(sprintf('Executing SQL statements...')); foreach ($statements as $database => $statementList) { $successfullStatements += $this->insertDatabaseSqlFiles($database, $statementList); } $this->log(sprintf('SQL execution complete. %d statements successfully executed.', $successfullStatements)); }
/** * @param string $datasource A datasource name. */ public function insertSql($datasource = null) { $statementsToInsert = array(); foreach ($this->getProperties($this->getSqlDbMapFilename()) as $sqlFile => $database) { if (null !== $datasource && $database !== $datasource) { // skip break; } if (!isset($statementsToInsert[$database])) { $statementsToInsert[$database] = array(); } if (null === $database || null !== $database && $database === $datasource) { $filename = $this->getWorkingDirectory() . DIRECTORY_SEPARATOR . $sqlFile; if (file_exists($filename)) { foreach (PropelSQLParser::parseFile($filename) as $sql) { $statementsToInsert[$database][] = $sql; } } } } foreach ($statementsToInsert as $database => $sqls) { if (!$this->hasConnection($database)) { continue; } $pdo = $this->getPdoConnection($database); $pdo->beginTransaction(); try { foreach ($sqls as $sql) { $stmt = $pdo->prepare($sql); $stmt->execute(); } $pdo->commit(); } catch (PDOException $e) { $pdo->rollback(); throw $e; } } return true; }