Skip to content

Commit a56fef8

Browse files
author
Tien Nguyen
committed
wip: trying to get text typed and image type column play nice with large data size
1 parent 50ab2b5 commit a56fef8

20 files changed

+778
-77
lines changed

AdoNetCore.AseClient.sln

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio 15
4-
VisualStudioVersion = 15.0.27130.2010
3+
# Visual Studio Version 16
4+
VisualStudioVersion = 16.0.30320.27
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdoNetCore.AseClient", "src\AdoNetCore.AseClient\AdoNetCore.AseClient.csproj", "{A994B1E4-2B7F-40B8-B045-57E4F324FF67}"
77
EndProject

src/AdoNetCore.AseClient/AdoNetCore.AseClient.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,10 @@
33
<PropertyGroup>
44
<Description>.NET Core data provider for Sybase ASE</Description>
55
</PropertyGroup>
6+
<PropertyGroup>
7+
<LangVersion>7</LangVersion>
8+
</PropertyGroup>
9+
<ItemGroup>
10+
<Compile Remove="Internal\UserTypeMetadata.cs" />
11+
</ItemGroup>
612
</Project>

src/AdoNetCore.AseClient/AdoNetCore.AseClient.csproj.DotSettings

Lines changed: 0 additions & 2 deletions
This file was deleted.

src/AdoNetCore.AseClient/AseCommand.cs

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Data;
34
using System.Data.Common;
45
using System.IO;
@@ -27,6 +28,7 @@ public sealed class AseCommand : DbCommand
2728
private string _commandText;
2829
private UpdateRowSource _updatedRowSource;
2930
private bool? _namedParameters;
31+
internal readonly IDictionary<string, FormatItem> FormatItems;
3032

3133
/// <summary>
3234
/// Constructor function for an <see cref="AseCommand"/> instance.
@@ -35,17 +37,16 @@ public sealed class AseCommand : DbCommand
3537
public AseCommand()
3638
{
3739
AseParameters = new AseParameterCollection();
40+
FormatItems = new Dictionary<string, FormatItem>();
3841
}
3942

4043
/// <summary>
4144
/// Constructor function for an <see cref="AseCommand"/> instance.
4245
/// Note: the instance will not be initialised with an AseConnection; before use this must be supplied.
4346
/// </summary>
4447
/// <param name="commandText">The command text to execute</param>
45-
public AseCommand(string commandText)
48+
public AseCommand(string commandText) : this()
4649
{
47-
AseParameters = new AseParameterCollection();
48-
4950
CommandText = commandText;
5051
}
5152

@@ -54,14 +55,10 @@ public AseCommand(string commandText)
5455
/// </summary>
5556
/// <param name="commandText">The command text to execute</param>
5657
/// <param name="connection">The connection upon which to execute</param>
57-
public AseCommand(string commandText, AseConnection connection)
58+
public AseCommand(string commandText, AseConnection connection) : this(commandText)
5859
{
5960
_connection = connection;
6061
_transaction = connection.Transaction;
61-
62-
AseParameters = new AseParameterCollection();
63-
64-
CommandText = commandText;
6562
}
6663

6764
/// <summary>
@@ -70,23 +67,13 @@ public AseCommand(string commandText, AseConnection connection)
7067
/// <param name="commandText">The command text to execute</param>
7168
/// <param name="connection">The connection upon which to execute</param>
7269
/// <param name="transaction">The transaction within which to execute</param>
73-
public AseCommand(string commandText, AseConnection connection, AseTransaction transaction)
70+
public AseCommand(string commandText, AseConnection connection, AseTransaction transaction) : this (commandText, connection)
7471
{
75-
_connection = connection;
7672
_transaction = transaction;
77-
78-
AseParameters = new AseParameterCollection();
79-
80-
CommandText = commandText;
8173
}
8274

83-
internal AseCommand(AseConnection connection)
84-
{
85-
_connection = connection;
86-
_transaction = connection.Transaction;
87-
88-
AseParameters = new AseParameterCollection();
89-
}
75+
internal AseCommand(AseConnection connection) : this (string.Empty, connection, connection.Transaction)
76+
{ }
9077

9178
/// <summary>
9279
/// Tries to cancel the execution of a <see cref="AseCommand" />.
@@ -126,11 +113,34 @@ public override void Cancel()
126113
return new AseParameter();
127114
}
128115

116+
public AseParameter CreateParameter(string name, object value, DbType dbType, int? overrideUserType)
117+
{
118+
if (_isDisposed)
119+
{
120+
throw new ObjectDisposedException(nameof(AseCommand));
121+
}
122+
return new AseParameter(name, value, dbType, overrideUserType);
123+
}
124+
129125
protected override DbParameter CreateDbParameter()
130126
{
131127
return CreateParameter();
132128
}
133129

