altcodepro-polydb-python 2.3.8__py3-none-any.whl → 2.3.10__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 (29) hide show
  1. {altcodepro_polydb_python-2.3.8.dist-info → altcodepro_polydb_python-2.3.10.dist-info}/METADATA +11 -1
  2. altcodepro_polydb_python-2.3.10.dist-info/RECORD +61 -0
  3. polydb/adapters/AzureBlobStorageAdapter.py +92 -90
  4. polydb/adapters/AzureFileStorageAdapter.py +74 -74
  5. polydb/adapters/AzureQueueAdapter.py +9 -5
  6. polydb/adapters/AzureTableStorageAdapter.py +5 -5
  7. polydb/adapters/BlockchainBlobAdapter.py +1 -1
  8. polydb/adapters/BlockchainFileAdapter.py +217 -0
  9. polydb/adapters/BlockchainKVAdapter.py +4 -3
  10. polydb/adapters/BlockchainQueueAdapter.py +3 -2
  11. polydb/adapters/DynamoDBAdapter.py +12 -3
  12. polydb/adapters/EFSAdapter.py +45 -19
  13. polydb/adapters/FirestoreAdapter.py +15 -13
  14. polydb/adapters/GCPFilestoreAdapter.py +77 -0
  15. polydb/adapters/GCPPubSubAdapter.py +4 -4
  16. polydb/adapters/GCPStorageAdapter.py +78 -117
  17. polydb/adapters/PostgreSQLAdapter.py +3 -2
  18. polydb/adapters/S3Adapter.py +5 -2
  19. polydb/adapters/S3CompatibleAdapter.py +87 -57
  20. polydb/adapters/SQSAdapter.py +5 -2
  21. polydb/adapters/VercelFileAdapter.py +29 -0
  22. polydb/audit/__init__.py +1 -1
  23. polydb/base/SharedFilesAdapter.py +5 -5
  24. polydb/cloudDatabaseFactory.py +37 -66
  25. polydb/databaseFactory.py +23 -7
  26. altcodepro_polydb_python-2.3.8.dist-info/RECORD +0 -58
  27. {altcodepro_polydb_python-2.3.8.dist-info → altcodepro_polydb_python-2.3.10.dist-info}/WHEEL +0 -0
  28. {altcodepro_polydb_python-2.3.8.dist-info → altcodepro_polydb_python-2.3.10.dist-info}/licenses/LICENSE +0 -0
  29. {altcodepro_polydb_python-2.3.8.dist-info → altcodepro_polydb_python-2.3.10.dist-info}/top_level.txt +0 -0
@@ -4,6 +4,8 @@ import os
4
4
  import threading
5
5
  from typing import Dict, List, Optional
6
6
 
7
+ from .base import SharedFilesAdapter
8
+
7
9
  from .adapters.AzureFileStorageAdapter import AzureFileStorageAdapter
8
10
  from .adapters.EFSAdapter import EFSAdapter
9
11
  from .adapters.PostgreSQLAdapter import PostgreSQLAdapter
@@ -44,7 +46,6 @@ from .adapters.VercelQueueAdapter import VercelQueueAdapter
44
46
  from .adapters.BlockchainQueueAdapter import BlockchainQueueAdapter
45
47
  from .adapters.SQSAdapter import SQSAdapter
46
48
 
47
-
48
49
  # ============================================================
49
50
  # FACTORY
50
51
  # ============================================================
@@ -106,7 +107,9 @@ class CloudDatabaseFactory:
106
107
  # OBJECT STORAGE
107
108
  # --------------------------------------------------------
108
109
  def get_object_storage(
109
- self, name: str = "azure"
110
+ self,
111
+ name: str = "azure",
112
+ container_name: Optional[str] = None,
110
113
  ) -> (
111
114
  AzureBlobStorageAdapter
112
115
  | S3CompatibleAdapter
@@ -115,13 +118,12 @@ class CloudDatabaseFactory:
115
118
  | BlockchainBlobAdapter
116
119
  ):
