DBD::DBMaker long support
=======================

There are two methods to handle LONG data:

I. use LongReadLen and blob_read

a. You may use the 'LONG VARCHAR' or 'LONG VARBINARY' fields like the normal
   ones, provided you have enough memory to fetch them.
   This can be done by giving an attribute value when preparing the
   statement:
   	$sth = $dbh->prepare("select * from foo",
		             { 'LongReadLen' => 4096, }
		             );
   

b. Additional, starting with v0.04, you may read the data out of a LONG
   column using the function blob_read().  This allows to read the whole
   data in the LONG field from a fetched row; each subsequent call to
   blob_read returns another part of the data within the LONG column.
   
   Example: After executing this code fragment you will have the
            entire contents of column 34 of a fetched row in $data.
   
   my $data = "";
   my $offset = 0;
   my $chunk = "";
   $dbh->{LongReadLen} = 0
   while ($chunk = $sth->blob_read(34, $offset, 4096))
   	{
	$offset += length($chunk);
	$data .= $chunk;
	}

II. Handle BLOB field via file with DBMaker

1. Output BLOB to user's file:

In DBI, you can set LongReadLen to set the buffer length for getting
your blob data. However, BLOB field's data maybe too large to malloc
buffer for storing it, and it may be a little troublesome to call
blob_read many times. By BindColToFile, you can redirect the 
column's output to a file, and you can continue to access the blob
on the local file.  Because this function will create many files
when you try to fetch in a table which holds many rows, please 
remember to clean up the files when you finish your program.

$sth->func($colno, $prefix_filename, $fgOverwrite, 'BindColToFile')

NOTE: set fgOverwrite 1 or 0 to specify whether your local file with same
name be overwritten or not.

For example:
$sql = qq{ SELECT c1 FROM blobt1};
$sth = $dbh->prepare( $sql );
 
$sth->func(1, "perl_outfile.txt", 1, 'BindColToFile');
 
$sth->execute()||die "$DBI::errstr";
 
my $c1;
 
$sth->bind_columns( undef, \$c1);
while( $sth->fetch() ) {  
    print "c1 = $c1\n"; 
}

After running this program, you will notice there's many file called
perl_outfile.txt, perl_outfile1.txt,...perl_outfilen.txt in your local
directory.  You need to remember to delete these files if they are no
longer necessary.

2. Use file as input parameter to a BLOB column

a. store file content for BLOB field

When this attribute value is 1 and user add quote for a file name as 
input parameter value, and the parameter's SQL type is SQL_LONGVARCHAR/
SQL_LONGVARBINARY/SQL_FILE, DBMaker will store the file's content into
database.

  Example:
  $dbh->do("create table blobt1 (c1 long varchar)");
  my $sql=qq{INSERT INTO blobt1 values(?)};
  my $sth = $dbh->prepare($sql);
 
  # By default, DBMaker will try to open a blob file name (for example: test.gif), 
  # read the file and then store into the database
  $sth->bind_param(1,"'test.gif'");
  $sth->execute();

  # If you want to store a blob file name (for example: test.gif) with string quote 
  # into database
  $sth->{dbmaker_file_input} = 0;
  $sth->bind_param(1,"'test.gif'");
  $sth->execute();

You can select c1 from this table and see what's the difference between these two
insert.

b. Store file name only for FILE column

When dbmaker_file_input statement attribute sets on, there are 
difference when you input file name with or without single quote for
DBMaker's SQL_FILE type.  When you do not add single quote with
the input string,  DBMaker will check if the file name is accessible
by DBMaker server, and store the file name into the database.  For
detail description for DBMaker's SQL_FILE type, please reference 
DBMaker's manual.

NOTE: In order to tell DBMaker to store file name, you should make
sure you have set DB_USRFO=1 in dmconfig.ini, and the input file name
must be full path with file name.

  Example:
  $dbh->do("create table filet1 (c1 file)");
  my $sql=qq{INSERT INTO filet1 values(?)};
  my $sth = $dbh->prepare($sql);
 
  # Test input file name with single quote
  # You can test with a file in current directory
  $sth->bind_param(1,"'test.gif'");
  $sth->execute();

  # If you want to store a data with or without single quote 
  # into database's FILE column, you should set 
  # the attribute dbmaker_file_input = 0
  $sth->{dbmaker_file_input} = 0;
  $sth->bind_param(1,"test.gif");
  $sth->execute();

  $sth->bind_param(1,"'test.gif'");
  $sth->execute();

You can select c1 or select filename(c1) from this table to see what's the difference
with these inserts.
