-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathLibsqlServiceProvider.php
92 lines (80 loc) · 3 KB
/
LibsqlServiceProvider.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php
namespace Libsql\Laravel;
use Illuminate\Database\Connectors\ConnectionFactory;
use Illuminate\Database\DatabaseManager;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;
use Illuminate\Database\Query\Builder;
class LibsqlServiceProvider extends PackageServiceProvider
{
public function boot(): void
{
parent::boot();
if (config('database.default') !== 'libsql') {
return;
}
Blueprint::macro('vectorIndex', function ($column, $indexName) {
return DB::statement("CREATE INDEX {$indexName} ON {$this->table}(libsql_vector_idx({$column}))");
});
Builder::macro('nearest', function ($index_name, $vector, $limit = 10) {
return $this->joinSub(
DB::table(DB::raw("vector_top_k('$index_name', '[" . implode(',', $vector) . "]', $limit)")),
'v',
'todos.rowid',
'=',
'v.id'
);
});
}
public function configurePackage(Package $package): void
{
$package->name('libsql-laravel');
}
public function register(): void
{
parent::register();
$this->app->singleton('db.factory', function ($app) {
return new class($app) extends ConnectionFactory {
protected function createConnection($driver, $connection, $database, $prefix = '', array $config = [])
{
$connection = function () use ($config) {
return new \Libsql\PDO(
$config["database"] ?? '',
password: $config["password"] ?? '',
options: $config,
);
};
var_dump($config);
return new LibsqlConnection(
$connection,
database: $config["database"] ?? '',
config: $config,
);
}
};
});
$this->app->resolving('db', function (DatabaseManager $db) {
$db->extend('libsql', function ($config, $name) {
$config = config('database.connections.libsql');
$config['name'] = $name;
if (!isset($config['driver'])) {
$config['driver'] = 'libsql';
}
return new LibsqlConnection(
function () use ($config) {
return new \Libsql\PDO(
$config["database"] ?? '',
password: $config["password"] ?? '',
options: $config
);
},
database: $config["database"],
config: $config,
);
});
});
}
}