altcodepro-polydb-python 2.3.4__py3-none-any.whl → 2.3.5__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.
- {altcodepro_polydb_python-2.3.4.dist-info → altcodepro_polydb_python-2.3.5.dist-info}/METADATA +1 -1
- {altcodepro_polydb_python-2.3.4.dist-info → altcodepro_polydb_python-2.3.5.dist-info}/RECORD +6 -6
- polydb/adapters/AzureTableStorageAdapter.py +31 -35
- {altcodepro_polydb_python-2.3.4.dist-info → altcodepro_polydb_python-2.3.5.dist-info}/WHEEL +0 -0
- {altcodepro_polydb_python-2.3.4.dist-info → altcodepro_polydb_python-2.3.5.dist-info}/licenses/LICENSE +0 -0
- {altcodepro_polydb_python-2.3.4.dist-info → altcodepro_polydb_python-2.3.5.dist-info}/top_level.txt +0 -0
{altcodepro_polydb_python-2.3.4.dist-info → altcodepro_polydb_python-2.3.5.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: altcodepro-polydb-python
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.5
|
|
4
4
|
Summary: Production-ready multi-cloud database abstraction layer with connection pooling, retry logic, and thread safety
|
|
5
5
|
Author: AltCodePro
|
|
6
6
|
Project-URL: Homepage, https://github.com/altcodepro/polydb-python
|
{altcodepro_polydb_python-2.3.4.dist-info → altcodepro_polydb_python-2.3.5.dist-info}/RECORD
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
altcodepro_polydb_python-2.3.
|
|
1
|
+
altcodepro_polydb_python-2.3.5.dist-info/licenses/LICENSE,sha256=9X8GLocsBwy-5aR5JGOt2SAMDDPs9Qv-YnqmHBHOXrw,1067
|
|
2
2
|
polydb/PolyDB.py,sha256=p9eDdvBGosE4fNSSAbtq3tHObdKZ-C2V2Q_ia39Ackk,23397
|
|
3
3
|
polydb/__init__.py,sha256=UhUzfSvmMgKbV2tSME1ooIyfshIBi7_WyU4xl1tWWiA,1454
|
|
4
4
|
polydb/advanced_query.py,sha256=cxMB-EB-qT3bWXJlhmjnMCUtrzogORWyoEfS50Dy7go,4280
|
|
@@ -24,7 +24,7 @@ polydb/validation.py,sha256=a1o1d02k3c6PWQwkBbw_0nEmIgrdB5RR8OcpNQMn4cA,4810
|
|
|
24
24
|
polydb/adapters/AzureBlobStorageAdapter.py,sha256=iNscCIeoWy4YJo3IbI7gNam-NUT7t45ayrlPnYfqlCQ,6409
|
|
25
25
|
polydb/adapters/AzureFileStorageAdapter.py,sha256=OuZY5P-FTQ36954obJN65oSMqmW3d-7QBmXxVGX0lds,6086
|
|
26
26
|
polydb/adapters/AzureQueueAdapter.py,sha256=5tslwI0DgvMeb20w57aVSSSKiuCJEKrYjN0kGuFcdUI,5276
|
|
27
|
-
polydb/adapters/AzureTableStorageAdapter.py,sha256=
|
|
27
|
+
polydb/adapters/AzureTableStorageAdapter.py,sha256=_S6HuZTyLbh7CEDf2PkCmwGXpWHxWj6mMeIbGo-RkVo,21663
|
|
28
28
|
polydb/adapters/BlockchainBlobAdapter.py,sha256=BXSDT6rDGGE04qM2-dVNAeWk-VcF82JGHAdUJeYHCbI,3320
|
|
29
29
|
polydb/adapters/BlockchainKVAdapter.py,sha256=5Egic8QyulgYcy9O12iWKq2EDyVEvnXp_ereYgIvbHk,4546
|
|
30
30
|
polydb/adapters/BlockchainQueueAdapter.py,sha256=K01klT8Eu8c-y1G9Sg2r0PIjay_at9x27kCTTEHPkNY,4179
|
|
@@ -52,7 +52,7 @@ polydb/base/ObjectStorageAdapter.py,sha256=mNdJnhoB3VqSCQvmcoel5PohrVQw7Nrajdd5s
|
|
|
52
52
|
polydb/base/QueueAdapter.py,sha256=jFgyG-SUK4nhRNxm2NbzUbwnA9b_5iAC-ikLSUpXRwk,799
|
|
53
53
|
polydb/base/SharedFilesAdapter.py,sha256=hvmdNNhNxpN46Ob9RLAi8l46GB6JolYyZWnAMuaJ86g,708
|
|
54
54
|
polydb/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
|
-
altcodepro_polydb_python-2.3.
|
|
56
|
-
altcodepro_polydb_python-2.3.
|
|
57
|
-
altcodepro_polydb_python-2.3.
|
|
58
|
-
altcodepro_polydb_python-2.3.
|
|
55
|
+
altcodepro_polydb_python-2.3.5.dist-info/METADATA,sha256=HryYolNI5LOA6XnqWIs3ZaA3C3v-_pQ3CYrIycsyESo,11910
|
|
56
|
+
altcodepro_polydb_python-2.3.5.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
57
|
+
altcodepro_polydb_python-2.3.5.dist-info/top_level.txt,sha256=WgLFWJoYjUhwvyPxJFl6jYLrVFuBJDX3OABf4ocwk_E,7
|
|
58
|
+
altcodepro_polydb_python-2.3.5.dist-info/RECORD,,
|
|
@@ -213,7 +213,6 @@ class AzureTableStorageAdapter(NoSQLKVAdapter):
|
|
|
213
213
|
def _pack_entity(self, model: type, pk: str, rk: str, data: JsonDict) -> JsonDict:
|
|
214
214
|
entity: JsonDict = {"PartitionKey": pk, "RowKey": rk}
|
|
215
215
|
|
|
216
|
-
# ✅ model isolation
|
|
217
216
|
entity[_MODEL_FIELD] = model.__qualname__
|
|
218
217
|
|
|
219
218
|
keymap: Dict[str, str] = {}
|
|
@@ -334,18 +333,18 @@ class AzureTableStorageAdapter(NoSQLKVAdapter):
|
|
|
334
333
|
safe_pk = self._sanitize_pk_rk(pk)
|
|
335
334
|
safe_rk = self._sanitize_pk_rk(rk)
|
|
336
335
|
|
|
336
|
+
# Pack entity (encoded for Azure Table)
|
|
337
337
|
entity = self._pack_entity(model, safe_pk, safe_rk, data)
|
|
338
338
|
|
|
339
339
|
# ---------------------------------------------------
|
|
340
|
-
# SIZE ESTIMATION (
|
|
340
|
+
# SIZE ESTIMATION (use ORIGINAL payload, not packed)
|
|
341
341
|
# ---------------------------------------------------
|
|
342
|
-
MAX_PROPERTY_CHARS = 30 * 1024 # ~30K
|
|
343
|
-
MAX_ENTITY_SIZE = 40 * 1024 # conservative total
|
|
342
|
+
MAX_PROPERTY_CHARS = 30 * 1024 # ~30K safe under UTF-16 32K limit
|
|
343
|
+
MAX_ENTITY_SIZE = 40 * 1024 # conservative total threshold
|
|
344
344
|
|
|
345
345
|
def _is_large_string(val: Any) -> bool:
|
|
346
346
|
return isinstance(val, str) and len(val) > MAX_PROPERTY_CHARS
|
|
347
347
|
|
|
348
|
-
# Check if any property exceeds safe char limit
|
|
349
348
|
has_large_property = False
|
|
350
349
|
large_key = None
|
|
351
350
|
|
|
@@ -358,42 +357,40 @@ class AzureTableStorageAdapter(NoSQLKVAdapter):
|
|
|
358
357
|
)
|
|
359
358
|
break
|
|
360
359
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
360
|
+
payload_json = json.dumps(data, default=json_safe)
|
|
361
|
+
payload_bytes = payload_json.encode("utf-8")
|
|
362
|
+
payload_size = len(payload_bytes)
|
|
364
363
|
|
|
365
|
-
force_blob = has_large_property or
|
|
364
|
+
force_blob = has_large_property or payload_size > MAX_ENTITY_SIZE
|
|
366
365
|
|
|
366
|
+
# ---------------------------------------------------
|
|
367
|
+
# BLOB OVERFLOW PATH
|
|
368
|
+
# ---------------------------------------------------
|
|
367
369
|
if force_blob:
|
|
368
370
|
logger.info(
|
|
369
371
|
f"Entity exceeds safe limits → using blob storage "
|
|
370
|
-
f"(size={
|
|
372
|
+
f"(size={payload_size // 1024} KB, large_key={large_key})"
|
|
371
373
|
)
|
|
372
374
|
|
|
373
|
-
|
|
374
|
-
# STORE FULL ENTITY IN BLOB
|
|
375
|
-
# ---------------------------------------------------
|
|
376
|
-
full_payload_bytes = entity_json.encode("utf-8")
|
|
377
|
-
checksum = hashlib.md5(full_payload_bytes).hexdigest()
|
|
375
|
+
checksum = hashlib.md5(payload_bytes).hexdigest()
|
|
378
376
|
blob_key = self._blob_key(safe_pk, safe_rk, checksum)
|
|
379
377
|
|
|
380
|
-
|
|
378
|
+
# Upload ORIGINAL payload (not packed entity)
|
|
379
|
+
self._blob_upload(blob_key, payload_bytes)
|
|
381
380
|
|
|
382
|
-
#
|
|
383
|
-
# STORE REFERENCE IN TABLE
|
|
384
|
-
# ---------------------------------------------------
|
|
381
|
+
# Build reference entity
|
|
385
382
|
reference_entity = {
|
|
386
383
|
"PartitionKey": safe_pk,
|
|
387
384
|
"RowKey": safe_rk,
|
|
388
385
|
_MODEL_FIELD: model.__qualname__,
|
|
389
386
|
"_overflow": True,
|
|
390
387
|
"_blob_key": blob_key,
|
|
391
|
-
"_size":
|
|
388
|
+
"_size": payload_size,
|
|
392
389
|
"_checksum": checksum,
|
|
393
390
|
"__keymap__": entity.get("__keymap__", "{}"),
|
|
394
391
|
}
|
|
395
392
|
|
|
396
|
-
# Keep only small
|
|
393
|
+
# Keep only small queryable fields
|
|
397
394
|
for k, v in entity.items():
|
|
398
395
|
if k in ("PartitionKey", "RowKey", "__keymap__", _MODEL_FIELD):
|
|
399
396
|
continue
|
|
@@ -410,29 +407,28 @@ class AzureTableStorageAdapter(NoSQLKVAdapter):
|
|
|
410
407
|
|
|
411
408
|
self._table_client.upsert_entity(reference_entity)
|
|
412
409
|
|
|
413
|
-
logger.info(f"Stored in blob: {blob_key} ({
|
|
410
|
+
logger.info(f"Stored in blob: {blob_key} ({payload_size // 1024} KB)")
|
|
414
411
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
412
|
+
restored = self._unpack_entity(entity)
|
|
413
|
+
restored["_overflow"] = True
|
|
414
|
+
restored["_blob_key"] = blob_key
|
|
415
|
+
restored["_checksum"] = checksum
|
|
416
|
+
restored["_size"] = payload_size
|
|
417
|
+
restored["id"] = safe_rk
|
|
418
|
+
|
|
419
|
+
return restored
|
|
422
420
|
|
|
423
421
|
# ---------------------------------------------------
|
|
424
422
|
# NORMAL TABLE STORAGE
|
|
425
423
|
# ---------------------------------------------------
|
|
426
424
|
self._table_client.upsert_entity(entity)
|
|
427
425
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
}
|
|
426
|
+
restored = self._unpack_entity(entity)
|
|
427
|
+
restored["id"] = safe_rk
|
|
428
|
+
|
|
429
|
+
return restored
|
|
433
430
|
|
|
434
431
|
except Exception as e:
|
|
435
|
-
# Do NOT retry deterministic size errors
|
|
436
432
|
if "PropertyValueTooLarge" in str(e):
|
|
437
433
|
raise NoSQLError("Azure Table limit exceeded → must use blob overflow") from e
|
|
438
434
|
|
|
File without changes
|
|
File without changes
|
{altcodepro_polydb_python-2.3.4.dist-info → altcodepro_polydb_python-2.3.5.dist-info}/top_level.txt
RENAMED
|
File without changes
|