in src/Core/Resolvers/SqlMutationEngine.cs [1386:1459]
private Dictionary<string, object?> BuildAndExecuteInsertDbQueries(ISqlMetadataProvider sqlMetadataProvider,
string entityName,
string parentEntityName,
IDictionary<string, object?> parameters,
SourceDefinition sourceDefinition,
bool isLinkingEntity,
int nestingLevel)
{
SqlInsertStructure sqlInsertStructure = new(
entityName: entityName,
sqlMetadataProvider: sqlMetadataProvider,
authorizationResolver: _authorizationResolver,
gQLFilterParser: _gQLFilterParser,
mutationParams: parameters,
httpContext: GetHttpContext(),
isLinkingEntity: isLinkingEntity);
IQueryBuilder queryBuilder = _queryManagerFactory.GetQueryBuilder(sqlMetadataProvider.GetDatabaseType());
IQueryExecutor queryExecutor = _queryManagerFactory.GetQueryExecutor(sqlMetadataProvider.GetDatabaseType());
// When the entity is a linking entity, the parent entity's name is used to get the
// datasource name. Otherwise, the entity's name is used.
string dataSourceName = isLinkingEntity ? _runtimeConfigProvider.GetConfig().GetDataSourceNameFromEntityName(parentEntityName)
: _runtimeConfigProvider.GetConfig().GetDataSourceNameFromEntityName(entityName);
string queryString = queryBuilder.Build(sqlInsertStructure);
Dictionary<string, DbConnectionParam> queryParameters = sqlInsertStructure.Parameters;
List<string> exposedColumnNames = new();
if (sqlMetadataProvider.TryGetExposedFieldToBackingFieldMap(entityName, out IReadOnlyDictionary<string, string>? exposedFieldToBackingFieldMap))
{
exposedColumnNames = exposedFieldToBackingFieldMap.Keys.ToList();
}
DbResultSet? dbResultSet;
DbResultSetRow? dbResultSetRow;
dbResultSet = queryExecutor.ExecuteQuery(
queryString,
queryParameters,
queryExecutor.ExtractResultSetFromDbDataReader,
GetHttpContext(),
EnumerableUtilities.IsNullOrEmpty(exposedColumnNames) ? sourceDefinition.Columns.Keys.ToList() : exposedColumnNames,
dataSourceName);
dbResultSetRow = dbResultSet is not null ? (dbResultSet.Rows.FirstOrDefault() ?? new DbResultSetRow()) : null;
if (dbResultSetRow is null || dbResultSetRow.Columns.Count == 0)
{
if (isLinkingEntity)
{
throw new DataApiBuilderException(
message: $"Could not insert row with given values in the linking table joining entities: {entityName} and {parentEntityName} at nesting level : {nestingLevel}",
statusCode: HttpStatusCode.InternalServerError,
subStatusCode: DataApiBuilderException.SubStatusCodes.DatabaseOperationFailed);
}
else
{
if (dbResultSetRow is null)
{
throw new DataApiBuilderException(
message: "No data returned back from database.",
statusCode: HttpStatusCode.InternalServerError,
subStatusCode: DataApiBuilderException.SubStatusCodes.DatabaseOperationFailed);
}
else
{
throw new DataApiBuilderException(
message: $"Could not insert row with given values for entity: {entityName} at nesting level : {nestingLevel}",
statusCode: HttpStatusCode.Forbidden,
subStatusCode: DataApiBuilderException.SubStatusCodes.DatabasePolicyFailure);
}
}
}
return dbResultSetRow.Columns;
}