1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef CONNECTIVITY_HSQLDB_ACCESSLOG_HXX
25*b1cdbd2cSJim Jagielski #define CONNECTIVITY_HSQLDB_ACCESSLOG_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #ifdef HSQLDB_DBG
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <stdio.h>
30*b1cdbd2cSJim Jagielski #include <jni.h>
31*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
32*b1cdbd2cSJim Jagielski #include <rtl/string.hxx>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski namespace connectivity { namespace hsqldb
35*b1cdbd2cSJim Jagielski {
36*b1cdbd2cSJim Jagielski     class LogFile
37*b1cdbd2cSJim Jagielski     {
38*b1cdbd2cSJim Jagielski     private:
39*b1cdbd2cSJim Jagielski         ::rtl::OUString     m_sFileName;
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski     public:
42*b1cdbd2cSJim Jagielski         LogFile( JNIEnv* env, jstring streamName, const sal_Char* _pAsciiSuffix );
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski     public:
45*b1cdbd2cSJim Jagielski                 void    writeString( const sal_Char* _pString, bool _bEndLine = true );
create()46*b1cdbd2cSJim Jagielski                 void    create() { getLogFile(); }
47*b1cdbd2cSJim Jagielski         virtual void    close();
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski     protected:
50*b1cdbd2cSJim Jagielski         FILE*&  getLogFile();
51*b1cdbd2cSJim Jagielski     };
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski     class OperationLogFile : public LogFile
54*b1cdbd2cSJim Jagielski     {
55*b1cdbd2cSJim Jagielski     public:
OperationLogFile(JNIEnv * env,jstring streamName,const sal_Char * _pAsciiSuffix)56*b1cdbd2cSJim Jagielski         OperationLogFile( JNIEnv* env, jstring streamName, const sal_Char* _pAsciiSuffix )
57*b1cdbd2cSJim Jagielski             :LogFile( env, streamName, ( ::rtl::OString( _pAsciiSuffix ) += ".op" ).getStr() )
58*b1cdbd2cSJim Jagielski         {
59*b1cdbd2cSJim Jagielski         }
60*b1cdbd2cSJim Jagielski 
logOperation(const sal_Char * _pOp)61*b1cdbd2cSJim Jagielski         void logOperation( const sal_Char* _pOp )
62*b1cdbd2cSJim Jagielski         {
63*b1cdbd2cSJim Jagielski             writeString( _pOp, true );
64*b1cdbd2cSJim Jagielski         }
65*b1cdbd2cSJim Jagielski 
logOperation(const sal_Char * _pOp,jlong _nLongArg)66*b1cdbd2cSJim Jagielski         void logOperation( const sal_Char* _pOp, jlong _nLongArg )
67*b1cdbd2cSJim Jagielski         {
68*b1cdbd2cSJim Jagielski             ::rtl::OString sLine( _pOp );
69*b1cdbd2cSJim Jagielski             sLine += "( ";
70*b1cdbd2cSJim Jagielski             sLine += ::rtl::OString::valueOf( _nLongArg );
71*b1cdbd2cSJim Jagielski             sLine += " )";
72*b1cdbd2cSJim Jagielski             writeString( sLine.getStr(), true );
73*b1cdbd2cSJim Jagielski         }
74*b1cdbd2cSJim Jagielski 
logReturn(jlong _nRetVal)75*b1cdbd2cSJim Jagielski         void logReturn( jlong _nRetVal )
76*b1cdbd2cSJim Jagielski         {
77*b1cdbd2cSJim Jagielski             ::rtl::OString sLine( " -> " );
78*b1cdbd2cSJim Jagielski             sLine += ::rtl::OString::valueOf( _nRetVal );
79*b1cdbd2cSJim Jagielski             writeString( sLine.getStr(), true );
80*b1cdbd2cSJim Jagielski         }
81*b1cdbd2cSJim Jagielski 
logReturn(jint _nRetVal)82*b1cdbd2cSJim Jagielski         void logReturn( jint _nRetVal )
83*b1cdbd2cSJim Jagielski         {
84*b1cdbd2cSJim Jagielski             ::rtl::OString sLine( " -> " );
85*b1cdbd2cSJim Jagielski             sLine += ::rtl::OString::valueOf( _nRetVal );
86*b1cdbd2cSJim Jagielski             writeString( sLine.getStr(), true );
87*b1cdbd2cSJim Jagielski         }
88*b1cdbd2cSJim Jagielski 
close()89*b1cdbd2cSJim Jagielski         virtual void close()
90*b1cdbd2cSJim Jagielski         {
91*b1cdbd2cSJim Jagielski             writeString( "-------------------------------", true );
92*b1cdbd2cSJim Jagielski             writeString( "", true );
93*b1cdbd2cSJim Jagielski             LogFile::close();
94*b1cdbd2cSJim Jagielski         }
95*b1cdbd2cSJim Jagielski     };
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski     class DataLogFile : public LogFile
98*b1cdbd2cSJim Jagielski     {
99*b1cdbd2cSJim Jagielski     public:
DataLogFile(JNIEnv * env,jstring streamName,const sal_Char * _pAsciiSuffix)100*b1cdbd2cSJim Jagielski         DataLogFile( JNIEnv* env, jstring streamName, const sal_Char* _pAsciiSuffix )
101*b1cdbd2cSJim Jagielski             :LogFile( env, streamName, _pAsciiSuffix )
102*b1cdbd2cSJim Jagielski         {
103*b1cdbd2cSJim Jagielski         }
104*b1cdbd2cSJim Jagielski 
write(jint value)105*b1cdbd2cSJim Jagielski         void write( jint value )
106*b1cdbd2cSJim Jagielski         {
107*b1cdbd2cSJim Jagielski 			fputc( value, getLogFile() );
108*b1cdbd2cSJim Jagielski             fflush( getLogFile() );
109*b1cdbd2cSJim Jagielski         }
110*b1cdbd2cSJim Jagielski 
write(const sal_Int8 * buffer,sal_Int32 bytesRead)111*b1cdbd2cSJim Jagielski         void write( const sal_Int8* buffer, sal_Int32 bytesRead )
112*b1cdbd2cSJim Jagielski         {
113*b1cdbd2cSJim Jagielski 			fwrite( buffer, sizeof(sal_Int8), bytesRead, getLogFile() );
114*b1cdbd2cSJim Jagielski             fflush( getLogFile() );
115*b1cdbd2cSJim Jagielski         }
116*b1cdbd2cSJim Jagielski 
seek(sal_Int64 pos)117*b1cdbd2cSJim Jagielski         sal_Int64 seek( sal_Int64 pos )
118*b1cdbd2cSJim Jagielski         {
119*b1cdbd2cSJim Jagielski             FILE* pFile = getLogFile();
120*b1cdbd2cSJim Jagielski             fseek( pFile, 0, SEEK_END );
121*b1cdbd2cSJim Jagielski             if ( ftell( pFile ) < pos )
122*b1cdbd2cSJim Jagielski             {
123*b1cdbd2cSJim Jagielski                 sal_Int8 filler( 0 );
124*b1cdbd2cSJim Jagielski                 while ( ftell( pFile ) < pos )
125*b1cdbd2cSJim Jagielski                     fwrite( &filler, sizeof( sal_Int8 ), 1, pFile );
126*b1cdbd2cSJim Jagielski                 fflush( pFile );
127*b1cdbd2cSJim Jagielski             }
128*b1cdbd2cSJim Jagielski             fseek( pFile, pos, SEEK_SET );
129*b1cdbd2cSJim Jagielski             return ftell( pFile );
130*b1cdbd2cSJim Jagielski         }
131*b1cdbd2cSJim Jagielski 
tell()132*b1cdbd2cSJim Jagielski         sal_Int64 tell()
133*b1cdbd2cSJim Jagielski         {
134*b1cdbd2cSJim Jagielski             return ftell( getLogFile() );
135*b1cdbd2cSJim Jagielski         }
136*b1cdbd2cSJim Jagielski     };
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski } }
139*b1cdbd2cSJim Jagielski #endif
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski #endif // CONNECTIVITY_HSQLDB_ACCESSLOG_HXX
142