Announcement

Collapse
No announcement yet.

Mysql Interface.

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mysql Interface.

    Hi,
    I am looking for a copy of PBMySQL.inc. I have found a copy
    in the archives but it does not work. It almost does but has a
    problem with returning field contents and field headings. The
    problem is the use of MemoryMove function which does not work.

    lMYSQL_FIELD = mysql_fetch_field_direct(MYSQL_RES, lField)
    IF lMYSQL_FIELD = 0 THEN EXIT FUNCTION

    MoveMemory lpName, BYVAL lMYSQL_FIELD, %LONG_SIZE
    PRINT lpName;"----------"
    IF lpName = 0 THEN EXIT FUNCTION

    My understanding is that the mysql_fetch_field_direct returns a
    pointer whichn then copied by using MoveMemory which does not
    work. If someone could help it would be appreciated.


    ------------------

  • #2
    MoveMemory() requires pointers for it's 1st two parameters. Personally, I find that using POKE$ is easier, but it's more a matter of programming style.

    The exact format will depend of the data type you are passing a pointer to. For dynamic strings, use BYVAL STRPTR(). For other variable types, use BYVAL VARPTR().

    Some examples:
    Code:
    DIM a$, b$
    a$ = "source data"
    b$ = SPACE$(11)
    MoveMemory BYVAL STRPTR(b$), BYVAL STRPTR(a$), LEN(a$)
     
    DIM X AS ASCIIZ * 1024
    DIM Y AS ASCIIZ * 1024
    ' Fill X here
    MoveMemory BYVAL VARPTR(Y), BYVAL VARPTR(X), LEN(X) ' or use SIZEOF(X) to copy the whole 1024 bytes.
    Now looking at your small code snippet:
    Code:
    MoveMemory lpName, BYVAL lMYSQL_FIELD, %LONG_SIZE
    If I can assume that lpName is a LONG or DWORD containing a pointer to the target memory buffer, and lMYSQL_FIELD is a UDT containg the data to copy, then the MoveMemory() call would look like this:
    Code:
    MoveMemory BYVAL lpName, BYVAL VARPTR(lMYSQL_FIELD), %LONG_SIZE
    That said, you can do the exact same thing with POKE$/PEEK$, thus:
    Code:
    POKE$ lpName, PEEK$(VARPTR(LMYSQL_FIELD), %LONG_SIZE)
    And we can simplify that even more:
    Code:
    POKE$ lpName, LMYSQL_FIELD
    Clear as mud?




    ------------------
    Lance
    PowerBASIC Support
    mailto:[email protected][email protected]</A>
    Lance
    mailto:[email protected]

    Comment


    • #3
      Thanks for the reply but no luck. The problem has to be something
      That I am just no seeing. I tried your suggestions and I got an
      invalid page fault. So I have enclosed the source I have so far.
      Code:
            %LONG_SIZE = 4
            %INT_SIZE = 2
            %BYTE_SIZE = 1
      '===============================================================================================
      '========= public declarations  =================================================================
      '===============================================================================================
            %MYSQL_OPT_CONNECT_TIMEOUT = 0
            %MYSQL_OPT_COMPRESS = 1
            %MYSQL_OPT_NAMED_PIPE = 2
            %MYSQL_INIT_COMMAND = 3
            %MYSQL_READ_DEFAULT_FILE = 4
            %MYSQL_READ_DEFAULT_GROUP = 5
            %MYSQL_SET_CHARSET_DIR = 6
            %MYSQL_SET_CHARSET_NAME = 7
            %CLIENT_LONG_PASSWORD = 1 'new more secure passwords
            %CLIENT_FOUND_ROWS = 2 'Found instead of affected rows
            %CLIENT_LONG_FLAG = 4 'Get all column flags
            %CLIENT_CONNECT_WITH_DB = 8 'One can specify db on connect
            %CLIENT_NO_SCHEMA = 16 'Don't allow database.table.column
            %CLIENT_COMPRESS = 32 'Can use compression protocol
            %CLIENT_ODBC = 64 'Odbc client
            %CLIENT_LOCAL_FILES = 128 'Can use LOAD DATA LOCAL
            %CLIENT_IGNORE_SPACE = 256 'Ignore spaces before '('
            %CLIENT_CHANGE_USER = 512 'Support the mysql_change_user()
            %CLIENT_INTERACTIVE = 1024 'This is an interactive client
            %CLIENT_SSL = 2048 'Switch to SSL after handshake
            %CLIENT_IGNORE_SIGPIPE = 4096 'IGNORE sigpipes
            %CLIENT_TRANSACTIONS = 8196 'Client knows about transactions
      
      'DECLARE SUB MoveMemory LIB "kernel32.dll" ALIAS "RtlMoveMemory" (lpDestination AS LONG, lpSource AS LONG, BYVAL lLength AS LONG)
      
      'connection management routines
      DECLARE SUB mysql_close LIB "libmySQL.DLL" ALIAS "mysql_close" (BYVAL lMYSQL AS LONG)
      DECLARE FUNCTION mysql_init LIB "libmySQL.DLL" ALIAS "mysql_init" (BYVAL lMYSQL AS LONG) AS LONG
      DECLARE FUNCTION mysql_options LIB "libmySQL.DLL" ALIAS "mysql_options" (BYVAL lMYSQL AS LONG, BYVAL lOption AS LONG, sArg AS ASCIIZ) AS LONG
      DECLARE FUNCTION mysql_ping LIB "libmySQL.DLL" ALIAS "mysql_ping" (BYVAL lMYSQL AS LONG) AS LONG
      DECLARE FUNCTION mysql_real_connect LIB "libmySQL.DLL" ALIAS "mysql_real_connect" (BYVAL lMYSQL AS LONG, sHostName AS ASCIIZ, sUserName AS ASCIIZ, sPassword AS ASCIIZ, sDbName AS ASCIIZ, BYVAL lPortNum AS LONG, sSocketName AS ASCIIZ, BYVAL lFlags AS  _
      LONG) AS LONG
      
      'status and error-reporting routines
      DECLARE FUNCTION mysql_errno LIB "libmySQL.DLL" ALIAS "mysql_errno" (BYVAL lMYSQL AS LONG) AS LONG
      DECLARE FUNCTION mysql_error LIB "libmySQL.DLL" ALIAS "mysql_error" (BYVAL lMYSQL AS LONG) AS LONG
      
      'query contruction and execution routines
      DECLARE FUNCTION mysql_query LIB "libmySQL.DLL" ALIAS "mysql_query" (BYVAL lMYSQL AS LONG, sQueryString AS ASCIIZ) AS LONG
      DECLARE FUNCTION mysql_select_db LIB "libmySQL.DLL" ALIAS "mysql_select_db" (BYVAL lMYSQL AS LONG, sDbName AS ASCIIZ) AS LONG
      
      'result set processing routines
      DECLARE FUNCTION mysql_affected_rows LIB "libmySQL.DLL" ALIAS "mysql_affected_rows" (BYVAL lMYSQL_RES AS LONG) AS LONG
      DECLARE SUB mysql_data_seek LIB "libmySQL.DLL" ALIAS "mysql_data_seek" (BYVAL lMYSQL_RES AS LONG, BYVAL lOffset AS CURRENCY)
      DECLARE FUNCTION mysql_fetch_field_direct LIB "libmySQL.DLL" ALIAS "mysql_fetch_field_direct" (BYVAL lMYSQL_RES AS LONG, BYVAL lFieldNum AS LONG) AS LONG
      DECLARE FUNCTION mysql_fetch_lengths LIB "libmySQL.DLL" ALIAS "mysql_fetch_lengths" (BYVAL lMYSQL_RES AS LONG) AS LONG
      DECLARE FUNCTION mysql_fetch_row LIB "libmySQL.DLL" ALIAS "mysql_fetch_row" (BYVAL lMYSQL_RES AS LONG) AS LONG
      DECLARE FUNCTION mysql_field_count LIB "libmySQL.DLL" ALIAS "mysql_field_count" (BYVAL lMYSQL AS LONG) AS LONG
      DECLARE SUB mysql_free_result LIB "libmySQL.DLL" ALIAS "mysql_free_result" (BYVAL lMYSQL AS LONG)
      DECLARE FUNCTION mysql_info LIB "libmySQL.DLL" ALIAS "mysql_info" (BYVAL lMYSQL AS LONG) AS LONG
      DECLARE FUNCTION mysql_insert_id LIB "libmySQL.DLL" ALIAS "mysql_insert_id" (BYVAL lMYSQL AS LONG) AS LONG
      DECLARE FUNCTION mysql_num_fields LIB "libmySQL.DLL" ALIAS "mysql_num_fields" (BYVAL lMYSQL_RES AS LONG) AS LONG
      DECLARE FUNCTION mysql_num_rows LIB "libmySQL.DLL" ALIAS "mysql_num_rows" (BYVAL lMYSQL_RES AS LONG) AS LONG
      DECLARE FUNCTION mysql_store_result LIB "libmySQL.DLL" ALIAS "mysql_store_result" (BYVAL lMYSQL AS LONG) AS LONG
      DECLARE FUNCTION mysql_use_result LIB "libmySQL.DLL" ALIAS "mysql_use_result" (BYVAL lMYSQL AS LONG) AS LONG
      
      FUNCTION GetFieldName(BYVAL lField AS LONG, BYVAL MYSQL_RES AS LONG) AS STRING
            LOCAL b AS BYTE
            LOCAL sVal AS STRING
            DIM lMYSQL_FIELD AS LONG  'pointer to mysql field structure
            DIM lpName AS LONG    'pointer to field name
      
            lMYSQL_FIELD = mysql_fetch_field_direct(MYSQL_RES, lField)
            IF lMYSQL_FIELD = 0 THEN EXIT FUNCTION
      
            'MoveMemory lpName, BYVAL lMYSQL_FIELD, %LONG_SIZE
            'MoveMemory BYVAL lpName, BYVAL VARPTR(lMYSQL_FIELD), %LONG_SIZE
            POKE lpName, lMYSQL_FIELD
      
            PRINT lpName;"----------"
            'IF lpName = 0 THEN EXIT FUNCTION
      
            sVal = ""
            DO
              'MoveMemory b, BYVAL lMYSQL_FIELD, %BYTE_SIZE
              'b = @lMYSQL_FIELD
              PRINT b;"___________"
              IF b = 0 THEN EXIT DO
              sVal = sVal & CHR$(b)
              lpName = lpName + %BYTE_SIZE
              INCR lMYSQL_FIELD
            LOOP
            GetFieldName = sVal
      END FUNCTION
      
      FUNCTION GetFieldValue(BYVAL lField AS LONG, BYVAL MYSQL_FIELD_LENGTHS AS LONG, BYVAL MYSQL_ROW AS LONG) AS STRING
      
            DIM lTmpChar AS LONG, lCurLen AS LONG
            DIM lRowData AS LONG
            DIM b AS BYTE
            DIM sVal AS STRING
      
            MoveMemory lRowData, BYVAL (MYSQL_ROW + (%LONG_SIZE * lField)), %LONG_SIZE
            MoveMemory lCurLen, BYVAL (MYSQL_FIELD_LENGTHS + (%LONG_SIZE * lField)),%LONG_SIZE
            IF lRowData = 0 THEN
              'null pointer
              GetFieldValue = ""
            ELSE
              sVal = ""
              FOR lTmpChar = 1 TO lCurLen
              MoveMemory b, BYVAL (lRowData + (%BYTE_SIZE * (lTmpChar - 1))), %BYTE_SIZE
              sVal = sVal & CHR$(b)
              NEXT lTmpChar
            GetFieldValue = sVal
            END IF
      END FUNCTION
      *UUB tags added by Administrator
      ------------------

      Comment


      • #4
        Is 'lMYSQL_FIELD' the same "width" as %LONG_SIZE (ie, 4 bytes)?

        If not, you'll have to use the POKE$+PEEK$ version I posted to ensure you do not overwrite more bytes than allowed.

        Otherwise, at what point does it GPF? Can you run it in the debugger (Animate mode) to find the exact point of failure?

        Beyond this, the problem is likely to be invalid pointer addresses, in which case, you'll need to do some deeper debugging.

        ------------------
        Lance
        PowerBASIC Support
        mailto:[email protected][email protected]</A>
        Lance
        mailto:[email protected]

        Comment


        • #5
          Hi

          please show how you are calling the GetFieldValue() and GetFieldName()
          functions.

          Cheers

          Florent

          ------------------

          Comment


          • #6
            The include file you're using seems to be a translation from
            visual basic (the CopyMemory stuff should not be necessary).

            Here's an example (I adapted the file you're using to reflect
            the original C api). The file is incomplete since I don't have
            the time to translate everything but it should give you an idea...

            Code:
            #IF 0
            **************************************************************************
            * ' Ported to PowerBASIC by Florent Heyworth - 17-Sep-2001 (incomplete)
            * '
            * '/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
            * '   
            * '   This library is free software; you can redistribute it and/or
            * '   modify it under the terms of the GNU Library General Public
            * '   License as published by the Free Software Foundation; either
            * '   version 2 of the License, or (at your option) any later version.
            * '   
            * '   This library 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
            * '   Library General Public License for more details.
            * '   
            * '   You should have received a copy of the GNU Library General Public
            * '   License along with this library; if not, write to the Free
            * '   Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
            * '   MA 02111-1307, USA */
            * '
            *************************************************************************
            #ENDIF
             
            'mysql_option enum
            %MYSQL_OPT_CONNECT_TIMEOUT 	= 0
            %MYSQL_OPT_COMPRESS 		= 1
            %MYSQL_OPT_NAMED_PIPE 		= 2
            %MYSQL_INIT_COMMAND 		= 3
            %MYSQL_READ_DEFAULT_FILE 	= 4
            %MYSQL_READ_DEFAULT_GROUP 	= 5
            %MYSQL_SET_CHARSET_DIR 		= 6
            %MYSQL_SET_CHARSET_NAME 	= 7
             
            'mysql_status enum
            %MYSQL_STATUS_READY 		= 0
            %MYSQL_STATUS_GET_RESULT	= 1
            %MYSQL_STATUS_USE_RESULT	= 2
             
            %MYSQL_ERRMSG_SIZE			= 200
             
            %CLIENT_LONG_PASSWORD = 1                               'new more secure passwords
            %CLIENT_FOUND_ROWS = 2                                  'Found instead of affected rows
            %CLIENT_LONG_FLAG = 4                                   'Get all column flags
            %CLIENT_CONNECT_WITH_DB = 8                             'One can specify db on connect
            %CLIENT_NO_SCHEMA = 16                                  'Don't allow database.table.column
            %CLIENT_COMPRESS = 32                                   'Can use compression protocol
            %CLIENT_ODBC = 64                                       'Odbc client
            %CLIENT_LOCAL_FILES = 128                               'Can use LOAD DATA LOCAL
            %CLIENT_IGNORE_SPACE = 256                              'Ignore spaces before '('
            %CLIENT_CHANGE_USER = 512                               'Support the mysql_change_user()
            %CLIENT_INTERACTIVE = 1024                              'This is an interactive client
            %CLIENT_SSL = 2048                                      'Switch to SSL after handshake
            %CLIENT_IGNORE_SIGPIPE = 4096                           'IGNORE sigpipes
            %CLIENT_TRANSACTIONS = 8196                             'Client knows about transactions
             
            'enum field types
            %FIELD_TYPE_DECIMAL		= 0
            %FIELD_TYPE_TINY    	= 1
            %FIELD_TYPE_SHORT		= 2
            %FIELD_TYPE_LONG		= 3
            %FIELD_TYPE_FLOAT		= 4
            %FIELD_TYPE_DOUBLE		= 5
            %FIELD_TYPE_NULL		= 6
            %FIELD_TYPE_TIMESTAMP	= 7
            %FIELD_TYPE_LONGLONG	= 8
            %FIELD_TYPE_INT24		= 9
            %FIELD_TYPE_DATE		= 10
            %FIELD_TYPE_TIME		= 11
            %FIELD_TYPE_DATETIME	= 12
            %FIELD_TYPE_YEAR		= 13
            %FIELD_TYPE_NEWDATE		= 14
            %FIELD_TYPE_ENUM		=247
            %FIELD_TYPE_SET			=248
            %FIELD_TYPE_TINY_BLOB	=249
            %FIELD_TYPE_MEDIUM_BLOB	=250
            %FIELD_TYPE_LONG_BLOB	=251
            %FIELD_TYPE_BLOB		=252
            %FIELD_TYPE_VAR_STRING	=253
            %FIELD_TYPE_STRING		=254
             
            TYPE T_USED_MEM				'/* struct for once_alloc */  
            	ptNext AS T_USED_MEM PTR   '/* Next block in use */      
            	dwLeft AS DWORD         '/* memory left in block  */  
            	dwSize AS DWORD         '/* size of block */          
            END TYPE
             
            TYPE T_MEM_ROOT
            	ptFree AS T_USED_MEM PTR
            	ptUsed AS T_USED_MEM PTR
            	ptPreAlloc AS T_USED_MEM PTR
            	dwMinMalloc AS DWORD
            	dwBlockSize AS DWORD
            END TYPE
             
            TYPE T_MYSQL_OPTIONS
            	dwConnectTimeout AS DWORD
            	dwClientFlag AS DWORD
            	bFlagCompress AS BYTE
            	bFlagNamedPipe AS BYTE
            	pszHost AS ASCIIZ PTR
            	pszInitCommand AS ASCIIZ PTR
            	pszUser AS ASCIIZ PTR
            	pszPassword AS ASCIIZ PTR
            	pszUnixSocket AS ASCIIZ PTR
            	pszDb AS ASCIIZ PTR
            	pszMyConfFile AS ASCIIZ PTR
            	pszMyConfGroup AS ASCIIZ PTR
            	pszCharsetDir AS ASCIIZ PTR
            	pszCharsetName AS ASCIIZ PTR
            	bFlagUseSSL AS BYTE				'/* if to use SSL or not */  
            	pszSSLKey AS ASCIIZ PTR         '/* PEM key file */          
            	pszSSLCert AS ASCIIZ PTR        '/* PEM cert file */         
            	pszSSLCa AS ASCIIZ PTR          '/* PEM CA file */           
            	pszSSLCaPath AS ASCIIZ PTR      '/* PEM directory of CA-s? */
            END TYPE
             
            TYPE T_NET
            	dwVio AS DWORD
            	lSock AS LONG 
            	lFcntl AS LONG
            	pbBuf AS BYTE PTR
            	pbBufEnd AS BYTE PTR
            	pbWritePos AS BYTE PTR
            	pbReadPos AS BYTE PTR
            	szLastError AS ASCIIZ * %MYSQL_ERRMSG_SIZE
            	lLastErrNo AS LONG
            	lMaxPacket AS LONG
            	lTimeOut AS LONG
            	lPktNr AS LONG
            	bError AS BYTE
            	bFlagReturnErrNo AS BYTE
            	bFlagCompress AS BYTE
            	bFlagNoSendOk AS BYTE
            	lRemainInBuf AS LONG
            	lBufLength AS LONG
            	lWhereb AS LONG
            	plReturnStatus AS LONG PTR
            	bReadingOrWriting AS BYTE
            	bSaveChar AS BYTE
            END TYPE
               
            TYPE T_MYSQL_FIELD			
            	pszName AS ASCIIZ PTR    '/* Name of column */                              
            	pszTable AS ASCIIZ PTR   '/* Table of column if column was a field */      
            	pszDef AS ASCIIZ PTR     '/* Default value (set by mysql_list_fields) */   
            	lFieldType AS LONG       '/* Type of field. Se mysql_com.h for types */    
            	dwLength AS DWORD        '/* Width of column */                            
            	dwMaxLength AS DWORD     '/* Max width of selected set */                  
            	dwFlags AS DWORD         '/* Div flags */                                  
            	dwDecimals AS DWORD      '/* Number of decimals in field */             
            END TYPE
             
            TYPE T_CHARSET_INFO
            	dwNumber AS DWORD
            	pszName AS ASCIIZ PTR
            	pbCType AS BYTE PTR
            	pbToLower AS BYTE PTR
            	pbToUpper AS BYTE PTR
            	pbSortOrder AS BYTE PTR
            	dwStrxFrmMultiply AS DWORD
            	pFuncStrColl AS DWORD
            	pFuncStrxFrm AS DWORD
            	pFuncStrnnColl AS DWORD
            	pFuncStrnxFrm AS DWORD
            	pbFuncLikeRange AS DWORD
            	dwMbMaxLen AS DWORD
            	pFuncIsMbChar AS DWORD
            	pbFuncIsMbHead AS DWORD
            	pMbCharLen AS DWORD
            END TYPE
             
            TYPE T_MYSQL
            	tNet AS T_NET
            	pszGptr AS ASCIIZ PTR
            	pszHost AS ASCIIZ PTR
            	pszUser AS ASCIIZ PTR
            	pszPassword AS ASCIIZ PTR
            	pszUnixSocket AS ASCIIZ PTR
            	pszServerVersion AS ASCIIZ PTR
            	pszHostInfo AS ASCIIZ PTR
            	dwPort AS DWORD
            	dwClientFlag AS DWORD
            	dwServerCapabilities AS DWORD
            	dwProtocolVersion AS DWORD
            	dwFieldCount AS DWORD
            	dwServerStatus AS DWORD
            	dwThreadId AS DWORD
            	qAffectedRows AS QUAD
            	qInsertId AS QUAD
            	qExtraInfo AS QUAD
            	ptFields AS T_MYSQL_FIELD PTR
            	tFieldAlloc AS T_MEM_ROOT
            	bFlagFreeMe AS BYTE
            	bFlagReconnect AS BYTE
            	tOptions AS T_MYSQL_OPTIONS
            	szScramble AS ASCIIZ * 9
            	ptCharset AS T_CHARSET_INFO PTR
            	dwServerLanguage AS DWORD
            END TYPE	
             	
            TYPE T_MYSQL_ROWS
            	ptNext AS DWORD 'list of rows
            	pszData AS ASCIIZ PTR
            END TYPE
             
            TYPE T_MYSQL_DATA
            	qRows AS QUAD
            	dwFields AS DWORD
            	ptData AS T_MYSQL_ROWS PTR
            	tAlloc AS T_MEM_ROOT
            END TYPE
             
            TYPE T_MYSQL_RES
            	qRowCount AS QUAD
            	dwFieldCount AS DWORD
            	dwCurrentField AS DWORD
            	ptFields AS T_MYSQL_FIELD PTR
            	ptData AS T_MYSQL_DATA PTR
            	ptDataCursor AS T_MYSQL_ROWS PTR
            	ptFieldAlloc AS T_MEM_ROOT            	'/* If unbuffered read */          
            	pszRow AS ASCIIZ PTR 					'/* array of strings */
            	pszCurrentRow AS ASCIIZ PTR             '/* column lengths of current row *
            	pdwLength AS DWORD PTR                  '/* for unbuffered reads */        
            	tHandle AS T_MYSQL PTR                    '/* Used my mysql_fetch_row */     
            	bEof AS BYTE
            END TYPE
             
            'connection management routines
            DECLARE SUB mysql_close LIB "libmySQL.DLL" ALIAS "mysql_close" (ptMYSQL AS T_MYSQL PTR)
            DECLARE FUNCTION mysql_init LIB "libmySQL.DLL" ALIAS "mysql_init" (ptMYSQL AS T_MYSQL PTR) As Long
            DECLARE FUNCTION mysql_options LIB "libmySQL.DLL" ALIAS "mysql_options" (ptMYSQL AS T_MYSQL PTR, ByVal lOption As Long, szArg As ASCIIZ) As Long
            DECLARE FUNCTION mysql_ping LIB "libmySQL.DLL"  ALIAS "mysql_ping" (ptMYSQL AS T_MYSQL PTR) As Long
            DECLARE FUNCTION mysql_real_connect LIB "libmySQL.DLL"  ALIAS "mysql_real_connect" (ptMYSQL AS T_MYSQL PTR, szHostName As ASCIIZ, szUserName As ASCIIZ, szPassword As ASCIIZ, szDbName As ASCIIZ, byval lPortNum As Long, szSocketName As ASCIIZ, ByVal lFlags As Long) As Long
             
            'STATUS AND ERROr-reporting routines
            DECLARE FUNCTION mysql_errno LIB "libmySQL.DLL"  ALIAS "mysql_errno" (ptMYSQL AS T_MYSQL PTR) As Long
            DECLARE FUNCTION mysql_error LIB "libmySQL.DLL"  ALIAS "mysql_error" (ptMYSQL AS T_MYSQL PTR) As Long
             
            'QUERY CONTRUCTIon and execution routines
            DECLARE FUNCTION mysql_query LIB "libmySQL.DLL"  ALIAS "mysql_query" (ptMYSQL AS T_MYSQL PTR, sQueryString As ASCIIZ) As Long
            DECLARE FUNCTION mysql_select_db LIB "libmySQL.DLL"  ALIAS "mysql_select_db" (ptMYSQL AS T_MYSQL PTR, szDbName As ASCIIZ) As Long
             
            'RESULT SET PROCessing routines
            DECLARE FUNCTION mysql_affected_rows LIB "libmySQL.DLL"  ALIAS "mysql_affected_rows" (ptResult AS T_MYSQL_RES PTR) As Long
            DECLARE SUB mysql_data_seek LIB "libmySQL.DLL"  ALIAS "mysql_data_seek" (ptResult AS T_MYSQL_RES PTR, ByVal lOffset As QUAD) 
            DECLARE FUNCTION mysql_fetch_field_direct LIB "libmySQL.DLL"  ALIAS "mysql_fetch_field_direct" (ptResult AS T_MYSQL_RES PTR, ByVal lFieldNum As Long) As Long
            DECLARE FUNCTION mysql_fetch_lengths LIB "libmySQL.DLL"  ALIAS "mysql_fetch_lengths" (ptResult AS T_MYSQL_RES PTR) As Long
            DECLARE FUNCTION mysql_fetch_row LIB "libmySQL.DLL"  ALIAS "mysql_fetch_row" ( ptResult AS T_MYSQL_RES PTR ) As Long
            DECLARE FUNCTION mysql_field_count LIB "libmySQL.DLL"  ALIAS "mysql_field_count" (ptMYSQL AS T_MYSQL PTR) As Long
            DECLARE SUB mysql_free_result LIB "libmySQL.DLL"  ALIAS "mysql_free_result" (ptMYSQL AS T_MYSQL PTR)
            DECLARE FUNCTION mysql_info LIB "libmySQL.DLL"  ALIAS "mysql_info" (ptMYSQL AS T_MYSQL PTR) As Long
            DECLARE FUNCTION mysql_insert_id LIB "libmySQL.DLL"  ALIAS "mysql_insert_id" (ptMYSQL AS T_MYSQL PTR) As Long
            DECLARE FUNCTION mysql_num_fields LIB "libmySQL.DLL"  ALIAS "mysql_num_fields" ( ptResult AS T_MYSQL_RES PTR) As Long
            DECLARE FUNCTION mysql_num_rows LIB "libmySQL.DLL"  ALIAS "mysql_num_rows" ( ptResult AS T_MYSQL_RES PTR ) As Long
            DECLARE FUNCTION mysql_store_result LIB "libmySQL.DLL"  ALIAS "mysql_store_result" (ptMYSQL AS T_MYSQL PTR) As Long
            DECLARE FUNCTION mysql_use_result LIB "libmySQL.DLL"  ALIAS "mysql_use_result" (ptMYSQL AS T_MYSQL PTR) As Long
             
            #IF NOT %DEF(%FALSE)
            %FALSE = 0
            #ENDIF
             
            #IF NOT %DEF(%TRUE)
            %TRUE = 1
            #ENDIF
             
            #IF NOT %DEF(%NULL)
            %NULL = 0
            #ENDIF
            
             
            SUB Tell( sMessage AS STRING )
            	#IF %DEF(%PB_CC32)
            	STDOUT "[INFO] " + sMessage
            	#ELSE
            	MSGBOX "[INFO] " + sMessage 
            	#ENDIF
            END SUB
             
            SUB Croak( sMessage AS STRING )
            	#IF %DEF(%PB_CC32)
            	STDOUT "[ERROR] " + sMessage
            	#ELSE
            	MSGBOX "[ERROR] " + sMessage 
            	#ENDIF
            END SUB
             
            FUNCTION GetFieldDesc( BYVAL lFieldType AS LONG ) AS STRING
             
            	SELECT CASE lFieldType
            		CASE %FIELD_TYPE_DECIMAL	: FUNCTION="TYPE_DECIMAL"
            		CASE %FIELD_TYPE_TINY    	: FUNCTION="TYPE_TINY"
            		CASE %FIELD_TYPE_SHORT		: FUNCTION="TYPE_SHORT"
            		CASE %FIELD_TYPE_LONG		: FUNCTION="TYPE_LONG"
            		CASE %FIELD_TYPE_FLOAT		: FUNCTION="TYPE_FLOAT"
            		CASE %FIELD_TYPE_DOUBLE		: FUNCTION="TYPE_DOUBLE"
            		CASE %FIELD_TYPE_NULL		: FUNCTION="TYPE_NULL"
            		CASE %FIELD_TYPE_TIMESTAMP	: FUNCTION="TYPE_TIMESTAMP"
            		CASE %FIELD_TYPE_LONGLONG	: FUNCTION="TYPE_LONGLONG"
            		CASE %FIELD_TYPE_INT24		: FUNCTION="TYPE_INT24"
            		CASE %FIELD_TYPE_DATE		: FUNCTION="TYPE_DATE"
            		CASE %FIELD_TYPE_TIME		: FUNCTION="TYPE_TIME"
            		CASE %FIELD_TYPE_DATETIME	: FUNCTION="TYPE_DATETIME"
            		CASE %FIELD_TYPE_YEAR		: FUNCTION="TYPE_YEAR"
            		CASE %FIELD_TYPE_NEWDATE	: FUNCTION="TYPE_NEWDATE"
            		CASE %FIELD_TYPE_ENUM		: FUNCTION="TYPE_ENUM"
            		CASE %FIELD_TYPE_SET		: FUNCTION="TYPE_SET"
            		CASE %FIELD_TYPE_TINY_BLOB	: FUNCTION="TYPE_TINY_BLOB"
            		CASE %FIELD_TYPE_MEDIUM_BLOB    : FUNCTION="TYPE_MEDIUM_BLOB"
            		CASE %FIELD_TYPE_LONG_BLOB	: FUNCTION="TYPE_LONG_BLOB"
            		CASE %FIELD_TYPE_BLOB		: FUNCTION="TYPE_BLOB"
            		CASE %FIELD_TYPE_VAR_STRING	: FUNCTION="TYPE_VAR_STRING"
            		CASE %FIELD_TYPE_STRING		: FUNCTION="TYPE_STRING"
            		CASE ELSE					: FUNCTION="TYPE_UNKNOWN"
             	END SELECT
            	
            END FUNCTION
            	
             	
            FUNCTION PBMAIN() AS LONG	
            	LOCAL tSqlStruct AS T_MYSQL PTR
            	LOCAL tSqlHandle AS T_MYSQL PTR
             	
            	tSqlStruct = mysql_init( BYVAL %NULL )
            	IF tSqlStruct = %NULL THEN
            		CALL Croak( "mysql_init() failed" )
             		
            	ELSE
            		CALL Tell( "mysql_init() succeeded" )
            		'connect for real
            		tSqlHandle =  mysql_real_connect( BYVAL tSqlStruct, "localhost", "<user>", "<password>", BYVAL %NULL, 3306, BYVAL %NULL, 0 )
            		IF tSqlHandle = %NULL THEN
            			CALL Croak( "mysql_real_connect() failed. "  )
            			CALL mysql_close( BYVAL tSqlStruct )
            		ELSE
            			CALL Tell( "mysql_real_connect() succeeded" )
            			'select a database (could have done it in mysql_real_connect as well)		
            			IF mysql_select_db( BYVAL tSqlHandle, "Talkbox" )  THEN
            				CALL Croak( "mysql_select_db() failed" )
            			ELSE
            				CALL Tell( "mysql_select_db() succeeded" )
            				IF mysql_query( BYVAL tSqlHandle, "SELECT Username, FirstName, LastName FROM t_user_profile" ) THEN
            					CALL Croak( "mysql_query() failed" )
            				ELSE
            					CALL Tell( "mysql_query() succeeded" )
             					
            					LOCAL i AS LONG
            					LOCAL tResult AS T_MYSQL_RES PTR
            					LOCAL ptField AS T_MYSQL_FIELD PTR
             					
            					tResult = mysql_use_result( BYVAL tSqlHandle )
            					FOR i = 0 TO @tResult.dwFieldCount -1
            						ptField = mysql_fetch_field_direct(BYVAL tResult, i)
            						IF ptField THEN
             							
            							CALL Tell( "Field(" + FORMAT$(i) + ").Name        : " + @[email protected] )
            							CALL Tell( "Field(" + FORMAT$(i) + ").Length      : " + FORMAT$(@ptField.dwLength) )
            							CALL Tell( "Field(" + FORMAT$(i) + ").DefaultValue: '" + @[email protected] + "'" )
            							CALL Tell( "Field(" + FORMAT$(i) + ").Type        : " + GetFieldDesc( @ptField.lFieldType ) )
             							 
            						END IF
             							
            					NEXT	
            					CALL mysql_free_result( BYVAL tResult )
            
             					
            				END IF
            			END IF
            			CALL mysql_close( BYVAL tSqlHandle )
            			CALL mysql_close( BYVAL tSqlStruct )
            		END IF
             		
            	END IF
             	
            END FUNCTION
            Note that using a native database API always means translating the
            header files (if they haven't been translated yet) and learning
            a new API. This is the advantage of ODBC: once mastered you
            can re-use your code, etc.

            You'll have to update the code to what you're using. Hopefully
            should give you a head start.

            Cheers

            Florent



            [This message has been edited by Florent Heyworth (edited September 17, 2001).]

            Comment


            • #7
              Florent, Thank you for your help, it has really helped.

              I have got most of the API beat except for extracting the data
              for the returned rows. The C Api documentation says that
              mysql_fetch_row returns an array of pointers. You have to
              dimension the result of mysql_fetch_row as my_sql_rows ptr.

              How do you dimension the result as an array so you can access the
              individual data. Or am I on the wrong track.

              ------------------

              Comment


              • #8
                Hi Martin

                To retrieve the rows, use mysql_store_result() and then call
                mysql_fetch_row and iterate while the result is not NULL using
                two levels of indirection to retrieve each column of each row
                (pointer to array of pointers).

                Here's an example:

                Code:
                #IF 0
                **************************************************************************
                * ' Ported to PowerBASIC by Florent Heyworth - 17-Sep-2001 (incomplete)
                * '
                * '/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
                * '   
                * '   This library is free software; you can redistribute it and/or
                * '   modify it under the terms of the GNU Library General Public
                * '   License as published by the Free Software Foundation; either
                * '   version 2 of the License, or (at your option) any later version.
                * '   
                * '   This library 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
                * '   Library General Public License for more details.
                * '   
                * '   You should have received a copy of the GNU Library General Public
                * '   License along with this library; if not, write to the Free
                * '   Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
                * '   MA 02111-1307, USA */
                * '
                *************************************************************************
                #ENDIF
                 
                'mysql_option enum
                %MYSQL_OPT_CONNECT_TIMEOUT  = 0
                %MYSQL_OPT_COMPRESS         = 1
                %MYSQL_OPT_NAMED_PIPE       = 2
                %MYSQL_INIT_COMMAND         = 3
                %MYSQL_READ_DEFAULT_FILE    = 4
                %MYSQL_READ_DEFAULT_GROUP   = 5
                %MYSQL_SET_CHARSET_DIR      = 6
                %MYSQL_SET_CHARSET_NAME     = 7
                 
                'mysql_status enum
                %MYSQL_STATUS_READY         = 0
                %MYSQL_STATUS_GET_RESULT    = 1
                %MYSQL_STATUS_USE_RESULT    = 2
                 
                %MYSQL_ERRMSG_SIZE          = 200
                 
                %CLIENT_LONG_PASSWORD = 1                               'new more secure passwords
                %CLIENT_FOUND_ROWS = 2                                  'Found instead of affected rows
                %CLIENT_LONG_FLAG = 4                                   'Get all column flags
                %CLIENT_CONNECT_WITH_DB = 8                             'One can specify db on connect
                %CLIENT_NO_SCHEMA = 16                                  'Don't allow database.table.column
                %CLIENT_COMPRESS = 32                                   'Can use compression protocol
                %CLIENT_ODBC = 64                                       'Odbc client
                %CLIENT_LOCAL_FILES = 128                               'Can use LOAD DATA LOCAL
                %CLIENT_IGNORE_SPACE = 256                              'Ignore spaces before '('
                %CLIENT_CHANGE_USER = 512                               'Support the mysql_change_user()
                %CLIENT_INTERACTIVE = 1024                              'This is an interactive client
                %CLIENT_SSL = 2048                                      'Switch to SSL after handshake
                %CLIENT_IGNORE_SIGPIPE = 4096                           'IGNORE sigpipes
                %CLIENT_TRANSACTIONS = 8196                             'Client knows about transactions
                 
                'enum field types
                %FIELD_TYPE_DECIMAL     = 0
                %FIELD_TYPE_TINY        = 1
                %FIELD_TYPE_SHORT       = 2
                %FIELD_TYPE_LONG        = 3
                %FIELD_TYPE_FLOAT       = 4
                %FIELD_TYPE_DOUBLE      = 5
                %FIELD_TYPE_NULL        = 6
                %FIELD_TYPE_TIMESTAMP   = 7
                %FIELD_TYPE_LONGLONG    = 8
                %FIELD_TYPE_INT24       = 9
                %FIELD_TYPE_DATE        = 10
                %FIELD_TYPE_TIME        = 11
                %FIELD_TYPE_DATETIME    = 12
                %FIELD_TYPE_YEAR        = 13
                %FIELD_TYPE_NEWDATE     = 14
                %FIELD_TYPE_ENUM        =247
                %FIELD_TYPE_SET         =248
                %FIELD_TYPE_TINY_BLOB   =249
                %FIELD_TYPE_MEDIUM_BLOB =250
                %FIELD_TYPE_LONG_BLOB   =251
                %FIELD_TYPE_BLOB        =252
                %FIELD_TYPE_VAR_STRING  =253
                %FIELD_TYPE_STRING      =254
                 
                TYPE T_USED_MEM             '/* struct for once_alloc */  
                    ptNext AS T_USED_MEM PTR   '/* Next block in use */      
                    dwLeft AS DWORD         '/* memory left in block  */  
                    dwSize AS DWORD         '/* size of block */          
                END TYPE
                 
                TYPE T_MEM_ROOT
                    ptFree AS T_USED_MEM PTR
                    ptUsed AS T_USED_MEM PTR
                    ptPreAlloc AS T_USED_MEM PTR
                    dwMinMalloc AS DWORD
                    dwBlockSize AS DWORD
                END TYPE
                 
                TYPE T_MYSQL_OPTIONS
                    dwConnectTimeout AS DWORD
                    dwClientFlag AS DWORD
                    bFlagCompress AS BYTE
                    bFlagNamedPipe AS BYTE
                    pszHost AS ASCIIZ PTR
                    pszInitCommand AS ASCIIZ PTR
                    pszUser AS ASCIIZ PTR
                    pszPassword AS ASCIIZ PTR
                    pszUnixSocket AS ASCIIZ PTR
                    pszDb AS ASCIIZ PTR
                    pszMyConfFile AS ASCIIZ PTR
                    pszMyConfGroup AS ASCIIZ PTR
                    pszCharsetDir AS ASCIIZ PTR
                    pszCharsetName AS ASCIIZ PTR
                    bFlagUseSSL AS BYTE             '/* if to use SSL or not */  
                    pszSSLKey AS ASCIIZ PTR         '/* PEM key file */          
                    pszSSLCert AS ASCIIZ PTR        '/* PEM cert file */         
                    pszSSLCa AS ASCIIZ PTR          '/* PEM CA file */           
                    pszSSLCaPath AS ASCIIZ PTR      '/* PEM directory of CA-s? */
                END TYPE
                 
                TYPE T_NET
                    dwVio AS DWORD
                    lSock AS LONG 
                    lFcntl AS LONG
                    pbBuf AS BYTE PTR
                    pbBufEnd AS BYTE PTR
                    pbWritePos AS BYTE PTR
                    pbReadPos AS BYTE PTR
                    szLastError AS ASCIIZ * %MYSQL_ERRMSG_SIZE
                    lLastErrNo AS LONG
                    lMaxPacket AS LONG
                    lTimeOut AS LONG
                    lPktNr AS LONG
                    bError AS BYTE
                    bFlagReturnErrNo AS BYTE
                    bFlagCompress AS BYTE
                    bFlagNoSendOk AS BYTE
                    lRemainInBuf AS LONG
                    lBufLength AS LONG
                    lWhereb AS LONG
                    plReturnStatus AS LONG PTR
                    bReadingOrWriting AS BYTE
                    bSaveChar AS BYTE
                END TYPE
                   
                TYPE T_MYSQL_FIELD          
                    pszName AS ASCIIZ PTR    '/* Name of column */                              
                    pszTable AS ASCIIZ PTR   '/* Table of column if column was a field */      
                    pszDef AS ASCIIZ PTR     '/* Default value (set by mysql_list_fields) */   
                    lFieldType AS LONG       '/* Type of field. Se mysql_com.h for types */    
                    dwLength AS DWORD        '/* Width of column */                            
                    dwMaxLength AS DWORD     '/* Max width of selected set */                  
                    dwFlags AS DWORD         '/* Div flags */                                  
                    dwDecimals AS DWORD      '/* Number of decimals in field */             
                END TYPE
                 
                TYPE T_CHARSET_INFO
                    dwNumber AS DWORD
                    pszName AS ASCIIZ PTR
                    pbCType AS BYTE PTR
                    pbToLower AS BYTE PTR
                    pbToUpper AS BYTE PTR
                    pbSortOrder AS BYTE PTR
                    dwStrxFrmMultiply AS DWORD
                    pFuncStrColl AS DWORD
                    pFuncStrxFrm AS DWORD
                    pFuncStrnnColl AS DWORD
                    pFuncStrnxFrm AS DWORD
                    pbFuncLikeRange AS DWORD
                    dwMbMaxLen AS DWORD
                    pFuncIsMbChar AS DWORD
                    pbFuncIsMbHead AS DWORD
                    pMbCharLen AS DWORD
                END TYPE
                 
                TYPE T_MYSQL
                    tNet AS T_NET
                    pszGptr AS ASCIIZ PTR
                    pszHost AS ASCIIZ PTR
                    pszUser AS ASCIIZ PTR
                    pszPassword AS ASCIIZ PTR
                    pszUnixSocket AS ASCIIZ PTR
                    pszServerVersion AS ASCIIZ PTR
                    pszHostInfo AS ASCIIZ PTR
                    dwPort AS DWORD
                    dwClientFlag AS DWORD
                    dwServerCapabilities AS DWORD
                    dwProtocolVersion AS DWORD
                    dwFieldCount AS DWORD
                    dwServerStatus AS DWORD
                    dwThreadId AS DWORD
                    qAffectedRows AS QUAD
                    qInsertId AS QUAD
                    qExtraInfo AS QUAD
                    ptFields AS T_MYSQL_FIELD PTR
                    tFieldAlloc AS T_MEM_ROOT
                    bFlagFreeMe AS BYTE
                    bFlagReconnect AS BYTE
                    tOptions AS T_MYSQL_OPTIONS
                    szScramble AS ASCIIZ * 9
                    ptCharset AS T_CHARSET_INFO PTR
                    dwServerLanguage AS DWORD
                END TYPE    
                    
                TYPE T_MYSQL_ROWS
                    ptNext AS DWORD 'list of rows
                    pszData AS ASCIIZ PTR
                END TYPE
                 
                TYPE T_MYSQL_DATA
                    qRows AS QUAD
                    dwFields AS DWORD
                    ptData AS T_MYSQL_ROWS PTR
                    tAlloc AS T_MEM_ROOT
                END TYPE
                 
                TYPE T_MYSQL_RES
                    qRowCount AS QUAD
                    dwFieldCount AS DWORD
                    dwCurrentField AS DWORD
                    ptFields AS T_MYSQL_FIELD PTR
                    ptData AS T_MYSQL_DATA PTR
                    ptDataCursor AS T_MYSQL_ROWS PTR
                    ptFieldAlloc AS T_MEM_ROOT              '/* If unbuffered read */          
                    pszRow AS ASCIIZ PTR                    '/* array of strings */
                    pszCurrentRow AS ASCIIZ PTR             '/* column lengths of current row *
                    pdwLength AS DWORD PTR                  '/* for unbuffered reads */        
                    tHandle AS T_MYSQL PTR                    '/* Used my mysql_fetch_row */     
                    bEof AS BYTE
                END TYPE
                 
                'connection management routines
                DECLARE SUB mysql_close LIB "libmySQL.DLL" ALIAS "mysql_close" (ptMYSQL AS T_MYSQL PTR)
                DECLARE FUNCTION mysql_init LIB "libmySQL.DLL" ALIAS "mysql_init" (ptMYSQL AS T_MYSQL PTR) As Long
                DECLARE FUNCTION mysql_options LIB "libmySQL.DLL" ALIAS "mysql_options" (ptMYSQL AS T_MYSQL PTR, ByVal lOption As Long, szArg As ASCIIZ) As Long
                DECLARE FUNCTION mysql_ping LIB "libmySQL.DLL"  ALIAS "mysql_ping" (ptMYSQL AS T_MYSQL PTR) As Long
                DECLARE FUNCTION mysql_real_connect LIB "libmySQL.DLL"  ALIAS "mysql_real_connect" (ptMYSQL AS T_MYSQL PTR, szHostName As ASCIIZ, szUserName As ASCIIZ, szPassword As ASCIIZ, szDbName As ASCIIZ, byval lPortNum As Long, szSocketName As ASCIIZ, ByVal lFlags As Long) As Long
                 
                'STATUS AND ERROr-reporting routines
                DECLARE FUNCTION mysql_errno LIB "libmySQL.DLL"  ALIAS "mysql_errno" (ptMYSQL AS T_MYSQL PTR) As Long
                DECLARE FUNCTION mysql_error LIB "libmySQL.DLL"  ALIAS "mysql_error" (ptMYSQL AS T_MYSQL PTR) As Long
                 
                'QUERY CONTRUCTIon and execution routines
                DECLARE FUNCTION mysql_query LIB "libmySQL.DLL"  ALIAS "mysql_query" (ptMYSQL AS T_MYSQL PTR, sQueryString As ASCIIZ) As Long
                DECLARE FUNCTION mysql_select_db LIB "libmySQL.DLL"  ALIAS "mysql_select_db" (ptMYSQL AS T_MYSQL PTR, szDbName As ASCIIZ) As Long
                 
                'RESULT SET PROCessing routines
                DECLARE FUNCTION mysql_affected_rows LIB "libmySQL.DLL"  ALIAS "mysql_affected_rows" (ptResult AS T_MYSQL_RES PTR) As Long
                DECLARE SUB mysql_data_seek LIB "libmySQL.DLL"  ALIAS "mysql_data_seek" (ptResult AS T_MYSQL_RES PTR, ByVal lOffset As QUAD) 
                DECLARE FUNCTION mysql_fetch_field_direct LIB "libmySQL.DLL"  ALIAS "mysql_fetch_field_direct" (ptResult AS T_MYSQL_RES PTR, ByVal lFieldNum As Long) As Long
                DECLARE FUNCTION mysql_fetch_lengths LIB "libmySQL.DLL"  ALIAS "mysql_fetch_lengths" (ptResult AS T_MYSQL_RES PTR) As Long
                DECLARE FUNCTION mysql_fetch_row LIB "libmySQL.DLL"  ALIAS "mysql_fetch_row" ( ptResult AS T_MYSQL_RES PTR ) As Long
                DECLARE FUNCTION mysql_field_count LIB "libmySQL.DLL"  ALIAS "mysql_field_count" (ptMYSQL AS T_MYSQL PTR) As Long
                DECLARE SUB mysql_free_result LIB "libmySQL.DLL"  ALIAS "mysql_free_result" (ptMYSQL AS T_MYSQL PTR)
                DECLARE FUNCTION mysql_info LIB "libmySQL.DLL"  ALIAS "mysql_info" (ptMYSQL AS T_MYSQL PTR) As Long
                DECLARE FUNCTION mysql_insert_id LIB "libmySQL.DLL"  ALIAS "mysql_insert_id" (ptMYSQL AS T_MYSQL PTR) As Long
                DECLARE FUNCTION mysql_num_fields LIB "libmySQL.DLL"  ALIAS "mysql_num_fields" ( ptResult AS T_MYSQL_RES PTR) As Long
                DECLARE FUNCTION mysql_num_rows LIB "libmySQL.DLL"  ALIAS "mysql_num_rows" ( ptResult AS T_MYSQL_RES PTR ) As Long
                DECLARE FUNCTION mysql_store_result LIB "libmySQL.DLL"  ALIAS "mysql_store_result" (ptMYSQL AS T_MYSQL PTR) As Long
                DECLARE FUNCTION mysql_use_result LIB "libmySQL.DLL"  ALIAS "mysql_use_result" (ptMYSQL AS T_MYSQL PTR) As Long
                 
                #IF NOT %DEF(%FALSE)
                %FALSE = 0
                #ENDIF
                 
                #IF NOT %DEF(%TRUE)
                %TRUE = 1
                #ENDIF
                 
                #IF NOT %DEF(%NULL)
                %NULL = 0
                #ENDIF
                
                 
                SUB Tell( sMessage AS STRING )
                    #IF %DEF(%PB_CC32)
                    STDOUT "[INFO] " + sMessage
                    #ELSE
                    MSGBOX "[INFO] " + sMessage 
                    #ENDIF
                END SUB
                 
                SUB Croak( sMessage AS STRING )
                    #IF %DEF(%PB_CC32)
                    STDOUT "[ERROR] " + sMessage
                    #ELSE
                    MSGBOX "[ERROR] " + sMessage 
                    #ENDIF
                END SUB
                 
                FUNCTION GetFieldDesc( BYVAL lFieldType AS LONG ) AS STRING
                 
                    SELECT CASE lFieldType
                        CASE %FIELD_TYPE_DECIMAL    : FUNCTION="TYPE_DECIMAL"
                        CASE %FIELD_TYPE_TINY       : FUNCTION="TYPE_TINY"
                        CASE %FIELD_TYPE_SHORT      : FUNCTION="TYPE_SHORT"
                        CASE %FIELD_TYPE_LONG       : FUNCTION="TYPE_LONG"
                        CASE %FIELD_TYPE_FLOAT      : FUNCTION="TYPE_FLOAT"
                        CASE %FIELD_TYPE_DOUBLE     : FUNCTION="TYPE_DOUBLE"
                        CASE %FIELD_TYPE_NULL       : FUNCTION="TYPE_NULL"
                        CASE %FIELD_TYPE_TIMESTAMP  : FUNCTION="TYPE_TIMESTAMP"
                        CASE %FIELD_TYPE_LONGLONG   : FUNCTION="TYPE_LONGLONG"
                        CASE %FIELD_TYPE_INT24      : FUNCTION="TYPE_INT24"
                        CASE %FIELD_TYPE_DATE       : FUNCTION="TYPE_DATE"
                        CASE %FIELD_TYPE_TIME       : FUNCTION="TYPE_TIME"
                        CASE %FIELD_TYPE_DATETIME   : FUNCTION="TYPE_DATETIME"
                        CASE %FIELD_TYPE_YEAR       : FUNCTION="TYPE_YEAR"
                        CASE %FIELD_TYPE_NEWDATE    : FUNCTION="TYPE_NEWDATE"
                        CASE %FIELD_TYPE_ENUM       : FUNCTION="TYPE_ENUM"
                        CASE %FIELD_TYPE_SET        : FUNCTION="TYPE_SET"
                        CASE %FIELD_TYPE_TINY_BLOB  : FUNCTION="TYPE_TINY_BLOB"
                        CASE %FIELD_TYPE_MEDIUM_BLOB: FUNCTION="TYPE_MEDIUM_BLOB"
                        CASE %FIELD_TYPE_LONG_BLOB  : FUNCTION="TYPE_LONG_BLOB"
                        CASE %FIELD_TYPE_BLOB       : FUNCTION="TYPE_BLOB"
                        CASE %FIELD_TYPE_VAR_STRING : FUNCTION="TYPE_VAR_STRING"
                        CASE %FIELD_TYPE_STRING     : FUNCTION="TYPE_STRING"
                        CASE ELSE                   : FUNCTION="TYPE_UNKNOWN"
                    END SELECT
                    
                END FUNCTION
                    
                    
                FUNCTION PBMAIN() AS LONG   
                    LOCAL ptSqlStruct AS T_MYSQL PTR
                    LOCAL ptSqlHandle AS T_MYSQL PTR
                    
                    ptSqlStruct = mysql_init( BYVAL %NULL )
                    IF ptSqlStruct = %NULL THEN
                        CALL Croak( "mysql_init() failed" )
                        
                    ELSE
                        CALL Tell( "mysql_init() succeeded" )
                        'connect for real
                        ptSqlHandle =  mysql_real_connect( BYVAL ptSqlStruct, "localhost", "root", "getit122", BYVAL %NULL, 3306, BYVAL %NULL, 0 )
                        IF ptSqlHandle = %NULL THEN
                            CALL Croak( "mysql_real_connect() failed. "  )
                            CALL mysql_close( BYVAL ptSqlStruct )
                        ELSE
                            CALL Tell( "mysql_real_connect() succeeded" )
                            'select a database (could have done it in mysql_real_connect as well)       
                            'use mysql's user database for demo purposes (no need to change every mysql has it)
                            IF mysql_select_db( BYVAL ptSqlHandle, "mysql" )  THEN
                                CALL Croak( "mysql_select_db() failed" )
                            ELSE
                                CALL Tell( "mysql_select_db() succeeded" )
                                'use mysql's user database for demo purposes
                                IF mysql_query( BYVAL ptSqlHandle, "SELECT user, password, host FROM user" ) THEN
                                    CALL Croak( "mysql_query() failed" )
                                ELSE
                                    CALL Tell( "mysql_query() succeeded" )
                                    
                                    LOCAL i AS LONG
                                    LOCAL ptResult AS T_MYSQL_RES PTR
                                    LOCAL ptField AS T_MYSQL_FIELD PTR
                                    LOCAL pRow AS ASCIIZ PTR
                                    LOCAL lTotalLen AS LONG
                                    'call store result prior to retrieving the rows
                                    ptResult = mysql_store_result( BYVAL ptSqlHandle )
                                    DIM lFieldLength(@ptResult.dwFieldCount) AS LONG
                                    
                                    STDOUT
                                    FOR i = 0 TO @ptResult.dwFieldCount -1
                                        ptField = mysql_fetch_field_direct(BYVAL ptResult, i)
                                        IF ptField THEN
                                            lFieldLength(i) = @ptField.dwMaxLength 
                                            PRINT @[email protected] + STRING$(lFieldLength(i) - LEN(@[email protected]), 32)+" |"; 
                                            lTotalLen = lTotalLen + lFieldLength(i)
                                        END IF
                                    NEXT    
                                    STDOUT CHR$(13,10) + STRING$(lTotalLen + UBOUND(lFieldLength(),1)*2, "-")
                                    
                                    DO
                                        pRow = mysql_fetch_row( BYVAL ptResult )
                                        IF pRow THEN
                                            FOR i = 0 TO @ptResult.dwFieldCount -1
                                                IF LEN(@@pRow) THEN
                                                    PRINT @@pRow +STRING$(lFieldLength(i) - LEN(@@pRow), 32) + " |";
                                                ELSE
                                                    PRINT "null" +STRING$(lFieldLength(i) - 4, 32) + " |";
                                                END IF
                                                ! add pRow, 4
                                            NEXT
                                            STDOUT STRING$(SCREENY -1, 32)
                
                                        ELSE
                                            EXIT DO
                                        END IF
                                    LOOP                
                                                        
                                    CALL mysql_free_result( BYVAL ptResult )
                                    
                                    
                                END IF
                            END IF
                            CALL mysql_close( BYVAL ptSqlHandle )
                            CALL mysql_close( BYVAL ptSqlStruct )
                        END IF
                        
                    END IF
                    
                END FUNCTION
                Cheers

                Florent



                [This message has been edited by Florent Heyworth (edited September 20, 2001).]

                Comment

                Working...
                X