117
120
  with self._lock:
118
- if name in self.instances:
119
- return self.instances[name]
120
-
121
- cfg = self.configs.get(name)
122
- if not cfg:
123
- cfg = StorageConfig(provider=self.provider, name=name)
121
+ # cache per (name, container) so different containers don't collide
122
+ cache_key = f"object::{name}::{container_name or ''}"
123
+ if cache_key in self.instances:
124
+ return self.instances[cache_key]
124
125
 
126
+ cfg = self.configs.get(name) or StorageConfig(provider=self.provider, name=name)
125
127
  provider = cfg.provider
126
128
 
127
129
  # ---------------- AZURE ----------------
@@ -130,11 +132,12 @@ class CloudDatabaseFactory:
130
132
 
131
133
  connection_string = None
132
134
  container = None
133
-
134
135
  if isinstance(cfg, AzureStorageConfig):
135
136
  connection_string = cfg.connection_string
136
137
  container = cfg.container
137
138
 
139
+ container = container_name or container # per-call overrides config/env
140
+
138
141
  instance = AzureBlobStorageAdapter(
139
142
  connection_string=connection_string or "",
140
143
  container_name=container or "",
@@ -157,7 +160,7 @@ class CloudDatabaseFactory:
157
160
  bucket = cfg.bucket
158
161
  project_id = cfg.project_id
159
162
  endpoint = cfg.endpoint
160
-
163
+ bucket = container_name or bucket # container_name doubles as bucket override
161
164
  instance = GCPStorageAdapter(
162
165
  project_id=project_id, endpoint=endpoint, bucket_name=bucket
163
166
  )
@@ -168,21 +171,16 @@ class CloudDatabaseFactory:
168
171
 
169
172
  token = None
170
173
  timeout = 10
171
-
172
174
  if isinstance(cfg, VercelStorageConfig):
173
175
  token = cfg.token
174
176
  timeout = cfg.timeout
175
-
176
177
  instance = VercelBlobAdapter(token=token or "", timeout=timeout)
177
178
 
178
179
  # ---------------- BLOCKCHAIN ----------------
179
180
  elif provider == CloudProvider.BLOCKCHAIN:
180
181
  from .adapters.BlockchainBlobAdapter import BlockchainBlobAdapter
181
182
 
182
- ipfs_url = None
183
- if isinstance(cfg, BlockchainStorageConfig):
184
- ipfs_url = cfg.ipfs_url
185
-
183
+ ipfs_url = cfg.ipfs_url if isinstance(cfg, BlockchainStorageConfig) else None
186
184
  instance = BlockchainBlobAdapter(ipfs_url=ipfs_url)
187
185
 
188
186
  # ---------------- DEFAULT ----------------
@@ -192,7 +190,7 @@ class CloudDatabaseFactory:
192
190
  self.logger.warning(f"Fallback to S3-compatible for provider={provider}")
193
191
  instance = S3CompatibleAdapter()
194
192
 
195
- self.instances[name] = instance
193
+ self.instances[cache_key] = instance
196
194
  return instance
197
195
 
198
196
  # --------------------------------------------------------
@@ -440,82 +438,55 @@ class CloudDatabaseFactory:
440
438
  self.instances["queue"] = instance
441
439
  return instance
442
440
 
443
- def get_files(
444
- self, name: str = "files"
445
- ) -> (
446
- AzureFileStorageAdapter
447
- | EFSAdapter
448
- | GCPStorageAdapter
449
- | AzureBlobStorageAdapter
450
- | S3CompatibleAdapter
451
- | VercelBlobAdapter
452
- | BlockchainBlobAdapter
453
- ):
441
+ def get_files(self, name: str = "files"):
454
442
  with self._lock:
455
443
  if name in self.instances:
456
444
  return self.instances[name]
457
445
 
458
- cfg = self.configs.get(name)
459
- if not cfg:
460
- cfg = StorageConfig(provider=self.provider, name=name)
446
+ cfg = self.configs.get(name) or StorageConfig(provider=self.provider, name=name)
461
447
 
462
- # ---------------- AZURE FILE STORAGE ----------------
463
448
  if cfg.provider == CloudProvider.AZURE:
464
449
  from .adapters.AzureFileStorageAdapter import AzureFileStorageAdapter
465
450
 
466
451
  connection_string = ""
467
452
  share_name = ""
468
-
469
453
  if isinstance(cfg, AzureFileConfig):
470
454
  connection_string = cfg.connection_string or ""
471
455
  share_name = cfg.share_name or ""
472
-
473
456
  instance = AzureFileStorageAdapter(
474
- connection_string=connection_string,
475
- share_name=share_name,
457
+ connection_string=connection_string, share_name=share_name
476
458
  )
477
459
 
478
- # ---------------- AWS EFS ----------------
479
460
  elif cfg.provider == CloudProvider.AWS:
480
461
  from .adapters.EFSAdapter import EFSAdapter
481
462
 
482
- mount_point = None
483
- if isinstance(cfg, EFSFileConfig):
484
- mount_point = cfg.mount_path
485
-
486
- instance = EFSAdapter(
487
- mount_point=mount_point or os.getenv("EFS_MOUNT_POINT", "/mnt/efs")
488
- )
463
+ mount_point = cfg.mount_path if isinstance(cfg, EFSFileConfig) else None
464
+ instance = EFSAdapter(mount_point=mount_point or "")
489
465
 
490
- # ---------------- GCP STORAGE (FILES VIA BUCKET) ----------------
491
466
  elif cfg.provider == CloudProvider.GCP:
492
- from .adapters.GCPStorageAdapter import GCPStorageAdapter
467
+ from .adapters.GCPFilestoreAdapter import FilestoreAdapter
493
468
 
494
- project_id = os.getenv("GOOGLE_CLOUD_PROJECT", "")
495
- endpoint = os.getenv("GCP_STORAGE_ENDPOINT") # optional (for emulator)
496
- bucket = None
469
+ mount_point = getattr(cfg, "mount_path", None)
470
+ instance = FilestoreAdapter(mount_point=mount_point or "")
497
471
 
498
- if isinstance(cfg, GCPFileConfig):
499
- bucket = cfg.bucket
500
-
501
- instance = GCPStorageAdapter(
502
- project_id=project_id,
503
- endpoint=endpoint,
504
- bucket_name=bucket,
505
- )
506
-
507
- # ---------------- VERCEL (fallback to blob) ----------------
508
472
  elif cfg.provider == CloudProvider.VERCEL:
509
- # Vercel has no file system → reuse blob adapter
510
- instance = self.get_object_storage(name)
473
+ from .adapters.VercelFileAdapter import VercelFileAdapter
511
474
 
512
- # ---------------- BLOCKCHAIN ----------------
513
- elif cfg.provider == CloudProvider.BLOCKCHAIN:
514
- raise NotImplementedError("File storage not supported for blockchain")
475
+ instance = VercelFileAdapter()
515
476
 
516
- # ---------------- DEFAULT ----------------
477
+ elif cfg.provider == CloudProvider.BLOCKCHAIN:
478
+ from .adapters.BlockchainFileAdapter import BlockchainFileAdapter
479
+
480
+ instance = BlockchainFileAdapter(
481
+ chain=getattr(cfg, "chain", None),
482
+ rpc_url=getattr(cfg, "rpc_url", None),
483
+ private_key=getattr(cfg, "private_key", None),
484
+ contract_address=getattr(cfg, "contract_address", None),
485
+ contract_abi=getattr(cfg, "contract_abi", None),
486
+ ipfs_url=getattr(cfg, "ipfs_url", None),
487
+ )
517
488
  else:
518
- raise NotImplementedError(f"File storage not supported for {self.provider.value}")
489
+ raise NotImplementedError(f"File storage not supported for {cfg.provider.value}")
519
490
 
520
491
  self.instances[name] = instance
521
492
  return instance
polydb/databaseFactory.py CHANGED
@@ -554,6 +554,7 @@ class DatabaseFactory:
554
554
  after_plain = None
555
555
  success = False
556
556
  error: Optional[str] = None
557
+
557
558
  def _op() -> JsonDict:
558
559
  nonlocal after_plain, success
559
560
  if self._is_sql(meta, engine_override):
@@ -866,8 +867,11 @@ class DatabaseFactory:
866
867
  media_type: Optional[str] = None,
867
868
  metadata: Optional[Dict[str, Any]] = None,
868
869
  storage_name: str = "azure",
870
+ container_name: Optional[str] = None,
869
871
  ) -> str:
