#include <stdio.h>
#include <time.h>
#include <math.h>
#include <qtXLS.h>

const qt_K_INTEGER  DIMArr = 50, NoColumns = 5, TEXTLen = 256;
static struct qT_TIMESTAMP_STRUCT TSArr[DIMArr];      // defines a date & time structure

void set_qT_SQLColumn( qT_SQLColumn *tColumn, 
                       char* sName,
                       void *ArrayAddr,
                       qt_K_INT4 iArrayDim, 
                       qt_K_INT4 iArrayType, 
                       qt_K_INT4 iLENArrElem )
{
   // tColumn->Name = sName;	// column name
   strcpy(tColumn->Name, sName);	// column name
   tColumn->ArrayAddr	= (qt_K_LP)ArrayAddr;   // address of array
   tColumn->ArrayDim		= iArrayDim;      // array dimension
   tColumn->ArrayType	= iArrayType;     // type of array
   tColumn->LENArrElem	= iLENArrElem;    // size of an array element (in bytes)
   tColumn->IndArrAddr	= 0;              // reserved, unused (should be 0)

   return;
}

void Set_TSArr( int j )
// fill date & time structure with some date and time values
{
   int hour;

   if ( j == 0 )
   {
      time_t now = time(NULL);
      tm *z = localtime(&now);
      TSArr[j].year		= z->tm_year + 1900;
      TSArr[j].month		= z->tm_mon + 1;
      TSArr[j].day		= z->tm_mday;
      TSArr[j].hour		= z->tm_hour;
      TSArr[j].minute	= z->tm_min;
      TSArr[j].second	= z->tm_sec;
      TSArr[j].fraction	= 0;
   }
   else
   // increment date and time
   {
      TSArr[j] = TSArr[j-1];

      TSArr[j].day = TSArr[j-1].day + 1;
      if ( TSArr[j].day > 28 )
      {
         TSArr[j].day = 1;
         TSArr[j].month = TSArr[j-1].month + 1;
         if ( TSArr[j].month > 12 )
         {
            TSArr[j].month = 1;
            TSArr[j].year = TSArr[j-1].year + 1;
         }
      }

      TSArr[j].second = TSArr[j-1].second + 1;
      if ( TSArr[j].second > 59 ) 
      {
         TSArr[j].second = 1;
         TSArr[j].minute = TSArr[j-1].minute + 1;
         if ( TSArr[j].minute > 59 ) 
         {
            TSArr[j].minute = 1;
            hour = TSArr[j-1].hour;
            TSArr[j].hour = hour % 24 + 1;
         }
      }
   }
   return;
}

