Skip to content

Commit

Permalink
Work on LastInsertedOID
Browse files Browse the repository at this point in the history
Moved from command to the reader, like RowsAffected, and made to work.
  • Loading branch information
roji committed Jan 1, 2015
1 parent de245a4 commit 3afdabd
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 72 deletions.
25 changes: 9 additions & 16 deletions Npgsql/Messages/CommandCompleteMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ namespace Npgsql.Messages
{
internal class CommandCompleteMessage : ServerMessage
{
private int? _rowsAffected;
private long? _lastInsertedOID;
internal long? LastInsertedOID { get; private set; }
internal int? RowsAffected { get; private set; }

internal CommandCompleteMessage Load(NpgsqlBuffer buf, int len)
{
_rowsAffected = null;
_lastInsertedOID = null;
RowsAffected = null;
LastInsertedOID = null;

var tag = buf.ReadString(len-1);
buf.Skip(1); // Null terminator
Expand All @@ -23,31 +23,24 @@ internal CommandCompleteMessage Load(NpgsqlBuffer buf, int len)
switch (tokens[0])
{
case "INSERT":
_lastInsertedOID = long.Parse(tokens[1]);
var lastInsertedOID = long.Parse(tokens[1]);
if (lastInsertedOID != 0) {
LastInsertedOID = lastInsertedOID;
}
goto case "UPDATE";

case "UPDATE":
case "DELETE":
case "COPY":
int rowsAffected;
if (int.TryParse(tokens[tokens.Length - 1], out rowsAffected)) {
_rowsAffected = rowsAffected;
RowsAffected = rowsAffected;
}
break;
}
return this;
}

public long? LastInsertedOID
{
get { return _lastInsertedOID; }
}

public int? RowsAffected
{
get { return _rowsAffected; }
}

internal override BackEndMessageCode Code { get { return BackEndMessageCode.CompletedResponse; } }
}
}
10 changes: 0 additions & 10 deletions Npgsql/NpgsqlCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,6 @@ public sealed partial class NpgsqlCommand : DbCommand, ICloneable
byte[] _preparedCommandText;
RowDescriptionMessage _preparedDescription;

long _lastInsertedOid;

// locals about function support so we don`t need to check it everytime a function is called.
bool _functionChecksDone;
bool _functionNeedsColumnListDefinition; // Functions don't return record by default.
Expand Down Expand Up @@ -297,14 +295,6 @@ public override UpdateRowSource UpdatedRowSource
}
}

/// <summary>
/// Returns oid of inserted row. This is only updated when using executenonQuery and when command inserts just a single row. If table is created without oids, this will always be 0.
/// </summary>
public Int64 LastInsertedOID
{
get { return _lastInsertedOid; }
}

/// <summary>
/// Returns whether this query will execute as a prepared (compiled) query.
/// </summary>
Expand Down
9 changes: 7 additions & 2 deletions Npgsql/NpgsqlDataReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ public class NpgsqlDataReader : DbDataReader
RowDescriptionMessage _rowDescription;
DataRowMessage _row;
int _recordsAffected;
internal long? LastInsertedOid { get; private set; }

/// <summary>
/// Indicates that at least one row has been read across all result sets
Expand Down Expand Up @@ -187,7 +186,7 @@ ReadResult ProcessMessage(ServerMessage msg)
: _recordsAffected + completed.RowsAffected.Value;
}
if (completed.LastInsertedOID.HasValue) {
LastInsertedOid = completed.LastInsertedOID;
LastInsertedOID = completed.LastInsertedOID.Value;
}
goto case BackEndMessageCode.EmptyQueryResponse;

Expand Down Expand Up @@ -337,6 +336,12 @@ public override int RecordsAffected
get { return _recordsAffected; }
}

/// <summary>
/// Returns the OID of the last inserted row.
/// If table is created without OIDs, this will always be 0.
/// </summary>
public long LastInsertedOID { get; private set; }

public override bool HasRows
{
get
Expand Down
24 changes: 1 addition & 23 deletions tests/CommandTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1314,29 +1314,6 @@ public void TestParameterNameWithDot()
Assert.AreEqual(aValue, a);
}

[Test]
public void LastInsertedOidSupport()
{
var insertCommand = new NpgsqlCommand("insert into data(field_text) values ('a');", Conn);
// Insert this dummy row, just to enable us to see what was the last oid in order we can assert it later.
insertCommand.ExecuteNonQuery();

var selectCommand = new NpgsqlCommand("select max(oid) from data;", Conn);
var previousOid = (Int32) selectCommand.ExecuteScalar();

insertCommand.ExecuteNonQuery();

Assert.AreEqual(previousOid + 1, insertCommand.LastInsertedOID);
}

/*[Test]
public void SetServerVersionToNull()
{
ServerVersion o = Conn.ServerVersion;
if(o == null)
return;
}*/

[Test]
public void VerifyFunctionNameWithDeriveParameters()
{
Expand Down Expand Up @@ -1445,6 +1422,7 @@ public void CaseSensitiveParameterNames()
Assert.AreEqual(5, result);
}

// TODO: Fix according to #438
[Test]
public void FunctionTestTimestamptzParameterSupport()
{
Expand Down
43 changes: 22 additions & 21 deletions tests/ReaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,32 +88,33 @@ public void FieldCount()
[Test]
public void RecordsAffected()
{
var command = new NpgsqlCommand("INSERT INTO data (field_int4) VALUES (7); INSERT INTO data (field_int4) VALUES (8)", Conn);
var dr = command.ExecuteReader();
dr.Close();
Assert.That(dr.RecordsAffected, Is.EqualTo(2));
}
var cmd = new NpgsqlCommand("INSERT INTO data (field_int4) VALUES (7); INSERT INTO data (field_int4) VALUES (8)", Conn);
var reader = cmd.ExecuteReader();
reader.Close();
Assert.That(reader.RecordsAffected, Is.EqualTo(2));

[Test]
public void RecordsAffectedSelect()
{
var command = new NpgsqlCommand("SELECT * FROM data", Conn);
using (var dr = command.ExecuteReader())
{
dr.Close();
Assert.That(dr.RecordsAffected, Is.EqualTo(-1));
}
cmd = new NpgsqlCommand("SELECT * FROM data", Conn);
reader = cmd.ExecuteReader();
reader.Close();
Assert.That(reader.RecordsAffected, Is.EqualTo(-1));

cmd = new NpgsqlCommand("UPDATE data SET field_int4=8", Conn);
reader = cmd.ExecuteReader();
reader.Close();
Assert.That(reader.RecordsAffected, Is.EqualTo(0));
}

[Test]
public void RecordsAffectedUpdateZero()
public void LastInsertedOID()
{
var command = new NpgsqlCommand("UPDATE data SET field_int4=8", Conn);
using (var dr = command.ExecuteReader())
{
dr.Close();
Assert.That(dr.RecordsAffected, Is.EqualTo(0));
}
var insertCmd = new NpgsqlCommand("INSERT INTO data (field_text) VALUES ('a')", Conn);
insertCmd.ExecuteNonQuery();

var selectCmd = new NpgsqlCommand("SELECT MAX(oid) FROM data", Conn);
var previousOid = (int)selectCmd.ExecuteScalar();

var reader = insertCmd.ExecuteReader();
Assert.That(reader.LastInsertedOID, Is.EqualTo(previousOid + 1));
}

[Test]
Expand Down

0 comments on commit 3afdabd

Please sign in to comment.