870
- storage = self._engines[0].cloud_factory.get_object_storage(storage_name)
872
+ storage = self._engines[0].cloud_factory.get_object_storage(
873
+ storage_name, container_name=container_name
874
+ )
871
875
  return storage.put(
872
876
  key=key,
873
877
  data=data,
@@ -877,16 +881,28 @@ class DatabaseFactory:
877
881
  metadata=metadata or {},
878
882
  )
879
883
 
880
- def download_blob(self, key: str, *, storage_name: str = "azure") -> Optional[bytes]:
881
- storage = self._engines[0].cloud_factory.get_object_storage(storage_name)
884
+ def download_blob(
885
+ self, key: str, *, storage_name: str = "azure", container_name: Optional[str] = None
886
+ ) -> Optional[bytes]:
887
+ storage = self._engines[0].cloud_factory.get_object_storage(
888
+ storage_name, container_name=container_name
889
+ )
882
890
  return storage.get(key)
883
891
 
884
- def delete_blob(self, key: str, *, storage_name: str = "azure") -> bool:
885
- storage = self._engines[0].cloud_factory.get_object_storage(storage_name)
892
+ def delete_blob(
893
+ self, key: str, *, storage_name: str = "azure", container_name: Optional[str] = None
894
+ ) -> bool:
895
+ storage = self._engines[0].cloud_factory.get_object_storage(
896
+ storage_name, container_name=container_name
897
+ )
886
898
  return storage.delete(key)
