summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxGrz <grzesiek.byskiniewicz@gmail.com>2025-10-01 11:56:48 +0200
committerxGrz <grzesiek.byskiniewicz@gmail.com>2025-10-01 11:56:48 +0200
commit5af3375acd5611295c672aefa2392ab36fde8ec0 (patch)
treebd194232c738cbbded2cd8e2be9b1157a633289e
downloadilluminate-firebird-5af3375acd5611295c672aefa2392ab36fde8ec0.tar.gz
illuminate-firebird-5af3375acd5611295c672aefa2392ab36fde8ec0.tar.bz2
illuminate-firebird-5af3375acd5611295c672aefa2392ab36fde8ec0.zip
[dev] Initial commit from HarryGulliford/laravel-firebird.
Added support for L12, handling search without a case-sensitive search at the database query level. Changed namespaces to xgrz.
-rw-r--r--.gitignore1
-rw-r--r--.idea/.gitignore8
-rw-r--r--.idea/deployment.xml14
-rw-r--r--.idea/firebird-support.iml8
-rw-r--r--.idea/jsLibraryMappings.xml6
-rw-r--r--.idea/misc.xml12
-rw-r--r--.idea/modules.xml8
-rw-r--r--.idea/php.xml34
-rw-r--r--.idea/vcs.xml6
-rw-r--r--composer.json24
-rw-r--r--composer.lock1846
-rwxr-xr-xsrc/FirebirdConnection.php81
-rwxr-xr-xsrc/FirebirdConnector.php57
-rwxr-xr-xsrc/FirebirdServiceProvider.php23
-rwxr-xr-xsrc/Query/Builder.php54
-rwxr-xr-xsrc/Query/Grammars/FirebirdGrammar.php172
-rw-r--r--src/Query/Processors/FirebirdProcessor.php21
-rwxr-xr-xsrc/Schema/Builder.php10
-rwxr-xr-xsrc/Schema/Grammars/FirebirdGrammar.php631
19 files changed, 3016 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..57872d0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/vendor/
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/deployment.xml b/.idea/deployment.xml
new file mode 100644
index 0000000..803f300
--- /dev/null
+++ b/.idea/deployment.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false">
+ <serverData>
+ <paths name="CameConfigurator">
+ <serverdata>
+ <mappings>
+ <mapping local="$PROJECT_DIR$" web="/" />
+ </mappings>
+ </serverdata>
+ </paths>
+ </serverData>
+ </component>
+</project> \ No newline at end of file
diff --git a/.idea/firebird-support.iml b/.idea/firebird-support.iml
new file mode 100644
index 0000000..c956989
--- /dev/null
+++ b/.idea/firebird-support.iml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+ <component name="NewModuleRootManager">
+ <content url="file://$MODULE_DIR$" />
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module> \ No newline at end of file
diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml
new file mode 100644
index 0000000..d23208f
--- /dev/null
+++ b/.idea/jsLibraryMappings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="JavaScriptLibraryMappings">
+ <includedPredefinedLibrary name="Node.js Core" />
+ </component>
+</project> \ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..5ccacb9
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="MaterialThemeProjectNewConfig">
+ <option name="metadata">
+ <MTProjectMetadataState>
+ <option name="migrated" value="true" />
+ <option name="pristineConfig" value="false" />
+ <option name="userId" value="-28e32f49:190c01bd7bb:-7ff9" />
+ </MTProjectMetadataState>
+ </option>
+ </component>
+</project> \ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..c997744
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/firebird-support.iml" filepath="$PROJECT_DIR$/.idea/firebird-support.iml" />
+ </modules>
+ </component>
+</project> \ No newline at end of file
diff --git a/.idea/php.xml b/.idea/php.xml
new file mode 100644
index 0000000..4d6b749
--- /dev/null
+++ b/.idea/php.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="MessDetectorOptionsConfiguration">
+ <option name="transferred" value="true" />
+ </component>
+ <component name="PHPCSFixerOptionsConfiguration">
+ <option name="transferred" value="true" />
+ </component>
+ <component name="PHPCodeSnifferOptionsConfiguration">
+ <option name="highlightLevel" value="WARNING" />
+ <option name="transferred" value="true" />
+ </component>
+ <component name="PhpCodeSniffer">
+ <phpcs_settings>
+ <phpcs_by_interpreter asDefaultInterpreter="true" interpreter_id="cb06832a-c1e5-4d33-a8f1-88fa166282ef" timeout="30000" />
+ </phpcs_settings>
+ </component>
+ <component name="PhpStan">
+ <PhpStan_settings>
+ <phpstan_by_interpreter asDefaultInterpreter="true" interpreter_id="cb06832a-c1e5-4d33-a8f1-88fa166282ef" timeout="60000" />
+ </PhpStan_settings>
+ </component>
+ <component name="PhpStanOptionsConfiguration">
+ <option name="transferred" value="true" />
+ </component>
+ <component name="Psalm">
+ <Psalm_settings>
+ <psalm_fixer_by_interpreter asDefaultInterpreter="true" interpreter_id="cb06832a-c1e5-4d33-a8f1-88fa166282ef" timeout="60000" />
+ </Psalm_settings>
+ </component>
+ <component name="PsalmOptionsConfiguration">
+ <option name="transferred" value="true" />
+ </component>
+</project> \ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="VcsDirectoryMappings">
+ <mapping directory="" vcs="Git" />
+ </component>
+</project> \ No newline at end of file
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..10367ac
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,24 @@
+{
+ "name": "xgrz/firebird-support",
+ "description": "Firebird database driver for the Laravel Framework",
+ "license": "MIT",
+ "require": {
+ "php": "^8.2",
+ "illuminate/support": "^12.0",
+ "illuminate/container": "^12.0",
+ "illuminate/database": "^12.0",
+ "illuminate/events": "^12.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "HarryGulliford\\Firebird\\": "src/"
+ }
+ },
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Xgrz\\Firebird\\FirebirdServiceProvider"
+ ]
+ }
+ }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..f1e7e17
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,1846 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "88f74516c0879fbf3ee0258840bfc53e",
+ "packages": [
+ {
+ "name": "brick/math",
+ "version": "0.14.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/brick/math.git",
+ "reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/brick/math/zipball/113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2",
+ "reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.2"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.2",
+ "phpstan/phpstan": "2.1.22",
+ "phpunit/phpunit": "^11.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Brick\\Math\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Arbitrary-precision arithmetic library",
+ "keywords": [
+ "Arbitrary-precision",
+ "BigInteger",
+ "BigRational",
+ "arithmetic",
+ "bigdecimal",
+ "bignum",
+ "bignumber",
+ "brick",
+ "decimal",
+ "integer",
+ "math",
+ "mathematics",
+ "rational"
+ ],
+ "support": {
+ "issues": "https://github.com/brick/math/issues",
+ "source": "https://github.com/brick/math/tree/0.14.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/BenMorel",
+ "type": "github"
+ }
+ ],
+ "time": "2025-08-29T12:40:03+00:00"
+ },
+ {
+ "name": "carbonphp/carbon-doctrine-types",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
+ "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
+ "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "conflict": {
+ "doctrine/dbal": "<4.0.0 || >=5.0.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^4.0.0",
+ "nesbot/carbon": "^2.71.0 || ^3.0.0",
+ "phpunit/phpunit": "^10.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KyleKatarn",
+ "email": "kylekatarnls@gmail.com"
+ }
+ ],
+ "description": "Types to use Carbon in Doctrine",
+ "keywords": [
+ "carbon",
+ "date",
+ "datetime",
+ "doctrine",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
+ "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-09T16:56:22+00:00"
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b",
+ "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12.0 || ^13.0",
+ "phpstan/phpstan": "^1.12 || ^2.0",
+ "phpstan/phpstan-phpunit": "^1.4 || ^2.0",
+ "phpstan/phpstan-strict-rules": "^1.6 || ^2.0",
+ "phpunit/phpunit": "^8.5 || ^12.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Inflector\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+ "keywords": [
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/inflector/issues",
+ "source": "https://github.com/doctrine/inflector/tree/2.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-10T19:31:58+00:00"
+ },
+ {
+ "name": "illuminate/bus",
+ "version": "v12.32.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/bus.git",
+ "reference": "a86a4548839028c18adc1139de2fabecec0b93fe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/bus/zipball/a86a4548839028c18adc1139de2fabecec0b93fe",
+ "reference": "a86a4548839028c18adc1139de2fabecec0b93fe",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/collections": "^12.0",
+ "illuminate/contracts": "^12.0",
+ "illuminate/pipeline": "^12.0",
+ "illuminate/support": "^12.0",
+ "php": "^8.2"
+ },
+ "suggest": {
+ "illuminate/queue": "Required to use closures when chaining jobs (^12.0)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Bus\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Bus package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-09-30T10:20:25+00:00"
+ },
+ {
+ "name": "illuminate/collections",
+ "version": "v12.32.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/collections.git",
+ "reference": "d47aaf15c55dd1c252688fdc7adbee129bd2ff0b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/collections/zipball/d47aaf15c55dd1c252688fdc7adbee129bd2ff0b",
+ "reference": "d47aaf15c55dd1c252688fdc7adbee129bd2ff0b",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/conditionable": "^12.0",
+ "illuminate/contracts": "^12.0",
+ "illuminate/macroable": "^12.0",
+ "php": "^8.2",
+ "symfony/polyfill-php84": "^1.33",
+ "symfony/polyfill-php85": "^1.33"
+ },
+ "suggest": {
+ "illuminate/http": "Required to convert collections to API resources (^12.0).",
+ "symfony/var-dumper": "Required to use the dump method (^7.2)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "functions.php",
+ "helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Collections package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-09-28T12:52:25+00:00"
+ },
+ {
+ "name": "illuminate/conditionable",
+ "version": "v12.32.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/conditionable.git",
+ "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/conditionable/zipball/ec677967c1f2faf90b8428919124d2184a4c9b49",
+ "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Conditionable package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-05-13T15:08:45+00:00"
+ },
+ {
+ "name": "illuminate/container",
+ "version": "v12.32.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/container.git",
+ "reference": "d6eaa8afd48dbe16b6b3c412a87479cad67eeb12"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/container/zipball/d6eaa8afd48dbe16b6b3c412a87479cad67eeb12",
+ "reference": "d6eaa8afd48dbe16b6b3c412a87479cad67eeb12",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/contracts": "^12.0",
+ "php": "^8.2",
+ "psr/container": "^1.1.1|^2.0.1",
+ "symfony/polyfill-php84": "^1.33",
+ "symfony/polyfill-php85": "^1.33"
+ },
+ "provide": {
+ "psr/container-implementation": "1.1|2.0"
+ },
+ "suggest": {
+ "illuminate/auth": "Required to use the Auth attribute",
+ "illuminate/cache": "Required to use the Cache attribute",
+ "illuminate/config": "Required to use the Config attribute",
+ "illuminate/database": "Required to use the DB attribute",
+ "illuminate/filesystem": "Required to use the Storage attribute",
+ "illuminate/log": "Required to use the Log or Context attributes"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Container\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Container package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-09-12T14:35:11+00:00"
+ },
+ {
+ "name": "illuminate/contracts",
+ "version": "v12.32.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/contracts.git",
+ "reference": "0bdbf0cdb5dd5739b2c8e6caf881a4114399ab15"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/0bdbf0cdb5dd5739b2c8e6caf881a4114399ab15",
+ "reference": "0bdbf0cdb5dd5739b2c8e6caf881a4114399ab15",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.2",
+ "psr/container": "^1.1.1|^2.0.1",
+ "psr/simple-cache": "^1.0|^2.0|^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Contracts\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Contracts package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-09-12T14:35:11+00:00"
+ },
+ {
+ "name": "illuminate/database",
+ "version": "v12.32.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/database.git",
+ "reference": "f9c4bb6a1d97c1ecfb8338c466893561c984ee5a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/database/zipball/f9c4bb6a1d97c1ecfb8338c466893561c984ee5a",
+ "reference": "f9c4bb6a1d97c1ecfb8338c466893561c984ee5a",
+ "shasum": ""
+ },
+ "require": {
+ "brick/math": "^0.11|^0.12|^0.13|^0.14",
+ "ext-pdo": "*",
+ "illuminate/collections": "^12.0",
+ "illuminate/container": "^12.0",
+ "illuminate/contracts": "^12.0",
+ "illuminate/macroable": "^12.0",
+ "illuminate/support": "^12.0",
+ "laravel/serializable-closure": "^1.3|^2.0",
+ "php": "^8.2",
+ "symfony/polyfill-php85": "^1.33"
+ },
+ "suggest": {
+ "ext-filter": "Required to use the Postgres database driver.",
+ "fakerphp/faker": "Required to use the eloquent factory builder (^1.24).",
+ "illuminate/console": "Required to use the database commands (^12.0).",
+ "illuminate/events": "Required to use the observers with Eloquent (^12.0).",
+ "illuminate/filesystem": "Required to use the migrations (^12.0).",
+ "illuminate/http": "Required to convert Eloquent models to API resources (^12.0).",
+ "illuminate/pagination": "Required to paginate the result set (^12.0).",
+ "symfony/finder": "Required to use Eloquent model factories (^7.2)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Database\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Database package.",
+ "homepage": "https://laravel.com",
+ "keywords": [
+ "database",
+ "laravel",
+ "orm",
+ "sql"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-09-30T11:19:20+00:00"
+ },
+ {
+ "name": "illuminate/events",
+ "version": "v12.32.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/events.git",
+ "reference": "ba94fc7c734864e1eba802e75930725fd8074fce"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/events/zipball/ba94fc7c734864e1eba802e75930725fd8074fce",
+ "reference": "ba94fc7c734864e1eba802e75930725fd8074fce",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/bus": "^12.0",
+ "illuminate/collections": "^12.0",
+ "illuminate/container": "^12.0",
+ "illuminate/contracts": "^12.0",
+ "illuminate/macroable": "^12.0",
+ "illuminate/support": "^12.0",
+ "php": "^8.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "functions.php"
+ ],
+ "psr-4": {
+ "Illuminate\\Events\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Events package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-09-30T10:20:25+00:00"
+ },
+ {
+ "name": "illuminate/macroable",
+ "version": "v12.32.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/macroable.git",
+ "reference": "e862e5648ee34004fa56046b746f490dfa86c613"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/macroable/zipball/e862e5648ee34004fa56046b746f490dfa86c613",
+ "reference": "e862e5648ee34004fa56046b746f490dfa86c613",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Macroable package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2024-07-23T16:31:01+00:00"
+ },
+ {
+ "name": "illuminate/pipeline",
+ "version": "v12.32.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/pipeline.git",
+ "reference": "b6a14c20d69a44bf0a6fba664a00d23ca71770ee"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/pipeline/zipball/b6a14c20d69a44bf0a6fba664a00d23ca71770ee",
+ "reference": "b6a14c20d69a44bf0a6fba664a00d23ca71770ee",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/contracts": "^12.0",
+ "illuminate/macroable": "^12.0",
+ "illuminate/support": "^12.0",
+ "php": "^8.2"
+ },
+ "suggest": {
+ "illuminate/database": "Required to use database transactions (^12.0)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Pipeline\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Pipeline package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-08-20T13:36:50+00:00"
+ },
+ {
+ "name": "illuminate/support",
+ "version": "v12.32.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/support.git",
+ "reference": "648bbaf51b108771e0c3297dc251953fd03a4243"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/support/zipball/648bbaf51b108771e0c3297dc251953fd03a4243",
+ "reference": "648bbaf51b108771e0c3297dc251953fd03a4243",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/inflector": "^2.0",
+ "ext-ctype": "*",
+ "ext-filter": "*",
+ "ext-mbstring": "*",
+ "illuminate/collections": "^12.0",
+ "illuminate/conditionable": "^12.0",
+ "illuminate/contracts": "^12.0",
+ "illuminate/macroable": "^12.0",
+ "nesbot/carbon": "^3.8.4",
+ "php": "^8.2",
+ "symfony/polyfill-php83": "^1.33",
+ "symfony/polyfill-php85": "^1.33",
+ "voku/portable-ascii": "^2.0.2"
+ },
+ "conflict": {
+ "tightenco/collect": "<5.5.33"
+ },
+ "replace": {
+ "spatie/once": "*"
+ },
+ "suggest": {
+ "illuminate/filesystem": "Required to use the Composer class (^12.0).",
+ "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).",
+ "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).",
+ "league/uri": "Required to use the Uri class (^7.5.1).",
+ "ramsey/uuid": "Required to use Str::uuid() (^4.7).",
+ "symfony/process": "Required to use the Composer class (^7.2).",
+ "symfony/uid": "Required to use Str::ulid() (^7.2).",
+ "symfony/var-dumper": "Required to use the dd function (^7.2).",
+ "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "functions.php",
+ "helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Support package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-09-29T18:49:19+00:00"
+ },
+ {
+ "name": "laravel/serializable-closure",
+ "version": "v2.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/serializable-closure.git",
+ "reference": "3832547db6e0e2f8bb03d4093857b378c66eceed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3832547db6e0e2f8bb03d4093857b378c66eceed",
+ "reference": "3832547db6e0e2f8bb03d4093857b378c66eceed",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "illuminate/support": "^10.0|^11.0|^12.0",
+ "nesbot/carbon": "^2.67|^3.0",
+ "pestphp/pest": "^2.36|^3.0",
+ "phpstan/phpstan": "^2.0",
+ "symfony/var-dumper": "^6.2.0|^7.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\SerializableClosure\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ },
+ {
+ "name": "Nuno Maduro",
+ "email": "nuno@laravel.com"
+ }
+ ],
+ "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.",
+ "keywords": [
+ "closure",
+ "laravel",
+ "serializable"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/serializable-closure/issues",
+ "source": "https://github.com/laravel/serializable-closure"
+ },
+ "time": "2025-09-22T17:29:40+00:00"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "3.10.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/CarbonPHP/carbon.git",
+ "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f",
+ "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f",
+ "shasum": ""
+ },
+ "require": {
+ "carbonphp/carbon-doctrine-types": "<100.0",
+ "ext-json": "*",
+ "php": "^8.1",
+ "psr/clock": "^1.0",
+ "symfony/clock": "^6.3.12 || ^7.0",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^3.6.3 || ^4.0",
+ "doctrine/orm": "^2.15.2 || ^3.0",
+ "friendsofphp/php-cs-fixer": "^v3.87.1",
+ "kylekatarnls/multi-tester": "^2.5.3",
+ "phpmd/phpmd": "^2.15.0",
+ "phpstan/extension-installer": "^1.4.3",
+ "phpstan/phpstan": "^2.1.22",
+ "phpunit/phpunit": "^10.5.53",
+ "squizlabs/php_codesniffer": "^3.13.4"
+ },
+ "bin": [
+ "bin/carbon"
+ ],
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Carbon\\Laravel\\ServiceProvider"
+ ]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ },
+ "branch-alias": {
+ "dev-2.x": "2.x-dev",
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Carbon\\": "src/Carbon/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "https://markido.com"
+ },
+ {
+ "name": "kylekatarnls",
+ "homepage": "https://github.com/kylekatarnls"
+ }
+ ],
+ "description": "An API extension for DateTime that supports 281 different languages.",
+ "homepage": "https://carbon.nesbot.com",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "support": {
+ "docs": "https://carbon.nesbot.com/docs",
+ "issues": "https://github.com/CarbonPHP/carbon/issues",
+ "source": "https://github.com/CarbonPHP/carbon"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon#sponsor",
+ "type": "opencollective"
+ },
+ {
+ "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-09-06T13:39:36+00:00"
+ },
+ {
+ "name": "psr/clock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/clock.git",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Clock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for reading the clock.",
+ "homepage": "https://github.com/php-fig/clock",
+ "keywords": [
+ "clock",
+ "now",
+ "psr",
+ "psr-20",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/clock/issues",
+ "source": "https://github.com/php-fig/clock/tree/1.0.0"
+ },
+ "time": "2022-11-25T14:36:26+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865",
+ "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/simple-cache/tree/3.0.0"
+ },
+ "time": "2021-10-29T13:26:27+00:00"
+ },
+ {
+ "name": "symfony/clock",
+ "version": "v7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/clock.git",
+ "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
+ "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/clock": "^1.0",
+ "symfony/polyfill-php83": "^1.28"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/now.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Clock\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Decouples applications from the system clock",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "clock",
+ "psr20",
+ "time"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/clock/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-23T08:48:59+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php83",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5",
+ "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php83\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-08T02:45:35+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php84",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php84.git",
+ "reference": "d8ced4d875142b6a7426000426b8abc631d6b191"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191",
+ "reference": "d8ced4d875142b6a7426000426b8abc631d6b191",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php84\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-24T13:30:11+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php85",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php85.git",
+ "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91",
+ "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php85\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-23T16:12:55+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v7.3.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "ec25870502d0c7072d086e8ffba1420c85965174"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174",
+ "reference": "ec25870502d0c7072d086e8ffba1420c85965174",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/translation-contracts": "^2.5|^3.0"
+ },
+ "conflict": {
+ "nikic/php-parser": "<5.0",
+ "symfony/config": "<6.4",
+ "symfony/console": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/http-kernel": "<6.4",
+ "symfony/service-contracts": "<2.5",
+ "symfony/twig-bundle": "<6.4",
+ "symfony/yaml": "<6.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.3|3.0"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^5.0",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/finder": "^6.4|^7.0",
+ "symfony/http-client-contracts": "^2.5|^3.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
+ "symfony/polyfill-intl-icu": "^1.21",
+ "symfony/routing": "^6.4|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/yaml": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to internationalize your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/translation/tree/v7.3.4"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-09-07T11:39:36+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
+ "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-27T08:32:26+00:00"
+ },
+ {
+ "name": "voku/portable-ascii",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/portable-ascii.git",
+ "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
+ "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+ },
+ "suggest": {
+ "ext-intl": "Use Intl for transliterator_transliterate() support"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "https://www.moelleken.org/"
+ }
+ ],
+ "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+ "homepage": "https://github.com/voku/portable-ascii",
+ "keywords": [
+ "ascii",
+ "clean",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/voku/portable-ascii/issues",
+ "source": "https://github.com/voku/portable-ascii/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.me/moelleken",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/voku",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/portable-ascii",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://www.patreon.com/voku",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-21T01:49:47+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {},
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.2"
+ },
+ "platform-dev": {},
+ "plugin-api-version": "2.6.0"
+}
diff --git a/src/FirebirdConnection.php b/src/FirebirdConnection.php
new file mode 100755
index 0000000..8128b18
--- /dev/null
+++ b/src/FirebirdConnection.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace Xgrz\Firebird;
+
+use Illuminate\Database\Connection as DatabaseConnection;
+use Xgrz\Firebird\Query\Builder as FirebirdQueryBuilder;
+use Xgrz\Firebird\Query\Grammars\FirebirdGrammar as FirebirdQueryGrammar;
+use Xgrz\Firebird\Query\Processors\FirebirdProcessor as FirebirdQueryProcessor;
+use Xgrz\Firebird\Schema\Builder as FirebirdSchemaBuilder;
+use Xgrz\Firebird\Schema\Grammars\FirebirdGrammar as FirebirdSchemaGrammar;
+
+class FirebirdConnection extends DatabaseConnection
+{
+ /**
+ * Get the default query grammar instance.
+ *
+ * @return \Illuminate\Database\Query\Grammars\Grammar
+ */
+ protected function getDefaultQueryGrammar()
+ {
+ return new FirebirdQueryGrammar($this);
+ }
+
+ /**
+ * Get the default post processor instance.
+ *
+ * @return \Illuminate\Database\Query\Processors\Processor
+ */
+ protected function getDefaultPostProcessor()
+ {
+ return new FirebirdQueryProcessor;
+ }
+
+ /**
+ * Get a schema builder instance for this connection.
+ *
+ * @return \Firebird\Schema\Builder
+ */
+ public function getSchemaBuilder()
+ {
+ if (is_null($this->schemaGrammar)) {
+ $this->useDefaultSchemaGrammar();
+ }
+
+ return new FirebirdSchemaBuilder($this);
+ }
+
+ /**
+ * Get the default schema grammar instance.
+ *
+ * @return \Firebird\Schema\Grammars\FirebirdGrammar
+ */
+ protected function getDefaultSchemaGrammar()
+ {
+ return $this->withTablePrefix(new FirebirdSchemaGrammar);
+ }
+
+ /**
+ * Get a new query builder instance.
+ *
+ * @return \Firebird\Query\Builder
+ */
+ public function query()
+ {
+ return new FirebirdQueryBuilder(
+ $this, $this->getQueryGrammar(), $this->getPostProcessor()
+ );
+ }
+
+ /**
+ * Execute a stored procedure.
+ *
+ * @param string $procedure
+ * @param array $values
+ * @return \Illuminate\Support\Collection
+ */
+ public function executeProcedure($procedure, array $values = [])
+ {
+ return $this->query()->fromProcedure($procedure, $values)->get();
+ }
+}
diff --git a/src/FirebirdConnector.php b/src/FirebirdConnector.php
new file mode 100755
index 0000000..99ed3ba
--- /dev/null
+++ b/src/FirebirdConnector.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Xgrz\Firebird;
+
+use Illuminate\Database\Connectors\Connector;
+use Illuminate\Database\Connectors\ConnectorInterface;
+
+class FirebirdConnector extends Connector implements ConnectorInterface
+{
+ /**
+ * Establish a database connection.
+ *
+ * @param array $config
+ * @return \PDO
+ */
+ public function connect(array $config)
+ {
+ return $this->createConnection(
+ $this->getDsn($config),
+ $config,
+ $this->getOptions($config)
+ );
+ }
+
+ /**
+ * Create a DSN string from the configuration.
+ *
+ * @param array $config
+ * @return string
+ */
+ protected function getDsn(array $config)
+ {
+ extract($config);
+
+ if (! isset($host) || ! isset($database)) {
+ trigger_error('Cannot connect to Firebird Database, no host or database supplied');
+ }
+
+ $dsn = "firebird:dbname={$host}";
+
+ if (isset($port)) {
+ $dsn .= "/{$port}";
+ }
+
+ $dsn .= ":{$database};";
+
+ if (isset($role)) {
+ $dsn .= "role={$role};";
+ }
+
+ if (isset($charset)) {
+ $dsn .= "charset={$charset};";
+ }
+
+ return $dsn;
+ }
+}
diff --git a/src/FirebirdServiceProvider.php b/src/FirebirdServiceProvider.php
new file mode 100755
index 0000000..b75ab54
--- /dev/null
+++ b/src/FirebirdServiceProvider.php
@@ -0,0 +1,23 @@
+<?php
+
+use Illuminate\Database\Connection;
+use Illuminate\Support\ServiceProvider;
+use Xgrz\Firebird\FirebirdConnection;
+use Xgrz\Firebird\FirebirdConnector;
+
+class FirebirdServiceProvider extends ServiceProvider
+{
+ /**
+ * Register any application services.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ Connection::resolverFor('firebird', function($connection, $database, $tablePrefix, $config) {
+ return new FirebirdConnection($connection, $database, $tablePrefix, $config);
+ });
+
+ $this->app->bind('db.connector.firebird', FirebirdConnector::class);
+ }
+}
diff --git a/src/Query/Builder.php b/src/Query/Builder.php
new file mode 100755
index 0000000..c91c6bd
--- /dev/null
+++ b/src/Query/Builder.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Xgrz\Firebird\Query;
+
+use Illuminate\Database\Query\Builder as QueryBuilder;
+
+class Builder extends QueryBuilder
+{
+ /**
+ * Determine if any rows exist for the current query.
+ *
+ * @return bool
+ */
+ public function exists()
+ {
+ return parent::count() > 0;
+ }
+
+ /**
+ * Add a from stored procedure clause to the query builder.
+ *
+ * @param string $procedure
+ * @param array $values
+ * @return \Illuminate\Database\Query\Builder|static
+ */
+ public function fromProcedure(string $procedure, array $values = [])
+ {
+ $compiledProcedure = $this->grammar->compileProcedure($this, $procedure, $values);
+
+ // Remove any expressions from the values array, as they will have
+ // already been evaluated by the grammar's parameterize() function.
+ $values = array_filter($values, function($value) {
+ return ! $this->grammar->isExpression($value);
+ });
+
+ $this->fromRaw($compiledProcedure, array_values($values));
+
+ return $this;
+ }
+
+ public function where($column, $operator = NULL, $value = NULL, $boolean = 'and')
+ {
+ // detect is not search
+ if (! str($operator)->contains('like', true)) {
+ return parent::where($column, $operator, $value, $boolean); // TODO: Change the autogenerated stub
+ }
+
+ // when is search covert to upper case column and value at database level
+ $wrapped = $this->grammar->wrap($column);
+ return $boolean === 'and'
+ ? parent::whereRaw("UPPER($wrapped) LIKE UPPER(?)", [$value])
+ : parent::orWhereRaw("UPPER($wrapped) LIKE UPPER(?)", [$value]);
+ }
+}
diff --git a/src/Query/Grammars/FirebirdGrammar.php b/src/Query/Grammars/FirebirdGrammar.php
new file mode 100755
index 0000000..c8b5535
--- /dev/null
+++ b/src/Query/Grammars/FirebirdGrammar.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace Xgrz\Firebird\Query\Grammars;
+
+use Illuminate\Database\Query\Builder;
+use Illuminate\Database\Query\Grammars\Grammar;
+use Illuminate\Support\Str;
+
+class FirebirdGrammar extends Grammar
+{
+ /**
+ * The components that make up a select clause.
+ *
+ * @var string[]
+ */
+ protected $selectComponents = [
+ 'aggregate',
+ 'columns',
+ 'from',
+ 'joins',
+ 'wheres',
+ 'groups',
+ 'havings',
+ 'orders',
+ // 'limit', - Handled in the compileColumns() method.
+ // 'offset', - Handled in the compileColumns() method.
+ 'lock',
+ ];
+
+ /**
+ * All of the available clause operators.
+ *
+ * @var array
+ *
+ * @link https://ib-aid.com/download/docs/firebird-language-reference-2.5/fblangref25-commons-predicates.html
+ */
+ protected $operators = [
+ '=', '<', '>', '<=', '>=', '<>', '!=',
+ 'like', 'not like', 'between', 'not between',
+ 'containing', 'not containing', 'starting with', 'not starting with',
+ 'similar to', 'not similar to', 'is distinct from', 'is not distinct from',
+ ];
+
+ /**
+ * @param Builder $query
+ * @param array $columns
+ * @return string|null
+ */
+ protected function compileColumns(Builder $query, $columns)
+ {
+ // See superclass.
+ if (! is_null($query->aggregate)) {
+ return;
+ }
+
+ // In Firebird, the correct syntax for limiting and offsetting rows is
+ // "select first [num_rows] skip [start_row] * from table". Laravel does
+ // not support adding components between the "select" keyword and the
+ // column names, so compile the limit and offset components here. Note
+ // that they are commented out in the $selectComponents class variable.
+ // Reference: http://mc-computing.com/Databases/Firebird/SQL.html
+
+ $select = 'select ';
+
+ if ($query->limit) {
+ $select .= $this->compileLimit($query, $query->limit).' ';
+ }
+
+ if ($query->offset) {
+ $select .= $this->compileOffset($query, $query->offset).' ';
+ }
+
+ if ($query->distinct) {
+ $select .= 'distinct ';
+ }
+
+ return $select.$this->columnize($columns);
+ }
+
+ /**
+ * Compile the "limit" portions of the query.
+ *
+ * @param \Illuminate\Database\Query\Builder $query
+ * @param int $limit
+ * @return string
+ */
+ protected function compileLimit(Builder $query, $limit)
+ {
+ return 'first '.(int) $limit;
+ }
+
+ /**
+ * Compile the "offset" portions of the query.
+ *
+ * @param \Illuminate\Database\Query\Builder $query
+ * @param int $offset
+ * @return string
+ */
+ protected function compileOffset(Builder $query, $offset)
+ {
+ return 'skip '.(int) $offset;
+ }
+
+ /**
+ * Compile the random statement into SQL.
+ *
+ * @param string $seed
+ * @return string
+ */
+ public function compileRandom($seed)
+ {
+ return 'RAND()';
+ }
+
+ /**
+ * Wrap a union subquery in parentheses.
+ *
+ * @param string $sql
+ * @return string
+ */
+ protected function wrapUnion($sql)
+ {
+ return $sql;
+ }
+
+ /**
+ * Compile a date based where clause.
+ *
+ * @param string $type
+ * @param \Illuminate\Database\Query\Builder $query
+ * @param array $where
+ * @return string
+ */
+ protected function dateBasedWhere($type, Builder $query, $where)
+ {
+ $value = $this->parameter($where['value']);
+
+ return 'EXTRACT('.$type.' FROM '.$this->wrap($where['column']).') '.$where['operator'].' '.$value;
+ }
+
+ /**
+ * Compile SQL statement for a stored procedure.
+ *
+ * @param \Illuminate\Database\Query\Builder $query
+ * @param string $procedure
+ * @param array $values
+ * @return string
+ */
+ public function compileProcedure(Builder $query, $procedure, array $values = null)
+ {
+ $procedure = $this->wrap($procedure);
+
+ return $procedure.' ('.$this->parameterize($values).')';
+ }
+
+ /**
+ * Compile an aggregated select clause.
+ *
+ * @param \Illuminate\Database\Query\Builder $query
+ * @param array $aggregate
+ * @return string
+ */
+ protected function compileAggregate(Builder $query, $aggregate)
+ {
+ // Wrap `aggregate` in double quotes to ensure the resultset returns the
+ // column name as a lowercase string. This resolves compatibility with
+ // the framework's paginator.
+ return Str::replaceLast(
+ 'as aggregate', 'as "aggregate"', parent::compileAggregate($query, $aggregate)
+ );
+ }
+}
diff --git a/src/Query/Processors/FirebirdProcessor.php b/src/Query/Processors/FirebirdProcessor.php
new file mode 100644
index 0000000..0d10706
--- /dev/null
+++ b/src/Query/Processors/FirebirdProcessor.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Xgrz\Firebird\Query\Processors;
+
+use Illuminate\Database\Query\Processors\Processor;
+
+class FirebirdProcessor extends Processor
+{
+ /**
+ * Process the results of a column listing query.
+ *
+ * @param array $results
+ * @return array
+ */
+ public function processColumnListing($results)
+ {
+ return array_map(function ($result) {
+ return ((object) $result)->column_name;
+ }, $results);
+ }
+}
diff --git a/src/Schema/Builder.php b/src/Schema/Builder.php
new file mode 100755
index 0000000..2069b67
--- /dev/null
+++ b/src/Schema/Builder.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace Xgrz\Firebird\Schema;
+
+use Illuminate\Database\Schema\Builder as SchemaBuilder;
+
+class Builder extends SchemaBuilder
+{
+ //
+}
diff --git a/src/Schema/Grammars/FirebirdGrammar.php b/src/Schema/Grammars/FirebirdGrammar.php
new file mode 100755
index 0000000..6c11385
--- /dev/null
+++ b/src/Schema/Grammars/FirebirdGrammar.php
@@ -0,0 +1,631 @@
+<?php
+
+namespace Xgrz\Firebird\Schema\Grammars;
+
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Schema\Grammars\Grammar;
+use Illuminate\Support\Fluent;
+
+class FirebirdGrammar extends Grammar
+{
+ /**
+ * The possible column modifiers.
+ *
+ * @var array
+ */
+ protected $modifiers = ['Charset', 'Collate', 'Increment', 'Nullable', 'Default'];
+
+ /**
+ * The columns available as serials.
+ *
+ * @var array
+ */
+ protected $serials = ['bigInteger', 'integer', 'mediumInteger', 'smallInteger', 'tinyInteger'];
+
+ /**
+ * Compile the query to determine the tables.
+ *
+ * @return string
+ */
+ public function compileTables()
+ {
+ return 'select trim(trailing from rdb$relation_name) as "name" '
+ .'from rdb$relations '
+ .'where rdb$relation_type = 0 '
+ .'and (rdb$system_flag is null or rdb$system_flag = 0) '
+ .'order by rdb$relation_name';
+ }
+
+ /**
+ * Compile the query to determine if a table exists.
+ *
+ * @return string
+ */
+ public function compileTableExists()
+ {
+ return 'select rdb$relation_name from rdb$relations where rdb$relation_name = ?';
+ }
+
+ /**
+ * Compile the query to determine the views.
+ *
+ * @return string
+ */
+ public function compileViews()
+ {
+ return 'select trim(trailing from rdb$relation_name) as "name", '
+ .'rdb$view_source as "definition" '
+ .'from rdb$relations '
+ .'where rdb$view_blr is not null '
+ .'and (rdb$system_flag is null or rdb$system_flag = 0)';
+ }
+
+ /**
+ * Compile the query to determine the columns.
+ *
+ * @param string $table
+ * @return string
+ */
+ public function compileColumns($table)
+ {
+ return 'select trim(trailing from rdb$field_name) as "name" '
+ .'from rdb$relation_fields '
+ .'where rdb$relation_name = '.$this->quoteString($table).' '
+ .'order by rdb$relation_name';
+ }
+
+ /**
+ * Compile the query to determine the list of columns.
+ *
+ * @param string $table
+ * @return string
+ */
+ public function compileColumnListing($table)
+ {
+ return "select trim(rdb\$field_name) as \"column_name\" from rdb\$relation_fields where rdb\$relation_name = '$table'";
+ }
+
+ /**
+ * Compile a create table command.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $command
+ * @return string
+ */
+ public function compileCreate(Blueprint $blueprint, Fluent $command)
+ {
+ if ($blueprint->temporary) {
+ throw new \LogicException('This database driver does not support temporary tables.');
+ }
+
+ $columns = implode(', ', $this->getColumns($blueprint));
+
+ $sql = 'create table '.$this->wrapTable($blueprint)." ($columns)";
+
+ return $sql;
+ }
+
+ /**
+ * Compile a drop table command.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $command
+ * @return string
+ */
+ public function compileDrop(Blueprint $blueprint, Fluent $command)
+ {
+ return 'drop table '.$this->wrapTable($blueprint);
+ }
+
+ /**
+ * Compile a drop table (if exists) command.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $command
+ * @return string
+ */
+ public function compileDropIfExists(Blueprint $blueprint, Fluent $command)
+ {
+ // Replace the double quotes with single quotes.
+ $table = str_replace('"', "'", $this->wrapTable($blueprint));
+
+ return sprintf(
+ "execute block as begin if (exists(%s)) then execute statement '%s'; end",
+ str_replace('?', $table, $this->compileTableExists()), // Replace the ? character with the table name.
+ $this->compileDrop($blueprint, $command)
+ );
+ }
+
+ /**
+ * Compile a column addition command.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $command
+ * @return string
+ */
+ public function compileAdd(Blueprint $blueprint, Fluent $command)
+ {
+ $table = $this->wrapTable($blueprint);
+
+ $columns = $this->prefixArray('ADD', $this->getColumns($blueprint));
+
+ return 'ALTER TABLE '.$table.' '.implode(', ', $columns);
+ }
+
+ /**
+ * Compile a primary key command.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $command
+ * @return string
+ */
+ public function compilePrimary(Blueprint $blueprint, Fluent $command)
+ {
+ $columns = $this->columnize($command->columns);
+
+ return 'ALTER TABLE '.$this->wrapTable($blueprint)." ADD PRIMARY KEY ({$columns})";
+ }
+
+ /**
+ * Compile a unique key command.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $command
+ * @return string
+ */
+ public function compileUnique(Blueprint $blueprint, Fluent $command)
+ {
+ $table = $this->wrapTable($blueprint);
+
+ $index = $this->wrap(substr($command->index, 0, 31));
+
+ $columns = $this->columnize($command->columns);
+
+ return "ALTER TABLE {$table} ADD CONSTRAINT {$index} UNIQUE ({$columns})";
+ }
+
+ /**
+ * Compile a plain index key command.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $command
+ * @return string
+ */
+ public function compileIndex(Blueprint $blueprint, Fluent $command)
+ {
+ $columns = $this->columnize($command->columns);
+
+ $index = $this->wrap(substr($command->index, 0, 31));
+
+ $table = $this->wrapTable($blueprint);
+
+ return "CREATE INDEX {$index} ON {$table} ($columns)";
+ }
+
+ /**
+ * Compile a foreign key command.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $command
+ * @return string
+ */
+ public function compileForeign(Blueprint $blueprint, Fluent $command)
+ {
+ $table = $this->wrapTable($blueprint);
+
+ $on = $this->wrapTable($command->on);
+
+ // We need to prepare several of the elements of the foreign key definition
+ // before we can create the SQL, such as wrapping the tables and convert
+ // an array of columns to comma-delimited strings for the SQL queries.
+ $columns = $this->columnize($command->columns);
+
+ $onColumns = $this->columnize((array) $command->references);
+
+ $fkName = substr($command->index, 0, 31);
+
+ $sql = "ALTER TABLE {$table} ADD CONSTRAINT {$fkName} ";
+
+ $sql .= "FOREIGN KEY ({$columns}) REFERENCES {$on} ({$onColumns})";
+
+ // Once we have the basic foreign key creation statement constructed we can
+ // build out the syntax for what should happen on an update or delete of
+ // the affected columns, which will get something like "cascade", etc.
+ if (! is_null($command->onDelete)) {
+ $sql .= " ON DELETE {$command->onDelete}";
+ }
+
+ if (! is_null($command->onUpdate)) {
+ $sql .= " ON UPDATE {$command->onUpdate}";
+ }
+
+ return $sql;
+ }
+
+ /**
+ * Compile a drop foreign key command.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $command
+ * @return string
+ */
+ public function compileDropForeign(Blueprint $blueprint, Fluent $command)
+ {
+ $table = $this->wrapTable($blueprint);
+
+ return "ALTER TABLE {$table} DROP CONSTRAINT {$command->index}";
+ }
+
+ /**
+ * Get the SQL for a character set column modifier.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $column
+ * @return string|null
+ */
+ protected function modifyCharset(Blueprint $blueprint, Fluent $column)
+ {
+ if (! is_null($column->charset)) {
+ return ' CHARACTER SET '.$column->charset;
+ }
+ }
+
+ /**
+ * Get the SQL for a collation column modifier.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $column
+ * @return string|null
+ */
+ protected function modifyCollate(Blueprint $blueprint, Fluent $column)
+ {
+ if (! is_null($column->collation)) {
+ return ' COLLATE '.$column->collation;
+ }
+ }
+
+ /**
+ * Get the SQL for a nullable column modifier.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $column
+ * @return string|null
+ */
+ protected function modifyNullable(Blueprint $blueprint, Fluent $column)
+ {
+ return $column->nullable ? '' : ' NOT NULL';
+ }
+
+ /**
+ * Get the SQL for a default column modifier.
+ *
+ * @param \Illuminate\Database\Schema\Blueprint $blueprint
+ * @param \Illuminate\Support\Fluent $column
+ * @return string|null
+ */
+ protected function modifyDefault(Blueprint $blueprint, Fluent $column)
+ {
+ if (! is_null($column->default)) {
+ return ' DEFAULT '.$this->getDefaultValue($column->default);
+ }
+ }
+
+ /**
+ * Create the column definition for a char type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeChar(Fluent $column)
+ {
+ return "CHAR({$column->length})";
+ }
+
+ /**
+ * Create the column definition for a string type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeString(Fluent $column)
+ {
+ return "VARCHAR({$column->length})";
+ }
+
+ /**
+ * Create the column definition for a text type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeText(Fluent $column)
+ {
+ return 'BLOB SUB_TYPE TEXT';
+ }
+
+ /**
+ * Create the column definition for a medium text type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeMediumText(Fluent $column)
+ {
+ return 'BLOB SUB_TYPE TEXT';
+ }
+
+ /**
+ * Create the column definition for a long text type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeLongText(Fluent $column)
+ {
+ return 'BLOB SUB_TYPE TEXT';
+ }
+
+ /**
+ * Create the column definition for a integer type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeInteger(Fluent $column)
+ {
+ return 'INTEGER';
+ }
+
+ /**
+ * Create the column definition for a big integer type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeBigInteger(Fluent $column)
+ {
+ return 'BIGINT';
+ }
+
+ /**
+ * Create the column definition for a medium integer type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeMediumInteger(Fluent $column)
+ {
+ return 'INTEGER';
+ }
+
+ /**
+ * Create the column definition for a tiny integer type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeTinyInteger(Fluent $column)
+ {
+ return 'SMALLINT';
+ }
+
+ /**
+ * Create the column definition for a small integer type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeSmallInteger(Fluent $column)
+ {
+ return 'SMALLINT';
+ }
+
+ /**
+ * Create the column definition for a float type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeFloat(Fluent $column)
+ {
+ return 'FLOAT';
+ }
+
+ /**
+ * Create the column definition for a double type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeDouble(Fluent $column)
+ {
+ return 'DOUBLE PRECISION';
+ }
+
+ /**
+ * Create the column definition for a decimal type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeDecimal(Fluent $column)
+ {
+ return "DECIMAL({$column->total}, {$column->places})";
+ }
+
+ /**
+ * Create the column definition for a boolean type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeBoolean(Fluent $column)
+ {
+ return 'CHAR(1)';
+ }
+
+ /**
+ * Create the column definition for an enum type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeEnum(Fluent $column)
+ {
+ $allowed = array_map(function ($a) {
+ return "'".$a."'";
+ }, $column->allowed);
+
+ return "VARCHAR(255) CHECK (\"{$column->name}\" IN (".implode(', ', $allowed).'))';
+ }
+
+ /**
+ * Create the column definition for a json type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeJson(Fluent $column)
+ {
+ return 'VARCHAR(8191)';
+ }
+
+ /**
+ * Create the column definition for a jsonb type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeJsonb(Fluent $column)
+ {
+ return 'VARCHAR(8191) CHARACTER SET OCTETS';
+ }
+
+ /**
+ * Create the column definition for a date type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeDate(Fluent $column)
+ {
+ return 'DATE';
+ }
+
+ /**
+ * Create the column definition for a date-time type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeDateTime(Fluent $column)
+ {
+ return 'TIMESTAMP';
+ }
+
+ /**
+ * Create the column definition for a date-time type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeDateTimeTz(Fluent $column)
+ {
+ // No timezone support, default to plain date time
+ return $this->typeDateTime($column);
+ }
+
+ /**
+ * Create the column definition for a time type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeTime(Fluent $column)
+ {
+ return 'TIME';
+ }
+
+ /**
+ * Create the column definition for a time type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeTimeTz(Fluent $column)
+ {
+ // No timezone support, default to plain time
+ return $this->typeTime($column);
+ }
+
+ /**
+ * Create the column definition for a timestamp type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeTimestamp(Fluent $column)
+ {
+ if ($column->useCurrent) {
+ return 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP';
+ }
+
+ return 'TIMESTAMP';
+ }
+
+ /**
+ * Create the column definition for a timestamp type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeTimestampTz(Fluent $column)
+ {
+ // No timezone support, default to plain timestamp
+ return $this->typeTimestamp($column);
+ }
+
+ /**
+ * Create the column definition for a binary type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeBinary(Fluent $column)
+ {
+ return 'BLOB SUB_TYPE BINARY';
+ }
+
+ /**
+ * Create the column definition for a uuid type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeUuid(Fluent $column)
+ {
+ return 'CHAR(36)';
+ }
+
+ /**
+ * Create the column definition for an IP address type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeIpAddress(Fluent $column)
+ {
+ return 'VARCHAR(45)';
+ }
+
+ /**
+ * Create the column definition for a MAC address type.
+ *
+ * @param \Illuminate\Support\Fluent $column
+ * @return string
+ */
+ protected function typeMacAddress(Fluent $column)
+ {
+ return 'VARCHAR(17)';
+ }
+}