/**************************************************************************
 *
 * mlinefromshape.c
 *
 * This program demonstrates how to insert spatial data into a database
 * in ESRI shapefile format using the Informix Spatial DataBlade's
 * SE_MlineFromShape function.
 *
 * This program creates a table and inserts several polygons into it.
 * For an example program which shows how to insert all spatial types,
 * please see load_shapes.c
 *
 * The following command will likely compile this source:
 *
 *   cc -o mlinefromshape mlinefromshape.c \
 *        -I$INFORMIXDIR/incl/cli -L$INFORMIXDIR/lib/cli -lifcli -lifdmr
 *
 **************************************************************************/


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

#ifdef WINNT
#include <io.h>
#include <windows.h>
#include <conio.h>
#endif

#include <infxcli.h>     /* ODBC typedefs and data structures */
#include "odbcutils.c"   /* ODBC utility functions */

/*
 * Constants, macros, typedefs, data structures, & functions for 
 * processing ESRI shapefile format data.
 */
#include "commfuncs.h"
#include "commfuncs.c"
#include "shapefuncs.c"


void main (int argc, char **argv)
{
    SQLHDBC       hdbc;
    SQLHENV       henv;
    SQLHSTMT      hstmt;
    char          sql_stmt[200];
    int           rc;
    SDWORD        pcbvalue1, pcbvalue2, pcbvalue3;
    Geometry      geom = {0};
    Point         pt[30];
    int           offsets[5];
    int           max_alloced = 0;
    int           id;
    char         *name;
    int           name_len;
    char         *water_shape_buf;
    int           water_shape_len;
    int           srid;
    
    /* Check for the correct number of arguments entered. */
    if (argc < 2)
    {
        printf ("Usage: %s <datasource> [<srid>]\n", argv[0]);
        exit (1);
    }

    /* Connect to the database. */
    server_connect ((UCHAR *) argv[1], &henv, &hdbc);

    /* Obtain srid to use for inserts */
    srid = (argc > 2) ? atoi(argv[2]) : 0;

    /* Allocate memory for the SQL statement handle and
     * associate the statement handle with the connection handle. */
    rc = SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt);
	returncode_check (hdbc, (SQLHSTMT)NULL, rc, "SQLAllocHandle");

    rc = SQLExecDirect (hstmt, (UCHAR *) "DROP TABLE waterways", SQL_NTS);
    rc = SQLExecDirect (hstmt, (UCHAR *) "CREATE TABLE waterways (id integer, name varchar(128), water ST_MultiLineString)", SQL_NTS);
    returncode_check (NULL, hstmt, rc, "SQLExecDirect");

    /* Initialize entries for non-spatial columns in the table  */
    id = 12345;
    name = "Fedders Creek";
    name_len = strlen(name);
    
    /* Populate the first linestring. */
    offsets[0] = 0;
    pt[0].x = 10; pt[0].y = 10;
    pt[1].x = 10; pt[1].y = 20;
  
    /* Populate the second linestring. */
    offsets[1] = 2; 
    pt[2].x = 5;  pt[2].y = 15;
    pt[3].x = 15; pt[3].y = 15;

    geom.type = geomMultiLineString;
    geom.num_points = 4;
    geom.num_parts  = 2;
    geom.offsets = offsets;
    geom.pt = pt;

    /* Convert the multilinestring to an ESRI shape. */
    geom_to_shape (&geom, &max_alloced, &water_shape_len, &water_shape_buf);
               

    /* INFORMIX_EXTEST_BEGIN mlinefromshape */

    /* Create the SQL insert statement to populate the waterways
     * table. The question marks are parameter markers that indicate
     * the column values that will be inserted at run time. */
    sprintf(sql_stmt,
            "INSERT INTO waterways (id,name,water) "
            "VALUES(?, ?, SE_MlineFromShape(?, %d))", srid);

    /* Prepare the SQL statement for execution. */
    rc = SQLPrepare (hstmt, (unsigned char *)sql_stmt, SQL_NTS);
    returncode_check (NULL, hstmt, rc, "SQLPrepare");

    /* Bind the id to the first parameter. */
    pcbvalue1 = 0;
    rc = SQLBindParameter (hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG,
                           SQL_INTEGER, 0, 0,
                           &id, 0, &pcbvalue1);
    returncode_check (NULL, hstmt, rc, "SQLBindParameter");

    /* Bind the name to the second parameter. */
    pcbvalue2 = name_len;
    rc = SQLBindParameter (hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR,
                           SQL_CHAR, name_len, 0,
                           name, name_len, &pcbvalue2);
    returncode_check (NULL, hstmt, rc, "SQLBindParameter");

    /* Bind the water geometry to the third parameter. */
    pcbvalue3 = water_shape_len;
    rc = SQLBindParameter (hstmt, 3, SQL_PARAM_INPUT, SQL_C_BINARY,
                           SQL_INFX_UDT_LVARCHAR, water_shape_len, 0,
                           water_shape_buf, water_shape_len, &pcbvalue3);
    returncode_check (NULL, hstmt, rc, "SQLBindParameter");
    /* Execute the insert statement. */
    rc = SQLExecute (hstmt);
    returncode_check (NULL, hstmt, rc, "SQLExecute");
    
    /* INFORMIX_EXTEST_END mlinefromshape */

    SQLFreeStmt (hstmt, SQL_CLOSE);          /* Close the statement handle */
    SQLFreeHandle (SQL_HANDLE_STMT, hstmt);  /* Free the statement handle */
    SQLDisconnect (hdbc);                    /* Close the connection */
    SQLFreeHandle (SQL_HANDLE_DBC, hdbc);    /* Free the database handle */
    SQLFreeHandle (SQL_HANDLE_ENV, henv);    /* Free the ODBC environment */
    printf( "\nTest Complete\n");
}