Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rule S2077: support for additional database libraries: NHibernate #6193

Merged
merged 12 commits into from
Oct 13, 2022
Merged
2 changes: 2 additions & 0 deletions analyzers/src/SonarAnalyzer.Common/Helpers/KnownType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ internal sealed partial class KnownType
internal static readonly KnownType NFluent_Check = new("NFluent.Check");
internal static readonly KnownType NFluent_FluentCheckException = new("NFluent.FluentCheckException");
internal static readonly KnownType NFluent_Kernel_FluentCheckException = new("NFluent.Kernel.FluentCheckException");
internal static readonly KnownType NHibernate_ISession = new("NHibernate.ISession");
internal static readonly KnownType NHibernate_Impl_AbstractSessionImpl = new("NHibernate.Impl.AbstractSessionImpl");
internal static readonly KnownType NLog_LogManager = new("NLog.LogManager");
internal static readonly KnownType NUnit_Framework_Assert = new("NUnit.Framework.Assert");
internal static readonly KnownType NUnit_Framework_AssertionException = new("NUnit.Framework.AssertionException");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,23 @@ public abstract class ExecutingSqlQueriesBase<TSyntaxKind, TExpressionSyntax, TI
new(KnownType.ServiceStack_OrmLite_OrmLiteReadApiAsync, "SqlListAsync"),
new(KnownType.ServiceStack_OrmLite_OrmLiteReadApiAsync, "SqlColumnAsync"),
new(KnownType.ServiceStack_OrmLite_OrmLiteReadApiAsync, "SqlScalarAsync"),
new(KnownType.ServiceStack_OrmLite_OrmLiteReadApiAsync, "ExecuteNonQueryAsync"),
new(KnownType.ServiceStack_OrmLite_OrmLiteReadApiAsync, "ExecuteNonQueryAsync")
};

private readonly MemberDescriptor[] invocationsForFirstArgument =
{
new(KnownType.System_Data_Sqlite_SqliteCommand, "Execute"),
new(KnownType.System_Data_Entity_DbSet, "SqlQuery"),
new(KnownType.System_Data_Entity_DbSet_TEntity, "SqlQuery")
new(KnownType.System_Data_Entity_DbSet_TEntity, "SqlQuery"),
new(KnownType.NHibernate_ISession, "CreateQuery"),
new(KnownType.NHibernate_ISession, "CreateSQLQuery"),
new(KnownType.NHibernate_ISession, "Delete"),
new(KnownType.NHibernate_ISession, "DeleteAsync"),
new(KnownType.NHibernate_ISession, "GetNamedQuery"),
new(KnownType.NHibernate_Impl_AbstractSessionImpl, "CreateQuery"),
new(KnownType.NHibernate_Impl_AbstractSessionImpl, "CreateSQLQuery"),
new(KnownType.NHibernate_Impl_AbstractSessionImpl, "GetNamedQuery"),
pavel-mikula-sonarsource marked this conversation as resolved.
Show resolved Hide resolved
new(KnownType.NHibernate_Impl_AbstractSessionImpl, "GetNamedSQLQuery")
};

private readonly MemberDescriptor[] invocationsForSecondArgument =
Expand All @@ -144,12 +153,14 @@ public abstract class ExecutingSqlQueriesBase<TSyntaxKind, TExpressionSyntax, TI
new(KnownType.MySql_Data_MySqlClient_MySqlHelper, "ExecuteScalar"),
new(KnownType.MySql_Data_MySqlClient_MySqlHelper, "ExecuteScalarAsync"),
new(KnownType.MySql_Data_MySqlClient_MySqlHelper, "UpdateDataSet"),
new(KnownType.MySql_Data_MySqlClient_MySqlHelper, "UpdateDataSetAsync")
new(KnownType.MySql_Data_MySqlClient_MySqlHelper, "UpdateDataSetAsync"),
new(KnownType.NHibernate_ISession, "CreateFilter"),
new(KnownType.NHibernate_ISession, "CreateFilterAsync")
};

private readonly MemberDescriptor[] properties =
{
new(KnownType.System_Data_IDbCommand, "CommandText"),
new(KnownType.System_Data_IDbCommand, "CommandText")
};

protected abstract TExpressionSyntax GetArgumentAtIndex(InvocationContext context, int index);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,5 +135,12 @@ public class ExecutingSqlQueriesTest
.AddReferences(MetadataReferenceFacade.SystemData)
.AddReferences(NuGetMetadataReference.ServiceStackOrmLite(Constants.NuGetLatestVersion))
.Verify();

[TestMethod]
public void ExecutingSqlQueries_NHibernate_CS() =>
builderCS
.AddPaths("ExecutingSqlQueries.NHibernate.cs")
.AddReferences(NuGetMetadataReference.NHibernate(Constants.NuGetLatestVersion))
.Verify();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using NHibernate;
using NHibernate.Impl;

class Program
{
public async Task ISessionMethods(ISession session, string query, string param)
{
session.CreateFilter(null, query); // Compliant
session.CreateFilter(null, query + param); // Noncompliant

await session.CreateFilterAsync(null, query); // Compliant
await session.CreateFilterAsync(null, query + param); // Noncompliant

session.CreateQuery(query); // Compliant
session.CreateQuery(query + param); // Noncompliant

session.CreateSQLQuery(query); // Compliant
session.CreateSQLQuery(query + param); // Noncompliant

session.Delete(query); // Compliant
session.Delete(query + param); // Noncompliant

await session.DeleteAsync(query); // Compliant
await session.DeleteAsync(query + param); // Noncompliant

session.GetNamedQuery(query); // Compliant
session.GetNamedQuery(query + param); // Noncompliant
}

public async Task SessionImplMethods(SessionImpl session, string query, string param)
{
session.CreateFilter(null, query); // Compliant
session.CreateFilter(null, query + param); // Noncompliant

await session.CreateFilterAsync(null, query); // Compliant
await session.CreateFilterAsync(null, query + param); // Noncompliant

session.CreateQuery(query); // Compliant
session.CreateQuery(query + param); // Noncompliant

session.CreateSQLQuery(query); // Compliant
session.CreateSQLQuery(query + param); // Noncompliant

session.Delete(query); // Compliant
session.Delete(query + param); // Noncompliant

await session.DeleteAsync(query); // Compliant
await session.DeleteAsync(query + param); // Noncompliant

session.GetNamedQuery(query); // Compliant
session.GetNamedQuery(query + param); // Noncompliant

session.GetNamedSQLQuery(query); // Compliant
session.GetNamedSQLQuery(query + param); // Noncompliant
}

public async Task AbstractSessionImplMethods(AbstractSessionImpl session, string query, string param)
{
session.CreateQuery(query); // Compliant
session.CreateQuery(query + param); // Noncompliant

session.CreateSQLQuery(query); // Compliant
session.CreateSQLQuery(query + param); // Noncompliant

session.GetNamedQuery(query); // Compliant
session.GetNamedQuery(query + param); // Noncompliant

session.GetNamedSQLQuery(query); // Compliant
session.GetNamedSQLQuery(query + param); // Noncompliant
}
}