deliFieldLeft = '"'; $this->deliFieldRight = '"'; $this->deliTableLeft = '"'; $this->deliTableRight = '"'; } public function concat(string $str1, ?string $str2 = null): string { return implode(' + ', func_get_args()); } /** * Given a SQL returns it with the proper LIMIT or equivalent method included * @param string $sql * @param int $start * @param int $qty * @return string * @throws NotAvailableException */ public function limit(string $sql, int $start, int $qty = 50): string { throw new NotAvailableException("DBLib does not support LIMIT feature."); } /** * Given a SQL returns it with the proper TOP or equivalent method included * @param string $sql * @param int $qty * @return string */ public function top(string $sql, int $qty): string { if (stripos($sql, ' TOP ') === false) { return preg_replace("/^\\s*(select) /i", "\1 top $qty ", $sql); } return preg_replace( '~(\s[Tt][Oo][Pp])\s.*?\d+\s~', '$1 ' . $qty . ' ', $sql ); } /** * Return if the database provider have a top or similar function * @return bool */ public function hasTop(): bool { return true; } /** * Return if the database provider have a limit function * @return bool */ public function hasLimit(): bool { return false; } /** * Format date column in sql string given an input format that understands Y M D * * @param string $format * @param string|null $column * @return string * @example $db->getDbFunctions()->SQLDate("d/m/Y H:i", "dtcriacao") */ public function sqlDate(string $format, ?string $column = null): string { if (is_null($column)) { $column = "getdate()"; } $pattern = [ 'Y' => "YYYY", 'y' => "YY", 'M' => "MM", 'm' => "M", 'Q' => "", 'q' => "", 'D' => "dd", 'd' => "dd", 'h' => "H", 'H' => "HH", 'i' => "mm", 's' => "ss", 'a' => "", 'A' => "", ]; $preparedSql = $this->prepareSqlDate($format, $pattern, ''); return sprintf( "FORMAT(%s, '%s')", $column, implode('', $preparedSql) ); } /** * @param DbDriverInterface $dbdataset * @param string $sql * @param array|null $param * @return mixed */ public function executeAndGetInsertedId(DbDriverInterface $dbdataset, string $sql, ?array $param = null): mixed { $insertedId = parent::executeAndGetInsertedId($dbdataset, $sql, $param); $iterator = $dbdataset->getIterator("select @@identity id"); if ($iterator->hasNext()) { $singleRow = $iterator->moveNext(); $insertedId = $singleRow->get("id"); } return $insertedId; } /** * @param string $sql * @return string * @throws \ByJG\AnyDataset\Core\Exception\NotAvailableException */ public function forUpdate(string $sql): string { throw new NotAvailableException('FOR UPDATE not available for Mssql/Dblib'); } public function hasForUpdate(): bool { return false; } public function getTableMetadata(DbDriverInterface $dbdataset, string $tableName): array { $sql = "select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '$tableName'"; return $this->getTableMetadataFromSql($dbdataset, $sql); } protected function parseColumnMetadata($metadata) { $return = []; foreach ($metadata as $key => $value) { if (!empty($value['character_maximum_length'])) { $dataType = strtolower($value['data_type']) . '(' . $value['character_maximum_length'] . ')'; } else { $dataType = strtolower($value['data_type']) . '(' . $value["numeric_precision"] . ',' . $value['numeric_precision_radix'] . ')'; } $return[strtolower($value['column_name'])] = [ 'name' => $value['column_name'], 'dbType' => strtolower($value['data_type']), 'required' => $value['is_nullable'] == 'NO', 'default' => $value['column_default'], ] + $this->parseTypeMetadata($dataType); } return $return; } public function getIsolationLevelCommand(?IsolationLevelEnum $isolationLevel = null): string { return match ($isolationLevel) { IsolationLevelEnum::READ_UNCOMMITTED => "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED", IsolationLevelEnum::READ_COMMITTED => "SET TRANSACTION ISOLATION LEVEL READ COMMITTED", IsolationLevelEnum::REPEATABLE_READ => "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ", IsolationLevelEnum::SERIALIZABLE => "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE", default => "", }; } }__halt_compiler();----SIGNATURE:----uh6LscgUP/IOIqJljQ8cWOeYcUUB8eeltqvl/NMBgUXdWKbap7iL2mJFtjfa0JquY9cM9yI3UbeKoS2pkc8Prz26tbWcKlrbLnbV+cN8F/yvp4Jnusx8T5AfhmpGtuMrPPwSay2b2RaQpvRPqI25WeTqpqSVXAExZP38mJCyQV0ncO3SuZvla4XJc3qCsZrWwnWIP9Qy3tzf0oQWCsRZkL+XMm9CabXdt+zW+prE6SDXXNrzflzrgbd+cgzSWRhw4oMzL3yC6NTMephxujf4iwL4J2K3hQSIHIc8tvtad2hzsB4ZFqUCny0LvYc3QoZUEGhuS2/oIIRlBQNYAPeCmyuzyPpyeSCfJ6pr/S5T8X+Tjqm7ezd80zJzdhXAbe6gVfvvqH46gNrWsG0CVABXfghoIc53cE//KoIekvEyEAjq0e6II/rMge87nL4+l6IKC1d/ikMnrb76oXHrfTy4BviLZSplROVE8xx9mi0CC/q93JuveLppPvsjH54wEToypn4j9ktPFtK2me9xeaUljPdwLCDH/Th/H39d6Vhx95nyOJitX4Nh4GGYMrd1UdhugX5m56VwAbYl2ocnGfq3nbG6Cgq/enRvm4I3jKvetCxEwgcWzGNExwBRWL33qYBLQ8D3gcqxHKT4k0FGLM+j+Uv7gZ59fh8F29AU21aZjhc=----ATTACHMENT:----NzcwODE5NjI0NDM5NDIzMiA0MjQyNTQ5MzY4MDUxMjE4IDk1Mzg5OTQyMzcxODA3MzA=