Skip to content

Commit

Permalink
Revert "Improve SqliteDataRecord class Efficiency"
Browse files Browse the repository at this point in the history
This reverts commit 84611fb.
  • Loading branch information
smitpatel committed Feb 27, 2020
1 parent b416e9d commit 2fdcc8d
Showing 1 changed file with 47 additions and 64 deletions.
111 changes: 47 additions & 64 deletions src/Microsoft.Data.Sqlite.Core/SqliteDataRecord.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.Data.Sqlite.Properties;
using SQLitePCL;
using static SQLitePCL.raw;
Expand All @@ -18,7 +17,6 @@ internal class SqliteDataRecord : SqliteValueReader, IDisposable
private readonly byte[][] _blobCache;
private readonly int?[] _typeCache;
private bool _stepped;
private int? _rowOrdinalCache;

public SqliteDataRecord(sqlite3_stmt stmt, bool hasRows, SqliteConnection connection)
{
Expand All @@ -27,7 +25,6 @@ public SqliteDataRecord(sqlite3_stmt stmt, bool hasRows, SqliteConnection connec
_connection = connection;
_blobCache = new byte[FieldCount][];
_typeCache = new int?[FieldCount];
_rowOrdinalCache = null;
}

public virtual object this[string name]
Expand Down Expand Up @@ -199,31 +196,25 @@ public static Type GetFieldType(string type)

public virtual long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length)
{
var blob = GetStream(ordinal);
var blob = GetCachedBlob(ordinal);

long bytesToRead = blob.Length - dataOffset;
if (buffer != null)
{
bytesToRead = Math.Min(bytesToRead, length);
using (var binaryReader = new BinaryReader(blob))
{
Array.Copy(binaryReader.ReadBytes((int)blob.Length), dataOffset, buffer, bufferOffset, bytesToRead);
}
Array.Copy(blob, dataOffset, buffer, bufferOffset, bytesToRead);
}

return bytesToRead;
}

public virtual long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length)
{
var textStream = GetStream(ordinal);
long charsToRead = textStream.Length - dataOffset;

using (var streamReader = new StreamReader(textStream, Encoding.UTF8))
{
Array.Copy(streamReader.ReadToEnd().ToCharArray(), dataOffset, buffer, bufferOffset, Math.Min(charsToRead, length));
}
var text = GetString(ordinal);

int charsToRead = text.Length - (int)dataOffset;
charsToRead = Math.Min(charsToRead, length);
text.CopyTo((int)dataOffset, buffer, bufferOffset, charsToRead);
return charsToRead;
}

Expand All @@ -238,57 +229,49 @@ public virtual Stream GetStream(int ordinal)
var blobDatabaseName = sqlite3_column_database_name(Handle, ordinal).utf8_to_string();
var blobTableName = sqlite3_column_table_name(Handle, ordinal).utf8_to_string();

int rowidOrdinal = -1;

if (_rowOrdinalCache.HasValue)
{
rowidOrdinal = _rowOrdinalCache.Value;
}
else
var rowidOrdinal = -1;
for (var i = 0; i < FieldCount; i++)
{
for (var i = 0; i < FieldCount; i++)
if (i == ordinal)
{
continue;
}

var databaseName = sqlite3_column_database_name(Handle, i).utf8_to_string();
if (databaseName != blobDatabaseName)
{
continue;
}

var tableName = sqlite3_column_table_name(Handle, i).utf8_to_string();
if (tableName != blobTableName)
{
continue;
}

var columnName = sqlite3_column_origin_name(Handle, i).utf8_to_string();
if (columnName == "rowid")
{
rowidOrdinal = i;
break;
}

var rc = sqlite3_table_column_metadata(
_connection.Handle,
databaseName,
tableName,
columnName,
out var dataType,
out var collSeq,
out var notNull,
out var primaryKey,
out var autoInc);
SqliteException.ThrowExceptionForRC(rc, _connection.Handle);
if (string.Equals(dataType, "INTEGER", StringComparison.OrdinalIgnoreCase)
&& primaryKey != 0)
{
if (i == ordinal)
{
continue;
}

var databaseName = sqlite3_column_database_name(Handle, i).utf8_to_string();
if (databaseName != blobDatabaseName)
{
continue;
}

var tableName = sqlite3_column_table_name(Handle, i).utf8_to_string();
if (tableName != blobTableName)
{
continue;
}

var columnName = sqlite3_column_origin_name(Handle, i).utf8_to_string();
if (columnName == "rowid")
{
rowidOrdinal = i;
break;
}

var rc = sqlite3_table_column_metadata(
_connection.Handle,
databaseName,
tableName,
columnName,
out var dataType,
out var collSeq,
out var notNull,
out var primaryKey,
out var autoInc);
SqliteException.ThrowExceptionForRC(rc, _connection.Handle);
if (string.Equals(dataType, "INTEGER", StringComparison.OrdinalIgnoreCase)
&& primaryKey != 0)
{
_rowOrdinalCache = rowidOrdinal = i;
break;
}
rowidOrdinal = i;
break;
}
}

Expand Down

0 comments on commit 2fdcc8d

Please sign in to comment.