office-gobmx/connectivity/workben/testmoz/mozthread.cxx
Tor Lillqvist 11c71842f6 Drop OS2
2011-05-21 16:26:08 +03:00

480 lines
15 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_connectivity.hxx"
#include <connectivity/sqlparse.hxx>
#include "connectivity/sqliterator.hxx"
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp>
#include <com/sun/star/sdbc/XResultSet.hpp>
#include <com/sun/star/sdbc/XResultSetMetaData.hpp>
#include <com/sun/star/sdbc/XRow.hpp>
#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/beans/PropertyState.hpp>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <unotools/processfactory.hxx>
#include <cppuhelper/servicefactory.hxx>
#include <com/sun/star/sdbc/XConnection.hpp>
#include <com/sun/star/sdbc/XDriver.hpp>
#include <com/sun/star/sdbc/XDriverAccess.hpp>
#include <com/sun/star/sdbcx/XRowLocate.hpp>
#include <com/sun/star/sdbc/XRowUpdate.hpp>
#include <com/sun/star/sdbc/XResultSetUpdate.hpp>
#include <com/sun/star/sdbcx/XDeleteRows.hpp>
#include <com/sun/star/sdbc/XCloseable.hpp>
#include <com/sun/star/sdb/XDatabaseEnvironment.hpp>
#include <com/sun/star/uno/Any.hxx>
#include "connectivity/sqlnode.hxx"
#include <ucbhelper/contentbroker.hxx>
#include <comphelper/regpathhelper.hxx>
#include <rtl/ustring.hxx>
#include <rtl/ustrbuf.hxx>
#include <osl/process.h>
#include <cppuhelper/bootstrap.hxx>
#include <cppuhelper/servicefactory.hxx>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/registry/XImplementationRegistration.hpp>
#include <com/sun/star/ucb/XContentProviderManager.hpp>
#include <ucbhelper/content.hxx>
#include <osl/module.h>
#include <tools/config.hxx>
#include <stdio.h>
#include <osl/thread.hxx>
#include <osl/diagnose.h>
#include <osl/conditn.hxx>
#include <time.h>
using namespace comphelper;
using namespace cppu;
using namespace com::sun::star::uno;
using namespace com::sun::star::lang;
using namespace com::sun::star::registry;
using namespace com::sun::star::ucb;
using namespace com::sun::star::beans;
using namespace connectivity;
using namespace com::sun::star::sdb;
using namespace com::sun::star::sdbc;
using namespace com::sun::star::sdbcx;
using namespace ::com::sun::star::container;
using namespace com::sun::star::registry;
using ::rtl::OUString;
using ::rtl::OUStringToOString;
extern Reference< XMultiServiceFactory > InitializeFac( void );
Reference< XMultiServiceFactory > mMgr;
#define OUtoCStr( x ) (OUStringToOString ( (x), RTL_TEXTENCODING_ASCII_US ).getStr())
#define PRINTSTR(x) printf("%s",x);
#define PRINTLN(x) printf("%s\n",x);
const int testLDAP=0;
const int testMozilla=1;
const int testOp=2;
const int testOe=3;
static int testCount = 0;
static int testList[4] = {0,0,0,0};
int autoTest(Reference<XResultSet> &xRes);
void printColumns( Reference<XResultSet> &xRes )
{
if(xRes.is())
{
char* aPat = " %-22s ";
char* aPat_Short = " %-12s ";
Reference<XResultSetMetaData> xMeta = Reference<XResultSetMetaDataSupplier>(xRes,UNO_QUERY)->getMetaData();
OSL_TRACE( "ColumnCount = %d\n", xMeta->getColumnCount());
for(sal_Int32 i=1;i<=xMeta->getColumnCount();++i)
{
const char *str = OUtoCStr(xMeta->getColumnName(i));
OSL_TRACE( aPat, str );
}
OSL_TRACE("\n");
OSL_TRACE("------------------------------------------------------------------------------------------\n");
}
else
{
OSL_TRACE(": FAILED to get a ResultSet \n");
}
}
void printXResultSet( Reference<XResultSet> &xRes )
{
if(xRes.is())
{
char* aPat = " %-22s ";
char* aPat_Short = " %-12s ";
Reference<XRow> xRow(xRes,UNO_QUERY);
Reference<XResultSetMetaData> xMeta = Reference<XResultSetMetaDataSupplier>(xRes,UNO_QUERY)->getMetaData();
for(sal_Int32 j=1;j<=xMeta->getColumnCount();++j)
{
try
{
const char *str = OUtoCStr(xRow->getString(j));
OSL_TRACE( aPat_Short, str );
} catch (...) {
OSL_TRACE(" Ex ");
}
}
OSL_TRACE("\n");
}
else
OSL_TRACE("FAILED to get a ResultSet \n");
}
void printXResultSets( Reference<XResultSet> &xRes )
{
if(xRes.is())
{
printColumns(xRes);
sal_Int32 nRows = 0;
while( xRes.is() && xRes->next())
{
printXResultSet(xRes);
nRows++;
}
OSL_TRACE( "%d Row(s)\n", nRows);
}else
OSL_TRACE("FAILED to get a ResultSet \n");
}
int TestMetaData(Reference< ::com::sun::star::sdbc::XConnection> &pConnection)
{
// Test some metadata
Reference< XDatabaseMetaData > xDmd = pConnection->getMetaData();
if ( xDmd.is() )
{
OSL_TRACE(": got DatabaseMetaData \n");
OUString sQuoteStr = xDmd->getIdentifierQuoteString();
OSL_TRACE( "Quote String : '%s'\n", OUtoCStr( sQuoteStr ) );
OUString sSQLCmds = xDmd->getSQLKeywords();
OSL_TRACE( "SQL Commands : '%s'\n", OUtoCStr( sSQLCmds ) );
OSL_TRACE("Testing getColumns() : START\n");
{
Reference<XResultSet> xRes = xDmd->getColumns(
makeAny(OUString(RTL_CONSTASCII_USTRINGPARAM(""))), // Catalog
OUString(RTL_CONSTASCII_USTRINGPARAM("%")), // Schema
OUString(RTL_CONSTASCII_USTRINGPARAM("%")), // TabName
OUString(RTL_CONSTASCII_USTRINGPARAM("%"))
);
printXResultSets( xRes );
}
OSL_TRACE("Testing getColumns() : END\n");
OSL_TRACE("Testing getTypeInfo() : START\n");
{
Reference<XResultSet> xRes = xDmd-> getTypeInfo();
printXResultSets( xRes );
}
OSL_TRACE("Testing getTypeInfo() : END\n");
OSL_TRACE("Testing getTables() : START\n");
{
Reference<XResultSet> xRes = xDmd->getTables(
makeAny(OUString(RTL_CONSTASCII_USTRINGPARAM(""))), // Catalog
OUString(RTL_CONSTASCII_USTRINGPARAM("%")), // Schema
OUString(RTL_CONSTASCII_USTRINGPARAM("%")), // TabName
Sequence<rtl::OUString>() );
printXResultSets( xRes );
}
OSL_TRACE("Testing getTables() : END\n");
}
else
OSL_TRACE(": FAILED to get DatabaseMetaData \n");
return 0;
}
void TestQuery(Reference< ::com::sun::star::sdbc::XConnection> &pConnection)
{
// Try a query
OSL_TRACE("Testing createStatement() & executeQuery() : START\n");
Reference<XStatement> xStmt = pConnection->createStatement();
Reference<XResultSet> xRes;
if(xStmt.is())
{
OSL_TRACE(": got statement\n");
OSL_TRACE(": excuteQuery() : START \n");
// SELECT "First Name", "Display Name", "E-mail" FROM tablename
OUString sqlPrefix(RTL_CONSTASCII_USTRINGPARAM("SELECT \"First Name\", \"Display Name\", \"E-mail\" FROM "));
try
{
sal_Int32 times=0;
Reference< XDatabaseMetaData > xDmd = pConnection->getMetaData();
if ( xDmd.is() )
{
OSL_TRACE("getTables() : START\n");
OUString qut = xDmd->getIdentifierQuoteString();
Reference<XResultSet> xRes = xDmd->getTables(
makeAny(OUString(RTL_CONSTASCII_USTRINGPARAM(""))), // Catalog
OUString(RTL_CONSTASCII_USTRINGPARAM("%")), // Schema
OUString(RTL_CONSTASCII_USTRINGPARAM("%")), // TabName
Sequence<rtl::OUString>() );
sal_Int32 nTables = 0;
while( xRes.is() && xRes->next())
{
Reference<XRow> xRow(xRes,UNO_QUERY);
const char *strTableName = OUtoCStr(xRow->getString(3));
OSL_TRACE("Testing Table:%s\n",strTableName);
Reference<XResultSet> tmpRes =
xStmt->executeQuery(sqlPrefix + qut + xRow->getString(3) + qut);
autoTest( tmpRes );
Reference<XCloseable> clsRes(tmpRes,UNO_QUERY);
clsRes->close();
nTables++;
}
OSL_TRACE("Tested Tables:%d\n",nTables);
}
} catch ( Exception &e ) {
OSL_TRACE( "Exception caught : %s\n", OUtoCStr( e.Message) );
}
// catch (...) {
// OSL_TRACE( "Non-UNO Exception caught\n" );
// }
OSL_TRACE("excuteQuery() : END \n");
}
else
{
OSL_TRACE(": FAILED to get statement\n");
}
OSL_TRACE("Testing createStatement() & executeQuery() : END\n");
}
Reference< ::com::sun::star::sdbc::XConnection> TestConnected
(Reference< ::com::sun::star::sdbc::XDriver> &pDriver)
{
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> pConnection;
OSL_TRACE("Begin Connect!\n");
OUString url;
Sequence<PropertyValue> aValue;
int nType=0;
srand( (unsigned)time( NULL ) );
nType = rand() % testCount + 1;
int nIndex=0,nCount=0;
for ( nIndex = 0; nIndex< 4;nIndex++)
{
if (testList[nIndex])
nCount++;
if (nCount == nType)
break;
}
switch( nIndex)
{
case testLDAP:
url=OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:address:ldap://"));
aValue.realloc(2);
aValue[0].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HostName"));
aValue[0].Value <<= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sun-ds"));
aValue[1].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BaseDN"));
aValue[1].Value <<= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("dc=sun,dc=com"));
break;
case testMozilla:
url=OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:address:mozilla://"));
break;
case testOp:
url=OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:address:outlook://"));
break;
case testOe:
url=OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:address:outlookexp://"));
break;
default:
url=OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:address:mozilla://"));
break;
}
pConnection =
pDriver->connect(url,aValue);
return pConnection;
}
int autoTest(Reference<XResultSet> &xRes)
{
printColumns(xRes);
if(xRes.is())
{
sal_Int32 nRows = 0;
while( xRes.is() && xRes->next())
{
nRows++;
}
OSL_TRACE( "%d Row(s)\n", nRows);
sal_Int32 times;
sal_Int32 pos;
if (nRows)
{
for(times = 1;times < 10; times ++)
{
pos= rand() % nRows+1;
OSL_TRACE("pos:%d\n",pos);
xRes->absolute(pos);
printXResultSet(xRes);
}
}
}
else
{
OSL_TRACE(": FAILED to get a ResultSet \n");
}
TimeValue timeValue = { 1, 0 }; //sleep 1 Seconds to give time to other threads
osl_waitThread(&timeValue);
return 0;
}
void SAL_CALL mozThread(void*)
{
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> m_xConnection;
try
{
Reference< ::com::sun::star::sdbc::XDriver>
m_xDriver(mMgr->createInstance(
OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.sdbc.MozabDriver"))),
UNO_QUERY);
if(m_xDriver.is())
{
m_xConnection = TestConnected(m_xDriver);
if(m_xConnection.is())
{
if (!TestMetaData(m_xConnection))
{
TestQuery(m_xConnection);
}
}
else
OSL_TRACE("Can't connected!\n");
}
else
{
OSL_TRACE("No driver!\n");
}
} catch ( Exception &e ) {
OSL_TRACE( "Exception caught : %s\n", OUtoCStr( e.Message) );
}
// catch (...) {
// OSL_TRACE( "Non-UNO Exception caught\n" );
// }
}
const int THREAD_COUNT=100;
void usage()
{
PRINTLN("mozThread [opts] threadcount");
PRINTLN("opts:");
PRINTLN("-l test ldap");
PRINTLN("-m test mozilla");
PRINTLN("-p test outlook");
PRINTLN("-e test outlook express");
PRINTLN("0 < threadcount <= 100, default 100");
}
#if (defined UNX)
int main( int argc, char * argv[] )
#else
int _cdecl main( int argc, char * argv[] )
#endif
{
OSL_TRACE("Init UNO\n");
Reference< XMultiServiceFactory > xMgr =InitializeFac();
int threadCount=THREAD_COUNT;
int nAc;
for (nAc = 1; nAc < argc; nAc ++)
{
if (strcmp(argv[nAc],"-l") ==0)
{
testList[testLDAP] = 1;
}else if(strcmp(argv[nAc],"-m") ==0)
{
testList[testMozilla]=1;
}else if(strcmp(argv[nAc],"-p") ==0)
{
testList[testOp]=1;
}else if(strcmp(argv[nAc],"-e") ==0)
{
testList[testOe]=1;
}else if(strcmp(argv[nAc],"-h") ==0 || strcmp(argv[nAc],"--help") ==0)
{
usage();
return 0;
}else
{
int tmpCount = atoi(argv[nAc]);
if (tmpCount > 0 && tmpCount < threadCount)
{
threadCount = tmpCount;
}
}
}
testCount = testList[testLDAP] + testList[testMozilla] + testList[testOp] + testList[testOe];
if ( testCount == 0)
{
testList[testLDAP] = 1;
testCount = 1;
}
if (!xMgr.is())
{
OSL_TRACE("Error init UNO\n");
return 1;
}
else
OSL_TRACE("UNO initted\n");
mMgr = xMgr;
oslThread xThreads[THREAD_COUNT];
int index=0;
for(index=0;index < threadCount; index++)
{
xThreads[index] = osl_createThread(mozThread,(void*)NULL);
TimeValue timeValue = { 1, 0 }; //sleep 1 Seconds to give time to other threads
osl_waitThread(&timeValue);
}
for(index=0;index < threadCount; index++)
{
if (osl_isThreadRunning(xThreads[index]))
osl_joinWithThread(xThreads[index]);
}
OSL_TRACE("Exiting...\n");
return 0;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */