Re: ~How to use RAW and LONG RAW columns ?
Date: 25 Jun 1998 20:53:34 +0300
Message-ID: <AB6sdary0G_at_unisoft.dp.ua>
RC> Hey Y'all, RC> RC> I'm trying to store BINARY files in a LONG RAW column (such as BITMAPs, RC> DOC files, WAVs etc), but none of my reference books tell me HOW to RC> actually do it. RC> RC> I'm using Pro*C with Oracle 7.2 (so I can't use BLOBs !!) RC> RC> Got any ideas ??? RC> RC> RC> Thanks, RC> Richard RC> RC> email: richard_at_rockdb.demon.co.uk
Hi, Richard.
In Pro*C 2.x you can work with LONG RAW columns, using expression
EXEC SQL TYPE <your_structure> IS long varraw (MAX_FILE_SIZE);
where <your_structure> is
typedef struct { long len; char buf[MAX_FILE_SIZE]; } <your_structure>;
Example from sample going with the Pro*C 2.x documentation:
#include <sqlca.h>
#include <string.h>
#include <stdio.h>
#include <io.h>
#define DISCARD (void)
#define S2VCPY(vch,s) \
DISCARD strcpy((char *)vch.arr,s);\
vch.len = (unsigned short) strlen(s)
#define VCHNULL(v) v.arr[v.len] = '\0'
EXEC SQL BEGIN DECLARE SECTION;
#define MAX_FILE_SIZE 500000
typedef struct { long len; char buf[MAX_FILE_SIZE]; } long_varraw;
EXEC SQL END DECLARE SECTION;
EXEC SQL TYPE long_varraw IS long varraw (MAX_FILE_SIZE);
int insert(char *key,char *file)
{
EXEC SQL BEGIN DECLARE SECTION;
long_varraw lvr1;
VARCHAR key1[20];
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE db_name DATABASE;
printf("Inserting file %s under key %s...\n", file, key);
S2VCPY(key1,key);
lvr1.len = read_file(file, lvr1.buf, MAX_FILE_SIZE);
if (lvr1.len == -1)
{ fprintf(stderr,"\n\nError while reading file ô%sô:\n", file);
EXEC SQL AT db_name ROLLBACK WORK RELEASE; return(1);
}
EXEC SQL WHENEVER SQLERROR DO sql_error("insert");
EXEC SQL AT db_name INSERT INTO executables (name, binary)
VALUES (:key1, :lvr1);
EXEC SQL AT db_name COMMIT;
printf("Inserted.\n");
}
int read_file(char *filename,char *buf,long bufsize) {
#define LOCAL_BUFFERSIZE 512
char local_buffer[LOCAL_BUFFERSIZE];
FILE *stream;
int number_read,in_fd,total_size=0;
if ((stream=fopen( filename, "rb" ))==NULL)
{ printf("Can't open file %s for read\n",filename); return(-2);}
in_fd=_fileno(stream);
while ((number_read = _read(in_fd, local_buffer,
LOCAL_BUFFERSIZE)) > 0) { if (total_size + number_read > bufsize) { close(in_fd); return(-1); } memcpy(buf+total_size, local_buffer, number_read); total_size += number_read;
}
_close(in_fd);
return(total_size);
}
I hope it will help.
WBR,
Vlad
UniSoft,ltd
Dniepropetrovsk
Ukraine
Received on Thu Jun 25 1998 - 19:53:34 CEST