13 Common Vortex Mistakes

Over time we've seen folks make these mistakes often:

  • Passing SQL parameters in the statement

    Embedded SQL parameters are there for protection - concatenating the statement and quoting literal arguments from variables is not safe and wastes time. Eg. do this:

    
      <SQL "select x from tbl where y like $query">
    

    NOT this:

    
      <SQL "select x from tbl where y like '" $query "'">
    

    It's easy to fall into this trap if you've had experience in other scripting languages.

  • Turning off query protection without knowing why

    Errors like Query would require linear search are there to protect your server from bogging down on poorly formed SQL and/or bad user queries. If you get them, don't just turn 'em off in <apicp> to let the query through. Fix your application and indexes, you're probably missing some indexes or doing the query in a less efficient manner.

  • Using SQL logic where Metamorph logic is more appropriate

    Texis and Metamorph are designed for multi-word queries; it's what we do. Don't do this:

    
      <SQL "select x from tbl where x like 'aaa' and x like 'bbb'
                 and x like 'ccc'">
    

    because it takes 3 searches instead of one. Instead do this:

    
      <SQL "select x from tbl where x like 'aaa bbb ccc'">
    

    because like requires all these terms to be present, and can do the search in one pass.

  • Accidentally passing multi-value params to non-select

    Multi-value text parameters in <SQL> become parenthetical comma-separated strings. This is intended for set lists in a Metamorph query. But in a non-select clause (eg. insert ), it'll just give you the wrong value:

    
      <SQL MAX=3 "select x from table1"></SQL>
      ...
      <SQL NOVARS "insert into table2 values($x, 5, 'now')"></SQL>
      <!-- whoops, $x is multi-value from that previous select:
        -- our insert gets a paren list accidentally.
        -->
    

    The right way:

    
      <SQL MAX=3 "select x from table1"></SQL>
      ...
      <LOOP $x>
        <SQL NOVARS "insert into table2 values($x, 5, 'now')"></SQL>
      </LOOP>
    

    It's easy to miss that a var is really multiple values, because when you print it, only the first value would be printed anyway. If you're unsure, <LOOP> over it to see if it has more values.

  • Forgetting NOVARS flag when needed

    Not just select statements, but update and insert return rows and variables as well, and they return the entire row - all columns. It's easy to blow away a variable without knowing it:

    
      <!-- schema: create table bob(x int, txt varchar(10)) -->
      <$txt = "Some important string to save">
      <SQL "update bob set x = 5 where x = 4"></SQL>
      <!-- We just blew away our $txt value, even though it's not mentioned
        -- directly in the update: update returns the whole row.
        -- Use NOVARS:
        -->
    
      <SQL NOVARS "update bob set x = 5 where x = 4"></SQL>
    

  • Forgetting ROW flag when needed

    Variables accumulate rows in <SQL> , <TIMPORT> , <rex> and <xtree> loops. If you only need them one at a time, and you're selecting a lot of them, use ROW to save memory.

  • Trying to parse without REX

    REX is your friend. Get to know it. Regular expressions have far more power and speed than stringing along with copious calls to C-style functions like <strstr> .

  • Wrong EXPORT type

    If you're only exporting a small variable like a user name or id, use URL export - it's faster.

  • Forgetting to clear EXPORT vars

    After a variable is exported, especially to the URL, it should be cleared if not needed, to prevent it cluttering up the next URL. For example:

    
      <SCRIPT LANGUAGE=vortex>
    
      <EXPORT $id URL>
    
      <A NAME=main>
        ...
        <SQL MAX=25 "select id, Title from books ...">
          <!-- $id has only one value here for $url: -->
          <A HREF=$url/details.html>$Title</A> <P>
        </SQL>
        <!-- $id now could have 25 values, and we don't need 'em;
          -- this $url will be unnecessarily long:
          -->
        Link to <A HREF=$url/other.html>unrelated function</A>
      </A>
    

    At the second $url , we don't care about $id being exported to other . But it's still set, and to 25 values: that URL will be very long.

    To avoid this, we clear $id just before the second $url reference. (Or move its values to another non-EXPORT var for safekeeping, if we still need them this invocation.)

  • Whitespace stripping

    Leading literal whitespace is truncated in the output. Also, trailing newlines after functions are stripped too, so that multiple non-output-generating function calls don't print a bunch of newlines. This lead to unexpected results when functions are strung together on a line. Use <fmt> or <send> to insert whitespace as needed.

  • Unintended period in variable name

    A period is a valid character for a variable in Vortex; this allows image map vars to come through. But sometimes you want a real period after the var:

    
      The cost is $price.  That's all.
    

    Instead of printing $price , we're actually referring to $price. which probably is unset. Quote the var:

    
      The cost is $'price'.  That's all.
    

  • Wrong case on function/statement names

    Some names in Vortex are case-sensitive (variables and in-script functions), while others are case-in sensitive (<SQL> , <LOOP> tags). You can always spell a reserved Vortex name in lower-case, regardless of sensitivity. Also, any reserved name that is in upper-case in the manual is case-insensitive.

    Back: Vortex Coding Tips Next: Processing Data from the Web
  • Copyright © 2024 Thunderstone Software LLC. All rights reserved.