Comment 12 for bug 724217

Revision history for this message
Bob Blanchard (blabj) wrote :

This happens on 10.04.2 LTS (x86_64) linux 2.6.32-30-generic with OO 3.2.0 as well.

Its not just OO Base.. general OO Basic macro execution in OO Calc spreadsheets execute 4 to 5 times slower than with previous JRE (22).

As a test case - creating a JDBC database connection "datasource1" (be sure to install necessary java class files for particular databse) and use the following macro in a Calc spreadsheet:

REM ***** BASIC *****

Global Pipe_connectedDatabase As Boolean ' Are we connected to the database?
Global Pipe_dConn as Variant
Global Pipe_dStat as Variant

function pipe (f_s as string) as variant
    on error goto err_h

 Dim dataType As Long ' What type of data was returned by the database?
 dim url as String
 dim driver as String
 dim dBase as Variant
 dim oDB as Variant
 dim oManager as Variant
 dim oMetaData as Variant
 dim connArgs(0) As New com.sun.star.beans.PropertyValue
 ' These declarations below are for casting data types around in BASIC
 Dim tmpDouble As Double ' Temporary holder for a double datatype, for inserting into Any
 Dim tmpString As String ' Temporary holder for a string datatype, for inserting into Any

 ' Actual database query
 if Pipe_connectedDatabase = false then
        dBase = createUnoService("com.sun.star.sdb.DatabaseContext")
        oDB = dBase.getByName("datasource1")
        url = oDB.URL
        driver = oDB.Settings.JavaDriverClass
        oManager = createUnoService ("com.sun.star.sdbc.DriverManager")
        connArgs(0).name = "JavaDriverClass"
        connArgs(0).value = driver
        Pipe_dConn = oManager.getConnectionWithInfo (url, connArgs)
        Pipe_connectedDatabase = true
        Pipe_dStat = Pipe_dConn.createStatement()
    end if
 oSet = Pipe_dStat.executeQuery (f_s)

 ' Datatype casting logic
 if oSet.next () then
  ' Get a LONG representation of the type of data that was returned by the
  ' database
  dataType = oSet.getMetaData().getColumnType(1)
  Select Case dataType

   Case com.sun.star.sdbc.DataType.CHAR
    tmpString = RTrim(oSet.getString(1))
    ret_val = tmpString

   Case com.sun.star.sdbc.DataType.SMALLINT
    tmpDouble = oSet.getDouble(1)
    ret_val = tmpDouble

   Case com.sun.star.sdbc.DataType.INTEGER
    tmpDouble = oSet.getDouble(1)
    ret_val = tmpDouble

   Case com.sun.star.sdbc.DataType.DECIMAL
    tmpDouble = oSet.getDouble(1)
    ret_val = tmpDouble

   Case com.sun.star.sdbc.DataType.VARCHAR
    tmpString = RTrim(oSet.getString(1))
    ret_val = tmpString

   Case com.sun.star.sdbc.DataType.DATE
    tmpString = Trim(oSet.getString(1))
    ret_val = tmpString

   Case Else
    ' Insert unknown types as string
    tmpString = RTrim(oSet.getString(1))
    ret_val = tmpString

  End Select

 else
   ret_val = "##NULL##"
 end if
 pipe = ret_val
 exit function
err_h:

 if Pipe_connectedDatabase = true then
  Pipe_dConn.close()
  Pipe_connectedDatabase = false
 endif

 pipe = "##ERROR##"
 exit function
end function

To test it.. in a cell enter: =pipe("select count(*) from sometable")

(sometable being the name of actual database table)

This should return the number of rows and insert it in the cell as a value (If you only get ##ERROR## - suspect jdbc connectivity issue/java class path issue).

This alone doesn't reveal performance issue.. BUT.. copy and paste this to 1000 cells.. and compare the performance with 22 and 24.