Jens Rehsack wrote: > Hi DBI and DBD developers, > > I have some open points for DBD::File I'd like to ask for feedback on them. > > The first two are related to the table meta data. > > 1) I introduced simple getters and setters for DBD::File table's meta > data (look for get_file_meta and set_file_meta in > lib/DBD/File/Developers.pod). Merijn and me came over to extend > this interface with some wild cards: > - '.': default - read, the attributes of the database handle is > delivered/modified (even through a proxy, which was the > primary intention) > - '*': all - the attribute of all tables (and the default one) > is modified > - '+': as '*', but restricted to all ANSI conform tables names > (default isn't touched) > - qr//: all tables matching the regex are affected
I read Developers.pod and did not notice these wild cards but I'll assume they are implemented and not documented as yet. > The question is related to the getter: how should the attributes being > returned (or more: what API should be supported)? > Let me explain a bit deeper the cause of the question. set_file_meta > can be called using the table_name as first argument, the attribute > name as second one and the new attribute value as third argument. > It sounds reasonable to allow following call, too: > > $dbh->func( $tname, { attr1 => val1, attr2 => val2 }, > 'set_file_meta' ); > > Consequently get_file_meta should be able to return more than one > attribute, shouldn't it? So we have 3 situations for get_file_meta > regarding the expected return values: > a) 1 table, 1 attribute - expected return value is a scalar > b) n tables, 1 attribute - expected return value is a hash of > table names pointing to the scalar value of the attribute > belonging to that table > c) n tables, m attributes - expected return value is a hash of > table names pointing to a hash of attribute names containing > the attribute values of the affected table > > I rate it to complex in API and need external thoughts :) I never like APIs where you need to examine the result to know what sort of result you have; I prefer to know up front what I'm going to get. In that respect I presume (a) is ok since at most it can return the attribute value or perhaps undef. (b) and (c) could be combined into always returning: { table1 => {attr1 => value, attr2 => value}, table2 => {attr1 => value, attr2 => value}, . . } Just a thought. > 2) backward compatibility of depreciated structures per table of DBD::CSV, > DBD::AnyData (and maybe later DBD::PO or DBD::DBM). DBD::CSV had a > structure $dbh->{csv_tables}{$tname}{...} - which is now handled via > $dbh->{f_meta}{$tname}{...} ... - DBD::AnyData had the same with > $dbh->{ad_tables}{$tname}{...}. > Both had several attributes in their which were not synchronized > between both DBD's. Further, the $dbh->{f_meta} structure contains > the table names after they walked through an internal filter > (suggested by mje) which handles the identifier case. An additional > structure $dbh->{f_meta_map} is used to hold the map between the > original table name (from SQL statement or through the getter/setter) > and the internal used identifier. > > Because it could be very difficult to manage backward compatibility > there, I would like to have a solution which can be plugged in as > early as possible: > a) $dbh->{csv_tables} or $dbh->{ad_tables} should become a tied hash > which access the table's meta data using the get_table_meta method > from the table implementor class. Sounds ok to me if you need that backwards compatibility. > b) further, the meta data which can be accessed through this tie > should be tied, too - to allow overriding FETCH/STORE methods which > could handle the mapping between old attribute names and new > attribute names. If you want/need to go that far in maintaining compatibility. How much code relies on these attributes - is it all possible to know? > While I rate being 2a more important than 2b, I would like to get > feedback for both ideas. Discarding 2a could result in inconsistent > entries in $dbh->{f_meta} which could lead the DBD into unpredictable > behavior. > My third question has lesser implications :) > > 3) Merijn and me had the idea to let the users decide on connection > whether to use DBI::SQL::Nano or SQL::Statement - not globally via > DBI_SQL_NANO environment variable. > > Because of the handling of the handles for the dr, db and st > instances of a DBD I hoped to get some suggestions how we could > implement a similar behavior for DBD::File::Statement and > DBD::File::Table. Don't understand the question - sorry. > Thanks for all answers in advance, > Jens > > Martin -- Martin J. Evans Easysoft Limited http://www.easysoft.com