Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Npgsql.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@
<Compile Include="Npgsql\PGUtil.cs" />
<Compile Include="Npgsql\SqlGenerators\SqlBaseGenerator.cs" />
<Compile Include="Npgsql\SqlGenerators\SqlDeleteGenerator.cs" />
<Compile Include="Npgsql\SqlGenerators\SqlFunctionGenerator.cs" />
<Compile Include="Npgsql\SqlGenerators\SqlInsertGenerator.cs" />
<Compile Include="Npgsql\SqlGenerators\SqlSelectGenerator.cs" />
<Compile Include="Npgsql\SqlGenerators\SqlUpdateGenerator.cs" />
Expand Down
4 changes: 2 additions & 2 deletions src/Npgsql/NpgsqlSchema.msl
Original file line number Diff line number Diff line change
Expand Up @@ -303,10 +303,10 @@
</cs:EndProperty>
</cs:AssociationSetMapping>
<cs:AssociationSetMapping Name="ViewConstraintColumns" StoreEntitySet="PgViewConstraintColumns" TypeName="Store.TableOrViewConstraintColumn">
<cs:EndProperty Name="Column">
<cs:EndProperty Name="Constraint">
<cs:ScalarProperty Name="Id" ColumnName="constraint_id"/>
</cs:EndProperty>
<cs:EndProperty Name="Constraint">
<cs:EndProperty Name="Column">
<cs:ScalarProperty Name="Id" ColumnName="column_id"/>
</cs:EndProperty>
</cs:AssociationSetMapping>
Expand Down
143 changes: 135 additions & 8 deletions src/Npgsql/NpgsqlSchema.ssdl
Original file line number Diff line number Diff line change
Expand Up @@ -388,14 +388,65 @@
</DefiningQuery>
</EntitySet>

<AssociationSet Association="NpgsqlSchema.TableTableColumn" Name="TableTableColumns" />
<AssociationSet Association="NpgsqlSchema.TableTableConstraint" Name="TableTableConstraints"/>
<AssociationSet Association="NpgsqlSchema.TableConstraintColumn" Name="TableConstraintColumns"/>
<AssociationSet Association="NpgsqlSchema.RelationshipRelationshipColumnMap" Name="RelationshipRelationshipColumnMaps" />
<AssociationSet Association="NpgsqlSchema.FromColumnRelationshipColumnMap" Name="FromColumnRelationshipColumnMaps" />
<AssociationSet Association="NpgsqlSchema.ToColumnRelationshipColumnMap" Name="ToColumnRelationshipColumnMaps" />
<AssociationSet Association="NpgsqlSchema.ViewViewColumn" Name="ViewViewColumns" />
<AssociationSet Association="NpgsqlSchema.FunctionFunctionParameter" Name="FunctionFunctionParameters" />
<AssociationSet Association="NpgsqlSchema.TableTableColumn" Name="TableTableColumns">
<End Role="Table" EntitySet="PgTables" />
<End Role="TableColumn" EntitySet="PgTableColumns" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.TableTableConstraint" Name="TableTableConstraints">
<End Role="Table" EntitySet="PgTables" />
<End Role="Constraint" EntitySet="PgConstraints" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.TableConstraintColumn" Name="TableConstraintColumns">
<End Role="Constraint" EntitySet="PgConstraints" />
<End Role="ConstraintColumn" EntitySet="PgConstraintColumns" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.RelationshipRelationshipColumnMap" Name="RelationshipRelationshipColumnMaps">
<End Role="ForeignKey" EntitySet="PgConstraints" />
<End Role="ForeignKeyColumn" EntitySet="PgForeignKeyColumns" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.FromColumnRelationshipColumnMap" Name="FromColumnRelationshipColumnMaps">
<End Role="TableColumn" EntitySet="PgTableColumns" />
<End Role="ForeignKeyColumn" EntitySet="PgForeignKeyColumns" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.ToColumnRelationshipColumnMap" Name="ToColumnRelationshipColumnMaps">
<End Role="TableColumn" EntitySet="PgTableColumns" />
<End Role="ForeignKeyColumn" EntitySet="PgForeignKeyColumns" />
</AssociationSet>

<AssociationSet Association="NpgsqlSchema.ViewViewColumn" Name="ViewViewColumns">
<End Role="View" EntitySet="PgViews" />
<End Role="ViewColumn" EntitySet="PgViewColumns" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.ViewViewConstraint" Name="ViewViewConstraints">
<End Role="View" EntitySet="PgViews" />
<End Role="Constraint" EntitySet="PgViewConstraints" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.ViewConstraintConstraintColumn" Name="ViewConstraintConstraintColumns">
<End Role="Constraint" EntitySet="PgViewConstraints" />
<End Role="ConstraintColumn" EntitySet="PgViewConstraintColumns" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.ViewConstraintForeignKey" Name="ViewConstraintForeignKeys">
<End Role="Constraint" EntitySet="PgViewConstraints" />
<End Role="ForeignKeyColumn" EntitySet="PgViewForeignKeyColumns" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.FromForeignKeyViewColumn" Name="FromForeignKeyViewColumns">
<End Role="ViewColumn" EntitySet="PgViewColumns" />
<End Role="ForeignKeyColumn" EntitySet="PgViewForeignKeyColumns" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.ToForeignKeyViewColumn" Name="ToForeignKeyViewColumns">
<End Role="ViewColumn" EntitySet="PgViewColumns" />
<End Role="ForeignKeyColumn" EntitySet="PgViewForeignKeyColumns" />
</AssociationSet>