130+
//command.SetParameter("@psComment", comment, DbType.String, 36);
131+
/// <summary>
132+
///
133+
/// </summary>
134+
/// <param name="parameterName"></param>
135+
/// <param name="parameterValue"></param>
136+
/// <param name="dbType"></param>
137+
/// <param name="overrideUserType"></param>
138+
/// <returns></returns>
139+
public AseParameter CreateParameter(string parameterName, string parameterValue, DbType dbType, int? overrideUserType)
140+
{
141+
return new AseParameter(parameterName, parameterValue, dbType, overrideUserType);
142+
}
143+
134144
/// <summary>
135145
/// Executes a Transact-SQL statement against the connection and returns the number of rows affected.
136146
/// </summary>

src/AdoNetCore.AseClient/AseCommandBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#if ENABLE_SYSTEM_DATA_COMMON_EXTENSIONS
1+
#if ENABLE_SYSTEM_DATA_COMMON_EXTENSIONS
22
using System;
33
using System.Collections.Generic;
44
using System.Data;
@@ -484,4 +484,4 @@ private void RowUpdating(object sender, AseRowUpdatingEventArgs args)
484484
}
485485
}
486486
}
487-
#endif
487+
#endif

src/AdoNetCore.AseClient/AseErrorCollection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ private static int GetIndexOfMostSevereError(AseError[] errors)
6464
var result = 0;
6565
for (var i = 1; i < errors.Length; i++)
6666
{
67-
// The '=' in '<=' means that for equal severity, we take the last error in the list.
68-
if (errors[result].Severity <= errors[i].Severity)
67+
// We will respect the order if they're the same and already sorted and only care for the different ones
68+
if (errors[result].Severity < errors[i].Severity)
6969
{
7070
result = i;
7171
}

src/AdoNetCore.AseClient/AseParameter.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,12 @@ public AseParameter(int parameterIndex, AseDbType dbType, int size, ParameterDir
277277
Value = value;
278278
}
279279

280+
public AseParameter(string parameterName, object value, DbType dbType, int? overrideUserType) : this(parameterName, value)
281+
{
282+
DbType = dbType;
283+
OverrideUserType = overrideUserType;
284+
}
285+
280286
public override void ResetDbType()
281287
{
282288
DbType = default(DbType);
@@ -470,5 +476,6 @@ public object Clone()
470476
}
471477
#endif
472478
internal object SendableValue => Value.AsSendableValue(_type);
479+
internal int? OverrideUserType { get; set; }
473480
}
474481
}

src/AdoNetCore.AseClient/Internal/FormatItem.cs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,20 +63,25 @@ public string ParameterName
6363
/// </summary>
6464
public SerializationType SerializationType { get; set; }
6565

66-
public static FormatItem CreateForParameter(AseParameter parameter, DbEnvironment env)
66+
public static FormatItem CreateForParameter(AseParameter parameter, DbEnvironment env, CommandType commandType = CommandType.StoredProcedure)
6767
{
6868
parameter.AseDbType = TypeMap.InferType(parameter);
6969

7070
var dbType = parameter.DbType;
71+
7172
var length = TypeMap.GetFormatLength(dbType, parameter, env.Encoding);
73+
Logger.Instance?.WriteLine($"TypeMap.GetFormatLength => {length}");
74+
7275
var format = new FormatItem
7376
{
7477
ParameterName = parameter.ParameterName,
7578
IsOutput = parameter.IsOutput,
7679
IsNullable = parameter.IsNullable,
7780
Length = length,
7881
DataType = TypeMap.GetTdsDataType(dbType, parameter.SendableValue, length, parameter.ParameterName),
79-
UserType = TypeMap.GetTdsUserType(dbType)
82+
//UserType = parameter.OverrideUserType ?? TypeMap.GetTdsUserType(dbType) // TypeMap.GetUserType(dbType, parameter.SendableValue, length)
83+
UserType = parameter.OverrideUserType ?? TypeMap.GetUserType(dbType, parameter.SendableValue, length)
84+
//UserType = TypeMap.GetUserType(dbType, parameter.SendableValue, length)
8085
};
8186

8287
//fixup the FormatItem's BlobType for strings and byte arrays
@@ -89,6 +94,8 @@ public static FormatItem CreateForParameter(AseParameter parameter, DbEnvironmen
8994
break;
9095
case DbType.String:
9196
format.BlobType = BlobType.BLOB_UNICHAR;
97+
if (commandType != CommandType.StoredProcedure)
98+
format.UserType = 0;
9299
break;
93100
case DbType.Binary:
94101
format.BlobType = BlobType.BLOB_LONGBINARY;
@@ -489,15 +496,5 @@ public string GetDataTypeName()
489496
return string.Empty;
490497
}
491498
}
492-
493-
public bool IsKey() => (RowStatus & RowFormatItemStatus.TDS_ROW_KEY) == RowFormatItemStatus.TDS_ROW_KEY;
494-
495-
public bool IsIdentity() => (RowStatus & RowFormatItemStatus.TDS_ROW_IDENTITY) == RowFormatItemStatus.TDS_ROW_IDENTITY;
496-
497-
public bool IsUnique()
498-
{
499-
return (DataType == TdsDataType.TDS_VARBINARY || DataType == TdsDataType.TDS_BINARY) && UserType == 80 || IsIdentity();
500-
}
501-
502499
}
503500
}

