Re: Replacement for mdb_ole_read_full

Jakob Egger <[email protected]> Fri, 13 May 2011 12:30:48 +0200
Newsgroups gmane.comp.db.mdb-tools.devel
Message-ID <[email protected]>
I have a general question about OLE fields: Once I read an OLE field from the database, what do I do with it? Let's say the user put an image into a field. Then the OLE field contains the jpeg/bmp/whatever file wrapped in some strange binary format. How can I extract the actual files from this binary OLE wrapper format? Or did I misunderstand something?

Does anybody have experience with this?
Best regards,
Jakob


On 27.02.2011, at 00:07, dw wrote:

> So, my first proposed modification is to replace the mdb_ole_read_full 
> routine in data.c.  While the current routine does work, it has a number 
> of inefficiencies:
> 
> - Performs unnecessary memory allocation/memcpy of the Memo Field Definition
> - Performs (repeated) unnecessary memcpys
> - Performs (repeated) unnecessary reallocs (which also do memcpys)
> - Allocates more memory than is needed to hold the data
> - Uses an inconsistent memory allocator (malloc vs g_malloc)
> - Leaves the col->bind_ptr in an unusable state
> 
> My replacement (below) does:
> 
> - Zero memcpys
> - Zero reallocs
> - A single, correctly-sized allocation using g_malloc
> - Preserves the Memo Field Definition in col->bind_ptr
> - Fully commented
> 
> My next proposed modification is more substantive, but this seemed like 
> a good place to start.
> 
> dw
> 
> /*
>  * mdb_ole_read_full - reads the entire OLE field
>  *
>  * mdb - the database pointer
>  * col - the column to read
>  * size - outputs the size of the buffer returned (may be NULL)
>  *
>  * returns - the result in a big buffer.  The number of data bytes is
>  * returned in the size parameter.  The returned buffer must freed
>  * using g_free().
>  *
>  * On return, col->bind_ptr still points to the 12 byte Memo Field
>  * Definition, NOT the data.  This means the OLE field can be
>  * re-read if necessary.
>  *
>  */
> void*
> mdb_ole_read_full(MdbHandle *mdb, MdbColumn *col, size_t *size)
> {
> 	void *pOldBind;
> 	unsigned char *result;
> 	size_t pos, iTotSize;
> 
> 	// What's the total length of the field?  Drop off flags
> 	iTotSize = mdb_get_int32(col->bind_ptr, 0)&  0x3fffffff;
> 
> 	// Allocate room for the entire field.
> 	result = (unsigned char *)g_malloc(iTotSize);
> 
> 	// Save the old pointer which points to the 12 byte Memo Field Definition
> 	pOldBind = col->bind_ptr;
> 
> 	// mdb_ole_read&  mdb_ole_read_next always write to col->bind_ptr.
> 	// So we adjust it to point to our full sized buffer
> 	col->bind_ptr = result;
> 
> 	// Reads at most 1 data page
> 	pos = mdb_ole_read(mdb, col, pOldBind, iTotSize);
> 
> 	// Is there more to read?
> 	while (pos<  iTotSize)
> 	{
> 		// Adjust col->bind_ptr so the next call will write to
> 		// the appropriate offset in the buffer
> 		col->bind_ptr = result + pos;
> 
> 		// Read the next chunk (at most 1 data page).  Passing NULL
> 		// for the 3rd parameter avoids redundant error checking
> 		pos += mdb_ole_read_next(mdb, col, NULL);
> 	}
> 
> 	// assert pos == iTotSize
> 
> 	if (size)
> 		*size = pos;
> 
> 	// restore the 12 byte Memo Field Definition
> 	col->bind_ptr = pOldBind;
> 
> 	return result;
> }
> 
> 
> 
> ------------------------------------------------------------------------------
> Free Software Download: Index, Search & Analyze Logs and other IT data in 
> Real-Time with Splunk. Collect, index and harness all the fast moving IT data 
> generated by your applications, servers and devices whether physical, virtual
> or in the cloud. Deliver compliance at lower cost and gain new business 
> insights. http://p.sf.net/sfu/splunk-dev2dev 
> _______________________________________________
> mdbtools-dev mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mdbtools-dev


------------------------------------------------------------------------------
Achieve unprecedented app performance and reliability
What every C/C++ and Fortran developer should know.
Learn how Intel has extended the reach of its next-generation tools
to help boost performance applications - inlcuding clusters.
http://p.sf.net/sfu/intel-dev2devmay