pyvastbase 0.2.2__tar.gz → 0.2.5__tar.gz
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.
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/PKG-INFO +4 -2
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/__init__.py +1 -1
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/connections.py +63 -3
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/pyproject.toml +4 -1
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/CLAUDE.md +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/CONTEXT.md +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/MANIFEST.in +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/README.md +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/README_en.md +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/__init__.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/collection.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/connections.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/index_builder.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/search_builder.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/utility.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/client.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/collection.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/__init__.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/collection_core.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/constants.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/exceptions.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/executor.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/mutation_result.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/schema.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/search_result.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/vector_types.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/executor/__init__.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/executor/async_impl.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/executor/sync.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/index/__init__.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/index/index_builder.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/__init__.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/admin.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/ddl.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/delete.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/index.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/insert.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/query.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/result.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/schema_reflect.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/search.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/search_result.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/upsert.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/orm/__init__.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/orm/base.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/orm/fields.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/pyvastbase.egg-info/SOURCES.txt +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/search/__init__.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/search/search_builder.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/setup.cfg +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/test_conn.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/__init__.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/conftest.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/helpers.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_async.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_async_alignment.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_async_executor.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_async_integration.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_async_with_executor.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_client_compat.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection_adapter.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection_core.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection_integration.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection_properties.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection_signatures.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_connection_alignment.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_connection_provider.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_connections.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_constants.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_datatype_compat.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_datatype_intenum.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_datatype_mapping.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_exception_aliases.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_exceptions.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_executor.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_exports.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_hybrid_search.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_index_builder.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_integration.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_mutation_result.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_operations.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_operations_compat.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_orm.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_packaging.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_parameter_unification.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_return_type_rename.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_schema.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_schema_alignment.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_search_builder.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_type_alignment.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_utility.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_utility_compat.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_utility_integration.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_utils.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_vastbase_client.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_vector_types.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_with_executor.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utility.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/__init__.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/distance_utils.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/filter_utils.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/index_utils.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/result_utils.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/sql_utils.py +0 -0
- {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/vector_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyvastbase
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: Python SDK for Vastbase V3 (PyMilvus-style API)
|
|
5
5
|
Author-email: "zhangzhijie(字节)" <zhangzj@vastdata.com.cn>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -21,6 +21,8 @@ Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
|
21
21
|
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
22
22
|
Requires-Dist: isort>=5.12.0; extra == "dev"
|
|
23
23
|
Requires-Dist: mypy>=1.5.0; extra == "dev"
|
|
24
|
+
Provides-Extra: pool
|
|
25
|
+
Requires-Dist: psycopg-pool>=3.2; extra == "pool"
|
|
24
26
|
Provides-Extra: async
|
|
25
27
|
Requires-Dist: psycopg_pool>=3.2; extra == "async"
|
|
26
28
|
Provides-Extra: all
|
|
@@ -30,7 +32,7 @@ Requires-Dist: pytest-cov>=4.1.0; extra == "all"
|
|
|
30
32
|
Requires-Dist: black>=23.0.0; extra == "all"
|
|
31
33
|
Requires-Dist: isort>=5.12.0; extra == "all"
|
|
32
34
|
Requires-Dist: mypy>=1.5.0; extra == "all"
|
|
33
|
-
Requires-Dist:
|
|
35
|
+
Requires-Dist: psycopg-pool>=3.2; extra == "all"
|
|
34
36
|
|
|
35
37
|
# pyvastbase
|
|
36
38
|
|
|
@@ -383,17 +383,77 @@ class VastbaseConnection:
|
|
|
383
383
|
}
|
|
384
384
|
|
|
385
385
|
def close(self) -> None:
|
|
386
|
-
"""Close connection
|
|
386
|
+
"""Close connection and pool.
|
|
387
|
+
|
|
388
|
+
Gracefully closes the pool first; if that fails (e.g. during
|
|
389
|
+
interpreter shutdown when worker threads are already dead),
|
|
390
|
+
force-closes individual TCP connections so the server releases them.
|
|
391
|
+
"""
|
|
387
392
|
if self._pool:
|
|
388
|
-
|
|
393
|
+
try:
|
|
394
|
+
self._pool.close()
|
|
395
|
+
except Exception:
|
|
396
|
+
self._force_close_pool_connections()
|
|
397
|
+
# Neutralize ConnectionPool.__del__ so it won't try to join
|
|
398
|
+
# dead threads during GC, which would print the
|
|
399
|
+
# "RuntimeError: cannot join current thread" warning.
|
|
400
|
+
self._suppress_pool_del()
|
|
389
401
|
self._pool = None
|
|
390
402
|
|
|
391
403
|
if self._connection:
|
|
392
|
-
|
|
404
|
+
try:
|
|
405
|
+
self._connection.close()
|
|
406
|
+
except Exception:
|
|
407
|
+
pass
|
|
393
408
|
self._connection = None
|
|
394
409
|
|
|
395
410
|
self._connected = False
|
|
396
411
|
|
|
412
|
+
def _suppress_pool_del(self) -> None:
|
|
413
|
+
"""Prevent ConnectionPool.__del__ from firing after cleanup.
|
|
414
|
+
|
|
415
|
+
Swaps the pool instance's class to a subclass with a no-op __del__,
|
|
416
|
+
so GC won't try to gather dead worker threads.
|
|
417
|
+
"""
|
|
418
|
+
pool = self._pool
|
|
419
|
+
if pool is None:
|
|
420
|
+
return
|
|
421
|
+
try:
|
|
422
|
+
base = type(pool)
|
|
423
|
+
if base.__del__ is not object.__del__: # has custom __del__
|
|
424
|
+
pool.__class__ = type(base.__name__, (base,), {'__del__': lambda self: None})
|
|
425
|
+
except Exception:
|
|
426
|
+
pass
|
|
427
|
+
|
|
428
|
+
def _force_close_pool_connections(self) -> None:
|
|
429
|
+
"""Force-close individual pool connections when pool.close() fails.
|
|
430
|
+
|
|
431
|
+
Accesses psycopg_pool internals as a last resort during shutdown.
|
|
432
|
+
"""
|
|
433
|
+
pool = self._pool
|
|
434
|
+
if pool is None:
|
|
435
|
+
return
|
|
436
|
+
# Mark pool as closed to prevent further getconn()
|
|
437
|
+
try:
|
|
438
|
+
pool._closed = True
|
|
439
|
+
except Exception:
|
|
440
|
+
pass
|
|
441
|
+
# Drain and close connections from internal deque
|
|
442
|
+
for attr in ("_pool", "_nconn", "_connections"):
|
|
443
|
+
bucket = getattr(pool, attr, None)
|
|
444
|
+
if bucket is None:
|
|
445
|
+
continue
|
|
446
|
+
items = list(bucket) if hasattr(bucket, "__iter__") else []
|
|
447
|
+
for conn in items:
|
|
448
|
+
try:
|
|
449
|
+
conn.close()
|
|
450
|
+
except Exception:
|
|
451
|
+
pass
|
|
452
|
+
try:
|
|
453
|
+
bucket.clear()
|
|
454
|
+
except Exception:
|
|
455
|
+
pass
|
|
456
|
+
|
|
397
457
|
def __enter__(self) -> 'VastbaseConnection':
|
|
398
458
|
"""Context manager entry"""
|
|
399
459
|
if not self._connected:
|
|
@@ -35,6 +35,9 @@ dev = [
|
|
|
35
35
|
"isort>=5.12.0",
|
|
36
36
|
"mypy>=1.5.0",
|
|
37
37
|
]
|
|
38
|
+
pool = [
|
|
39
|
+
"psycopg-pool>=3.2",
|
|
40
|
+
]
|
|
38
41
|
async = [
|
|
39
42
|
"psycopg_pool>=3.2",
|
|
40
43
|
]
|
|
@@ -45,7 +48,7 @@ all = [
|
|
|
45
48
|
"black>=23.0.0",
|
|
46
49
|
"isort>=5.12.0",
|
|
47
50
|
"mypy>=1.5.0",
|
|
48
|
-
"
|
|
51
|
+
"psycopg-pool>=3.2",
|
|
49
52
|
]
|
|
50
53
|
|
|
51
54
|
[tool.setuptools]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|