| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | /************************************************************************** * * 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");}
 |