00001
00002 #include <stdio.h>
00003 #include <stdlib.h>
00004 #include "examples.h"
00005
00006 int insert_file_into_blob_table(sqlo_db_handle_t dbh, int key, const char * fname )
00007 {
00008
00009 char * stmt =
00010 "INSERT INTO T_SQLORA_BLOB (KEY, BDATA) "
00011 "VALUES (:b1, EMPTY_BLOB()) RETURNING BDATA INTO :b2";
00012 sqlo_lob_desc_t loblp;
00013 sqlo_stmt_handle_t sth;
00014 int status;
00015 FILE * fp;
00016 unsigned filelen;
00017 short ind;
00018 int k = key;
00019
00020 create_blob_table(dbh);
00021
00022 if (! (fp = fopen(fname, "r"))) {
00023 printf("ERROR: cannot open file %s\n", fname);
00024 return 0;
00025 }
00026
00027
00028 fseek(fp, 0, SEEK_END);
00029 filelen = ftell(fp);
00030 fseek(fp, 0, 0);
00031
00032
00033 if (0>(sth = sqlo_prepare(dbh, stmt)))
00034 error_exit(dbh, "sqlo_prepare");
00035
00036
00037 if (0 > sqlo_alloc_lob_desc(dbh, &loblp))
00038 error_exit(dbh, "sqlo_alloc_lob_desc");
00039
00040
00041 if (SQLO_SUCCESS !=
00042 (sqlo_bind_by_pos(sth, 1, SQLOT_INT, &k, sizeof(int), NULL, 0)) ||
00043 (sqlo_bind_by_pos(sth, 2, SQLOT_BLOB, &loblp, 0, &ind, 0))
00044 ) {
00045 sqlo_free_lob_desc(dbh, &loblp);
00046 error_exit(dbh, "sqlo_bind_by_pos");
00047 }
00048
00049
00050 status = sqlo_execute(sth, 1);
00051
00052 if (SQLO_SUCCESS != status) {
00053 sqlo_free_lob_desc(dbh, &loblp);
00054 error_exit(dbh, "sqlo_execute");
00055 }
00056
00057
00058 status = sqlo_lob_write_stream(dbh, loblp, filelen, fp);
00059
00060 if (status < 0) {
00061 sqlo_free_lob_desc(dbh, &loblp);
00062 error_exit(dbh, "sqlo_lob_write_stream");
00063 }
00064
00065 sqlo_close(sth);
00066 sqlo_free_lob_desc(dbh, &loblp);
00067 fclose(fp);
00068
00069 return (1);
00070 }
00071
00072
00073