a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
203 lines
5.3 KiB
C#
203 lines
5.3 KiB
C#
// testblob.cs - tests loading a binary file into an oracle blob and vice-versa
|
|
using System;
|
|
using System.Data;
|
|
using System.Data.OracleClient;
|
|
using System.Text;
|
|
using System.IO;
|
|
|
|
class TestBlob
|
|
{
|
|
static string infilename = @"../../../tools/mono-win32-setup-dark.bmp";
|
|
static string outfilename = @"mono-win32-setup-dark2.bmp";
|
|
static string connectionString = "Data Source=testdb;User ID=scott;Password=tiger";
|
|
static byte[] bytes1 = null;
|
|
|
|
public static void Main (string[] args)
|
|
{
|
|
OracleConnection con = new OracleConnection();
|
|
con.ConnectionString = connectionString;
|
|
con.Open();
|
|
|
|
BLOBTest (con);
|
|
ReadBlob (con);
|
|
|
|
con.Close();
|
|
con = null;
|
|
}
|
|
|
|
// read the BLOB into file "cs-parser2.cs"
|
|
public static void ReadBlob (OracleConnection connection)
|
|
{
|
|
if (File.Exists(outfilename) == true) {
|
|
Console.WriteLine("Filename already exists: " + outfilename);
|
|
return;
|
|
}
|
|
|
|
OracleCommand rcmd = connection.CreateCommand ();
|
|
rcmd.CommandText = "SELECT BLOB_COLUMN FROM BLOBTEST";
|
|
OracleDataReader reader2 = rcmd.ExecuteReader ();
|
|
if (!reader2.Read ())
|
|
Console.WriteLine ("ERROR: RECORD NOT FOUND");
|
|
|
|
Console.WriteLine (" TESTING OracleLob OBJECT 2...");
|
|
OracleLob lob2 = reader2.GetOracleLob (0);
|
|
Console.WriteLine (" LENGTH: {0}", lob2.Length);
|
|
Console.WriteLine (" CHUNK SIZE: {0}", lob2.ChunkSize);
|
|
|
|
byte[] lobvalue = (byte[]) lob2.Value;
|
|
|
|
if (ByteArrayCompare(bytes1, lobvalue) == true)
|
|
Console.WriteLine("bytes1 and bytes2 are equal: good");
|
|
else
|
|
Console.WriteLine("bytes1 and bytes2 are not equal: bad");
|
|
|
|
FileStream fs = new FileStream(outfilename, FileMode.CreateNew);
|
|
BinaryWriter w = new BinaryWriter(fs);
|
|
w.Write(lobvalue);
|
|
w.Close();
|
|
fs.Close();
|
|
|
|
lob2.Close ();
|
|
reader2.Close ();
|
|
}
|
|
|
|
public static void BLOBTest (OracleConnection connection)
|
|
{
|
|
Console.WriteLine (" BEGIN TRANSACTION ...");
|
|
|
|
OracleTransaction transaction = connection.BeginTransaction ();
|
|
|
|
Console.WriteLine (" Drop table BLOBTEST ...");
|
|
try {
|
|
OracleCommand cmd2 = connection.CreateCommand ();
|
|
cmd2.Transaction = transaction;
|
|
cmd2.CommandText = "DROP TABLE BLOBTEST";
|
|
cmd2.ExecuteNonQuery ();
|
|
}
|
|
catch (OracleException) {
|
|
// ignore if table already exists
|
|
}
|
|
|
|
Console.WriteLine (" CREATE TABLE ...");
|
|
|
|
OracleCommand create = connection.CreateCommand ();
|
|
create.Transaction = transaction;
|
|
create.CommandText = "CREATE TABLE BLOBTEST (BLOB_COLUMN BLOB)";
|
|
create.ExecuteNonQuery ();
|
|
|
|
Console.WriteLine (" INSERT RECORD ...");
|
|
|
|
OracleCommand insert = connection.CreateCommand ();
|
|
insert.Transaction = transaction;
|
|
insert.CommandText = "INSERT INTO BLOBTEST VALUES (EMPTY_BLOB())";
|
|
insert.ExecuteNonQuery ();
|
|
|
|
OracleCommand select = connection.CreateCommand ();
|
|
select.Transaction = transaction;
|
|
select.CommandText = "SELECT BLOB_COLUMN FROM BLOBTEST FOR UPDATE";
|
|
Console.WriteLine (" SELECTING A BLOB (Binary Large Object) VALUE FROM BLOBTEST");
|
|
|
|
OracleDataReader reader = select.ExecuteReader ();
|
|
if (!reader.Read ())
|
|
Console.WriteLine ("ERROR: RECORD NOT FOUND");
|
|
|
|
Console.WriteLine (" TESTING OracleLob OBJECT ...");
|
|
OracleLob lob = reader.GetOracleLob (0);
|
|
Console.WriteLine (" LENGTH: {0}", lob.Length);
|
|
Console.WriteLine (" CHUNK SIZE: {0}", lob.ChunkSize);
|
|
|
|
//try {
|
|
if (File.Exists(infilename) == false) {
|
|
Console.WriteLine("Filename does not exist: " + infilename);
|
|
return;
|
|
}
|
|
|
|
FileStream fs = new FileStream(infilename, FileMode.Open, FileAccess.Read);
|
|
BinaryReader r = new BinaryReader(fs);
|
|
|
|
byte[] bytes = null;
|
|
int bufferLen = 8192;
|
|
bytes = r.ReadBytes (bufferLen);
|
|
|
|
while(bytes.Length > 0) {
|
|
Console.WriteLine("byte count: " + bytes.Length.ToString());
|
|
lob.Write (bytes, 0, bytes.Length);
|
|
bytes1 = ByteArrayCombine (bytes1, bytes);
|
|
if (bytes.Length < bufferLen)
|
|
break;
|
|
bytes = r.ReadBytes (bufferLen);
|
|
}
|
|
|
|
r.Close();
|
|
fs.Close ();
|
|
//}
|
|
//catch (Exception e) {
|
|
// Console.WriteLine("The file could not be read:");
|
|
// Console.WriteLine(e.Message);
|
|
//}
|
|
|
|
lob.Close ();
|
|
|
|
Console.WriteLine (" CLOSING READER...");
|
|
|
|
reader.Close ();
|
|
transaction.Commit ();
|
|
transaction = null;
|
|
lob = null;
|
|
reader.Dispose();
|
|
reader = null;
|
|
create = null;
|
|
insert = null;
|
|
select = null;
|
|
}
|
|
|
|
static byte[] ByteArrayCombine (byte[] b1, byte[] b2)
|
|
{
|
|
if (b1 == null)
|
|
b1 = new byte[0];
|
|
if (b2 == null)
|
|
b2 = new byte[0];
|
|
|
|
byte[] bytes = new byte[b1.Length + b2.Length];
|
|
int i = 0;
|
|
for (int j = 0; j < b1.Length; j++) {
|
|
bytes[i] = b1[j];
|
|
i++;
|
|
}
|
|
for (int k = 0; k < b2.Length; k++) {
|
|
bytes[i] = b2[k];
|
|
i++;
|
|
}
|
|
return bytes;
|
|
}
|
|
|
|
static bool ByteArrayCompare(byte[] ba1, byte[] ba2)
|
|
{
|
|
if (ba1 == null && ba2 == null)
|
|
return true;
|
|
|
|
if (ba1 == null)
|
|
return false;
|
|
|
|
if (ba2 == null)
|
|
return false;
|
|
|
|
if (ba1.Length != ba2.Length)
|
|
return false;
|
|
|
|
for (int i = 0; i < ba1.Length; i++)
|
|
{
|
|
Console.WriteLine("i: " + i.ToString() + " ba1: " + ba1[i].ToString() + " ba2: " + ba2[i].ToString());
|
|
}
|
|
|
|
for (int i = 0; i < ba1.Length; i++)
|
|
{
|
|
if (ba1[i] != ba2[i])
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|