Files
server/usr/share/psa-pear/pear/docs/Horde_Rdo/TODO
2026-01-07 20:52:11 +01:00

158 lines
5.6 KiB
Plaintext

- Add query logging/profiling (also something like
http://blog.talbott.ws/articles/2006/05/17/querytrace-my-first-official-rails-plugin
?)
- Remove Horde_Rdo::CUSTOM, allow custom 'query' arrays on all
relationships as possible, and have a new type (not relationships,
but mixins? extra_fields? that can be defined by a Query and that
allows the flexibility of CUSTOM without being smooshed into
relationships.
- Allow Horde_Rdo_Query objects to be turned into just WHERE (or JOIN)
clauses
- Allow relationships to be defined by Query objects?
- allow for using php.ini-set database configs for security, or perhaps
$ENV variables - see Ilia's security presentation. Example php.ini dsn:
[PDO]
pdo.dsn.MYDB="odbc:SAMPLE"
- Ensure that Rdo_Base objects are serializable
- Charset support: support a database charset config parameter, and
convert field values to the requested client charset.
- Implement named queries
(http://www.tonybibbs.com/article.php/PropelDAO)
- Support composite primary keys. Discussion of surragate vs. natural
primary keys: http://www.bcarter.com/intsurr1.htm
- Saving arrays, hashes, and other non-mappable objects in text
columns ?
- Allow setting $key field explicitly (not just by overriding the
model)
- Some check for whether or not an object is new (has been saved to
the backend yet)?
- Freezing: implement $frozen variable for Rdo objects for when the
object has been deleted, or similar?
- Caching hooks - not required, but allow caching of models, query
generation, etc. with a passed-in Cache object.
- Work on the basic Horde_Support_Inflector enough that it supports
standard Horde table naming.
- Use fetchObject (at least in PDO drivers) for performance?
- Eager loading of MANY relationships - see
http://darwinweb.net/article/Optimizing_And_Simplifying_Limited_Eager_Loading_In_Activerecord
- Two-query eager loading of a specific relationship (load the main
object in one query, then all foreign-key objects in a 2nd, and join
the two.
- Implement eager loading with several relationships to the same table.
- Observer hooks: beforeDelete, afterDelete, beforeUpdate, afterUpdate, beforeCreate, afterCreate
- Support fixtures (YAML?) for testing
- Test suite for Rdo:
http://www.ds-o.com/archives/64-Adding-Database-Tests-to-Existing-PHPUnit-Test-Cases.html
http://mikenaberezny.com/archives/79
http://www.phpunit.de/browser/phpunit/branches/3.2/PHPUnit/Extensions/Database/Operation
Links:
http://www.analysisandsolutions.com/code/dates.htm
http://www.qcodo.com/
http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html
http://www.phpdoctrine.com/
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
http://www.analysisandsolutions.com/presentations/portability/slides/toc.htm
http://fuzzyblog.com/archives/2006/08/12/sql_calc_found_rows-and-faster-count-alternatives/
http://phplens.com/phpeverywhere/?q=node/view/231
http://pooteeweet.org/blog/688
http://pooteeweet.org/blog/711
http://pooteeweet.org/blog/809
http://schlitt.info/applications/blog/?/archives/528-Object-relation-mapping-in-eZ-Components.html
http://nubyonrails.com/articles/2005/12/27/dump-or-slurp-yaml-reference-data
http://db.apache.org/ddlutils/
http://www.thespanner.co.uk/2007/07/23/php-mysql-tips/
http://www.sqlalchemy.org/
things that can be specified on relationships:
className - only if it can't be inferred from the field name
foreignKey - also if can't be inferred
criteria - restrict associations by more than foreign keys
dependent - if true, associated object is destroyed when main object is
order - of associated objects?
- cascading deletes/updates: ?
- Single table inheritance ?
::
class Company extends Rdo
class Firm extends Company
class Client extends Company
class PriorityClient extends Client
CREATE TABLE companies (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
client_of int(11),
name varchar(255),
type varchar(100),
PRIMARY KEY (id)
);
CREATE TABLE people (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
name text,
company_id text,
PRIMARY KEY (id)
);
potential field parameters:
size
maxsize
fixedsize
numeric
null
canbenull
default
canhavedefault
unsigned
canbeunsigned
realname
description
type
base
>> Here I disagree. To me the key point of a DBAL compared to just a DBL (database layer) is that it provides almost everything necessary to manually build portable SQL. This means that instead of passing of an array that magically builds my SQL, the user remains in the driver seat and is provided with a rich enough API to build almost everything in the SQL spec (and a bit beyond that) in a portable manner.
> What you want to say is that a DBAL must additionally provide:
> a Query Builder, maybe extendable by the driver to provide RDBMS specific options/methods
no .. not a query builder .. that would imply that you just pass of some data and it magically constructs the entire SQL for you .. that is the job for some OO<->SQL tool. what I think a DBAL should provide is methods to generate pieces of SQL that are then assembled by the user.
so for example setLimit() would either return or automatically append to an supplied SQL string. same applies to field abstraction, you still call quote() to get the necessary SQL fragment to embedd in your SQL statement.
Pierre Minnieur wrote:
> Must a DBAL then provide OO access to executed statements, prepared statements and results sets, too (like PDO does)?
absolutely .. a DBAL also needs to cover the reading part. so you need to have a portable way to read data from the database (including data type abstraction, handling of trimming off empty spaces etc).