On Sat, Jun 12, 2010 at 4:54 AM, Ilia Alshanetsky <i...@prohost.org> wrote:
> The concerns you raised about custom methods specific to database drivers
> were not reflective of the PDO's intent as was clarified by Wez and myself.
>
> The code that was introduced was specific to PostgreSQL, the common
> functionality was introduced in a way that allows each driver to implement.


Yet the rest of the copyFrom, copyTo, etc.. could have ben generic as
well. I specifically stated that this could be done at the driver
level for FreeTDS using the BCP extensions and/or using "BULK INSERT
". Yet now this is a specific pgsql*** interface that cannot be
abstracted for other drivers OR implemented at the driver level. Now
if I want a MSSQL / Sybase dump/load method, I need to preface it with
dblibCopyFrom, dblibCopyTo.

IMHO, every function should be a generic named interface to the driver
or statement level and then throw a "not implemented" if the driver
does not support it. This will allow for abstraction at a higher level
and give the driver developers an opportunity to implement it. It will
also give PDO users a more structured way to deal with unsupported
methods with try/catch.

I know I am a noob to the PDO development process, however I have used
OO for quite awhile and I have never seen it DB abstractions
implemented like this.

>
> On Sat, Jun 12, 2010 at 12:24 PM, Pierre Joye <pierre....@gmail.com> wrote:
>
>> hi Ilia,
>>
>> So you basically say that the worries and wishes raised here are
>> simply irrelevant and at the end of the day you decide what PDO can or
>> cannot be?
>>
>> I'm very disappointed by these two commits. I don't think it is the
>> way we should develop PDO and it is clear that I'm not the only one to
>> think that. As it is trunk, I won't battle too much to revert it but
>> be sure that is not something I will let in for any of the upcoming
>> releases as it is clearly bad design.
>>
>> Cheers,
>> --
>> Pierre
>>
>> On Thu, Jun 10, 2010 at 2:12 PM, Ilia Alshanetsky <i...@prohost.org>
>> wrote:
>> > I've added the transaction code as a generic method inTransaction(), by
>> > default it'll just use in_txn internal parameter, but allows the driver
>> to
>> > extend this (as was done in PostgreSQL) and provide a detailed status
>> code.
>> >
>> > On Wed, May 26, 2010 at 1:11 PM, Denis Gasparin
>> > <denis.gaspa...@edistar.com>wrote:
>> >
>> >>
>> >> I attached to this mail a new version of the patch both in unified and
>> >> single file format.
>> >>
>> >> I attached the unit tests for all the new methods too.
>> >> They are three files: one for pgsqlIsInTransaction(), one for
>> >> pgsqlCopyFrom*  methods and one for pgsqlCopyTo* methods.
>> >>
>> >> I did a typo writing the documentation in my first mail. The typo is
>> about
>> >> the $fields parameter.
>> >> It is actually a string (not an array) with field names separated by
>> comma.
>> >>
>> >> If needed, I can write also documentation in a more suitable format for
>> php
>> >> web site.
>> >>
>> >> The updated documentation of the methods follows.
>> >>
>> >> Any feedback is appreciated.
>> >>
>> >> Thank you in advance,
>> >> Denis
>> >>
>> >> pgsqlIsInTransaction()
>> >>
>> >>    It uses the native Postgresql functions to check transaction status.
>> >>    It returns one of the following status codes:
>> >>        * PDO:GSQL_TRANSACTION_IDLE: connection in idle status
>> >>       * PDO:GSQL_TRANSACTION_ACTIVE: connection is executing a command
>> >>       * PDO:GSQL_TRANSACTION_INTRANS: connection is idle in a valid
>> >> transaction block
>> >>       * PDO:GSQL_TRANSACTION_INERROR: connection is idle, in a failed
>> >> transaction block
>> >>       * PDO:GSQL_TRANSACTION_UNKNOWN: connection is in a bad status
>> >>
>> >>
>> >>
>> >> pgsqlCopyFromArray($table,Array $data,$delimiter,$null, Array $fields)
>> >>
>> >>    It uses the native Postgresql copy construct to append $data to
>> $table.
>> >>    It returns boolean.
>> >>    Parameters:
>> >>       * (mandatory) $table: table to append data to
>> >>       * (mandatory) $data: Array of rows with data in table field order
>> >>                           (or as specified in the $fields array). Fields
>> >> must be separated by $delimiter or by
>> >>                           postgresql standard \t)
>> >>       * $delimiter: alternative delimiter to use in place of the
>> standard
>> >> postgres delimiter ("\t")
>> >>       * $null: alternative string to use as null value. Default is "\N"
>> >>        * $fields: string with table fields that are specified in $data
>> >> parameter. Fields are separated by comma
>> >>
>> >>
>> >>
>> >> pgsqlCopyFromFile($table,$filename,$delimiter,$null,$fields)
>> >>
>> >>    It uses the native Postgresql copy construct to append $filename
>> >> contents to $table.
>> >>    It returns boolean.
>> >>    Parameters:
>> >>       * (mandatory) $table: table to append data to.
>> >>       * (mandatory) $filename: file with contents to append to $table.
>> See
>> >> Postgresql documentation for the format.
>> >>       * $delimiter: alternative delimiter to use in place of the
>> standard
>> >> postgres delimiter ("\t")
>> >>       * $null: alternative string to use as null value. Default is "\N"
>> >>        * $fields: string with table fields that are specified in
>> $filename
>> >> file. Fields are separated by comma
>> >>
>> >> pgsqlCopyToArray($table,$delimiter,$null,$fields)
>> >>
>> >>    It uses the native Postgresql copy construct to retrieve $table
>> contents
>> >> and store them to an array.
>> >>    It returns an array of rows or false in case of problems.
>> >>    The format of the rows into the array is indicated in the $delimiter,
>> >> $null and $fields parameters.
>> >>    Parameters:
>> >>       * (mandatory) $table: table to retrieve data from.
>> >>       * $delimiter: alternative delimiter to use in place of the
>> standard
>> >> postgres delimiter ("\t")
>> >>       * $null: alternative string to use as null value. Default is "\N"
>> >>        * $fields: string with table fields to include in the row of the
>> >> array. Fields are separated by comma
>> >>
>> >>
>> >> pgsqlCopyToFile($table,$filename,$delimiter,$null,$fields)
>> >>
>> >>
>> >>    It uses the native Postgresql copy construct to retrieve $table
>> contents
>> >> and store them into a file.
>> >>    It returns boolean.
>> >>    The format of the rows stored into the file is indicated in the
>> >> $delimiter, $null and $fields parameters.
>> >>    Parameters:
>> >>       * (mandatory) $table: table to retrieve data from.
>> >>       * (mandatory) $filename: file where to store the contents of the
>> >> table
>> >>       * $delimiter: alternative delimiter to use in place of the
>> standard
>> >> postgres delimiter ("\t")
>> >>       * $null: alternative string to use as null value. Default is "\N"
>> >>        * $fields: string with table fields to include in the row of the
>> >> array. Fields are separated by comma
>> >>
>> >>
>> >> ----- Messaggio originale -----
>> >> > Da: "Ilia Alshanetsky" <i...@prohost.org>
>> >> > A: "Denis Gasparin" <denis.gaspa...@edistar.com>
>> >> > Cc: internals@lists.php.net
>> >> > Inviato: Martedì, 25 maggio 2010 18:40:09
>> >> > Oggetto: Re: [PHP-DEV] [PATCH] New PDO methods for PostgreSQL driver
>> >>
>> >> > Good reason, I'll review the patch in the next day or two.
>> >> >
>> >> >
>> >> > On Mon, May 24, 2010 at 5:55 PM, Denis Gasparin <
>> >> > denis.gaspa...@edistar.com > wrote:
>> >> >
>> >> >
>> >> >
>> >> > The copy to/from sql statements accept both as main parameter a
>> >> > filename or stdout/stdin respectively.
>> >> >
>> >> > The filename represents a file in the database filesystem (apache/php
>> >> > and postgresql must reside on the same machine or share the file via
>> >> > shared filesystem). I quote from the postgresql manual:
>> >> >
>> >> > <<<
>> >> > COPY with a file name instructs the PostgreSQL server to directly read
>> >> > from or write to a file. The file must be accessible to the server and
>> >> > the name must be specified from the viewpoint of the (database)
>> >> > server.
>> >> > >>>
>> >> >
>> >> > Because of this "limitation", if you'd like to load a csv file into
>> >> > pgsql via copy command, you must before copy into a shared folder and
>> >> > the issue the copy from filename command.
>> >> > Using the methods added to PDO, you can do it directly from the
>> >> > webserver.
>> >> >
>> >> > About copying to/from stdin and stdout, PostgreSQL enters a particular
>> >> > status after a copy stdin/stdout command has been issued via sql.
>> >> > These status codes are PGRES_COPY_OUT and PGRES_COPY_IN. When in this
>> >> > status, the only way to interact with the database server is via
>> >> > PQgetCopyData and PQputCopyData.
>> >> >
>> >> > There are not PDO methods or functions that implements these functions
>> >> > and there is no way to share the connection between PDO driver and old
>> >> > pgsql drivers.
>> >> >
>> >> > These are the relevant PostgreSQL man pages:
>> >> >
>> >> > http://www.postgresql.org/docs/8.2/interactive/libpq-copy..html
>> >> > http://www.postgresql.org/docs/8.2/interactive/sql-copy.html
>> >> >
>> >> > Denis
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > > Denis could you elaborate on what makes use of the COPY code via Sql
>> >> > > behave differently then a PHP method call?
>> >> > >
>> >> > > Ilia Alshanetsky
>> >> > > CIO/CSO Centah Inc.
>> >> > >
>> >> > > On 2010-05-24, at 15:45, Denis Gasparin <
>> denis.gaspa...@edistar.com
>> >> > > >
>> >> > > wrote:
>> >> > >
>> >> > > >
>> >> > > > I'll provide the patches in a single file as soon as possible..
>> >> > > >
>> >> > > > Actually all the methods are wrappers against the native
>> >> > > > PostgreSQL commands (connection status, copy to/from).
>> >> > > >
>> >> > > > I needed to develop them as methods because it is not possible to
>> >> > > > get the same results with a sql statement (in particular for
>> >> > > > connection status).
>> >> > > >
>> >> > > > It was not possible also for COPY TO/FROM because of the way
>> >> > > > PostgreSQL handle them ( special functions were developed also for
>> >> > > > the old pgsql driver).
>> >> > > >
>> >> > > > We are currently using them in production and we needed them in
>> >> > > > order to avoid additional connections to database (one with the
>> >> > > > old driver and one with PDO).
>> >> > > >
>> >> > > > Denis
>> >> > > >
>> >> > > >
>> >> > > > ----- Messaggio originale -----
>> >> > > >> Da: "Ilia Alshanetsky" < i...@prohost.org >
>> >> > > >> A: "Denis Gasparin" < denis.gaspa...@edistar.com >
>> >> > > >> Cc: internals@lists.php.net
>> >> > > >> Inviato: Lunedì, 24 maggio 2010 19:54:46
>> >> > > >> Oggetto: Re: [PHP-DEV] [PATCH] New PDO methods for PostgreSQL
>> >> > > >> driver
>> >> > > >
>> >> > > >> Denis,
>> >> > > >>
>> >> > > >>
>> >> > > >> Could you merge the patches into a single for easier code review.
>> >> > > >> Also, the copy to/from file seems like it would just be a wrapper
>> >> > > >> against the native COPY PostgreSQL command, is there really a
>> >> > > >> need to provide a method for it?
>> >> > > >>
>> >> > > >>
>> >> > > >> On Mon, May 24, 2010 at 4:57 AM, Denis Gasparin <
>> >> > > >> denis.gaspa...@edistar.com > wrote:
>> >> > > >>
>> >> > > >>
>> >> > > >> Hi.
>> >> > > >>
>> >> > > >> I developed some patches for PDO/Postgresql driver in order to
>> >> > > >> add some useful methods that were available in the original pgsql
>> >> > > >> driver.
>> >> > > >>
>> >> > > >> The attached patches apply on 5.3.2 and svn 5.3.x.
>> >> > > >> If needed, i have patches also for 5.2.x.
>> >> > > >>
>> >> > > >> Please comment and tell me improvements or tips.
>> >> > > >>
>> >> > > >> Thank you in advance,
>> >> > > >>
>> >> > > >> Denis Gasparin
>> >> > > >>
>> >> > > >> Documentation of the added methods follows:
>> >> > > >>
>> >> > > >> pgsqlIsInTransaction()
>> >> > > >>
>> >> > > >> It uses the native Postgresql functions to check transaction
>> >> > > >> status..
>> >> > > >> It returns one of the following status codes:
>> >> > > >> * PDO::PGSQL_TRANSACTION_IDLE: connection in idle status
>> >> > > >> * PDO::PGSQL_TRANSACTION_ACTIVE: connection is executing a
>> >> > > >> command * PDO::PGSQL_TRANSACTION_INTRANS: connection is idle in a
>> >> > > >> valid transaction block
>> >> > > >> * PDO::PGSQL_TRANSACTION_INERROR: connection is idle, in a failed
>> >> > > >> transaction block
>> >> > > >> * PDO::PGSQL_TRANSACTION_UNKNOWN: connection is in a bad status
>> >> > > >>
>> >> > > >>
>> >> > > >>
>> >> > > >> pgsqlCopyFromArray($table,Array $data,$delimiter,$null, Array
>> >> > > >> $fields)
>> >> > > >>
>> >> > > >> It uses the native Postgresql copy construct to append $data to
>> >> > > >> $table. It returns boolean.
>> >> > > >> Parameters: * (mandatory) $table: table to append data to
>> >> > > >> * (mandatory) $data: Array of rows with data in table field order
>> >> > > >> (or as specified in the $fields array). Fields must be separated
>> >> > > >> by $delimiter or by
>> >> > > >> postgresql standard \t)
>> >> > > >> * $delimiter: alternative delimiter to use in place of the
>> >> > > >> standard postgres delimiter ("\t")
>> >> > > >> * $null: alternative string to use as null value. Default is "\N"
>> >> > > >> * $fields: array with table fields that are specified in $data
>> >> > > >> parameter
>> >> > > >>
>> >> > > >>
>> >> > > >>
>> >> > > >> pgsqlCopyFromFile($table,$filename,$delimiter,$null,$fields)
>> >> > > >>
>> >> > > >> It uses the native Postgresql copy construct to append $filename
>> >> > > >> contents to $table.
>> >> > > >> It returns boolean.
>> >> > > >> Parameters: * (mandatory) $table: table to append data to.
>> >> > > >> * (mandatory) $filename: file with contents to append to $table.
>> >> > > >> See Postgresql documentation for the format.
>> >> > > >> * $delimiter: alternative delimiter to use in place of the
>> >> > > >> standard postgres delimiter ("\t")
>> >> > > >> * $null: alternative string to use as null value. Default is "\N"
>> >> > > >> * $fields: array with table fields that are specified in
>> >> > > >> $filename file
>> >> > > >>
>> >> > > >> pgsqlCopyToArray($table,$delimiter,$null,$fields)
>> >> > > >>
>> >> > > >> It uses the native Postgresql copy construct to retrieve $table
>> >> > > >> contents and store them to an array.
>> >> > > >> It returns an array of rows or false in case of problems.
>> >> > > >> The format of the rows into the array is indicated in the
>> >> > > >> $delimiter, $null and $fields parameters.
>> >> > > >> Parameters: * (mandatory) $table: table to retrieve data from..
>> >> > > >> * $delimiter: alternative delimiter to use in place of the
>> >> > > >> standard postgres delimiter ("\t")
>> >> > > >> * $null: alternative string to use as null value. Default is "\N"
>> >> > > >> * $fields: array with table fields to include in the row of the
>> >> > > >> array.
>> >> > > >>
>> >> > > >>
>> >> > > >> pgsqlCopyToFile($table,$filename,$delimiter,$null,$fields)
>> >> > > >>
>> >> > > >>
>> >> > > >> It uses the native Postgresql copy construct to retrieve $table
>> >> > > >> contents and store them into a file.
>> >> > > >> It returns boolean.
>> >> > > >> The format of the rows stored into the file is indicated in the
>> >> > > >> $delimiter, $null and $fields parameters.
>> >> > > >> Parameters: * (mandatory) $table: table to retrieve data from..
>> >> > > >> * (mandatory) $filename: file where to store the contents of the
>> >> > > >> table * $delimiter: alternative delimiter to use in place of the
>> >> > > >> standard postgres delimiter ("\t")
>> >> > > >> * $null: alternative string to use as null value. Default is "\N"
>> >> > > >> * $fields: array with table fields to include in the row of the
>> >> > > >> array.
>> >> > > >>
>> >> > > >> -- PHP Internals - PHP Runtime Development Mailing List
>> >> > > >> To unsubscribe, visit: http://www.php.net/unsub.php
>> >>
>> >
>>
>>
>>
>> --
>> Pierre
>>
>> @pierrejoye | http://blog.thepimp.net | http://www.libgd.org
>>
>

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to