Solved. Malplaced memset....

Op 07-01-2024 om 19:39 schreef Jogchum Reitsma via discuss:

Hi,

Using server version: 11.2.2, I try to extract data from a database with this C-code:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <mysql.h>

    define MAXFLEN 66

    char *bo_src = "SELECT FILENAMME, FILENUM FROM BOEK WHERE TOKENS
    IS NULL ORDER BY UDC_KOADE, FILENUM";

    char   filename[MAXFLEN],
           stavering[3];

    long   filenum;

    int fetch_result;

    MYSQL      *bo_src_sql;
    MYSQL_ST MT *bo_src_stmt;
    MYSQL_RES  *bo_src_res;
    MYSQL_BIND  bo_src_bind[2],
                bo_src_bind_result[2];

    int main (argc, argv)

         int argc;
      char *argv[];

      {  bo_src_sql = mysql_init(bo_src_sql)
      ;  if ((bo_src_stmt = mysql_stmt_init(bo_src_sql))==NULL)
            printf ("Can't initialize %s:\n %s/n", bo_src,
    mysql_error(bo_src_sql))
      ;  if
    
(!mysql_real_connect(bo_src_sql,"localhost","<user>","<passwd>","tdb",0,NULL,0))
            fprintf(stderr, "Failed to connect to book table for
    select: Error: %s\n", mysql_error(bo_src_sql))
      ; if (mysql_stmt_prepare(bo_src_stmt, bo_src, strlen(bo_src)))
            printf ("Can't prepare %s:\n %s\n", bo_src,
    mysql_error(bo_src_sql))
      ; bo_src_bind_result[0].buffer_type   = MYSQL_TYPE_STRING
      ; bo_src_bind_result[0].buffer        = filename
      ; bo_src_bind_result[0].buffer_length = 100
      ; bo_src_bind_result[1].buffer_type   = MYSQL_TYPE_LONG
      ; bo_src_bind_result[1].buffer        = (long *)&filenum
      ; bo_src_bind_result[1].buffer_length = sizeof (filenum)
      ;  memset (bo_src_bind, 0, sizeof (bo_src_bind))
      ;  memset (bo_src_bind_result, 0, sizeof (bo_src_bind_result))
      ;  if (mysql_stmt_bind_param (bo_src_stmt, bo_src_bind))
           fprintf(stderr, "Failed to bind parameters in %s: \n Error:
    %s\n", bo_src, mysql_error(bo_src_sql))
      ;  if (mysql_stmt_bind_result(bo_src_stmt, bo_src_bind_result))
           fprintf(stderr, "Failed to bind result in %s: \n Error:
    %s\n", bo_src, mysql_error(bo_src_sql))
      ;  if (!mysql_stmt_execute (bo_src_stmt))
            {  fetch_result = mysql_stmt_fetch(bo_src_stmt)
            ;  if  (fetch_result == 0)
                    printf ("%ld %s %s\n", filenum, filename, stavering)
            ;  else if (fetch_result == MYSQL_NO_DATA)
                        printf ("No data found\n")
            ;       else if (fetch_result == MYSQL_DATA_TRUNCATED)
                             printf ("Data truncated.\n%d/n",
    fetch_result)
            ;            else printf ("Something else! %d \n%s/n",
    fetch_result, mysql_error(bo_src_sql));
            }
      ;  mysql_stmt_close(bo_src_stmt)
      ;  mysql_close(bo_src_sql);
      }

The definition of the table is

describe BOEK;
+-----------+-------------------------------+------+-----+---------+----------------+ | Field     | Type                          | Null | Key | Default | Extra          | +-----------+-------------------------------+------+-----+---------+----------------+ | FILENUM   | smallint(4)                   | NO   | PRI | NULL    | auto_increment | | TITEL     | varchar(50)                   | YES  |     | NULL    |                | | UDC_KOADE | varchar(10)                   | YES  |     | NULL    |                | | ISBN      | bigint(13)                    | YES  |     | NULL    |                | | FILENAMME | varchar(20)                   | YES  |     | NULL    |                | | SKR_NUM   | smallint(5)                   | YES  |     | NULL    |                | | UTJ_NUM   | smallint(5)                   | YES  |     | NULL    |                | | UTJ_DATUM | date                          | YES  |     | NULL    |                | | OERSET    | tinyint(1)                    | YES  |     | NULL    |                | | PRINTINGE | smallint(3)                   | YES  |     | NULL    |                | | YNL_DATUM | date                          | YES  |     | NULL    |                | | STAVERING | enum('ald','mid','nij','int') | YES  |     | NULL    |                | | TOKENS    | smallint(6)                   | YES  |     | NULL    |                | | TYPES     | smallint(5)                   | YES  |     | NULL    |                | | MAXTOKENS | smallint(6)                   | YES  |     | NULL    |                | | MAXTYPES  | smallint(5)                   | YES  |     | NULL    |                | | TIID      | time                          | YES  |     | NULL    |                |
+-----------+-------------------------------+------+-----+---------+----------------+

So the size of FILENAMME, varchar20, is much smaller than the buffer length specified in the code:

  ; bo_src_bind_result[0].buffer_type   = MYSQL_TYPE_STRING
  ; bo_src_bind_result[0].buffer        = filename
  ; bo_src_bind_result[0].buffer_length = 100

Yet I get a MYSQL_DATA_TRUNCATED fetching the result of the query.

Debugging, only the integer filenum gets its value.

The statement (SELECT FILENAMME, FILENUM FROM BOEK WHERE TOKENS IS NULL ORDER BY UDC_KOADE, FILENUM;) gives the expected result when entered in a terminal session.

I obviously do something wrong, but I can't find out what. Googling gets me no answer.

Anyone who can spot the error?

Many thanks in advance,

best regards, Jogchum



_______________________________________________
discuss mailing list [email protected]
To unsubscribe send an email [email protected]

_______________________________________________
discuss mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to