diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..d6c7dc0f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,184 @@ + +[*.{appxmanifest,axml,blockshader,build,c,c++,c++m,cc,ccm,cginc,compute,config,cp,cpp,cppm,cshtml,csproj,cu,cuh,cxx,cxxm,dbml,discomap,dtd,fx,fxh,h,h++,hh,hlsl,hlsli,hlslinc,hp,hpp,htm,html,hxx,icc,inc,inl,ino,ipp,ixx,jsproj,lsproj,mpp,mq4,mq5,mqh,mxx,njsproj,nuspec,proj,props,razor,resw,resx,shaderFoundry,StyleCop,targets,tasks,tcc,tpp,urtshader,usf,ush,vbproj,xml,xsd}] +indent_style = tab +indent_size = tab +tab_width = 4 + +[*.{asax,ascx,aspx,axaml,cs,master,paml,skin,vb,xaml,xamlx,xoml}] +indent_style = space +indent_size = 4 +tab_width = 4 + +[*] + +# Microsoft .NET properties +csharp_new_line_before_members_in_object_initializers = false +csharp_preferred_modifier_order = public, private, protected, internal, file, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async, required:suggestion +csharp_style_prefer_utf8_string_literals = true:suggestion +csharp_style_var_elsewhere = true:suggestion +csharp_style_var_for_built_in_types = true:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion +dotnet_naming_rule.interfaces_rule.import_to_resharper = True +dotnet_naming_rule.interfaces_rule.resharper_description = Interfaces +dotnet_naming_rule.interfaces_rule.resharper_guid = a7a3339e-4e89-4319-9735-a9dc4cb74cc7 +dotnet_naming_rule.interfaces_rule.severity = warning +dotnet_naming_rule.interfaces_rule.style = i_upper_camel_case_style +dotnet_naming_rule.interfaces_rule.symbols = interfaces_symbols +dotnet_naming_rule.private_constants_rule.import_to_resharper = True +dotnet_naming_rule.private_constants_rule.resharper_description = Constant fields (private) +dotnet_naming_rule.private_constants_rule.resharper_guid = 236f7aa5-7b06-43ca-bf2a-9b31bfcff09a +dotnet_naming_rule.private_constants_rule.severity = warning +dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style +dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols +dotnet_naming_rule.private_instance_fields_rule.import_to_resharper = True +dotnet_naming_rule.private_instance_fields_rule.resharper_description = Instance fields (private) +dotnet_naming_rule.private_instance_fields_rule.resharper_guid = 4a98fdf6-7d98-4f5a-afeb-ea44ad98c70c +dotnet_naming_rule.private_instance_fields_rule.severity = warning +dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols +dotnet_naming_rule.private_static_fields_rule.import_to_resharper = True +dotnet_naming_rule.private_static_fields_rule.resharper_description = Static fields (private) +dotnet_naming_rule.private_static_fields_rule.resharper_exclusive_prefixes_suffixes = true +dotnet_naming_rule.private_static_fields_rule.resharper_guid = f9fce829-e6f4-4cb2-80f1-5497c44f51df +dotnet_naming_rule.private_static_fields_rule.severity = warning +dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.private_static_fields_rule.symbols = private_static_fields_symbols +dotnet_naming_rule.private_static_readonly_rule.import_to_resharper = True +dotnet_naming_rule.private_static_readonly_rule.resharper_description = Static readonly fields (private) +dotnet_naming_rule.private_static_readonly_rule.resharper_guid = 15b5b1f1-457c-4ca6-b278-5615aedc07d3 +dotnet_naming_rule.private_static_readonly_rule.severity = warning +dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style +dotnet_naming_rule.private_static_readonly_rule.symbols = private_static_readonly_symbols +dotnet_naming_style.i_upper_camel_case_style.capitalization = pascal_case +dotnet_naming_style.i_upper_camel_case_style.required_prefix = I +dotnet_naming_style.lower_camel_case_style.capitalization = camel_case +dotnet_naming_style.lower_camel_case_style.required_prefix = _ +dotnet_naming_style.upper_camel_case_style.capitalization = pascal_case +dotnet_naming_symbols.interfaces_symbols.applicable_accessibilities = * +dotnet_naming_symbols.interfaces_symbols.applicable_kinds = interface +dotnet_naming_symbols.interfaces_symbols.resharper_applicable_kinds = interface +dotnet_naming_symbols.interfaces_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field +dotnet_naming_symbols.private_constants_symbols.required_modifiers = const +dotnet_naming_symbols.private_constants_symbols.resharper_applicable_kinds = constant_field +dotnet_naming_symbols.private_constants_symbols.resharper_required_modifiers = any +dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.private_instance_fields_symbols.resharper_applicable_kinds = field,readonly_field +dotnet_naming_symbols.private_instance_fields_symbols.resharper_required_modifiers = instance +dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.private_static_fields_symbols.required_modifiers = static +dotnet_naming_symbols.private_static_fields_symbols.resharper_applicable_kinds = field +dotnet_naming_symbols.private_static_fields_symbols.resharper_required_modifiers = static +dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds = field +dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers = readonly,static +dotnet_naming_symbols.private_static_readonly_symbols.resharper_applicable_kinds = readonly_field +dotnet_naming_symbols.private_static_readonly_symbols.resharper_required_modifiers = static +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:warning +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:warning +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion +dotnet_style_qualification_for_event = false:suggestion +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion + +# ReSharper properties +resharper_method_or_operator_body = expression_body + +# ReSharper inspection severities +resharper_annotate_can_be_null_parameter_highlighting = warning +resharper_annotate_can_be_null_type_member_highlighting = warning +resharper_annotate_not_null_parameter_highlighting = warning +resharper_annotate_not_null_type_member_highlighting = warning +resharper_arguments_style_anonymous_function_highlighting = warning +resharper_arguments_style_literal_highlighting = warning +resharper_arguments_style_named_expression_highlighting = warning +resharper_arguments_style_other_highlighting = warning +resharper_arguments_style_string_literal_highlighting = warning +resharper_arrange_attributes_highlighting = warning +resharper_arrange_constructor_or_destructor_body_highlighting = warning +resharper_arrange_local_function_body_highlighting = warning +resharper_arrange_method_or_operator_body_highlighting = warning +resharper_arrange_redundant_parentheses_highlighting = hint +resharper_arrange_this_qualifier_highlighting = hint +resharper_arrange_type_member_modifiers_highlighting = hint +resharper_arrange_type_modifiers_highlighting = hint +resharper_async_void_method_highlighting = warning +resharper_bad_attribute_brackets_spaces_highlighting = hint +resharper_bad_braces_spaces_highlighting = hint +resharper_bad_child_statement_indent_highlighting = hint +resharper_bad_colon_spaces_highlighting = hint +resharper_bad_comma_spaces_highlighting = hint +resharper_bad_control_braces_indent_highlighting = hint +resharper_bad_control_braces_line_breaks_highlighting = hint +resharper_bad_declaration_braces_indent_highlighting = hint +resharper_bad_declaration_braces_line_breaks_highlighting = hint +resharper_bad_empty_braces_line_breaks_highlighting = hint +resharper_bad_expression_braces_indent_highlighting = hint +resharper_bad_expression_braces_line_breaks_highlighting = hint +resharper_bad_generic_brackets_spaces_highlighting = hint +resharper_bad_indent_highlighting = hint +resharper_bad_linq_line_breaks_highlighting = hint +resharper_bad_list_line_breaks_highlighting = hint +resharper_bad_member_access_spaces_highlighting = hint +resharper_bad_namespace_braces_indent_highlighting = hint +resharper_bad_parens_line_breaks_highlighting = hint +resharper_bad_parens_spaces_highlighting = hint +resharper_bad_preprocessor_indent_highlighting = hint +resharper_bad_semicolon_spaces_highlighting = hint +resharper_bad_spaces_after_keyword_highlighting = hint +resharper_bad_square_brackets_spaces_highlighting = hint +resharper_bad_switch_braces_indent_highlighting = hint +resharper_bad_symbol_spaces_highlighting = hint +resharper_built_in_type_reference_style_for_member_access_highlighting = hint +resharper_built_in_type_reference_style_highlighting = hint +resharper_class_can_be_sealed_global_highlighting = warning +resharper_class_can_be_sealed_local_highlighting = warning +resharper_compare_non_constrained_generic_with_null_highlighting = warning +resharper_function_complexity_overflow_highlighting = warning +resharper_incorrect_blank_lines_near_braces_highlighting = hint +resharper_lambda_expression_can_be_made_static_highlighting = warning +resharper_localizable_element_highlighting = none +resharper_local_function_can_be_made_static_highlighting = warning +resharper_loop_can_be_partly_converted_to_query_highlighting = warning +resharper_missing_blank_lines_highlighting = hint +resharper_missing_indent_highlighting = hint +resharper_missing_linebreak_highlighting = hint +resharper_missing_space_highlighting = hint +resharper_multiple_spaces_highlighting = hint +resharper_multiple_statements_on_one_line_highlighting = hint +resharper_multiple_type_members_on_one_line_highlighting = hint +resharper_nullable_warning_suppression_is_used_highlighting = warning +resharper_n_unit_attribute_produces_too_many_tests_highlighting = warning +resharper_outdent_is_off_prev_level_highlighting = hint +resharper_redundant_base_qualifier_highlighting = warning +resharper_redundant_blank_lines_highlighting = hint +resharper_redundant_enum_case_label_for_default_section_highlighting = warning +resharper_redundant_linebreak_highlighting = hint +resharper_redundant_space_highlighting = hint +resharper_remove_constructor_invocation_highlighting = warning +resharper_separate_control_transfer_statement_highlighting = warning +resharper_string_ends_with_is_culture_specific_highlighting = warning +resharper_string_starts_with_is_culture_specific_highlighting = warning +resharper_struct_member_can_be_made_read_only_highlighting = warning +resharper_suggest_var_or_type_built_in_types_highlighting = hint +resharper_suggest_var_or_type_elsewhere_highlighting = hint +resharper_suggest_var_or_type_simple_types_highlighting = hint +resharper_switch_expression_handles_some_known_enum_values_with_exception_in_default_highlighting = none +resharper_tabs_and_spaces_mismatch_highlighting = hint +resharper_tabs_are_disallowed_highlighting = warning +resharper_tabs_outside_indent_highlighting = hint +resharper_unknown_property_highlighting = warning +resharper_unnecessary_whitespace_highlighting = warning +resharper_use_configure_await_false_for_async_disposable_highlighting = warning +resharper_use_nameof_expression_for_part_of_the_string_highlighting = warning +resharper_use_positional_deconstruction_pattern_highlighting = warning +resharper_use_throw_if_null_method_highlighting = warning +resharper_wrong_indent_size_highlighting = hint +resharper_wrong_metadata_use_highlighting = warning diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 44408851..c5a6f938 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -13,3 +13,7 @@ updates: target-branch: main reviewers: - jas88 +- package-ecosystem: "dotnet-sdk" + directory: "/" + schedule: + interval: weekly diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 535b6234..71dc68ef 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -23,6 +23,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + - name: Setup .NET Core + uses: actions/setup-dotnet@v4 - name: Initialize CodeQL uses: github/codeql-action/init@v3 diff --git a/.github/workflows/dotnet-core.yml b/.github/workflows/dotnet-core.yml index d56e01b9..2828098d 100644 --- a/.github/workflows/dotnet-core.yml +++ b/.github/workflows/dotnet-core.yml @@ -11,7 +11,7 @@ env: jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 services: oracle: image: konnecteam/docker-oracle-12c:sequelize @@ -37,12 +37,10 @@ jobs: - uses: actions/checkout@v4 - name: Setup .NET Core uses: actions/setup-dotnet@v4 - with: - dotnet-version: 8.0.x - name: Install Sql Server run: | wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - - sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list)" + sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list)" sudo apt-get install -y --no-install-recommends postgresql mssql-tools mssql-server sudo -E /opt/mssql/bin/mssql-conf -n setup accept-eula - name: MySQL diff --git a/Directory.Build.props b/Directory.Build.props index f2ad2f8c..07bbaf46 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,7 @@ - - preview + + net9.0 + preview enable \ No newline at end of file diff --git a/FAnsiSql/FAnsi.csproj b/FAnsiSql/FAnsi.csproj index 7c711bf0..ff98b448 100644 --- a/FAnsiSql/FAnsi.csproj +++ b/FAnsiSql/FAnsi.csproj @@ -11,12 +11,11 @@ false FAnsiSql is a database management/ETL library that allows you to perform common SQL operations without having to know which Database Management System (DBMS) you are targetting (e.g. Sql Server, My Sql, Oracle). Ansi,SQL - net8.0 HIC.FAnsiSql Health Informatics Centre, University of Dundee HIC.FAnsiSql FAnsiSql is a database management/ETL library that allows you to perform common SQL operations without having to know which Database Management System (DBMS) you are targetting (e.g. Sql Server, My Sql, Oracle). - Copyright © 2019-2024 + Copyright © 2019-2025 false true true diff --git a/FAnsiSql/Implementations/MicrosoftSQL/MicrosoftSQLBulkCopy.cs b/FAnsiSql/Implementations/MicrosoftSQL/MicrosoftSQLBulkCopy.cs index d41ec3a5..a6f29c19 100644 --- a/FAnsiSql/Implementations/MicrosoftSQL/MicrosoftSQLBulkCopy.cs +++ b/FAnsiSql/Implementations/MicrosoftSQL/MicrosoftSQLBulkCopy.cs @@ -110,7 +110,7 @@ private Exception AttemptLineByLineInsert(Exception e, SqlBulkCopy insert, DataT using var con = (SqlConnection)serverForLineByLineInvestigation.GetConnection(); con.Open(); var investigationTransaction = con.BeginTransaction("Investigate BulkCopyFailure"); - using (var investigationOneLineAtATime = new SqlBulkCopy(con,SqlBulkCopyOptions.KeepIdentity,investigationTransaction)) + using (var investigationOneLineAtATime = new SqlBulkCopy(con, SqlBulkCopyOptions.KeepIdentity, investigationTransaction)) { investigationOneLineAtATime.DestinationTableName = insert.DestinationTableName; @@ -136,7 +136,7 @@ private Exception AttemptLineByLineInsert(Exception e, SqlBulkCopy insert, DataT line, result), e); var sourceValue = dr[badMapping.SourceColumn]; - var destColumn = TargetTableColumns.SingleOrDefault(c =>c.GetRuntimeName().Equals(badMapping.DestinationColumn)); + var destColumn = TargetTableColumns.SingleOrDefault(c => c.GetRuntimeName().Equals(badMapping.DestinationColumn)); if (destColumn != null) return new FileLoadException( @@ -146,7 +146,7 @@ private Exception AttemptLineByLineInsert(Exception e, SqlBulkCopy insert, DataT } return new FileLoadException( - string.Format(SR.MicrosoftSQLBulkCopy_AttemptLineByLineInsert_Second_Pass_Exception__Failed_to_load_data_row__0__the_following_values_were_rejected_by_the_database___1__2__3_, line, Environment.NewLine, string.Join(Environment.NewLine,dr.ItemArray), firstPass), + string.Format(SR.MicrosoftSQLBulkCopy_AttemptLineByLineInsert_Second_Pass_Exception__Failed_to_load_data_row__0__the_following_values_were_rejected_by_the_database___1__2__3_, line, Environment.NewLine, string.Join(Environment.NewLine, dr.ItemArray), firstPass), exception); } @@ -155,7 +155,7 @@ private Exception AttemptLineByLineInsert(Exception e, SqlBulkCopy insert, DataT con.Close(); } - return new Exception(SR.MicrosoftSQLBulkCopy_AttemptLineByLineInsert_Second_Pass_Exception__Bulk_insert_failed_but_when_we_tried_to_repeat_it_a_line_at_a_time_it_worked + firstPass , e); + return new Exception(SR.MicrosoftSQLBulkCopy_AttemptLineByLineInsert_Second_Pass_Exception__Bulk_insert_failed_but_when_we_tried_to_repeat_it_a_line_at_a_time_it_worked + firstPass, e); } /// @@ -193,7 +193,7 @@ private static bool BcpColIdToString(SqlBulkCopy insert, SqlException? ex, out s var length = metadata.GetType().GetField("length", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(metadata); badMapping = insert.ColumnMappings.Cast() - .SingleOrDefault(m => string.Equals(m.DestinationColumn , destinationColumn, StringComparison.CurrentCultureIgnoreCase)); + .SingleOrDefault(m => string.Equals(m.DestinationColumn, destinationColumn, StringComparison.CurrentCultureIgnoreCase)); newMessage = ex.Message.Insert(match.Index + match.Length, $"(Source Column <<{badMapping?.SourceColumn??"unknown"}>> Dest Column <<{destinationColumn}>> which has MaxLength of {length})"); @@ -212,11 +212,11 @@ private static bool BcpColIdToString(SqlBulkCopy insert, SqlException? ex, out s private static void EmptyStringsToNulls(DataTable dt) { foreach (var col in dt.Columns.Cast().Where(static c => c.DataType == typeof(string))) - foreach (var row in dt.Rows.Cast() - .Select(row => new { row, o = row[col] }) - .Where(static t => t.o != DBNull.Value && t.o != null && string.IsNullOrWhiteSpace(t.o.ToString())) - .Select(static t => t.row)) - row[col] = DBNull.Value; + foreach (var row in dt.Rows.Cast() + .Select(row => new { row, o = row[col] }) + .Where(static t => t.o != DBNull.Value && t.o != null && string.IsNullOrWhiteSpace(t.o.ToString())) + .Select(static t => t.row)) + row[col] = DBNull.Value; } [Pure] @@ -246,16 +246,16 @@ private static string ExceptionToListOfInnerMessages(Exception e, bool includeSt private static void InspectDataTableForFloats(DataTable dt) { //are there any float or float? columns - var floatColumnNames = dt.Columns.Cast().Where(static c => c.DataType == typeof(float) || c.DataType == typeof(float?)).Select(static c=>c.ColumnName).ToArray(); + var floatColumnNames = dt.Columns.Cast().Where(static c => c.DataType == typeof(float) || c.DataType == typeof(float?)).Select(static c => c.ColumnName).ToArray(); if (floatColumnNames.Length!=0) throw new NotSupportedException( $"Found float column(s) in data table, SQLServer does not support floats in bulk insert, instead you should use doubles otherwise you will end up with the value 0.85 turning into :0.850000023841858 in your database. Float column(s) were:{string.Join(",", floatColumnNames)}"); //are there any object columns - var objectColumns = dt.Columns.Cast().Where(static c => c.DataType == typeof(object)).Select(static col=>col.Ordinal).ToArray(); + var objectColumns = dt.Columns.Cast().Where(static c => c.DataType == typeof(object)).Select(static col => col.Ordinal).ToArray(); //do any of the object columns have floats or float? in them? - for (var i = 0; i < Math.Min(100, dt.Rows.Count); i++) + for (var i = 0;i < Math.Min(100, dt.Rows.Count);i++) { var bad = objectColumns.Select(c => dt.Rows[i][c]) .FirstOrDefault(static t => t is float); diff --git a/Tests/FAnsiTests/FAnsiTests.csproj b/Tests/FAnsiTests/FAnsiTests.csproj index 3a9f2abb..51670023 100644 --- a/Tests/FAnsiTests/FAnsiTests.csproj +++ b/Tests/FAnsiTests/FAnsiTests.csproj @@ -1,6 +1,5 @@ - net8.0 FAnsiSqlTests FAnsiSqlTests Copyright © 2019 diff --git a/Tests/FAnsiTests/Table/CreatePrimaryKeyTest.cs b/Tests/FAnsiTests/Table/CreatePrimaryKeyTest.cs index 41aa4559..20a24ad1 100644 --- a/Tests/FAnsiTests/Table/CreatePrimaryKeyTest.cs +++ b/Tests/FAnsiTests/Table/CreatePrimaryKeyTest.cs @@ -92,7 +92,7 @@ public void TestBasicCase_FailHalfWay_SchemaUnchanged(DatabaseType databaseType) Assert.Multiple(() => { Assert.That(ex?.Message.Contains("Failed to create primary key on table") ?? false); - Assert.That(ex?.InnerException, Is.Not.InstanceOf(typeof(AggregateException))); + Assert.That(ex?.InnerException, Is.Not.InstanceOf()); Assert.That(ex?.InnerException, Is.InstanceOf()); }); diff --git a/Tests/FAnsiTests/TypeTranslation/TypeTranslaterTests.cs b/Tests/FAnsiTests/TypeTranslation/TypeTranslaterTests.cs index 4bed1cbc..c17814ab 100644 --- a/Tests/FAnsiTests/TypeTranslation/TypeTranslaterTests.cs +++ b/Tests/FAnsiTests/TypeTranslation/TypeTranslaterTests.cs @@ -22,16 +22,16 @@ namespace FAnsiTests.TypeTranslation; /// public sealed class TypeTranslaterTests : DatabaseTests { - private readonly Dictionary _translaters = []; + private readonly Dictionary _translaters = []; [OneTimeSetUp] public void SetupDatabases() { - foreach (DatabaseType type in Enum.GetValues(typeof(DatabaseType))) + foreach (var type in Enum.GetValues()) try { var tt = ImplementationManager.GetImplementation(type).GetQuerySyntaxHelper().TypeTranslater; - _translaters.Add(type,tt); + _translaters.Add(type, tt); } catch (ImplementationNotFoundException) { diff --git a/global.json b/global.json new file mode 100644 index 00000000..45f790ca --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "9.0.101", + "rollForward": "minor" + } +}