Skip to content

Commit 847d122

Browse files
zhaodongwang-msftMax Wang
andauthored
consistency strong (#37)
* consistency strong * remove _wait_for_entity_ready and some other refactor --------- Co-authored-by: Max Wang <zhaodongwang@microsoft.com>
1 parent de6539c commit 847d122

1 file changed

Lines changed: 19 additions & 22 deletions

File tree

src/dataverse_sdk/odata.py

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -679,15 +679,19 @@ def _normalize_entity_schema(self, tablename: str) -> str:
679679
return tablename
680680
return f"new_{self._to_pascal(tablename)}"
681681

682-
def _get_entity_by_schema(self, schema_name: str) -> Optional[Dict[str, Any]]:
682+
def _get_entity_by_schema(
683+
self,
684+
schema_name: str,
685+
headers: Optional[Dict[str, str]] = None,
686+
) -> Optional[Dict[str, Any]]:
683687
url = f"{self.api}/EntityDefinitions"
684688
# Escape single quotes in schema name
685689
schema_escaped = self._escape_odata_quotes(schema_name)
686690
params = {
687691
"$select": "MetadataId,LogicalName,SchemaName,EntitySetName",
688692
"$filter": f"SchemaName eq '{schema_escaped}'",
689693
}
690-
r = self._request("get", url, params=params)
694+
r = self._request("get", url, params=params, headers=headers)
691695
items = r.json().get("value", [])
692696
return items[0] if items else None
693697

@@ -697,7 +701,7 @@ def _create_entity(
697701
display_name: str,
698702
attributes: List[Dict[str, Any]],
699703
solution_unique_name: Optional[str] = None,
700-
) -> str:
704+
) -> Dict[str, Any]:
701705
url = f"{self.api}/EntityDefinitions"
702706
payload = {
703707
"@odata.type": "Microsoft.Dynamics.CRM.EntityMetadata",
@@ -715,23 +719,18 @@ def _create_entity(
715719
if solution_unique_name:
716720
params = {"SolutionUniqueName": solution_unique_name}
717721
self._request("post", url, json=payload, params=params)
718-
ent = self._wait_for_entity_ready(schema_name)
722+
ent = self._get_entity_by_schema(
723+
schema_name,
724+
headers={"Consistency": "Strong"},
725+
)
719726
if not ent or not ent.get("EntitySetName"):
720727
raise RuntimeError(
721728
f"Failed to create or retrieve entity '{schema_name}' (EntitySetName not available)."
722729
)
723-
return ent["MetadataId"]
724-
725-
def _wait_for_entity_ready(self, schema_name: str, delays: Optional[List[int]] = None) -> Optional[Dict[str, Any]]:
726-
import time
727-
delays = delays or [0, 2, 5, 10, 20, 30]
728-
ent: Optional[Dict[str, Any]] = None
729-
for idx, delay in enumerate(delays):
730-
if idx > 0 and delay > 0:
731-
time.sleep(delay)
732-
ent = self._get_entity_by_schema(schema_name)
733-
if ent and ent.get("EntitySetName"):
734-
return ent
730+
if not ent.get("MetadataId"):
731+
raise RuntimeError(
732+
f"MetadataId missing after creating entity '{schema_name}'."
733+
)
735734
return ent
736735

737736
def _normalize_attribute_schema(self, entity_schema: str, column_name: str) -> str:
@@ -1189,20 +1188,18 @@ def _create_table(
11891188
if not solution_unique_name:
11901189
raise ValueError("solution_unique_name cannot be empty")
11911190

1192-
metadata_id = self._create_entity(
1191+
metadata = self._create_entity(
11931192
entity_schema,
11941193
tablename,
11951194
attributes,
11961195
solution_unique_name,
11971196
)
1198-
ent2: Dict[str, Any] = self._wait_for_entity_ready(entity_schema) or {}
1199-
logical_name = ent2.get("LogicalName")
12001197

12011198
return {
12021199
"entity_schema": entity_schema,
1203-
"entity_logical_name": logical_name,
1204-
"entity_set_name": ent2.get("EntitySetName") if ent2 else None,
1205-
"metadata_id": metadata_id,
1200+
"entity_logical_name": metadata.get("LogicalName"),
1201+
"entity_set_name": metadata.get("EntitySetName"),
1202+
"metadata_id": metadata.get("MetadataId"),
12061203
"columns_created": created_cols,
12071204
}
12081205

0 commit comments

Comments
 (0)