int main(void)
{
// Program demonstrates usage of qtXLS routines to export some
// data to  an EXCEL file.
//
// We are going to create an EXCEL file named "qtXLSDemo3.xls"
// which contains a table named "qtXLSDemoTable" with
// columns:  lfdNr   x   y   Description   Date_Time   


// Arrays with data to be exported.
   char *szTextArr;           // [DIMArr][TEXTLen];
   qt_K_INTEGER *lfdNrArr;    // INTEGER*4 [DIMArr] arrays
   qt_K_R8 *xArr, *yArr;      // REAL*8 [DIMArr] arrays

   qt_K_R8 angle;
   const qt_K_R8 PI = 3.1415932654;

// variables to be used by qtXLS routines
   qt_K_HANDLE hDS;
   qt_K_INT4 iRet, iRow, TNLen, NoRows, ind;
   char *szFileName;
   struct qT_SQLColumn *tColumns[NoColumns];
   char *szTableName;
   char *szTableDefinition;

   // qtSetXLSLicencePath( szPathName )   // change the path to a location where the licence file resides

   NoRows = DIMArr;
   // allocate arrays for result set
   //szTextArr[NoRows] = new char [NoRows][TEXTLen];
   szTextArr =(char *) calloc(NoRows, TEXTLen);
   lfdNrArr = new qt_K_INTEGER [NoRows];
   xArr = new qt_K_R8 [NoRows];
   yArr = new qt_K_R8 [NoRows];

   if (    szTextArr == NULL 
        || lfdNrArr == NULL 
        || xArr == NULL 
        || yArr == NULL )
   {
      printf("Could not allocate arrays.n");
      return -1;		// to the "Exit"
   }
   // Fill arrays with values (the data we"re going to export into an EXCEL file)
   for (ind = 0; ind < DIMArr; ind++)
   {
      iRow = ind + 1;
      lfdNrArr[ind] = iRow;
      xArr[ind] = iRow * 0.01;
      angle = xArr[ind] * PI;
      yArr[ind] = cos(angle);
      sprintf(szTextArr + ind * TEXTLen, "(Angle = , %.2f,  (degree)", angle * 180. / PI);
      Set_TSArr( ind );    // routine (see CONTAINS section) sets TSArr
   }

// create "empty" EXCEL file
   szFileName = "qtXLSDemo3.xls";
   hDS = qtXLSCreateEXCELFile( szFileName );   // returns a "data source handle" to be used with other qtXLS routines
   if ( hDS == 0 )
   {
      printf("Error returned from qtXLSCreateEXCELFile = %d\n", hDS);
      return -1;
   }
   else
      printf("qtXLSCreateEXCELFile created the file %s\n", szFileName);

   qtXLSSetErrorLevel( 1 );                  // continue, if an error occurs (if possible)
   //T qtXLSSetErrorMessagesDisplay( 1 );    // turn on "error display"

// Create (empty) table
// --------------------
   szTableName = "qtXLSDemoTable";                 // table name (zero terminated)
   TNLen = qtXLSGetszStringLength( szTableName );  // returns length of string (without terminating zero)

// check if table already exists
   if ( qtXLSDoesTableNameExist( hDS, szTableName ) == 1 )
      printf("Table %s already exists.\n", szTableName);
   else
   {
   // create table by setting up a command line containing the table name followed 
   // by a list of pairs of column names and column types (like NUMBER, DATETIME, TEXT, CURRENCY or LOGICAL).
      szTableDefinition = new char [1000];
      strcpy(szTableDefinition, szTableName);
      strcpy(&szTableDefinition[TNLen],
             " (lfdNr NUMBER, x NUMBER, y NUMBER, Description TEXT, Date_Time DATETIME)");
      iRet = qtXLSCreateTable( hDS, szTableDefinition  );
      if ( iRet != 0) return -1;    // stop on error
   }

// Set up columns "lfdNr   x   y   Description   Date_Time" for export
// -------------------------------------------------------------------
   // create array of structure tColumns
   tColumns[0] = (qT_SQLColumn *) calloc(NoColumns, sizeof(qT_SQLColumn));
   for (ind = 1; ind < NoColumns; ind++)
   tColumns[ind] = tColumns[ind-1] + 1; // + sizeof(qT_SQLColumn);

   // 1st column
   set_qT_SQLColumn( tColumns[0], 
                     "lfdNr", 
                     lfdNrArr, 
                     NoRows,
                     qt_SQL_C_SLONG, 
                     4 );
// and remaining columns
   set_qT_SQLColumn(tColumns[1], "x", xArr, NoRows, qt_SQL_C_DOUBLE, 8);
   set_qT_SQLColumn(tColumns[2], "y", yArr, NoRows, qt_SQL_C_DOUBLE, 8);
   set_qT_SQLColumn(tColumns[3], "Description", szTextArr, NoRows, qt_SQL_C_CHAR, TEXTLen);
   set_qT_SQLColumn(tColumns[4], "Date_Time", TSArr, NoRows, qt_SQL_C_TIMESTAMP, 16);

// Fill table with rows
// --------------------
   iRet = qtXLSWriteRows( hDS, szTableName, NoColumns, NoRows, tColumns[0] );

   if ( iRet >= 0 ) 
      printf("qtXLSWriteRows successful. Number of rows written: %d\n", iRet);
   else
      printf("Error returned from qtXLSWriteRows; iError = %d\n", iRet);

   iRet = qtXLSCloseEXCELFile( hDS );
   if ( iRet == 0 )
   {
      printf("Data successfully exported to EXCEL file %s\n", szFileName);
      printf("qtXLS closed.\n");
   }
   else
      printf("Error returned from qtXLSCloseEXCELFile = %d\n", iRet);

   printf("\n");
   printf("(C) QT software GmbH, Germany. All rights reserved. 2006.\n");
   printf("    http:\\www.qtsoftware.de    eMail: info@qtsoftware.de\n");
   return 0;
}