public function insertGet(string $table, array $map, string $field)
{
if ($this->insert($table, $map)) {
$post = [];
$params = [];
foreach ($map as $i => $v) {
// Escape the identifier to prevent stupidity
$i = $this->escapeIdentifier($i);
if ($v === null) {
$post[] = " {$i} IS NULL ";
} elseif ($v === true) {
$post[] = " {$i} = TRUE ";
} elseif ($v === false) {
$post[] = " {$i} = FALSE ";
} elseif (\is_array($v)) {
throw new \TypeError(\trk('errors.database.array_passed'));
} else {
// We use prepared statements for handling the users' data
$post[] = " {$i} = ? ";
$params[] = $v;
}
}
$conditions = \implode(' AND ', $post);
// We want the latest value:
switch ($this->dbengine) {
case 'mysql':
$limiter = ' ORDER BY ' . $this->escapeIdentifier($field) . ' DESC LIMIT 0, 1 ';
break;
case 'pgsql':
$limiter = ' ORDER BY ' . $this->escapeIdentifier($field) . ' DESC OFFSET 0 LIMIT 1 ';
break;
default:
$limiter = '';
}
$query = 'SELECT ' . $this->escapeIdentifier($field) . ' FROM ' . $this->escapeIdentifier($table) . ' WHERE ' . $conditions . $limiter;
return $this->single($query, $params);
} else {
throw new DBAlert\DBException(\trk('errors.database.insert_failed', $table, $this->pdo->errorInfo()[2]));
}
}
/** * We're storing metadata about a package in the database. * * @param TreeUpdate $update * @param int $treeUpdateID */ protected function updatePackageQueue(TreeUpdate $update, int $treeUpdateID) { $packageId = $this->db->cell('SELECT packageid FROM airship_package_cache WHERE packagetype = ? AND supplier = ? AND name = ? ', $update->getPackageType(), $update->getSupplierName(), $update->getPackageName()); if (empty($packageId)) { $packageId = $this->db->insertGet('airship_package_cache', ['packagetype' => $update->getPackageType(), 'supplier' => $update->getSupplierName(), 'name' => $update->getPackageName()], 'packageid'); } $data = $update->getNodeData(); $this->db->insert('airship_package_versions', ['package' => $packageId, 'version' => $data['version'], 'checksum' => $data['checksum'], 'commithash' => $data['commit'] ?? null, 'date_released' => $data['date_released'], 'treeupdateid' => $treeUpdateID]); }