amphp/postgres

Row count reported by driver hidden behind private API

Bilge opened this issue · 5 comments

Bilge commented

One of the most useful things to know when performing a query is how many results are in the results set. This information is provided by the driver and exposed by a public method in this library, but by an object that is inaccessible to the consumer.

PgSqlResultSet exposes the method numRows(), but PgSqlResultSet is wrapped by PooledResultSet which is what the consumer actually receives and which does not provided any public access to the underlying PgSqlResultSet. Due to this, the row count is inaccessible to the consumer.

Also, and this is a side issue, even if it were possible to access numRows() via PooledResultSet, the library only declares interfaces, and the method is not present on the generic SQL interface so declared. The consumer would have to know the underlying object's exact type and override the type system to access it.

The row count cannot be known for all queries and this method will be removed from PgSqlResult in the next version. The new Result object will have getRowCount(), but it may return null if the number of rows is unknown.

Bilge commented

If it's a results set, to my knowledge, the row count can always be known. If it is not, then it's an entirely different object: PgSqlCommandResult. In any case, I will hold off making a PR if you are going to address this issue directly. Although, if the new version is not backwards-compatible, I still think it is worth addressing the issue in this major version.

Unbuffered result sets do not provide a total row count, so that's why the method is missing from the pool result set. I potentially could add numRows() to PooledResultSet in this version, but it would sometimes return null if the pooled result set is unbuffered.

See the streams branch for the upcoming version in sql, sql-common, and this repo.

Bilge commented

What determines whether a results set is "buffered"?

The ext-pq driver is capable of returning unbuffered results. Usually if a query is more than a few rows it is not buffered, but sent in chunks instead. PqUnbufferedResultSet does not have a numRows() method because of this.