[pmwiki-devel] More database standards

marc gmane at auxbuss.com
Sun Dec 17 09:37:59 CST 2006


Ben Stallings said...
> Marc wrote:
> > Are you suggesting that the standard should be that folk provided the 
> > db/table pair in each function call?
> > 
> > No? I thought not. But I don't understand what you are proposing.
> 
> I'm proposing that it be left up to the recipe authors how to write the 
> configuration variables that are specific to their recipes.

But that will result in every recipe requiring its db and tables to be 
uniquely defined. That's a lot of unnecessary extra work when you can 
simply define a table once. (By table, I always mean a unique db/table 
pair.)

The effect is that each of these definitions will need to be amended 
when using another table, instead of only having to do so in one 
location.

The knock on effect is that admins will have to write their own code to 
manage db and table changes in their config.php, because the definition 
appear more than once. That is something I specifically wished to avoid.

> As I 
> understand it, although your $DBTables array provides a standard 
> *format* for configuration variables, the variables themselves 
> ($DBTables[handle]) are specific to each recipe

No, this isn't the case. $DBTables[handle] (e.g. $DBTables[members]) is 
simply a PmWiki-wide handle for a table. A table is uniquely identified 
by its db and db table name, which is the minimal contents of an 
$DBTables entry. This handle can be used anywhere.

Anywhere, in this case, also means within markup, and this is incredibly 
useful. For example, I have a generic object display markup for PmWiki. 
That means that users can simply say:

  (:Show Members='fred blogs':)
  (:Show Products='PmWiki t-shirt':)
  (:Show Purchases Member='fred blogs':)

Now, wrap that up a bit with a form and an entry field and that's 
customer support sorted.

> in which case a 
> standard format (array('database'=>dbname, 'table'=>tablename)) is not 
> necessary.

This doesn't make sense to me, I'm afraid. Why is it 'not necessary'?
 
> In fact, if two recipes use the same handle to refer to two different 
> tables

If the tables are different, then you use different handles. One handle 
maps to one table (that is, one unique database/table pair - although 
there is nothing to stop someone creating two handles for for the same 
db/table pair).

> -- because one recipe's "products" are not the same as another's

I'm already doing this in the wild, so it's a good example of why this 
mechanism - this very simple mechanism - works in the real world.

In fact, in some cases, we are building multiple result-sets from 
multiple "same table" tables on multiple databases and displaying one 
set of results.

Where there are multiple products' table, one simply defines a handle 
for each one:

  'products'  => array ( 'database' => $liveDb, 'table' => 'products'),
  'products2' => array ( 'database' => $liveDb, 'table' => 'products2'),
  'products3' => array ( 'database' => $liveDb, 'table' => 'products3'),

If the recipe writer wants to provide a means for the handle to be 
provided as a parameter to a function he may do so. There's no /loss/ of 
functionality. Alternatively, the recipe writer can do this via an 
additional field in $DBTables array for a table. Indeed, there's nothing 
to stop the recipe writer interpreting, say, 'table' as an array and 
processing that. e.g.

  'products'  => array (
    'database' => $liveDb,
    'table' => array ( 'products', 'producs2', 'products3' ));

> -- using a single variable for both recipes could have unintended 
> consequences.

Well, I'd prefer too see you support these 'unintended consequences' 
with some specifics, but, as I mentioned above, this isn't how it works.

> To avoid that conflict, the recipes would have to use 
> handles with recipe-specific prefixes: DHproducts and DQproducts and so 
> on... which means they may as well be separate global variables 
> $DHproducts and $DQproducts.

Why do that?

The problem here is that it precludes a generic set of definitions that 
is the simplest case, and the most likely to be used by most folk. 
Admins can define the required tables once and be done with it.

I have a case where there are only six tables and twenty odd recipes. 
$DBTables is 6 lines. It would be 120 lines if each were defined for 
each recipe.

Also, you need to keep in mind that classes, and methods within 
classes might use a variety of similarly named but physically different 
tables. 

But, in addition, the case you give provides no extra benefit.
 
> So I say, if a recipe is going to use handles at all, it should have its 
> own separate configuration variables rather than attempting to share them.

As I've shown. this is unnecessary, more complex, and creates additional 
work to maintain. But, in addition, there's nothing to stop a recipe 
writer using their own recipe-specific handles in $DBTables, if they so 
wish.
 
> > Well, fine, but we need to agree a 'standard'. Right now, there isn't 
> > one, and that's the reason why I raised the issue - to get a consensus. 
> > I've spelt out my approach and as yet, no alternative has been offered. 
> > Bring it on.
> 
> We needed a standard for database *connections*, because we needed to 
> prevent redundant connections, and we have such a standard, though 
> admittedly it has room for improvement.

> Why do we need a standard for database *tables*?

> You say it reduces the amount of configuration, and 
> it may in the recipes you're writing, but I've tried to demonstrate that 
> it would have the opposite effect in the recipes I'm writing, and could 
> cause problems by limiting the name space available for variables.

Unfortunately, I don't think you have demonstrated these things, but 
only asserted them.

While I'm not claiming that what I proposed in the best solution, I put 
it out there for discussion.

> So you do not have consensus.  You've gotten me riled up, and it seems 
> like Crisses is a little miffed too, and both of us have asked you to 
> give us a working script to look at so we can understand what you're 
> doing, but you haven't done that.

Yes, I have presented quite a lot of code.

> Why should we give you consensus when 
> we don't yet understand the benefits of what you're proposing?

Consensus = general agreement. So it's not something you can give, nor 
something I could receive.

> > Frankly, for the extra flexibility, I'm at a loss to understand why this 
> > is being perceived negatively. 
> 
> I think our hostility to your suggestion comes from a sense that you're 
> trying to add stuff to the standard that has no business there and far 
> from trying to build consensus cooperatively, you're trying to tell us 
> the right way to program, and we're not convinced that it is the right 
> way.  I hope that helps explain the reaction you're getting.

I'll sidestep the ad hominem and just leave you to it.

-- 
Best,
Marc




More information about the pmwiki-devel mailing list