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.
Files changed (35) hide show
  1. thoth_dbmanager/ThothDbManager.py +14 -0
  2. thoth_dbmanager/__init__.py +15 -1
  3. thoth_dbmanager/adapters/__init__.py +44 -6
  4. thoth_dbmanager/adapters/mariadb.py +361 -129
  5. thoth_dbmanager/adapters/postgresql.py +49 -23
  6. thoth_dbmanager/adapters/sqlite.py +14 -1
  7. thoth_dbmanager/adapters/sqlserver.py +38 -9
  8. thoth_dbmanager/core/__init__.py +14 -0
  9. thoth_dbmanager/core/factory.py +17 -0
  10. thoth_dbmanager/core/interfaces.py +14 -0
  11. thoth_dbmanager/core/registry.py +14 -0
  12. thoth_dbmanager/documents.py +14 -0
  13. thoth_dbmanager/dynamic_imports.py +14 -0
  14. thoth_dbmanager/helpers/__init__.py +13 -0
  15. thoth_dbmanager/helpers/multi_db_generator.py +14 -0
  16. thoth_dbmanager/helpers/preprocess_values.py +14 -0
  17. thoth_dbmanager/helpers/schema.py +14 -0
  18. thoth_dbmanager/helpers/search.py +14 -0
  19. thoth_dbmanager/lsh/__init__.py +14 -0
  20. thoth_dbmanager/lsh/core.py +14 -0
  21. thoth_dbmanager/lsh/factory.py +14 -0
  22. thoth_dbmanager/lsh/manager.py +14 -0
  23. thoth_dbmanager/lsh/storage.py +14 -0
  24. thoth_dbmanager/plugins/__init__.py +47 -8
  25. thoth_dbmanager/plugins/mariadb.py +41 -251
  26. thoth_dbmanager/plugins/postgresql.py +14 -0
  27. thoth_dbmanager/plugins/sqlite.py +14 -0
  28. thoth_dbmanager/plugins/sqlserver.py +14 -0
  29. {thoth_dbmanager-0.5.3.dist-info → thoth_dbmanager-0.5.9.dist-info}/METADATA +2 -1
  30. thoth_dbmanager-0.5.9.dist-info/RECORD +34 -0
  31. thoth_dbmanager-0.5.9.dist-info/licenses/LICENSE.md +21 -0
  32. thoth_dbmanager-0.5.3.dist-info/RECORD +0 -33
  33. {thoth_dbmanager-0.5.3.dist-info → thoth_dbmanager-0.5.9.dist-info}/WHEEL +0 -0
  34. {thoth_dbmanager-0.5.3.dist-info → thoth_dbmanager-0.5.9.dist-info}/licenses/LICENSE +0 -0
  35. {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
- # Import all plugins to ensure they are registered
6
- from .postgresql import PostgreSQLPlugin
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
- Unified implementation combining plugin architecture with full database functionality.
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, Union
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 ..documents import TableDocument, ColumnDocument, ForeignKeyDocument, SchemaDocument, IndexDocument
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 with full functionality."""
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
- return MariaDBAdapter(kwargs)
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', 'port', 'user', 'password']
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', 3306)
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
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,,