<AssociationSet Association="NpgsqlSchema.FunctionFunctionParameter" Name="FunctionFunctionParameters">
<End Role="Function" EntitySet="PgFunctions" />
<End Role="FunctionParameter" EntitySet="PgFunctionParameters" />
</AssociationSet>
<AssociationSet Association="NpgsqlSchema.ProcedureProcedureParameter" Name="ProcedureProcedureParameters">
<End Role="Procedure" EntitySet="PgProcedures" />
<End Role="ProcedureParameter" EntitySet="PgProcedureParameters" />
</AssociationSet>

</EntityContainer>
<EntityType Name="Table">
<Key>
Expand Down Expand Up @@ -625,6 +676,7 @@
<Property Name="column_id" Type="varchar" Nullable="false"/>
<Property Name="constraint_id" Type="varchar" Nullable="false"/>
</EntityType>

<Association Name="TableTableColumn">
<End Type="NpgsqlSchema.Table" Role="Table" Multiplicity="1"/>
<End Type="NpgsqlSchema.TableColumn" Role="TableColumn" Multiplicity="*"/>
Expand Down Expand Up @@ -697,6 +749,7 @@
</Dependent>
</ReferentialConstraint>
</Association>

<Association Name="ViewViewColumn">
<End Type="NpgsqlSchema.View" Role="View" Multiplicity="1"/>
<End Type="NpgsqlSchema.ViewColumn" Role="ViewColumn" Multiplicity="*"/>
Expand All @@ -709,6 +762,67 @@
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="ViewViewConstraint">
<End Type="NpgsqlSchema.View" Role="View" Multiplicity="1" />
<End Type="NpgsqlSchema.ViewConstraint" Role="Constraint" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="View">
<PropertyRef Name="id" />
</Principal>
<Dependent Role="Constraint">
<PropertyRef Name="view_id" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="ViewConstraintConstraintColumn">
<End Type="NpgsqlSchema.ViewConstraint" Role="Constraint" Multiplicity="1" />
<End Type="NpgsqlSchema.ViewConstraintColumn" Role="ConstraintColumn" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Constraint">
<PropertyRef Name="id" />
</Principal>
<Dependent Role="ConstraintColumn">
<PropertyRef Name="constraint_id" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="ViewConstraintForeignKey">
<End Type="NpgsqlSchema.ViewConstraint" Role="Constraint" Multiplicity="1" />
<End Type="NpgsqlSchema.ViewForeignKeyColumn" Role="ForeignKeyColumn" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Constraint">
<PropertyRef Name="id" />
</Principal>
<Dependent Role="ForeignKeyColumn">
<PropertyRef Name="constraint_id" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FromForeignKeyViewColumn">
<End Type="NpgsqlSchema.ViewColumn" Role="ViewColumn" Multiplicity="1" />
<End Type="NpgsqlSchema.ViewForeignKeyColumn" Role="ForeignKeyColumn" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="ViewColumn">
<PropertyRef Name="id" />
</Principal>
<Dependent Role="ForeignKeyColumn">
<PropertyRef Name="from_columnid" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="ToForeignKeyViewColumn">
<End Type="NpgsqlSchema.ViewColumn" Role="ViewColumn" Multiplicity="1" />
<End Type="NpgsqlSchema.ViewForeignKeyColumn" Role="ForeignKeyColumn" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="ViewColumn">
<PropertyRef Name="id" />
</Principal>
<Dependent Role="ForeignKeyColumn">
<PropertyRef Name="to_columnid" />
</Dependent>
</ReferentialConstraint>
</Association>

<Association Name="FunctionFunctionParameter">
<End Type="NpgsqlSchema.Function" Role="Function" Multiplicity="1"/>
<End Type="NpgsqlSchema.FunctionParameter" Role="FunctionParameter" Multiplicity="*"/>
Expand All @@ -721,4 +835,17 @@
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="ProcedureProcedureParameter">
<End Type="NpgsqlSchema.Procedure" Role="Procedure" Multiplicity="1" />
<End Type="NpgsqlSchema.ProcedureParameter" Role="ProcedureParameter" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Procedure">
<PropertyRef Name="id" />
</Principal>
<Dependent Role="ProcedureParameter">
<PropertyRef Name="procedure_id" />
</Dependent>
</ReferentialConstraint>
</Association>

