This example shows how to insert a blob in chunks and retrieve it in chunks too.
// ********************************************************************* // Copyright 1994-2008 iAnywhere Solutions, Inc. All rights reserved. // This sample code is provided AS IS, without warranty or liability // of any kind. // // You may use, reproduce, modify and distribute this sample code // without limitation, on the condition that you retain the foregoing // copyright notice and disclaimer as to the original iAnywhere code. // // ********************************************************************* #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include "sacapidll.h" int main( ) { SQLAnywhereInterface api; a_sqlany_connection *conn; a_sqlany_stmt *stmt; unsigned int I; unsigned char *data; unsigned int size = 1024*1024; // 1MB blob int code; a_sqlany_data_value value; int num_cols; unsigned char retrieve_buffer[4096]; a_sqlany_data_info dinfo; int bytes_read; size_t total_bytes_read; unsigned int max_api_ver; if( !sqlany_initialize_interface( &api, NULL ) ) { printf( "Could not initialize the interface!\n" ); exit( 0 ); } assert( api.sqlany_init( "my_php_app", SQLANY_CURRENT_API_VERSION, &max_api_ver ) ); conn = api.sqlany_new_connection(); if( !api.sqlany_connect( conn, "uid=dba;pwd=sql" ) ) { char buffer[SACAPI_ERROR_SIZE]; code = api.sqlany_error( conn, buffer, sizeof(buffer) ); printf( "Could not connection[%d]:%s\n", code, buffer ); goto clean; } printf( "Connected successfully!\n" ); api.sqlany_execute_immediate( conn, "drop table my_blob_table" ); assert( api.sqlany_execute_immediate( conn, "create table my_blob_table (size integer, data long binary)" ) != 0); // 1. Starting to insert blob operation stmt = api.sqlany_prepare( conn, "insert into my_blob_table( size, data) values( ?, ? )" ); assert( stmt != NULL ); // 1.1 You must first bind the parameters a_sqlany_bind_param param; api.sqlany_describe_bind_param( stmt, 0, ¶m ); param.value.buffer = (char *)&size; param.value.type = A_VAL32; param.value.is_null= NULL; param.direction = DD_INPUT; api.sqlany_bind_param( stmt, 0, ¶m ); api.sqlany_describe_bind_param( stmt, 1, ¶m ); param.value.buffer = NULL; param.value.type = A_BINARY; param.value.is_null= NULL; param.direction = DD_INPUT; api.sqlany_bind_param( stmt, 1, ¶m ); data = (unsigned char *)malloc( size ); for( I = 0; I < size; I++ ) { data[i] = I % 256; } // 1.2 upload the blob data to the server in chunks for( I = 0; I < size; I += 4096 ) { if( !api.sqlany_send_param_data( stmt, 1, (char *)&data[i], 4096 )) { char buffer[SACAPI_ERROR_SIZE]; code = api.sqlany_error( conn, buffer, sizeof(buffer) ); printf( "Could not send param[%d]:%s\n", code, buffer ); } } // 1.3 actually do the row insert operation assert( api.sqlany_execute( stmt ) == 1 ); api.sqlany_commit( conn ); api.sqlany_free_stmt( stmt ); // 2. Now let's retrieve the blob stmt = api.sqlany_execute_direct( conn, "select * from my_blob_table" ); assert( stmt != NULL ); assert( api.sqlany_fetch_next( stmt ) == 1 ); num_cols = api.sqlany_num_cols( stmt ); assert( num_cols == 2 ); api.sqlany_get_column( stmt, 0, &value ); assert( I == size ); assert( value.type == A_VAL32 ); api.sqlany_get_data_info( stmt, 1, &dinfo ); assert( dinfo.type == A_BINARY ); assert( dinfo.data_size == size ); assert( dinfo.is_null == 0 ); // 2.1 Retrieve data in 4096 byte chunks total_bytes_read = 0; while( 1 ) { bytes_read = api.sqlany_get_data( stmt, 1, total_bytes_read, retrieve_buffer, sizeof(retrieve_buffer) ); if( bytes_read <= 0 ) { break; } // verify the buffer contents for( I = 0; I < (unsigned int)bytes_read; I++ ) { assert( retrieve_buffer[i] == data[total_bytes_read+I] ); } total_bytes_read += bytes_read; } assert( total_bytes_read == size ); free(data ); assert( api.sqlany_fetch_next( stmt ) == 0 ); api.sqlany_free_stmt( stmt ); api.sqlany_disconnect( conn ); clean: api.sqlany_free_connection( conn ); api.sqlany_fini(); sqlany_finalize_interface( &api ); printf( "Success!\n" ); } |
Discuss this page in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |