thoth-dbmanager 0.5.3__py3-none-any.whl → 0.5.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- thoth_dbmanager/ThothDbManager.py +14 -0
- thoth_dbmanager/__init__.py +15 -1
- thoth_dbmanager/adapters/__init__.py +44 -6
- thoth_dbmanager/adapters/mariadb.py +361 -129
- thoth_dbmanager/adapters/postgresql.py +49 -23
- thoth_dbmanager/adapters/sqlite.py +14 -1
- thoth_dbmanager/adapters/sqlserver.py +38 -9
- thoth_dbmanager/core/__init__.py +14 -0
- thoth_dbmanager/core/factory.py +17 -0
- thoth_dbmanager/core/interfaces.py +14 -0
- thoth_dbmanager/core/registry.py +14 -0
- thoth_dbmanager/documents.py +14 -0
- thoth_dbmanager/dynamic_imports.py +14 -0
- thoth_dbmanager/helpers/__init__.py +13 -0
- thoth_dbmanager/helpers/multi_db_generator.py +14 -0
- thoth_dbmanager/helpers/preprocess_values.py +14 -0
- thoth_dbmanager/helpers/schema.py +14 -0
- thoth_dbmanager/helpers/search.py +14 -0
- thoth_dbmanager/lsh/__init__.py +14 -0
- thoth_dbmanager/lsh/core.py +14 -0
- thoth_dbmanager/lsh/factory.py +14 -0
- thoth_dbmanager/lsh/manager.py +14 -0
- thoth_dbmanager/lsh/storage.py +14 -0
- thoth_dbmanager/plugins/__init__.py +47 -8
- thoth_dbmanager/plugins/mariadb.py +41 -251
- thoth_dbmanager/plugins/postgresql.py +14 -0
- thoth_dbmanager/plugins/sqlite.py +14 -0
- thoth_dbmanager/plugins/sqlserver.py +14 -0
- {thoth_dbmanager-0.5.3.dist-info → thoth_dbmanager-0.5.9.dist-info}/METADATA +2 -1
- thoth_dbmanager-0.5.9.dist-info/RECORD +34 -0
- thoth_dbmanager-0.5.9.dist-info/licenses/LICENSE.md +21 -0
- thoth_dbmanager-0.5.3.dist-info/RECORD +0 -33
- {thoth_dbmanager-0.5.3.dist-info → thoth_dbmanager-0.5.9.dist-info}/WHEEL +0 -0
- {thoth_dbmanager-0.5.3.dist-info → thoth_dbmanager-0.5.9.dist-info}/licenses/LICENSE +0 -0
- {thoth_dbmanager-0.5.3.dist-info → thoth_dbmanager-0.5.9.dist-info}/top_level.txt +0 -0
@@ -1,17 +1,56 @@
|
|
1
|
+
# Copyright 2025 Marco Pancotti
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
1
15
|
"""
|
2
16
|
Database plugins for Thoth SQL Database Manager.
|
3
17
|
"""
|
4
18
|
|
5
|
-
|
6
|
-
|
19
|
+
import logging
|
20
|
+
|
21
|
+
logger = logging.getLogger(__name__)
|
22
|
+
|
23
|
+
# Always available plugin (SQLite is built into Python)
|
7
24
|
from .sqlite import SQLitePlugin
|
8
|
-
from .mariadb import MariaDBPlugin
|
9
|
-
from .sqlserver import SQLServerPlugin
|
10
25
|
|
11
|
-
# This ensures all plugins are registered when the module is imported
|
12
26
|
__all__ = [
|
13
|
-
"PostgreSQLPlugin",
|
14
27
|
"SQLitePlugin",
|
15
|
-
"MariaDBPlugin",
|
16
|
-
"SQLServerPlugin",
|
17
28
|
]
|
29
|
+
|
30
|
+
# Optional plugins - only import if dependencies are available
|
31
|
+
try:
|
32
|
+
import psycopg2
|
33
|
+
from .postgresql import PostgreSQLPlugin
|
34
|
+
__all__.append("PostgreSQLPlugin")
|
35
|
+
logger.debug("PostgreSQL plugin loaded successfully")
|
36
|
+
except ImportError:
|
37
|
+
logger.debug("psycopg2 not installed, PostgreSQL plugin not available")
|
38
|
+
PostgreSQLPlugin = None
|
39
|
+
|
40
|
+
try:
|
41
|
+
import mariadb
|
42
|
+
from .mariadb import MariaDBPlugin
|
43
|
+
__all__.append("MariaDBPlugin")
|
44
|
+
logger.debug("MariaDB plugin loaded successfully")
|
45
|
+
except ImportError:
|
46
|
+
logger.debug("MariaDB connector not installed, MariaDB plugin not available")
|
47
|
+
MariaDBPlugin = None
|
48
|
+
|
49
|
+
try:
|
50
|
+
import pyodbc
|
51
|
+
from .sqlserver import SQLServerPlugin
|
52
|
+
__all__.append("SQLServerPlugin")
|
53
|
+
logger.debug("SQL Server plugin loaded successfully")
|
54
|
+
except ImportError:
|
55
|
+
logger.debug("pyodbc not installed, SQL Server plugin not available")
|
56
|
+
SQLServerPlugin = None
|
@@ -1,265 +1,37 @@
|
|
1
|
+
# Copyright 2025 Marco Pancotti
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
1
15
|
"""
|
2
16
|
MariaDB plugin for Thoth SQL Database Manager.
|
3
|
-
|
17
|
+
Uses the MariaDB adapter from adapters.mariadb module.
|
4
18
|
"""
|
5
19
|
|
6
20
|
import logging
|
7
|
-
import os
|
8
21
|
from pathlib import Path
|
9
22
|
from threading import Lock
|
10
|
-
from typing import Any, Dict, List, Optional
|
11
|
-
|
12
|
-
from sqlalchemy import create_engine, inspect, text
|
13
|
-
from sqlalchemy.exc import SQLAlchemyError
|
23
|
+
from typing import Any, Dict, List, Optional
|
14
24
|
|
15
25
|
from ..core.interfaces import DbPlugin, DbAdapter
|
16
26
|
from ..core.registry import register_plugin
|
17
|
-
from ..
|
27
|
+
from ..adapters.mariadb import MariaDBAdapter
|
18
28
|
|
19
29
|
logger = logging.getLogger(__name__)
|
20
30
|
|
21
31
|
|
22
|
-
class MariaDBAdapter(DbAdapter):
|
23
|
-
"""MariaDB database adapter with full functionality."""
|
24
|
-
|
25
|
-
def __init__(self, connection_params: Dict[str, Any]):
|
26
|
-
super().__init__(connection_params)
|
27
|
-
self.engine = None
|
28
|
-
self.host = connection_params.get('host')
|
29
|
-
self.port = connection_params.get('port', 3306)
|
30
|
-
self.dbname = connection_params.get('database') or connection_params.get('dbname')
|
31
|
-
self.user = connection_params.get('user') or connection_params.get('username')
|
32
|
-
self.password = connection_params.get('password')
|
33
|
-
|
34
|
-
def connect(self) -> None:
|
35
|
-
"""Establish database connection."""
|
36
|
-
try:
|
37
|
-
# Try different connection methods for MariaDB
|
38
|
-
connection_methods = [
|
39
|
-
# Use MySQL driver (MariaDB is MySQL-compatible)
|
40
|
-
f"mysql+pymysql://{self.user}:{self.password}@{self.host}:{self.port}/{self.dbname}",
|
41
|
-
# Use MySQL connector with explicit TCP
|
42
|
-
f"mysql+mysqlconnector://{self.user}:{self.password}@{self.host}:{self.port}/{self.dbname}",
|
43
|
-
# Use MariaDB connector with TCP parameters
|
44
|
-
f"mariadb+mariadbconnector://{self.user}:{self.password}@{self.host}:{self.port}/{self.dbname}?unix_socket=",
|
45
|
-
]
|
46
|
-
|
47
|
-
last_error = None
|
48
|
-
for connection_string in connection_methods:
|
49
|
-
try:
|
50
|
-
self.engine = create_engine(connection_string, pool_pre_ping=True)
|
51
|
-
# Test the connection
|
52
|
-
with self.engine.connect() as conn:
|
53
|
-
conn.execute(text("SELECT 1"))
|
54
|
-
self.connection = self.engine
|
55
|
-
self._initialized = True
|
56
|
-
logger.info(f"MariaDB connected using: {connection_string.split('://')[0]}")
|
57
|
-
return
|
58
|
-
except Exception as e:
|
59
|
-
last_error = e
|
60
|
-
logger.debug(f"MariaDB connection failed with {connection_string.split('://')[0]}: {e}")
|
61
|
-
if self.engine:
|
62
|
-
self.engine.dispose()
|
63
|
-
self.engine = None
|
64
|
-
continue
|
65
|
-
|
66
|
-
# If all methods fail, raise the last error
|
67
|
-
raise ConnectionError(f"Failed to connect to MariaDB: {last_error}")
|
68
|
-
|
69
|
-
except Exception as e:
|
70
|
-
raise ConnectionError(f"Failed to connect to MariaDB: {e}")
|
71
|
-
|
72
|
-
def disconnect(self) -> None:
|
73
|
-
"""Close database connection."""
|
74
|
-
if self.engine:
|
75
|
-
self.engine.dispose()
|
76
|
-
self.engine = None
|
77
|
-
self.connection = None
|
78
|
-
|
79
|
-
def execute_query(self, query: str, params: Optional[Dict] = None, fetch: Union[str, int] = "all", timeout: int = 60) -> Any:
|
80
|
-
"""Execute a query and return results."""
|
81
|
-
if not self.engine:
|
82
|
-
self.connect()
|
83
|
-
|
84
|
-
with self.engine.connect() as connection:
|
85
|
-
try:
|
86
|
-
if params:
|
87
|
-
result = connection.execute(text(query), params)
|
88
|
-
else:
|
89
|
-
result = connection.execute(text(query))
|
90
|
-
|
91
|
-
# Check if this is a query that returns rows (SELECT, SHOW, etc.)
|
92
|
-
query_upper = query.strip().upper()
|
93
|
-
if query_upper.startswith(('SELECT', 'SHOW', 'DESCRIBE', 'DESC', 'EXPLAIN', 'WITH')):
|
94
|
-
if fetch == "all":
|
95
|
-
return [row._asdict() for row in result.fetchall()]
|
96
|
-
elif fetch == "one":
|
97
|
-
row = result.fetchone()
|
98
|
-
return row._asdict() if row else None
|
99
|
-
elif isinstance(fetch, int) and fetch > 0:
|
100
|
-
return [row._asdict() for row in result.fetchmany(fetch)]
|
101
|
-
else:
|
102
|
-
return [row._asdict() for row in result.fetchall()]
|
103
|
-
else:
|
104
|
-
# For DDL/DML queries (CREATE, INSERT, UPDATE, DELETE), return rowcount
|
105
|
-
connection.commit()
|
106
|
-
return result.rowcount
|
107
|
-
except SQLAlchemyError as e:
|
108
|
-
logger.error(f"Error executing SQL: {str(e)}")
|
109
|
-
raise e
|
110
|
-
|
111
|
-
def get_tables_as_documents(self) -> List[TableDocument]:
|
112
|
-
"""Return tables as document objects."""
|
113
|
-
inspector = inspect(self.engine)
|
114
|
-
table_names = inspector.get_table_names()
|
115
|
-
tables = []
|
116
|
-
|
117
|
-
for table_name in table_names:
|
118
|
-
try:
|
119
|
-
table_comment = inspector.get_table_comment(table_name).get('text', '')
|
120
|
-
except SQLAlchemyError:
|
121
|
-
table_comment = ''
|
122
|
-
|
123
|
-
tables.append(TableDocument(
|
124
|
-
table_name=table_name,
|
125
|
-
schema_name="", # MariaDB doesn't have explicit schemas like PostgreSQL
|
126
|
-
comment=table_comment or "",
|
127
|
-
row_count=None # Could be populated if needed
|
128
|
-
))
|
129
|
-
|
130
|
-
return tables
|
131
|
-
|
132
|
-
def get_columns_as_documents(self, table_name: str) -> List[ColumnDocument]:
|
133
|
-
"""Return columns as document objects."""
|
134
|
-
inspector = inspect(self.engine)
|
135
|
-
columns_metadata = inspector.get_columns(table_name)
|
136
|
-
pk_columns = inspector.get_pk_constraint(table_name).get('constrained_columns', [])
|
137
|
-
|
138
|
-
columns = []
|
139
|
-
for col_meta in columns_metadata:
|
140
|
-
columns.append(ColumnDocument(
|
141
|
-
table_name=table_name,
|
142
|
-
column_name=col_meta['name'],
|
143
|
-
data_type=str(col_meta['type']),
|
144
|
-
is_nullable=col_meta.get('nullable', True),
|
145
|
-
is_pk=col_meta['name'] in pk_columns,
|
146
|
-
comment=col_meta.get('comment', '') or ""
|
147
|
-
))
|
148
|
-
|
149
|
-
return columns
|
150
|
-
|
151
|
-
def get_foreign_keys_as_documents(self) -> List[ForeignKeyDocument]:
|
152
|
-
"""Return foreign keys as document objects."""
|
153
|
-
inspector = inspect(self.engine)
|
154
|
-
all_foreign_keys = []
|
155
|
-
|
156
|
-
for table_name in inspector.get_table_names():
|
157
|
-
fks = inspector.get_foreign_keys(table_name)
|
158
|
-
for fk in fks:
|
159
|
-
all_foreign_keys.append(ForeignKeyDocument(
|
160
|
-
source_table_name=table_name,
|
161
|
-
source_column_name=fk['constrained_columns'][0],
|
162
|
-
target_table_name=fk['referred_table'],
|
163
|
-
target_column_name=fk['referred_columns'][0],
|
164
|
-
constraint_name=fk.get('name', '')
|
165
|
-
))
|
166
|
-
|
167
|
-
return all_foreign_keys
|
168
|
-
|
169
|
-
def get_schemas_as_documents(self) -> List[SchemaDocument]:
|
170
|
-
"""Return schemas as document objects."""
|
171
|
-
# MariaDB doesn't have explicit schemas like PostgreSQL
|
172
|
-
return [SchemaDocument(
|
173
|
-
schema_name="default",
|
174
|
-
comment="Default MariaDB schema"
|
175
|
-
)]
|
176
|
-
|
177
|
-
def get_indexes_as_documents(self, table_name: Optional[str] = None) -> List[IndexDocument]:
|
178
|
-
"""Return indexes as document objects."""
|
179
|
-
inspector = inspect(self.engine)
|
180
|
-
indexes = []
|
181
|
-
|
182
|
-
tables = [table_name] if table_name else inspector.get_table_names()
|
183
|
-
|
184
|
-
for tbl_name in tables:
|
185
|
-
try:
|
186
|
-
table_indexes = inspector.get_indexes(tbl_name)
|
187
|
-
for idx in table_indexes:
|
188
|
-
indexes.append(IndexDocument(
|
189
|
-
table_name=tbl_name,
|
190
|
-
index_name=idx['name'],
|
191
|
-
column_names=idx['column_names'],
|
192
|
-
is_unique=idx['unique'],
|
193
|
-
index_type="BTREE" # Default for MariaDB
|
194
|
-
))
|
195
|
-
except SQLAlchemyError as e:
|
196
|
-
logger.warning(f"Could not get indexes for table {tbl_name}: {e}")
|
197
|
-
|
198
|
-
return indexes
|
199
|
-
|
200
|
-
def get_unique_values(self) -> Dict[str, Dict[str, List[str]]]:
|
201
|
-
"""Get unique values from the database."""
|
202
|
-
# This is a placeholder implementation.
|
203
|
-
# A more sophisticated version like in ThothPgManager should be implemented.
|
204
|
-
return {}
|
205
|
-
|
206
|
-
def get_example_data(self, table_name: str, number_of_rows: int = 30) -> Dict[str, List[Any]]:
|
207
|
-
"""Get example data (most frequent values) for each column in a table."""
|
208
|
-
inspector = inspect(self.engine)
|
209
|
-
try:
|
210
|
-
columns = inspector.get_columns(table_name)
|
211
|
-
except SQLAlchemyError as e:
|
212
|
-
logger.error(f"Error inspecting columns for table {table_name}: {e}")
|
213
|
-
raise e
|
214
|
-
|
215
|
-
if not columns:
|
216
|
-
logger.warning(f"No columns found for table {table_name}")
|
217
|
-
return {}
|
218
|
-
|
219
|
-
most_frequent_values: Dict[str, List[Any]] = {}
|
220
|
-
|
221
|
-
with self.engine.connect() as connection:
|
222
|
-
for col_info in columns:
|
223
|
-
column_name = col_info['name']
|
224
|
-
# MariaDB uses backticks for identifier quoting (same as MySQL)
|
225
|
-
quoted_column_name = f'`{column_name}`'
|
226
|
-
quoted_table_name = f'`{table_name}`'
|
227
|
-
|
228
|
-
query_str = f"""
|
229
|
-
SELECT {quoted_column_name}
|
230
|
-
FROM (
|
231
|
-
SELECT {quoted_column_name}, COUNT(*) as _freq
|
232
|
-
FROM {quoted_table_name}
|
233
|
-
WHERE {quoted_column_name} IS NOT NULL
|
234
|
-
GROUP BY {quoted_column_name}
|
235
|
-
ORDER BY _freq DESC
|
236
|
-
LIMIT :num_rows
|
237
|
-
) as subquery;
|
238
|
-
"""
|
239
|
-
try:
|
240
|
-
result = connection.execute(text(query_str), {"num_rows": number_of_rows})
|
241
|
-
values = [row[0] for row in result]
|
242
|
-
most_frequent_values[column_name] = values
|
243
|
-
except SQLAlchemyError as e:
|
244
|
-
logger.error(f"Error fetching frequent values for {column_name} in {table_name}: {e}")
|
245
|
-
most_frequent_values[column_name] = []
|
246
|
-
|
247
|
-
# Normalize list lengths
|
248
|
-
max_length = 0
|
249
|
-
if most_frequent_values:
|
250
|
-
max_length = max(len(v) for v in most_frequent_values.values()) if most_frequent_values else 0
|
251
|
-
|
252
|
-
for column_name in most_frequent_values:
|
253
|
-
current_len = len(most_frequent_values[column_name])
|
254
|
-
if current_len < max_length:
|
255
|
-
most_frequent_values[column_name].extend([None] * (max_length - current_len))
|
256
|
-
|
257
|
-
return most_frequent_values
|
258
|
-
|
259
|
-
|
260
32
|
@register_plugin("mariadb")
|
261
33
|
class MariaDBPlugin(DbPlugin):
|
262
|
-
"""MariaDB database plugin
|
34
|
+
"""MariaDB database plugin."""
|
263
35
|
|
264
36
|
plugin_name = "MariaDB Plugin"
|
265
37
|
plugin_version = "1.0.0"
|
@@ -315,11 +87,19 @@ class MariaDBPlugin(DbPlugin):
|
|
315
87
|
|
316
88
|
def create_adapter(self, **kwargs) -> DbAdapter:
|
317
89
|
"""Create and return a MariaDB adapter instance."""
|
318
|
-
|
90
|
+
# Map plugin parameters to adapter parameters
|
91
|
+
connection_params = {
|
92
|
+
'host': kwargs.get('host', 'localhost'),
|
93
|
+
'port': kwargs.get('port', 3307),
|
94
|
+
'database': kwargs.get('database') or kwargs.get('dbname'),
|
95
|
+
'user': kwargs.get('user') or kwargs.get('username'),
|
96
|
+
'password': kwargs.get('password')
|
97
|
+
}
|
98
|
+
return MariaDBAdapter(connection_params)
|
319
99
|
|
320
100
|
def validate_connection_params(self, **kwargs) -> bool:
|
321
101
|
"""Validate connection parameters for MariaDB."""
|
322
|
-
required = ['host', '
|
102
|
+
required = ['host', 'user', 'password']
|
323
103
|
database = kwargs.get('database') or kwargs.get('dbname')
|
324
104
|
|
325
105
|
if not database:
|
@@ -331,7 +111,7 @@ class MariaDBPlugin(DbPlugin):
|
|
331
111
|
logger.error(f"Missing required parameter: {param}")
|
332
112
|
return False
|
333
113
|
|
334
|
-
port = kwargs.get('port')
|
114
|
+
port = kwargs.get('port', 3307)
|
335
115
|
if not isinstance(port, int) or not (1 <= port <= 65535):
|
336
116
|
logger.error("port must be an integer between 1 and 65535")
|
337
117
|
return False
|
@@ -341,8 +121,8 @@ class MariaDBPlugin(DbPlugin):
|
|
341
121
|
def initialize(self, **kwargs) -> None:
|
342
122
|
"""Initialize the MariaDB plugin."""
|
343
123
|
# Validate and extract parameters
|
344
|
-
self.host = kwargs.get('host')
|
345
|
-
self.port = kwargs.get('port',
|
124
|
+
self.host = kwargs.get('host', 'localhost')
|
125
|
+
self.port = kwargs.get('port', 3307)
|
346
126
|
self.dbname = kwargs.get('database') or kwargs.get('dbname')
|
347
127
|
self.user = kwargs.get('user') or kwargs.get('username')
|
348
128
|
self.password = kwargs.get('password')
|
@@ -434,3 +214,13 @@ class MariaDBPlugin(DbPlugin):
|
|
434
214
|
return self.adapter.get_example_data(table_name, number_of_rows)
|
435
215
|
else:
|
436
216
|
raise RuntimeError("Plugin not initialized")
|
217
|
+
|
218
|
+
@classmethod
|
219
|
+
def get_required_parameters(cls) -> List[str]:
|
220
|
+
"""Get list of required connection parameters."""
|
221
|
+
return ['host', 'port', 'database', 'user', 'password']
|
222
|
+
|
223
|
+
@classmethod
|
224
|
+
def get_optional_parameters(cls) -> List[str]:
|
225
|
+
"""Get list of optional connection parameters."""
|
226
|
+
return ['db_root_path', 'db_mode']
|
@@ -1,3 +1,17 @@
|
|
1
|
+
# Copyright 2025 Marco Pancotti
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
1
15
|
"""
|
2
16
|
PostgreSQL plugin implementation.
|
3
17
|
"""
|
@@ -1,3 +1,17 @@
|
|
1
|
+
# Copyright 2025 Marco Pancotti
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
1
15
|
"""
|
2
16
|
SQLite plugin implementation.
|
3
17
|
"""
|
@@ -1,3 +1,17 @@
|
|
1
|
+
# Copyright 2025 Marco Pancotti
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
1
15
|
"""
|
2
16
|
SQL Server plugin implementation.
|
3
17
|
"""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: thoth_dbmanager
|
3
|
-
Version: 0.5.
|
3
|
+
Version: 0.5.9
|
4
4
|
Summary: A Python library for managing SQL databases with support for multiple database types, LSH-based similarity search, and a modern plugin architecture.
|
5
5
|
Author-email: Marco Pancotti <mp@tylconsulting.it>
|
6
6
|
Project-URL: Homepage, https://github.com/mptyl/thoth_dbmanager
|
@@ -22,6 +22,7 @@ Classifier: Development Status :: 4 - Beta
|
|
22
22
|
Requires-Python: >=3.9
|
23
23
|
Description-Content-Type: text/markdown
|
24
24
|
License-File: LICENSE
|
25
|
+
License-File: LICENSE.md
|
25
26
|
Requires-Dist: datasketch>=1.5.0
|
26
27
|
Requires-Dist: tqdm>=4.60.0
|
27
28
|
Requires-Dist: SQLAlchemy>=1.4.0
|
@@ -0,0 +1,34 @@
|
|
1
|
+
thoth_dbmanager/ThothDbManager.py,sha256=Mt3MCvV7vVPgS2jXuyGJVMLslKRpbhxmTCeHL6s80XA,9522
|
2
|
+
thoth_dbmanager/__init__.py,sha256=7TpqAsZhwGyr3tA_oyGbAOaVhd7k6Ta3wGQTK7mdUpE,2234
|
3
|
+
thoth_dbmanager/documents.py,sha256=BnYL9MR9eOl9cNOrY58SgHgXACnHCk_UzKjpfV8RjgY,5630
|
4
|
+
thoth_dbmanager/dynamic_imports.py,sha256=nKCwg3Y2e5f4oP_-9X53t4Z9InbIGDMgidQjeN1Xgoo,7592
|
5
|
+
thoth_dbmanager/adapters/__init__.py,sha256=rfXo8IxWPx2TQV2OwFrZqpOzrkKuO6HR0q8ftkuGhW0,1578
|
6
|
+
thoth_dbmanager/adapters/mariadb.py,sha256=Bc31B4LNzlqu1QwhBP49Ia1jlh-XWh14Q_ya-KqWvsQ,15636
|
7
|
+
thoth_dbmanager/adapters/postgresql.py,sha256=7NiYHGWQpiZ3NMT6G3tqLeCJztxNZ4E0jB-aeT5FhK0,18453
|
8
|
+
thoth_dbmanager/adapters/sqlite.py,sha256=sg9ifwBL3L_aBf6i3Z0wq_Z7mTjnVeWhCY1VK6Cfh9E,15147
|
9
|
+
thoth_dbmanager/adapters/sqlserver.py,sha256=VcWW5xudK4_3BuPwX0WcBAxgN6j9seRssvwsWPpJudo,25320
|
10
|
+
thoth_dbmanager/core/__init__.py,sha256=22dsupbGskkjGgS9IzeCwaf5o7nIKH_og1qARZURAFM,848
|
11
|
+
thoth_dbmanager/core/factory.py,sha256=4RHiAlqTGbtMKGCboDM8dnCgyJhO4PTWgkGyJ-ZSrFc,9537
|
12
|
+
thoth_dbmanager/core/interfaces.py,sha256=SAmPllSyJamLb8eyN9CdpnunNxje6M-q1SrR3hxTAE4,10154
|
13
|
+
thoth_dbmanager/core/registry.py,sha256=0yqZGs2zVoX601pr4Sct1LITt1O87IG4Yyhay8EpNg0,9203
|
14
|
+
thoth_dbmanager/helpers/__init__.py,sha256=4URWmUXMDcn9N4Jd-1vGA93MG6TOhTF55wVC0nBpPIw,578
|
15
|
+
thoth_dbmanager/helpers/multi_db_generator.py,sha256=qoSJA-xfUEPyFgKLcJDJUAkcvTxRG-IJzHHi05a6Tpc,23817
|
16
|
+
thoth_dbmanager/helpers/preprocess_values.py,sha256=fuRebc34DvE6OSZztCG8iJDFu2W6_mXpYvymoP0s_LU,6762
|
17
|
+
thoth_dbmanager/helpers/schema.py,sha256=9zmQXZYPpWErYxhKiGjw84iqi2R1bfuULzEdxuzZhrI,14557
|
18
|
+
thoth_dbmanager/helpers/search.py,sha256=pN-GNKA25jAFrspEyZoLI9pw4VKGC75nABeUEwIrVQQ,4549
|
19
|
+
thoth_dbmanager/lsh/__init__.py,sha256=nOCWWb4FUJ3ukggaTdPA2AOZI3m3iu54OKschnqxThc,1134
|
20
|
+
thoth_dbmanager/lsh/core.py,sha256=eqeqHvOiHcEiwt0xxInn5iQT7rOX2Chl_tWBBNq1Stw,7392
|
21
|
+
thoth_dbmanager/lsh/factory.py,sha256=jf-_0VXOHsCdgKb8KgWDMSQk9TpTg6KbpPXc0Mn_Lqc,2990
|
22
|
+
thoth_dbmanager/lsh/manager.py,sha256=mHdgVgkOhVcJvu0ED0qgHmZKp28er6avx2MZzTOJCSQ,7092
|
23
|
+
thoth_dbmanager/lsh/storage.py,sha256=ijryQWavoPAQ7tRGvjc-2dBJmI7mzNGUa1dSR_ke6Vw,5122
|
24
|
+
thoth_dbmanager/plugins/__init__.py,sha256=uTGI4GZNE6xSEfzuf_7llqGHY5D1BbC2EMJjgKXU-xM,1736
|
25
|
+
thoth_dbmanager/plugins/mariadb.py,sha256=OW_u_x3mfaQYH5dUEreUbelPE6KEQU4kiqT3_DzHgUg,8610
|
26
|
+
thoth_dbmanager/plugins/postgresql.py,sha256=VFGiGa1qAWRR00DkoHIAFS-U9uMLMwb5gKa_NB-cQA8,6097
|
27
|
+
thoth_dbmanager/plugins/sqlite.py,sha256=yqqa_lToLabOv_ut2uRTXxhjyEQSVbB8kIcUwy7HNZk,9436
|
28
|
+
thoth_dbmanager/plugins/sqlserver.py,sha256=AxEXwe21FRh6L1lX6-gu3VzcxDQ7dO5YLvLXTrIyaRk,5868
|
29
|
+
thoth_dbmanager-0.5.9.dist-info/licenses/LICENSE,sha256=81-BOzGgwtY1XdYfkwMQB87AkOGXI9OMq0kjNcZA4UE,1071
|
30
|
+
thoth_dbmanager-0.5.9.dist-info/licenses/LICENSE.md,sha256=TtKT2ej3GRki3W8FmSeYzRuQtZ1oMGWchpWykZ4vA7c,1070
|
31
|
+
thoth_dbmanager-0.5.9.dist-info/METADATA,sha256=Bic4w9wYxCM8SKiJVKVwvJJTrFo9XC96BftJivljIcw,14777
|
32
|
+
thoth_dbmanager-0.5.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
33
|
+
thoth_dbmanager-0.5.9.dist-info/top_level.txt,sha256=b9ttxm9RUc0KUCASEKRx6FqoREYJ1-KZWSpNuaM0uQ4,16
|
34
|
+
thoth_dbmanager-0.5.9.dist-info/RECORD,,
|
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2025 Marco Pancotti
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
@@ -1,33 +0,0 @@
|
|
1
|
-
thoth_dbmanager/ThothDbManager.py,sha256=q-jctgt3MJCDFzq6icQdP1oLeVy1ypg402F4ybxhG8c,8943
|
2
|
-
thoth_dbmanager/__init__.py,sha256=Qrd9n7YYMkNKCFiIkzWbjKf5LNOkfp4TkebEpsKqt7E,1655
|
3
|
-
thoth_dbmanager/documents.py,sha256=z-f7zo_CZHqoGM0qHT8-lSUx4NhnMNZTSajpoFtRxn4,5051
|
4
|
-
thoth_dbmanager/dynamic_imports.py,sha256=xDahgiqKvwSYqjPgHiQqD1XPhAbM_JqnU3OhBp2N-fc,7013
|
5
|
-
thoth_dbmanager/adapters/__init__.py,sha256=Ua3ZjSOFlP9kVMFTiC6fyrpcv327b_mBimQ_4fnUsGY,318
|
6
|
-
thoth_dbmanager/adapters/mariadb.py,sha256=LTsf0gORiwqZkd6WtKcOsYLHyDgysxdqNesBscbJwNs,5709
|
7
|
-
thoth_dbmanager/adapters/postgresql.py,sha256=qxdlxOV7Nvn8U4Lhat50w87Z2S8AzBfmLfEwKfz7dis,17299
|
8
|
-
thoth_dbmanager/adapters/sqlite.py,sha256=RTDszgnAtkE14LKFeoe9lBHgsqXqkmDk6jDCTmVpnoM,14659
|
9
|
-
thoth_dbmanager/adapters/sqlserver.py,sha256=V555kUH54Fb1Atow0BfvbSHmoSwGnrB_RJGn718VQSI,23880
|
10
|
-
thoth_dbmanager/core/__init__.py,sha256=FlqNW0GZNv1rnwNgyXGzveLqaw0Z90y5AKhR_1DvHBE,269
|
11
|
-
thoth_dbmanager/core/factory.py,sha256=84EeZYRoH7y7b19EFHqN4X0CSA6dv-0yxUmlX2zHETk,8840
|
12
|
-
thoth_dbmanager/core/interfaces.py,sha256=s6t-8w4QWu_4Dl654LAU2p3Ao34wjeNaGEsUOJwYHaM,9575
|
13
|
-
thoth_dbmanager/core/registry.py,sha256=url4qpQMoMw4rDrdAAvV6L7-NdO4z86xSJPSwTH_l5g,8624
|
14
|
-
thoth_dbmanager/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
-
thoth_dbmanager/helpers/multi_db_generator.py,sha256=frN0SZtWAfeojoJFLs4XLR3ri6h9pHYc-2O4aLAOlbo,23238
|
16
|
-
thoth_dbmanager/helpers/preprocess_values.py,sha256=sKMjD50UL2CZG7-g7KGe3TJQeXmXC7n28LGge8CaP5c,6183
|
17
|
-
thoth_dbmanager/helpers/schema.py,sha256=PhHgUxfFe7qUPxdpWQ3YfS593VQjyKtaSKMlChCyLNo,13978
|
18
|
-
thoth_dbmanager/helpers/search.py,sha256=k04L7clSPfeQOlq_ifsH3PZ21ZK-rujh_Qy4hWrvSso,3970
|
19
|
-
thoth_dbmanager/lsh/__init__.py,sha256=zAUTRuRX4MNc2nU93tTBkT2_IVL7OBkBL0WZPPgO3Ec,555
|
20
|
-
thoth_dbmanager/lsh/core.py,sha256=171FqHW7ItAqAPk6g_AoayKTE3Bs1rRZxnt55MJVzjY,6813
|
21
|
-
thoth_dbmanager/lsh/factory.py,sha256=2Bpkk-OygjaptZAw1yysxO1cxG3QTxmJ1yFGcXHqX3w,2411
|
22
|
-
thoth_dbmanager/lsh/manager.py,sha256=LGrKbGKiBuISlNXaU4Yxfc_BqJfN27MaXapJbzEAjJQ,6513
|
23
|
-
thoth_dbmanager/lsh/storage.py,sha256=qei6fwpmRCBSS8CRtDlnZCuWEmyuOK9gVSTkEJdX0eI,4543
|
24
|
-
thoth_dbmanager/plugins/__init__.py,sha256=KiamB8UgZujwLUE8Q5suYgqC2i5VEAdmC1m0KF9GgvM,430
|
25
|
-
thoth_dbmanager/plugins/mariadb.py,sha256=ElYa4Rexwrofcjcs0UQKan8fZpbU6-n9zghYR9SgRb4,17975
|
26
|
-
thoth_dbmanager/plugins/postgresql.py,sha256=pI1W9oHpQty8tHMoEDcsOT-Msv6S4aoFcArOGFxLR7Q,5518
|
27
|
-
thoth_dbmanager/plugins/sqlite.py,sha256=gkgZ6-Vjkab0IP3ffHOg4bbpDHsjO_N4DesUnSDNAmQ,8857
|
28
|
-
thoth_dbmanager/plugins/sqlserver.py,sha256=mMb3F5FmSWV02FZwj-Ult-2TjuyeVA4Fl1iME1dbgLU,5289
|
29
|
-
thoth_dbmanager-0.5.3.dist-info/licenses/LICENSE,sha256=81-BOzGgwtY1XdYfkwMQB87AkOGXI9OMq0kjNcZA4UE,1071
|
30
|
-
thoth_dbmanager-0.5.3.dist-info/METADATA,sha256=ex4_W1vKNmcoFo0ZDHa4Hq-uaoO2YM6T_2a0VvdChvw,14752
|
31
|
-
thoth_dbmanager-0.5.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
32
|
-
thoth_dbmanager-0.5.3.dist-info/top_level.txt,sha256=b9ttxm9RUc0KUCASEKRx6FqoREYJ1-KZWSpNuaM0uQ4,16
|
33
|
-
thoth_dbmanager-0.5.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|