Greg Stein wrote:

> That sounds like a great idea! +1
> 
> It shouldn't be hard to tweak transform_sql.py. If you have a specific
> prefix for the "token" symbols (eg TOKEN_BASE_DELETED), then we can
> have the transform script simply look for lines like you suggest in
> (say) wc_db.h. If the search regex is strong enough, then it will have
> no problem finding them. And if transform_sql.py sees TOKEN_FOO that
> it does NOT recognize, then it should throw an error. Either somebody
> forgot the mapping, or the syntax was not conformant -- both are
> "errors".
> 
> I would be near -1 on putting short numeric values into the db; I
> chose the tokens for debuggability, and think that is quite important.
> I like your improvement on the strengthening the db/token system.
> 
> Cheers,
> -g
> 
> 
> On Fri, Dec 7, 2012 at 12:54 PM, Philip Martin <phi...@codematters.co.uk> 
> wrote:
>>  Columns such as nodes.kind, nodes.presence, etc. have strings that
>>  should be one of a discrete set of values.  When we bind these columns
>>  in C code we use something like:
>> 
>>      svn_sqlite__bindf("t", presence_map, svn_wc__db_status_normal);
>> 
>>  This means we only use known values (svn_wc__db_status_normal) and the
>>  map converts it to the correct discrete string.  This checking happens
>>  at build time.
>> 
>>  We also have queries where the strings are defined as literals in
>>  wc-queries.sql like:
>> 
>>      DELETE FROM nodes
>>      WHERE wc_id = ?1
>>        AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
>>        AND (op_depth < ?3
>>             OR (op_depth = ?3 AND presence = 'base-deleted'))
>> 
>>  There is no checking of these literals to catch errors such as
>>  'base-delete'.
>> 
>>  I've been thinking that transform_sql.py should do some checking.
>>  Perhaps we could move the maps into a know header, annotate them:
>> 
>>      { "base-deleted", svn_wc__db_status_base_deleted },  /* MAP_DELETED */
>> 
>>  and then have transform_sql.py parse the header and convert:
>> 
>>        OR (op_depth = ?3 AND presence = MAP_DELETED))
>> 
>>  into
>> 
>>        OR (op_depth = ?3 AND presence = 'base-deleted'))


If we're doing string matching anyway, can we just make it parse the plain

   { "base-deleted", svn_wc__db_status_base_deleted },

lines out of the header file (recognizing that it's a line in a token map, by 
whatever means is convenient) and then match the literal

  ... presence = 'base-deleted'

by the pattern:

  ... <recognized_column_name> = <valid_token_for_that_column>

Even if we have to append "/* TOKEN_MAP(presence) */" to every line, but 
hopefully without that, that's better than "/* MAP_DELETED */".

- Julian

Reply via email to