Subject | How to query using isc_info_svc_svr_db_info service ? |
---|---|
Author | ece1a04 |
Post date | 2003-06-11T01:10:49Z |
I am writing a set of C library routines to manage the Interbase /
Firebird. I had tried with both Firebird 1.5 and interbase 6 to try
out the routines. When the isc_info_svc_svr_db_info item is placed
in the request table the returned value from the server are :
0x32 0x04 0x00 0x02 0x00 0x00 0x00 0x32 0x04 0x00 0x02 0x00 0x00
0x01 0x00 ..
The rest of the 100 byte dump are zeroes. By doing a manual
decoding 0x32(50) is the value for isc_info_svc_svr_db_info. This is
correct and is expected However the additional arguments of :
isc_spb_num_att , (0x05)
isc_spb_num_db , (0x06)
isc_spb_dbname (0x6A)
and isc_info_flag_end (0x7F)
are missing.
To test this out I have 2 processes attached to 2 separate
databases. I used IBConsole to check if it could detect the number
of attachment and databases. It could.
I have looked through ibx admin source code to see how it was done
and the codes doesn't differ much from what I have used. However in
the Ibx admin source code it checks for each of the arguments
following isc_info_svc_svr_db_info. If it is not present a parsing
error message is generated.
What am I doing wrong ? Is there something else that I need to do.
Please help ! Thanks.
Codes I used to extract the information . No error was generated at
the request stage (checked using (status[0] == 1 && status[1]))
I have changed my code to follow the IBX admin source code.
/* Extract data from result Buffer */
if (*p == isc_info_svc_svr_db_info)
{
p++ ; // move to next argument
NumberOfDatabases = 0 ;
NumberOfAttachments = 0 ;
if (*p != isc_spb_num_att)
{
GenerateParsingError() ;
return ;
}
p += sizeof(unsigned short);// point at isc_spb_num_att data
NumberOfAttachments = (unsigned long) isc_vax_integer(p,sizeof
(unsigned long)) ;
p += sizeof(unsigned long) ;// move to next argument
if (*p != isc_spb_num_db)
{
GenerateParsingError() ;
return ;
}
p += sizeof(unsigned short) ;
NumberOfDatabases = (unsigned long) isc_vax_integer(p , sizeof
(unsigned long)) ;
p += sizeof(unsigned long) ; // point to next argument.
if (*p != isc_spb_dbname)
{
GenerateParsingError() ;
return ;
}
i = 0 ;
// read in all the databases name
while (*p != isc_info_flag_end)
{
/* Data base name in use */
path_length = (unsigned short) isc_vax_integer(p, sizeof(unsigned
short)) ;
p += sizeof(unsigned short) ;
DBName[i] = (char *) malloc(path_length+1) ;
strncpy(DBName[i] , p , path_length) ;
DBName[i][path_length] = 0 ;
p += path_length ;
i++ ;
}
----- the rest of the code -----
Firebird. I had tried with both Firebird 1.5 and interbase 6 to try
out the routines. When the isc_info_svc_svr_db_info item is placed
in the request table the returned value from the server are :
0x32 0x04 0x00 0x02 0x00 0x00 0x00 0x32 0x04 0x00 0x02 0x00 0x00
0x01 0x00 ..
The rest of the 100 byte dump are zeroes. By doing a manual
decoding 0x32(50) is the value for isc_info_svc_svr_db_info. This is
correct and is expected However the additional arguments of :
isc_spb_num_att , (0x05)
isc_spb_num_db , (0x06)
isc_spb_dbname (0x6A)
and isc_info_flag_end (0x7F)
are missing.
To test this out I have 2 processes attached to 2 separate
databases. I used IBConsole to check if it could detect the number
of attachment and databases. It could.
I have looked through ibx admin source code to see how it was done
and the codes doesn't differ much from what I have used. However in
the Ibx admin source code it checks for each of the arguments
following isc_info_svc_svr_db_info. If it is not present a parsing
error message is generated.
What am I doing wrong ? Is there something else that I need to do.
Please help ! Thanks.
Codes I used to extract the information . No error was generated at
the request stage (checked using (status[0] == 1 && status[1]))
I have changed my code to follow the IBX admin source code.
/* Extract data from result Buffer */
if (*p == isc_info_svc_svr_db_info)
{
p++ ; // move to next argument
NumberOfDatabases = 0 ;
NumberOfAttachments = 0 ;
if (*p != isc_spb_num_att)
{
GenerateParsingError() ;
return ;
}
p += sizeof(unsigned short);// point at isc_spb_num_att data
NumberOfAttachments = (unsigned long) isc_vax_integer(p,sizeof
(unsigned long)) ;
p += sizeof(unsigned long) ;// move to next argument
if (*p != isc_spb_num_db)
{
GenerateParsingError() ;
return ;
}
p += sizeof(unsigned short) ;
NumberOfDatabases = (unsigned long) isc_vax_integer(p , sizeof
(unsigned long)) ;
p += sizeof(unsigned long) ; // point to next argument.
if (*p != isc_spb_dbname)
{
GenerateParsingError() ;
return ;
}
i = 0 ;
// read in all the databases name
while (*p != isc_info_flag_end)
{
/* Data base name in use */
path_length = (unsigned short) isc_vax_integer(p, sizeof(unsigned
short)) ;
p += sizeof(unsigned short) ;
DBName[i] = (char *) malloc(path_length+1) ;
strncpy(DBName[i] , p , path_length) ;
DBName[i][path_length] = 0 ;
p += path_length ;
i++ ;
}
----- the rest of the code -----