887
899
 
888
- def list_blob(self, prefix: str = "", *, storage_name: str = "azure") -> List[str]:
889
- storage = self._engines[0].cloud_factory.get_object_storage(storage_name)
900
+ def list_blob(
901
+ self, prefix: str = "", *, storage_name: str = "azure", container_name: Optional[str] = None
902
+ ) -> List[str]:
903
+ storage = self._engines[0].cloud_factory.get_object_storage(
904
+ storage_name, container_name=container_name
905
+ )
890
906
  return storage.list(prefix)
891
907
 
892
908
  # ══════════════════════════════════════════════════════════════════════
@@ -1,58 +0,0 @@
1
- altcodepro_polydb_python-2.3.8.dist-info/licenses/LICENSE,sha256=9X8GLocsBwy-5aR5JGOt2SAMDDPs9Qv-YnqmHBHOXrw,1067
2
- polydb/PolyDB.py,sha256=p9eDdvBGosE4fNSSAbtq3tHObdKZ-C2V2Q_ia39Ackk,23397
3
- polydb/__init__.py,sha256=UhUzfSvmMgKbV2tSME1ooIyfshIBi7_WyU4xl1tWWiA,1454
4
- polydb/advanced_query.py,sha256=cxMB-EB-qT3bWXJlhmjnMCUtrzogORWyoEfS50Dy7go,4280
5
- polydb/batch.py,sha256=_DjWZa1ZXYSk6MLKqFe0eT7SYVRZtYNqZb9bI8Y2sao,4566
6
- polydb/cache.py,sha256=JBXF1XEK-fY80ar8SDE893Z1Z116YtXAEG0PaJ0Nkcw,7658
7
- polydb/cloudDatabaseFactory.py,sha256=E5tFJBNJuwwdJ4sqjr3IgUTpUWpXoa-UarIv8pLB7lY,18121
8
- polydb/databaseFactory.py,sha256=LtRxQ5R6A4XegqSsHI26lbtTsmrzpVLvKIqn57BAjIg,40447
9
- polydb/decorators.py,sha256=Rzk8Bj8wHi8YFtc06HEYT5r_Vqqn7TGaCtR5qvHdY-E,420
10
- polydb/errors.py,sha256=rcFeBH0cenjJ86v0cmDc2Yjj4R019pLCBcTeSC4qps4,1428
11
- polydb/json_safe.py,sha256=R5PrqAGirqjYKPyy-8KH-lSXjLH0FPr2TSGozy4eheU,149
12
- polydb/models.py,sha256=9uu_BaJ95194n-vnd0Rx9KLc6aPS-mxn10P4W5grUcI,8155
13
- polydb/monitoring.py,sha256=UMm3ybyRJjAQi-prXXMLl9zuHhnhMnYBzMD3XWK66y8,9571
14
- polydb/multitenancy.py,sha256=9kyY98RpKg8xDy9ejB_MyV_YzF7eZd4uxashw5S8vlg,6408
15
- polydb/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- polydb/query.py,sha256=L13FL8A06HxT0F_LGlY9IBh-62j1VWZrv2Tu_wS-Ed0,6348
17
- polydb/registry.py,sha256=RD_elvFXcmhTdCyZDm2f3ej0elxqhArnSJ2aO9k5VCU,2352
18
- polydb/retry.py,sha256=etsj8MGo1WMvlcZMzWmFELAsWCRs-XPEuJe6K76QgbM,2548
19
- polydb/schema.py,sha256=VrOayX6V6AD2Qh3-lm4ZVPTpI24e4V52IYheZf2rNQ4,5812
20
- polydb/security.py,sha256=-bXdRjFmvq4X6ie6FrZMcO9ZbgjWFkNySSbRwFt1X1Q,16281
21
- polydb/types.py,sha256=XB_85Un8_aWt4dSfpjIGotHbK3KBY2WurQGXr9EOxWY,2992
22
- polydb/utils.py,sha256=G_ki5zKr5rGPgpFQM1CTq6twQd5OytaHKfet267MftM,1662
23
- polydb/validation.py,sha256=a1o1d02k3c6PWQwkBbw_0nEmIgrdB5RR8OcpNQMn4cA,4810
24
- polydb/adapters/AzureBlobStorageAdapter.py,sha256=iNscCIeoWy4YJo3IbI7gNam-NUT7t45ayrlPnYfqlCQ,6409
25
- polydb/adapters/AzureFileStorageAdapter.py,sha256=OuZY5P-FTQ36954obJN65oSMqmW3d-7QBmXxVGX0lds,6086
26
- polydb/adapters/AzureQueueAdapter.py,sha256=5tslwI0DgvMeb20w57aVSSSKiuCJEKrYjN0kGuFcdUI,5276
27
- polydb/adapters/AzureTableStorageAdapter.py,sha256=FEND2V8-V-CGoTj0hWz8C7FIsA17wr-tTkXidcyjqbM,23345
28
- polydb/adapters/BlockchainBlobAdapter.py,sha256=BXSDT6rDGGE04qM2-dVNAeWk-VcF82JGHAdUJeYHCbI,3320
29
- polydb/adapters/BlockchainKVAdapter.py,sha256=5Egic8QyulgYcy9O12iWKq2EDyVEvnXp_ereYgIvbHk,4546
30
- polydb/adapters/BlockchainQueueAdapter.py,sha256=K01klT8Eu8c-y1G9Sg2r0PIjay_at9x27kCTTEHPkNY,4179
31
- polydb/adapters/DynamoDBAdapter.py,sha256=MSgIk43WT5z0fbBpZJ_5uLq0CfZS2YRfwX06-b_sl3o,18235
32
- polydb/adapters/EFSAdapter.py,sha256=z6ZarHlG_3HMHEk3yVXdJT2vlc8xleML1vEhxizMbdk,1723
33
- polydb/adapters/FirestoreAdapter.py,sha256=cvDOlxrEI8u81kWkjhazqb2rG4Q4I8Ftoho_cbx9nZQ,13947
34
- polydb/adapters/GCPPubSubAdapter.py,sha256=YFkQkTBezjoV56FsIVoNjQ0cqIo3uYzUF_fMf7CCV4M,8759
35
- polydb/adapters/GCPStorageAdapter.py,sha256=B8i9k2rCuH8NJ-wU4RpijbiCx_O_EbUeQXyhcjNdgHU,7758
36
- polydb/adapters/MongoDBAdapter.py,sha256=vX3SAHDLbTnHABGesES9N-gYSQqPqdqFLJgd7pYWZzw,7471
37
- polydb/adapters/PostgreSQLAdapter.py,sha256=qYrtDPxaIk_Q0W9DyXYvhbqbSLtheWuSjL1CKpVR8og,24852
38
- polydb/adapters/S3Adapter.py,sha256=2TqdtTGYKApMFbj6ssbH5JMMM4JUxWzCDdgVJSa_o-w,7547
39
- polydb/adapters/S3CompatibleAdapter.py,sha256=k_25W3hUjTJ-3v1dcMev-jY3oypT8s3tPz3lRdp5Gb0,5642
40
- polydb/adapters/SQSAdapter.py,sha256=qQeMIlvJAkpY0M7Pf1E5sdZxnrLKx_cuoheIj_irNSc,5759
41
- polydb/adapters/VercelBlobAdapter.py,sha256=Hu1u8vE-3rvJMBDotnPKeRoVaH1Vl9PdM1hBKphgj2w,6983
42
- polydb/adapters/VercelKVAdapter.py,sha256=QZxRkuYzVNWFCEFaJPSph8YEAut-YtlXPqbCt0JlROI,8647
43
- polydb/adapters/VercelQueueAdapter.py,sha256=cWtPaMIWCako0HHr_rzAE6vMLugSR6zBXqp3VP9MXwY,2375
44
- polydb/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
- polydb/audit/AuditStorage.py,sha256=A5HLhkWG8kef_caUuWakJf4fSK_r03NN4JLbbK7N55c,4949
46
- polydb/audit/__init__.py,sha256=m_GE7gjLw00zfHX-1SpkF7QZpRE72HO699ZzKzqD3kc,244
47
- polydb/audit/context.py,sha256=-A1FMtmr-2snVAHpTrVT80u-D_MCaqX6AoV4Ku2bz_o,1955
48
- polydb/audit/manager.py,sha256=KzaaOf5bDfr4M-CkCAZBG_U_4xIBCKDLRAf3hsm-DAk,1236
49
- polydb/audit/models.py,sha256=BgkSEQRbjbourxyGcEeJYIYzozwTM-pqTiSOM_BhWHs,2256
50
- polydb/base/NoSQLKVAdapter.py,sha256=oa3MT7Z6E5zsF6mDeqjaMfefScKXJgne79LkB7dN8ZA,11557
51
- polydb/base/ObjectStorageAdapter.py,sha256=mNdJnhoB3VqSCQvmcoel5PohrVQw7Nrajdd5suGBOvQ,2242
52
- polydb/base/QueueAdapter.py,sha256=jFgyG-SUK4nhRNxm2NbzUbwnA9b_5iAC-ikLSUpXRwk,799
53
- polydb/base/SharedFilesAdapter.py,sha256=hvmdNNhNxpN46Ob9RLAi8l46GB6JolYyZWnAMuaJ86g,708
54
- polydb/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- altcodepro_polydb_python-2.3.8.dist-info/METADATA,sha256=Impq_k0nllCHVLVy7C-Ri97slsR44MQdV7mQpHmK5Fk,11910
56
- altcodepro_polydb_python-2.3.8.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
57
- altcodepro_polydb_python-2.3.8.dist-info/top_level.txt,sha256=WgLFWJoYjUhwvyPxJFl6jYLrVFuBJDX3OABf4ocwk_E,7
58
- altcodepro_polydb_python-2.3.8.dist-info/RECORD,,