src/AdoNetCore.AseClient/Internal/InternalConnection.cs

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -297,13 +297,11 @@ public void ChangeDatabase(string databaseName)
297297
HasParameters = false,
298298
CommandText = $"USE {databaseName}"
299299
}));
300-
300+
301301
var messageHandler = new MessageTokenHandler(EventNotifier);
302302
var envChangeTokenHandler = new EnvChangeTokenHandler(_environment, _parameters.Charset);
303303

304-
ReceiveTokens(
305-
envChangeTokenHandler,
306-
messageHandler);
304+
ReceiveTokens(envChangeTokenHandler, messageHandler);
307305

308306
AssertExecutionCompletion();
309307

@@ -437,7 +435,7 @@ private void InternalExecuteNonQueryAsync(AseCommand command, AseTransaction tra
437435
}
438436
catch (Exception ex)
439437
{
440-
rowsAffectedSource.TrySetException(ex);
438+
if (!rowsAffectedSource.TrySetException(ex)) throw;
441439
}
442440
}
443441

@@ -611,11 +609,16 @@ private IEnumerable<IToken> BuildCommandTokens(AseCommand command, CommandBehavi
611609
yield return command.CommandType == CommandType.StoredProcedure
612610
? BuildRpcToken(command, behavior)
613611
: BuildLanguageToken(command, behavior);
614-
615-
foreach (var token in BuildParameterTokens(command.AseParameters))
612+
//BuildParameterTokens
613+
//foreach (var token in BuildParameterTokens(command.AseParameters, command.CommandType == CommandType.StoredProcedure))
614+
//{
615+
// yield return token;
616+
//}
617+
foreach (var token in BuildParameterTokens(command))
616618
{
617619
yield return token;
618620
}
621+
619622
}
620623

621624
private IToken BuildLanguageToken(AseCommand command, CommandBehavior behavior)
@@ -663,14 +666,20 @@ private string MakeCommand(string commandText, CommandBehavior behavior, bool na
663666
return result;
664667
}
665668

666-
private IToken[] BuildParameterTokens(AseParameterCollection parameters)
669+
private IToken[] BuildParameterTokens(AseCommand command)
667670
{
668671
var formatItems = new List<FormatItem>();
669672
var parameterItems = new List<ParametersToken.Parameter>();
670673

671-
foreach (var parameter in parameters.SendableParameters)
674+
foreach (var parameter in command.Parameters.SendableParameters)
672675
{
673-
var formatItem = FormatItem.CreateForParameter(parameter, _environment);
676+
var parameterName = parameter.ParameterName ?? command.Parameters.IndexOf(parameter).ToString();
677+
if (!command.FormatItems.TryGetValue(parameterName, out FormatItem formatItem))
678+
{
679+
formatItem = FormatItem.CreateForParameter(parameter, _environment, command.CommandType);
680+
command.FormatItems.Add(parameterName, formatItem);
681+
}
682+
674683
formatItems.Add(formatItem);
675684
parameterItems.Add(new ParametersToken.Parameter
676685
{
@@ -697,6 +706,45 @@ private IToken[] BuildParameterTokens(AseParameterCollection parameters)
697706
};
698707
}
699708

709+
//private IToken[] BuildParameterTokens(AseParameterCollection parameters, bool includeUserType = true)
710+
//{
711+
// var formatItems = new List<FormatItem>();
712+
// var parameterItems = new List<ParametersToken.Parameter>();
713+
714+
// foreach (var parameter in parameters.SendableParameters)
715+
// {
716+
717+
// var formatItem = FormatItem.CreateForParameter(parameter, _environment);
718+
719+
// //if (!includeUserType)
720+
// // formatItem.UserType = 0;
721+
722+
// formatItems.Add(formatItem);
723+
// parameterItems.Add(new ParametersToken.Parameter
724+
// {
725+
// Format = formatItem,
726+
// Value = parameter.SendableValue
727+
// });
728+
// }
729+
730+
// if (formatItems.Count == 0)
731+
// {
732+
// return new IToken[0];
733+
// }
734+
735+
// return new IToken[]
736+
// {
737+
// new ParameterFormat2Token
738+
// {
739+
// Formats = formatItems.ToArray()
740+
// },
741+
// new ParametersToken
742+
// {
743+
// Parameters = parameterItems.ToArray()
744+
// }
745+
// };
746+
//}
747+
700748
public void Dispose()
701749
{
702750
if (IsDisposed)

0 commit comments

Comments
 (0)