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.
Files changed (106) hide show
  1. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/PKG-INFO +4 -2
  2. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/__init__.py +1 -1
  3. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/connections.py +63 -3
  4. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/pyproject.toml +4 -1
  5. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/CLAUDE.md +0 -0
  6. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/CONTEXT.md +0 -0
  7. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/MANIFEST.in +0 -0
  8. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/README.md +0 -0
  9. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/README_en.md +0 -0
  10. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/__init__.py +0 -0
  11. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/collection.py +0 -0
  12. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/connections.py +0 -0
  13. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/index_builder.py +0 -0
  14. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/search_builder.py +0 -0
  15. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/async_impl/utility.py +0 -0
  16. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/client.py +0 -0
  17. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/collection.py +0 -0
  18. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/__init__.py +0 -0
  19. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/collection_core.py +0 -0
  20. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/constants.py +0 -0
  21. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/exceptions.py +0 -0
  22. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/executor.py +0 -0
  23. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/mutation_result.py +0 -0
  24. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/schema.py +0 -0
  25. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/search_result.py +0 -0
  26. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/core/vector_types.py +0 -0
  27. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/executor/__init__.py +0 -0
  28. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/executor/async_impl.py +0 -0
  29. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/executor/sync.py +0 -0
  30. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/index/__init__.py +0 -0
  31. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/index/index_builder.py +0 -0
  32. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/__init__.py +0 -0
  33. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/admin.py +0 -0
  34. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/ddl.py +0 -0
  35. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/delete.py +0 -0
  36. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/index.py +0 -0
  37. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/insert.py +0 -0
  38. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/query.py +0 -0
  39. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/result.py +0 -0
  40. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/schema_reflect.py +0 -0
  41. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/search.py +0 -0
  42. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/search_result.py +0 -0
  43. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/operations/upsert.py +0 -0
  44. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/orm/__init__.py +0 -0
  45. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/orm/base.py +0 -0
  46. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/orm/fields.py +0 -0
  47. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/pyvastbase.egg-info/SOURCES.txt +0 -0
  48. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/search/__init__.py +0 -0
  49. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/search/search_builder.py +0 -0
  50. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/setup.cfg +0 -0
  51. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/test_conn.py +0 -0
  52. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/__init__.py +0 -0
  53. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/conftest.py +0 -0
  54. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/helpers.py +0 -0
  55. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_async.py +0 -0
  56. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_async_alignment.py +0 -0
  57. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_async_executor.py +0 -0
  58. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_async_integration.py +0 -0
  59. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_async_with_executor.py +0 -0
  60. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_client_compat.py +0 -0
  61. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection.py +0 -0
  62. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection_adapter.py +0 -0
  63. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection_core.py +0 -0
  64. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection_integration.py +0 -0
  65. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection_properties.py +0 -0
  66. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_collection_signatures.py +0 -0
  67. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_connection_alignment.py +0 -0
  68. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_connection_provider.py +0 -0
  69. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_connections.py +0 -0
  70. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_constants.py +0 -0
  71. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_datatype_compat.py +0 -0
  72. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_datatype_intenum.py +0 -0
  73. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_datatype_mapping.py +0 -0
  74. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_exception_aliases.py +0 -0
  75. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_exceptions.py +0 -0
  76. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_executor.py +0 -0
  77. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_exports.py +0 -0
  78. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_hybrid_search.py +0 -0
  79. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_index_builder.py +0 -0
  80. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_integration.py +0 -0
  81. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_mutation_result.py +0 -0
  82. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_operations.py +0 -0
  83. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_operations_compat.py +0 -0
  84. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_orm.py +0 -0
  85. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_packaging.py +0 -0
  86. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_parameter_unification.py +0 -0
  87. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_return_type_rename.py +0 -0
  88. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_schema.py +0 -0
  89. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_schema_alignment.py +0 -0
  90. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_search_builder.py +0 -0
  91. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_type_alignment.py +0 -0
  92. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_utility.py +0 -0
  93. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_utility_compat.py +0 -0
  94. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_utility_integration.py +0 -0
  95. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_utils.py +0 -0
  96. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_vastbase_client.py +0 -0
  97. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_vector_types.py +0 -0
  98. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/tests/test_with_executor.py +0 -0
  99. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utility.py +0 -0
  100. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/__init__.py +0 -0
  101. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/distance_utils.py +0 -0
  102. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/filter_utils.py +0 -0
  103. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/index_utils.py +0 -0
  104. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/result_utils.py +0 -0
  105. {pyvastbase-0.2.2 → pyvastbase-0.2.5}/utils/sql_utils.py +0 -0
  106. {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.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: psycopg_pool>=3.2; extra == "all"
35
+ Requires-Dist: psycopg-pool>=3.2; extra == "all"
34
36
 
35
37
  # pyvastbase
36
38
 
@@ -38,7 +38,7 @@ Example:
38
38
  ... )
39
39
  """
40
40
 
41
- __version__ = "0.2.2"
41
+ __version__ = "0.2.5"
42
42
  __author__ = "pyvastbase contributors"
43
43
 
44
44
  # Core imports
@@ -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
- self._pool.close()
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
- self._connection.close()
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
- "psycopg_pool>=3.2",
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