</Schema>
6 changes: 5 additions & 1 deletion src/Npgsql/NpgsqlServices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ private void TranslateCommandTree(DbCommandTree commandTree, DbCommand command)
DbInsertCommandTree insert;
DbUpdateCommandTree update;
DbDeleteCommandTree delete;
DbFunctionCommandTree function;
if ((select = commandTree as DbQueryCommandTree) != null)
{
sqlGenerator = new SqlSelectGenerator(select);
Expand All @@ -72,8 +73,11 @@ private void TranslateCommandTree(DbCommandTree commandTree, DbCommand command)
{
sqlGenerator = new SqlDeleteGenerator(delete);
}
else
else if ((function = commandTree as DbFunctionCommandTree) != null)
{
sqlGenerator = new SqlFunctionGenerator(function);
}
else {
// TODO: get a message (unsupported DbCommandTree type)
throw new ArgumentException();
}
Expand Down
98 changes: 98 additions & 0 deletions src/Npgsql/SqlGenerators/SqlFunctionGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
#if ENTITIES
using System;
using System.Collections.Generic;
using System.Data.Common;
#if ENTITIES6
using System.Data.Entity.Core.Common.CommandTrees;
using NpgsqlTypes;
using System.Data.Entity.Core.Metadata.Edm;
#else
using System.Data.Common.CommandTrees;
using System.Data.Metadata.Edm;
#endif

namespace Npgsql.SqlGenerators {
internal class SqlFunctionGenerator : SqlBaseGenerator {
private DbFunctionCommandTree _commandTree;

public SqlFunctionGenerator(DbFunctionCommandTree commandTree) {
_commandTree = commandTree;
}

public override void BuildCommand(DbCommand command) {
System.Diagnostics.Debug.Assert(command is NpgsqlCommand);

var edmFunc = _commandTree.EdmFunction;
if (String.IsNullOrEmpty(edmFunc.CommandTextAttribute)) {
String text = "";
if (false) { }
#if ENTITIES6
else if (!String.IsNullOrEmpty(edmFunc.Schema)) text += QuoteIdentifier(edmFunc.Schema);
#endif
else if (!String.IsNullOrEmpty(edmFunc.NamespaceName)) text += QuoteIdentifier(edmFunc.NamespaceName);

if (!String.IsNullOrEmpty(text))
text += ".";

if (false) { }
#if ENTITIES6
else if (!String.IsNullOrEmpty(edmFunc.StoreFunctionNameAttribute)) text += QuoteIdentifier(edmFunc.StoreFunctionNameAttribute);
#endif
else if (!String.IsNullOrEmpty(edmFunc.Name)) text += QuoteIdentifier(edmFunc.Name);

command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = text;
}
else {
command.CommandType = System.Data.CommandType.Text;
command.CommandText = _commandTree.EdmFunction.CommandTextAttribute;
}

command.Parameters.Clear();

foreach (var kv in _commandTree.Parameters) {
FunctionParameter funcParm;
if (edmFunc != null && edmFunc.Parameters.TryGetValue(kv.Key, true, out funcParm)) {
//fp.Name; fp.TypeUsage; fp.Mode;
var pgParm = new NpgsqlParameter(funcParm.Name, DBNull.Value);
if (false) { }
else if (funcParm.Mode == ParameterMode.In) pgParm.Direction = System.Data.ParameterDirection.Input;
else if (funcParm.Mode == ParameterMode.Out) pgParm.Direction = System.Data.ParameterDirection.Output;
else if (funcParm.Mode == ParameterMode.InOut) pgParm.Direction = System.Data.ParameterDirection.InputOutput;
else if (funcParm.Mode == ParameterMode.ReturnValue) pgParm.Direction = System.Data.ParameterDirection.ReturnValue;
else { }

if (false) { }
else if (funcParm.TypeUsage.EdmType is PrimitiveType) {
var pt = (PrimitiveType)funcParm.TypeUsage.EdmType;
if (false) { }
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Binary) pgParm.DbType = System.Data.DbType.Binary;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Boolean) pgParm.DbType = System.Data.DbType.Boolean;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Byte) pgParm.DbType = System.Data.DbType.Byte;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.DateTime) pgParm.DbType = System.Data.DbType.DateTime;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.DateTimeOffset) pgParm.DbType = System.Data.DbType.DateTimeOffset;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Decimal) pgParm.DbType = System.Data.DbType.Decimal;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Double) pgParm.DbType = System.Data.DbType.Double;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Guid) pgParm.DbType = System.Data.DbType.Guid;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Int16) pgParm.DbType = System.Data.DbType.Int16;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Int32) pgParm.DbType = System.Data.DbType.Int32;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Int64) pgParm.DbType = System.Data.DbType.Int64;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.SByte) pgParm.DbType = System.Data.DbType.SByte;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Single) pgParm.DbType = System.Data.DbType.Single;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.String) pgParm.DbType = System.Data.DbType.String;
else if (pt.PrimitiveTypeKind == PrimitiveTypeKind.Time) pgParm.DbType = System.Data.DbType.Time;
else throw new NotSupportedException("Unknown PrimitiveTypeKind: " + pt.PrimitiveTypeKind);
}
else throw new NotSupportedException("EdmType has to be PrimitiveType");

command.Parameters.Add(pgParm);
}
}
}

public override VisitedExpression Visit(DbPropertyExpression expression) {
throw new NotImplementedException();
}
}
}
#endif