Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re^4: Distiguishing arguments: number-strings vs real integer

by LanX (Archbishop)
on Aug 10, 2018 at 13:54 UTC ( #1220195=note: print w/replies, xml ) Need Help??


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

I find SQL very confusing and archaic that's why I want a safer abstraction layer.

Saying this it becomes even more confusing because of different dialects and differently implemented DB drivers.

> Therefore, you need to determine whether the placeholder needs to be 42 or "42".

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.

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

  • Comment on Re^4: Distiguishing arguments: number-strings vs real integer

Replies are listed 'Best First'.
Re^5: Distiguishing arguments: number-strings vs real integer
by syphilis (Bishop) on Aug 10, 2018 at 14:46 UTC
    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
      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

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1220195]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (4)
As of 2020-03-29 06:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    To "Disagree to disagree" means to:









    Results (169 votes). Check out past polls.

    Notices?