#include <stdio.h>

exec sql include ../regression;

EXEC SQL WHENEVER sqlerror sqlprint;
EXEC SQL WHENEVER sqlwarning sqlprint;
EXEC SQL WHENEVER not found sqlprint;

EXEC SQL TYPE customer IS
    struct
    {
        varchar name[50];
        int     phone;
    };

EXEC SQL TYPE cust_ind IS
    struct ind
    {
        short   name_ind;
        short   phone_ind;
    };

EXEC SQL TYPE company IS
    struct
    {
        customer customers[10];
    };

int main()
{
    EXEC SQL begin declare section;
      customer  custs1[10];
      cust_ind  inds[10];
      typedef struct
      {
        varchar name[50];
        int     phone;
      } customer2;
      customer2  custs2[10];
      struct customer3
      {
        varchar name[50];
        int     phone;
      } custs3[10];
      struct customer4
      {
        varchar name[50];
        int     phone;
      } custs4;

      company acme;

      int r;
      varchar onlyname[2][50];
    EXEC SQL end declare section;

    ECPGdebug(1, stderr);

    EXEC SQL connect to REGRESSDB1;

    EXEC SQL create table customers (c varchar(50), p int);

    /* First we'll insert some data using C variable references */
    strcpy(custs1[0].name.arr, "John Doe");
    custs1[0].name.len = strlen(custs1[0].name.arr);
    custs1[0].phone = 12345;

    strcpy(acme.customers[1].name.arr, "Jane Doe");
    acme.customers[1].name.len = strlen(acme.customers[1].name.arr);
    acme.customers[1].phone = 67890;

    EXEC SQL insert into customers values (:custs1->name,
                                           :custs1[0].phone);
    EXEC SQL insert into customers values (:acme.customers[1].name,
                                           :acme.customers[1].phone);

    /* Clear the array, to be sure reading back into it actually gets data */
    memset(custs1, 0, sizeof(customer) * 10);

    /* Now read back the data */
    EXEC SQL select * INTO :custs1:inds from customers limit 2;
    printf("custs1:\n");
    for (r = 0; r < 2; r++)
    {
	    printf( "name  - %s\n", custs1[r].name.arr );
	    printf( "phone - %d\n", custs1[r].phone );
    }

    EXEC SQL select * INTO :custs2:inds from customers limit 2;
    printf("\ncusts2:\n");
    for (r = 0; r < 2; r++)
    {
	    printf( "name  - %s\n", custs2[r].name.arr );
	    printf( "phone - %d\n", custs2[r].phone );
    }

    EXEC SQL select * INTO :custs3:inds from customers limit 2;
    printf("\ncusts3:\n");
    for (r = 0; r < 2; r++)
    {
	    printf( "name  - %s\n", custs3[r].name.arr );
	    printf( "phone - %d\n", custs3[r].phone );
    }

    EXEC SQL select * INTO :custs4:inds[0] from customers limit 1;
    printf("\ncusts4:\n");
    printf( "name  - %s\n", custs4.name.arr );
    printf( "phone - %d\n", custs4.phone );

    EXEC SQL select c INTO :onlyname from customers limit 2;
    printf("\nname:\n");
    for (r = 0; r < 2; r++)
    {
	    printf( "name  - %s\n", onlyname[r].arr );
    }

    EXEC SQL disconnect all;

    return 0;
}
