Method: QuickBase::Client#doSQLQuery

Defined in:
lib/QuickBaseClient.rb

#doSQLQuery(sqlString, returnOptions = nil) ⇒ Object

Translate a simple SQL SELECT statement to a QuickBase query and run it.

If any supplied field names are numeric, they will be treated as QuickBase field IDs if
they aren't valid field names.
  • e.g. doSQLQuery( “SELECT FirstName,Salary FROM Contacts WHERE LastName = ”Doe“ ORDER BY FirstName )

  • e.g. doSQLQuery( “SELECT * FROM Books WHERE Author = ”Freud“ )

Note: This method is here primarily for Rails integration. Note: This assumes, like SQL, that your column (i.e. field) names do not contain spaces.



4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
# File 'lib/QuickBaseClient.rb', line 4654

def doSQLQuery( sqlString, returnOptions = nil )

   ret = nil
   sql = sqlString.dup
   dbid = nil
   clist = nil
   slist = nil
   state = nil
   dbname = ""
   columns = []
   sortFields = []
   limit = nil
   offset = nil
   options = nil
   getRecordCount = false

   queryFields = []
   query = "{'["
   queryState = "getFieldName"
   queryField = ""
   
   sql.split(' ').each{ |token|
      case token
         when "SELECT" then state = "getColumns";next
         when "count(*)" then state = "getCount";next
         when "FROM" then state = "getTable";next
         when "WHERE" then state = "getFilter" ;next
         when "ORDER" then state = "getBy";next
         when "BY" then state = "getSort";next
         when "LIMIT" then state = "getLimit";next
         when "OFFSET" then state = "getOffset";next
      end
      if state == "getColumns"
         if token.index( "," )
            token.split(",").each{ |column| columns << column if column.length > 0 }
         else
            columns << "#{token} "
         end
      elsif state == "getCount"
         getRecordCount = true
      elsif state == "getTable"
         dbname = token.strip
      elsif state == "getFilter"
         if token == "AND"
            query.strip!
            query << "'}AND{'["
            queryState = "getFieldName"
         elsif token == "OR"
            query.strip!
            query << "'}OR{'["
            queryState = "getFieldName"
         elsif token == "="
            query << "]'.TV.'"
            queryState = "getFieldValue"
            queryFields << queryField
            queryField  = ""
         elsif token == "<>" or token == "!="
            query << "]'.XTV.'"
            queryState = "getFieldValue"
            queryFields << queryField
            queryField  = ""
         elsif queryState == "getFieldValue"
            fieldValue = token.dup
            if fieldValue[-2,2] == "')"
               fieldValue[-1,1] = ""
            end
            if fieldValue[-1] == "'"
               fieldValue.gsub!("'","")
               query << "#{fieldValue}"
            else   
               fieldValue.gsub!("'","")
               query << "#{fieldValue} "
            end
         elsif queryState == "getFieldName"
            fieldName = token.gsub("(","").gsub(")","").gsub( "#{dbname}.","")
            query << "#{fieldName}"
            queryField << "#{fieldName} "
         end
      elsif state == "getSort"
         if token.contains( "," )
            token.split(",").each{ |sortField| sortFields << sortField if sortField.length > 0 }
         else
            sortFields << "#{token} "
         end
      elsif state == "getLimit"
         limit = token.dup
         if options.nil?
            options = "num-#{limit}" 
         else
            options << ".num-#{limit}"
         end
      elsif state == "getOffset"   
         offset = token.dup
         if options.nil?
            options = "skp-#{offset}" 
         else
            options << ".skp-#{offset}"
         end
      end
   }
   
   if dbname and @dbid.nil?
      dbid = findDBByname( dbname )
   else
      dbid = lookupChdbid( dbname )
   end
   dbid ||= @dbid

   if dbid
      getDBInfo( dbid )
      getSchema( dbid )
      if columns.length > 0
         if columns[0] == "* "
            columns = getFieldNames( dbid )
         end
         columnNames = []
         columns.each{ |column|
            column.strip!
            fid = lookupFieldIDByName( column )
            if fid.nil? and column.match(/[0-9]+/)
               fid = column
               columnNames << lookupFieldNameFromID(fid)
            else   
               columnNames << column
            end
            if fid
               if clist
                  clist << ".#{fid}"
               else
                  clist = fid
               end
            end
         }
      end
      if sortFields.length > 0
         sortFields.each{ |sortField|
            sortField.strip!
            fid = lookupFieldIDByName( sortField )
            if fid.nil?
               fid = sortField if sortField.match(/[0-9]+/)
            end
            if fid 
               if slist
                  slist << ".#{fid}"
               else
                  slist = fid
               end
            end
         }
      end
      if queryFields.length > 0
         query.strip!
         query << "'}"
         queryFields.each{ |fieldName|
            fieldName.strip!
            fid = lookupFieldIDByName( fieldName )
            if fid
               query.gsub!( "'[#{fieldName} ]'", "'#{fid}'" )
            end
         }
      else
         query = nil
      end
      if getRecordCount 
         ret = getNumRecords(dbid)
      elsif returnOptions == :Hash
         ret = getAllValuesForFields(dbid, columnNames, query, nil, nil, clist, slist,"structured",options)
      elsif returnOptions == :Array
         ret = getAllValuesForFieldsAsArray(dbid, columnNames, query, nil, nil, clist, slist,"structured",options)
      else
         ret = doQuery( dbid, query, nil, nil, clist, slist, "structured", options )
      end
   end
   ret
end