http://www.perlmonks.org?node_id=1220199


in reply to Re^4: Distiguishing arguments: number-strings vs real integer
in thread Distiguishing arguments: number-strings vs real integer

This is up to the user of the layer, that's why I need to know if he passed a literal string or number. And to be able to warn him if necessary.

Ok ... so you firstly need to know which option the user has chosen.
Having determined that, I would have thought you could just pass on that user-supplied argument as "$x" (if string was chosen) or "$x"+0 (if integer was chosen) without any need to analyse just what that argument was.

But I've never worked with databases so you should probably simply ignore me (and perhaps even be envious ;-)

Cheers,
Rob
  • Comment on Re^5: Distiguishing arguments: number-strings vs real integer

Replies are listed 'Best First'.
Re^6: Distiguishing arguments: number-strings vs real integer (DSL concept)
by LanX (Saint) on Aug 10, 2018 at 15:15 UTC
    In the case of (auto generated) placeholders I will pass a reference to the original value into DBI->bind_param() , so this will be fine.

    It's the case of literals causing me headaches.

    The raw concept in short:

    • the DB-table is handled as a Perl package with it's proper namespace,
    • the columns are constants in this package returning objects blessed into a class SQL::Column
    • operators are overloaded for SQL::Column
    • operations return objects of class SQL::Operation with nested attributes like {operator => "<", left =>  bless (['col'], '::Column'), right=> bless (["42"], '::Literal')
    • higher syntax expressions like WHERE are just functions imported into that table package, dealing with the nested objects and returning another container object
    • In the end I get an abstract syntax tree of nested objects which I can walk and translate to the target SQL dialect
    So something like this
    query { package t_table; WHERE col < "42" }

    needs to distinguish if the literal was string "42" or 42

    Of course I could think about overloading lt too, to have a more Perlish way to get the type (and crosscheck against the table's definition), but the more information I have to catch errors, the better.

    I hope my approach is clearer now! :)

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice