title: Synchronous query to Web SQL Database
body: <p>I'm working on a bit of JavaScript that interacts with a client-side SQLite database, via the newish <code>window.openDatabase(...)</code>, <code>database.transaction(...)</code> and related APIs. As most of you know when you execute a query in this way it is an asynchronous call, which is typically good. You can make the call and handle the results as appropriate with callbacks.</p>
  
  <p>In my current situation I'm working on an algo for a client that does some hierarchy walking in the locally stored database. The part of the algo I'm having trouble with requires starting at some row, which has a reference to a "parent" (by id) that is another row further up in the table. I have to keep walking up this tree until I reach the root.</p>
  
  <p>The problem is that I'm at a point where I'm not sure how to use an asynchronous style query with a callback to keep feeding the loop parent ids. Ideally I could get the query to block so that I can do it all in the loop. Here's the key parts of my current setup:</p>
  
  <pre><code>    for (i in search.searchResults.resultsArray)
      {
          hierarchyArr = new Array();
          pageHierarchyArr = new Array();
          id = search.searchResults.resultsArray[i].ID;
  
          while (id != null &amp;&amp; id != "")
          {
              var hierarchySql = "SELECT ID, parentID, type, content FROM content WHERE ID = " + id;
  
              // This is a prettied up call to database.transaction(...)
              var rs = db.getRS(hierarchySql);
  
              // Ideally the code below doesn't execute until rs is populated
  
              hierarchyArr.push(rs[0]);
  
              if (rs[0].type == "page")
              {
                  pageHierarchyArr.push(rs[0]);
  
                  // Do some additional work
              }
  
              id = rs[0].parentID;
          }
      }
  </code></pre>
  
  <p>As you might imagine, it doesn't work well. hierarchyArr gets an "undefined" pushed into it, and then the script crashes when it tries to check the type of rs[0].</p>
  
  <p>When I try to set it up with a callback (<code>db.getRSAndCallback(sql, callbackFunc)</code>, which I used for the earlier, non-interdependent queries just fine) it's worse: the inner loop takes off like crazy because id isn't getting updated; presumably because the loop is keeping the JavaScript interpreter so busy that it never actually fills <code>rs</code>. In some artificial testing where I forced the inner loop to break after a few iterations all the callbacks started coming through all at the end, after the loop finished.</p>
  
  <p>The "standard" (such as it is right now) at <a href="http://dev.w3.org/html5/webdatabase/#synchronous-database-api" rel="nofollow noreferrer">http://dev.w3.org/html5/webdatabase/#synchronous-database-api</a> seems to indicate that there is a synchronous API, but I haven't seen any sign of it on any WebKit based browsers.</p>
  
  <p>Can anyone offer suggestions on how I might either, a. properly formulate these iterative, interdependent queries using callbacks or, b. somehow get the call to actually happen in a synchronous or apparently synchronous manner.</p>
  
  <p>Many thanks in advance for anyone who takes a crack at this seemingly tricky little problem.</p>
  
  <p>Naim</p>
  
  <p>P.S. Here's the client's implementation of <code>db.getRS</code> for reference:</p>
  
  <pre><code>.
  .
  .
  getRS: function(sql)
  {
      var output = [];
      db.database.transaction(function(tx)
      {
          tx.executeSql(sql, [], function(tx,rs)
          {
              for(i = 0; i &lt; rs.rows.length; i++)
              {
                  output.push(rs.rows.item(i));
              }
          },
          function(tx, error) { ... }
      )});
      return output;
  },
  .
  .
  .
  </code></pre>