mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-05-18 06:39:30 +08:00
Patches from Brent Johnson for double, off page memo, and big endian support
This commit is contained in:
parent
e05970d711
commit
62dc667342
@ -13,7 +13,7 @@ mandir = $(exec_prefix)/man/man1
|
|||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CPPFLAGS =
|
CPPFLAGS =
|
||||||
CFLAGS = $(CPPFLAG) -g -O2
|
CFLAGS = $(CPPFLAG) -g -O2 -DHW_LITTLE_ENDIAN
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
LIBS =
|
LIBS =
|
||||||
INSTALL= @INSTALL@
|
INSTALL= @INSTALL@
|
||||||
|
96
src/configure
vendored
96
src/configure
vendored
@ -1197,6 +1197,102 @@ EOF
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
OLDCFLAGS="$CFLAGS"
|
||||||
|
CFLAGS=""
|
||||||
|
echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
|
||||||
|
echo "configure:1204: checking whether byte ordering is bigendian" >&5
|
||||||
|
if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
|
||||||
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
else
|
||||||
|
ac_cv_c_bigendian=unknown
|
||||||
|
# See if sys/param.h defines the BYTE_ORDER macro.
|
||||||
|
cat > conftest.$ac_ext <<EOF
|
||||||
|
#line 1211 "configure"
|
||||||
|
#include "confdefs.h"
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
|
||||||
|
bogus endian macros
|
||||||
|
#endif
|
||||||
|
; return 0; }
|
||||||
|
EOF
|
||||||
|
if { (eval echo configure:1222: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||||
|
rm -rf conftest*
|
||||||
|
# It does; now see whether it defined to BIG_ENDIAN or not.
|
||||||
|
cat > conftest.$ac_ext <<EOF
|
||||||
|
#line 1226 "configure"
|
||||||
|
#include "confdefs.h"
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
#if BYTE_ORDER != BIG_ENDIAN
|
||||||
|
not big endian
|
||||||
|
#endif
|
||||||
|
; return 0; }
|
||||||
|
EOF
|
||||||
|
if { (eval echo configure:1237: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||||
|
rm -rf conftest*
|
||||||
|
ac_cv_c_bigendian=yes
|
||||||
|
else
|
||||||
|
echo "configure: failed program was:" >&5
|
||||||
|
cat conftest.$ac_ext >&5
|
||||||
|
rm -rf conftest*
|
||||||
|
ac_cv_c_bigendian=no
|
||||||
|
fi
|
||||||
|
rm -f conftest*
|
||||||
|
else
|
||||||
|
echo "configure: failed program was:" >&5
|
||||||
|
cat conftest.$ac_ext >&5
|
||||||
|
fi
|
||||||
|
rm -f conftest*
|
||||||
|
if test $ac_cv_c_bigendian = unknown; then
|
||||||
|
if test "$cross_compiling" = yes; then
|
||||||
|
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
|
||||||
|
else
|
||||||
|
cat > conftest.$ac_ext <<EOF
|
||||||
|
#line 1257 "configure"
|
||||||
|
#include "confdefs.h"
|
||||||
|
main () {
|
||||||
|
/* Are we little or big endian? From Harbison&Steele. */
|
||||||
|
union
|
||||||
|
{
|
||||||
|
long l;
|
||||||
|
char c[sizeof (long)];
|
||||||
|
} u;
|
||||||
|
u.l = 1;
|
||||||
|
exit (u.c[sizeof (long) - 1] == 1);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
if { (eval echo configure:1270: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
||||||
|
then
|
||||||
|
ac_cv_c_bigendian=no
|
||||||
|
else
|
||||||
|
echo "configure: failed program was:" >&5
|
||||||
|
cat conftest.$ac_ext >&5
|
||||||
|
rm -fr conftest*
|
||||||
|
ac_cv_c_bigendian=yes
|
||||||
|
fi
|
||||||
|
rm -fr conftest*
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$ac_t""$ac_cv_c_bigendian" 1>&6
|
||||||
|
if test $ac_cv_c_bigendian = yes; then
|
||||||
|
cat >> confdefs.h <<\EOF
|
||||||
|
#define WORDS_BIGENDIAN 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $ac_cv_c_bigendian = yes; then OLDCFLAGS="$OLDCFLAGS -DHW_BIG_ENDIAN";
|
||||||
|
else OLDCFLAGS="$OLDCFLAGS -DHW_LITTLE_ENDIAN"; fi
|
||||||
|
CFLAGS=$OLDCFLAGS
|
||||||
|
|
||||||
|
|
||||||
trap '' 1 2 15
|
trap '' 1 2 15
|
||||||
cat > confcache <<\EOF
|
cat > confcache <<\EOF
|
||||||
|
@ -19,6 +19,13 @@ dnl Checks for typedefs, structures, and compiler characteristics.
|
|||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
AC_TYPE_SIZE_T
|
AC_TYPE_SIZE_T
|
||||||
|
|
||||||
|
OLDCFLAGS="$CFLAGS"
|
||||||
|
CFLAGS=""
|
||||||
|
AC_C_BIGENDIAN
|
||||||
|
if test $ac_cv_c_bigendian = yes; then OLDCFLAGS="$OLDCFLAGS -DHW_BIG_ENDIAN";
|
||||||
|
else OLDCFLAGS="$OLDCFLAGS -DHW_LITTLE_ENDIAN"; fi
|
||||||
|
CFLAGS=$OLDCFLAGS
|
||||||
|
|
||||||
dnl Checks for library functions.
|
dnl Checks for library functions.
|
||||||
|
|
||||||
AC_OUTPUT(util/Makefile extras/Makefile Makefile libmdb/Makefile include/Makefile)
|
AC_OUTPUT(util/Makefile extras/Makefile Makefile libmdb/Makefile include/Makefile)
|
||||||
|
@ -13,7 +13,7 @@ mandir = $(exec_prefix)/man/man1
|
|||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CPPFLAGS =
|
CPPFLAGS =
|
||||||
CFLAGS = $(CPPFLAG) -g -O2
|
CFLAGS = $(CPPFLAG) -g -O2 -DHW_LITTLE_ENDIAN
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
LIBS =
|
LIBS =
|
||||||
INSTALL= @INSTALL@
|
INSTALL= @INSTALL@
|
||||||
@ -30,7 +30,7 @@ mdb-dump: dump.o
|
|||||||
$(CC) -g -o $@ $<
|
$(CC) -g -o $@ $<
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) -g -c $<
|
$(CC) $(CFLAGS) -g -c $<
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@for prog in $(PROGS); do \
|
@for prog in $(PROGS); do \
|
||||||
|
@ -30,7 +30,7 @@ mdb-dump: dump.o
|
|||||||
$(CC) -g -o $@ $<
|
$(CC) -g -o $@ $<
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) -g -c $<
|
$(CC) $(CFLAGS) -g -c $<
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@for prog in $(PROGS); do \
|
@for prog in $(PROGS); do \
|
||||||
|
@ -31,7 +31,7 @@ mdb-dump: dump.o
|
|||||||
$(CC) -g -o $@ $<
|
$(CC) -g -o $@ $<
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) -g -c $<
|
$(CC) $(CFLAGS) -g -c $<
|
||||||
|
|
||||||
install:
|
install:
|
||||||
mkdir -p $(includedir)
|
mkdir -p $(includedir)
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#define MDB_MAX_OBJ_NAME 30
|
#define MDB_MAX_OBJ_NAME 30
|
||||||
#define MDB_CATALOG_PG 18
|
#define MDB_CATALOG_PG 18
|
||||||
#define MDB_MEMO_OVERHEAD 12
|
#define MDB_MEMO_OVERHEAD 12
|
||||||
|
#define MDB_BIND_SIZE 2048
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MDB_VER_JET3 = 0,
|
MDB_VER_JET3 = 0,
|
||||||
@ -81,6 +82,7 @@ typedef struct {
|
|||||||
guint16 row_num;
|
guint16 row_num;
|
||||||
unsigned int cur_pos;
|
unsigned int cur_pos;
|
||||||
unsigned char pg_buf[MDB_PGSIZE];
|
unsigned char pg_buf[MDB_PGSIZE];
|
||||||
|
unsigned char alt_pg_buf[MDB_PGSIZE];
|
||||||
int num_catalog;
|
int num_catalog;
|
||||||
GArray *catalog;
|
GArray *catalog;
|
||||||
int pg_size;
|
int pg_size;
|
||||||
@ -139,8 +141,10 @@ extern MdbTableDef *mdb_alloc_tabledef(MdbCatalogEntry *entry);
|
|||||||
|
|
||||||
/* file.c */
|
/* file.c */
|
||||||
extern size_t mdb_read_pg(MdbHandle *mdb, unsigned long pg);
|
extern size_t mdb_read_pg(MdbHandle *mdb, unsigned long pg);
|
||||||
|
extern size_t mdb_read_alt_pg(MdbHandle *mdb, unsigned long pg);
|
||||||
extern int mdb_get_int16(MdbHandle *mdb, int offset);
|
extern int mdb_get_int16(MdbHandle *mdb, int offset);
|
||||||
extern long mdb_get_int32(MdbHandle *mdb, int offset);
|
extern long mdb_get_int32(MdbHandle *mdb, int offset);
|
||||||
|
extern double mdb_get_double(MdbHandle *mdb, int offset);
|
||||||
extern MdbHandle *mdb_open(char *filename);
|
extern MdbHandle *mdb_open(char *filename);
|
||||||
|
|
||||||
/* catalog.c */
|
/* catalog.c */
|
||||||
|
@ -13,7 +13,7 @@ mandir = $(exec_prefix)/man/man1
|
|||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CPPFLAGS =
|
CPPFLAGS =
|
||||||
CFLAGS = $(CPPFLAG) -g -O2
|
CFLAGS = $(CPPFLAG) -g -O2 -DHW_LITTLE_ENDIAN
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
LIBS =
|
LIBS =
|
||||||
INSTALL= @INSTALL@
|
INSTALL= @INSTALL@
|
||||||
@ -31,7 +31,7 @@ clean:
|
|||||||
rm -f core *.o *.a
|
rm -f core *.o *.a
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) -g -c $< $(INC)
|
$(CC) $(CFLAGS) -g -c $< $(INC)
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@for lib in $(LIBLIST); do \
|
@for lib in $(LIBLIST); do \
|
||||||
@ -44,3 +44,13 @@ uninstall:
|
|||||||
echo " copying $$lib to $(libdir)"; \
|
echo " copying $$lib to $(libdir)"; \
|
||||||
rm -f $(libdir)/$$lib; \
|
rm -f $(libdir)/$$lib; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
backend.o: backend.c ../include/mdbtools.h
|
||||||
|
catalog.o: catalog.c ../include/mdbtools.h
|
||||||
|
data.o: data.c ../include/mdbtools.h
|
||||||
|
dump.o: dump.c ../include/mdbtools.h
|
||||||
|
file.o: file.c ../include/mdbtools.h
|
||||||
|
kkd.o: kkd.c ../include/mdbtools.h
|
||||||
|
mem.o: mem.c ../include/mdbtools.h
|
||||||
|
table.o: table.c ../include/mdbtools.h
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ clean:
|
|||||||
rm -f core *.o *.a
|
rm -f core *.o *.a
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) -g -c $< $(INC)
|
$(CC) $(CFLAGS) -g -c $< $(INC)
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@for lib in $(LIBLIST); do \
|
@for lib in $(LIBLIST); do \
|
||||||
@ -44,3 +44,13 @@ uninstall:
|
|||||||
echo " copying $$lib to $(libdir)"; \
|
echo " copying $$lib to $(libdir)"; \
|
||||||
rm -f $(libdir)/$$lib; \
|
rm -f $(libdir)/$$lib; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
backend.o: backend.c ../include/mdbtools.h
|
||||||
|
catalog.o: catalog.c ../include/mdbtools.h
|
||||||
|
data.o: data.c ../include/mdbtools.h
|
||||||
|
dump.o: dump.c ../include/mdbtools.h
|
||||||
|
file.o: file.c ../include/mdbtools.h
|
||||||
|
kkd.o: kkd.c ../include/mdbtools.h
|
||||||
|
mem.o: mem.c ../include/mdbtools.h
|
||||||
|
table.o: table.c ../include/mdbtools.h
|
||||||
|
|
||||||
|
@ -159,11 +159,11 @@ MdbBackend *backend;
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
char *mdb_get_relationships(MdbHandle *mdb) {
|
|
||||||
|
|
||||||
|
static void do_first (MdbHandle *mdb)
|
||||||
|
{
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
static char text[255];
|
static char text[255];
|
||||||
void do_first () {
|
|
||||||
mdb_read_catalog (mdb, MDB_TABLE);
|
mdb_read_catalog (mdb, MDB_TABLE);
|
||||||
|
|
||||||
/* loop over each entry in the catalog */
|
/* loop over each entry in the catalog */
|
||||||
@ -171,29 +171,32 @@ static char text[255];
|
|||||||
entry = g_array_index (mdb->catalog, MdbCatalogEntry, i);
|
entry = g_array_index (mdb->catalog, MdbCatalogEntry, i);
|
||||||
if ((entry.object_type == MDB_TABLE) &&
|
if ((entry.object_type == MDB_TABLE) &&
|
||||||
(strncmp (entry.object_name, "MSysRelationships", 17) == 0))
|
(strncmp (entry.object_name, "MSysRelationships", 17) == 0))
|
||||||
{
|
{
|
||||||
table = mdb_read_table (&entry);
|
table = mdb_read_table (&entry);
|
||||||
if ( table->num_rows > 0 ) {
|
if ( table->num_rows > 0 ) {
|
||||||
mdb_read_columns(table);
|
mdb_read_columns(table);
|
||||||
mdb_rewind_table(table);
|
mdb_rewind_table(table);
|
||||||
for (k=0;k<table->num_cols;k++) {
|
for (k=0;k<table->num_cols;k++) {
|
||||||
bound_values[k] = (char *) malloc(256);
|
bound_values[k] = (char *) malloc(MDB_BIND_SIZE);
|
||||||
bound_values[k][0] = '\0';
|
bound_values[k][0] = '\0';
|
||||||
mdb_bind_column(table,k+1,bound_values[k]);
|
mdb_bind_column(table,k+1,bound_values[k]);
|
||||||
}
|
}
|
||||||
relationships[0] = (char *) malloc(256); /* child column */
|
relationships[0] = (char *) malloc(256); /* child column */
|
||||||
|
|
||||||
relationships[1] = (char *) malloc(256); /* child table */
|
relationships[1] = (char *) malloc(256); /* child table */
|
||||||
relationships[2] = (char *) malloc(256); /* parent column
|
relationships[2] = (char *) malloc(256); /* parent column */
|
||||||
*/
|
|
||||||
relationships[3] = (char *) malloc(256); /* parent table */
|
relationships[3] = (char *) malloc(256); /* parent table */
|
||||||
|
} /* if num_rows > 0 */
|
||||||
}
|
|
||||||
did_first = 1;
|
did_first = 1;
|
||||||
return;
|
return;
|
||||||
}
|
} /* if MSysRelationships */
|
||||||
}
|
} /* for */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *mdb_get_relationships(MdbHandle *mdb) {
|
||||||
|
|
||||||
|
int k;
|
||||||
|
static char text[255];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* generate relationships by "reading" the MSysRelationships table
|
* generate relationships by "reading" the MSysRelationships table
|
||||||
* szColumn contains the column name of the child table
|
* szColumn contains the column name of the child table
|
||||||
@ -203,7 +206,7 @@ static char text[255];
|
|||||||
*/
|
*/
|
||||||
sprintf(text,"%c",0);
|
sprintf(text,"%c",0);
|
||||||
if ( did_first == 0)
|
if ( did_first == 0)
|
||||||
do_first();
|
do_first(mdb);
|
||||||
if (table->cur_row < table->num_rows) {
|
if (table->cur_row < table->num_rows) {
|
||||||
if (mdb_fetch_row(table)) {
|
if (mdb_fetch_row(table)) {
|
||||||
relationships[0][0] = '\0';
|
relationships[0][0] = '\0';
|
||||||
@ -221,19 +224,17 @@ static char text[255];
|
|||||||
else if (strncmp(col->name,"szReferencedObject",18) == 0)
|
else if (strncmp(col->name,"szReferencedObject",18) == 0)
|
||||||
strcpy(relationships[3],bound_values[k]);
|
strcpy(relationships[3],bound_values[k]);
|
||||||
}
|
}
|
||||||
if (strncmp(mdb->backend_name,"oracle",6) == 0)
|
if (strncmp(mdb->backend_name,"oracle",6) == 0) {
|
||||||
sprintf(text,"alter table %s add constraint %s_%s foreign key
|
sprintf(text,"alter table %s add constraint %s_%s foreign key (%s) \
|
||||||
(%s) references %s(%s)",
|
references %s(%s)",
|
||||||
|
relationships[1],relationships[3],relationships[1],
|
||||||
relationships[1],relationships[3],relationships[1],
|
relationships[0],relationships[3],relationships[2]);
|
||||||
|
} else {
|
||||||
relationships[0],relationships[3],relationships[2]);
|
sprintf(text,"relationships are not supported for %s",
|
||||||
else
|
mdb->backend_name);
|
||||||
sprintf(text,"relationships are not supported for
|
} /* else */
|
||||||
%s",mdb->backend_name);
|
|
||||||
} /* got a row */
|
} /* got a row */
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
for (k=0;k<table->num_cols;k++) {
|
for (k=0;k<table->num_cols;k++) {
|
||||||
free(bound_values[k]);
|
free(bound_values[k]);
|
||||||
}
|
}
|
||||||
|
@ -255,10 +255,51 @@ int mdb_is_fixed_col(MdbColumn *col)
|
|||||||
{
|
{
|
||||||
return col->is_fixed;
|
return col->is_fixed;
|
||||||
}
|
}
|
||||||
|
static char *mdb_memo_to_string(MdbHandle *mdb, int start, int size)
|
||||||
|
{
|
||||||
|
short memo_len;
|
||||||
|
static char text[MDB_BIND_SIZE];
|
||||||
|
|
||||||
|
if (size<MDB_MEMO_OVERHEAD) {
|
||||||
|
return "";
|
||||||
|
} else if (size == MDB_MEMO_OVERHEAD) {
|
||||||
|
/* If the only thing here is the field information, the
|
||||||
|
* data is linked. Go read it from another page.
|
||||||
|
* Question: Do we need to read and evaluate the whole page?
|
||||||
|
* Question: It seems to be the only record on the page. If
|
||||||
|
* it weren't, how do we know which record it is?
|
||||||
|
*
|
||||||
|
* WARNING: Assuming the storage area is at least 2048 bytes!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The 16 bit integer at offset 0 is the length of the memo field.
|
||||||
|
* The 16 bit integer at offset 5 is the page it is stored on.
|
||||||
|
*/
|
||||||
|
memo_len = mdb_get_int16(mdb, start);
|
||||||
|
|
||||||
|
if(mdb_read_alt_pg(mdb, mdb_get_int16(mdb, start+5)) != mdb->pg_size) {
|
||||||
|
/* Failed to read */
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
strncpy(text, &mdb->alt_pg_buf[mdb->pg_size - memo_len], memo_len);
|
||||||
|
return text;
|
||||||
|
} else {
|
||||||
|
strncpy(text, &mdb->pg_buf[start + MDB_MEMO_OVERHEAD],
|
||||||
|
size - MDB_MEMO_OVERHEAD);
|
||||||
|
text[size - MDB_MEMO_OVERHEAD]='\0';
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
strncpy(text, &mdb->pg_buf[start + MDB_MEMO_OVERHEAD],
|
||||||
|
size - MDB_MEMO_OVERHEAD);
|
||||||
|
text[size - MDB_MEMO_OVERHEAD]='\0';
|
||||||
|
return text;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
char *mdb_col_to_string(MdbHandle *mdb, int start, int datatype, int size)
|
char *mdb_col_to_string(MdbHandle *mdb, int start, int datatype, int size)
|
||||||
{
|
{
|
||||||
/* FIX ME -- not thread safe */
|
/* FIX ME -- not thread safe */
|
||||||
static char text[256];
|
static char text[MDB_BIND_SIZE];
|
||||||
|
|
||||||
switch (datatype) {
|
switch (datatype) {
|
||||||
case MDB_BOOL:
|
case MDB_BOOL:
|
||||||
@ -273,6 +314,10 @@ static char text[256];
|
|||||||
sprintf(text,"%ld",mdb_get_int32(mdb, start));
|
sprintf(text,"%ld",mdb_get_int32(mdb, start));
|
||||||
return text;
|
return text;
|
||||||
break;
|
break;
|
||||||
|
case MDB_DOUBLE:
|
||||||
|
sprintf(text,"%f",mdb_get_double(mdb, start));
|
||||||
|
return text;
|
||||||
|
break;
|
||||||
case MDB_TEXT:
|
case MDB_TEXT:
|
||||||
if (size<0) {
|
if (size<0) {
|
||||||
return "";
|
return "";
|
||||||
@ -282,13 +327,7 @@ static char text[256];
|
|||||||
return text;
|
return text;
|
||||||
break;
|
break;
|
||||||
case MDB_MEMO:
|
case MDB_MEMO:
|
||||||
if (size<MDB_MEMO_OVERHEAD) {
|
return mdb_memo_to_string(mdb, start, size);
|
||||||
return "";
|
|
||||||
}
|
|
||||||
strncpy(text, &mdb->pg_buf[start + MDB_MEMO_OVERHEAD],
|
|
||||||
size - MDB_MEMO_OVERHEAD);
|
|
||||||
text[size - MDB_MEMO_OVERHEAD]='\0';
|
|
||||||
return text;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return "";
|
return "";
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
#include "mdbtools.h"
|
#include "mdbtools.h"
|
||||||
|
|
||||||
|
static size_t _mdb_read_pg(MdbHandle *mdb, unsigned char *pg_buf, unsigned long pg);
|
||||||
|
|
||||||
MdbHandle *mdb_open(char *filename)
|
MdbHandle *mdb_open(char *filename)
|
||||||
{
|
{
|
||||||
MdbHandle *mdb;
|
MdbHandle *mdb;
|
||||||
@ -68,6 +70,22 @@ int j,pos;
|
|||||||
*/
|
*/
|
||||||
size_t mdb_read_pg(MdbHandle *mdb, unsigned long pg)
|
size_t mdb_read_pg(MdbHandle *mdb, unsigned long pg)
|
||||||
{
|
{
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = _mdb_read_pg(mdb, mdb->pg_buf, pg);
|
||||||
|
/* kan - reset the cur_pos on a new page read */
|
||||||
|
mdb->cur_pos = 0; /* kan */
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
size_t mdb_read_alt_pg(MdbHandle *mdb, unsigned long pg)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = _mdb_read_pg(mdb, mdb->alt_pg_buf, pg);
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
static size_t _mdb_read_pg(MdbHandle *mdb, unsigned char *pg_buf, unsigned long pg)
|
||||||
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
struct stat status;
|
struct stat status;
|
||||||
off_t offset = pg * mdb->pg_size;
|
off_t offset = pg * mdb->pg_size;
|
||||||
@ -78,7 +96,7 @@ off_t offset = pg * mdb->pg_size;
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
lseek(mdb->fd, offset, SEEK_SET);
|
lseek(mdb->fd, offset, SEEK_SET);
|
||||||
len = read(mdb->fd,mdb->pg_buf,mdb->pg_size);
|
len = read(mdb->fd,pg_buf,mdb->pg_size);
|
||||||
if (len==-1) {
|
if (len==-1) {
|
||||||
perror("read");
|
perror("read");
|
||||||
return 0;
|
return 0;
|
||||||
@ -87,8 +105,6 @@ off_t offset = pg * mdb->pg_size;
|
|||||||
/* fprintf(stderr,"EOF reached.\n"); */
|
/* fprintf(stderr,"EOF reached.\n"); */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* kan - reset the cur_pos on a new page read */
|
|
||||||
mdb->cur_pos = 0; /* kan */
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
int mdb_get_int16(MdbHandle *mdb, int offset)
|
int mdb_get_int16(MdbHandle *mdb, int offset)
|
||||||
@ -119,6 +135,27 @@ unsigned char *c;
|
|||||||
mdb->cur_pos+=4;
|
mdb->cur_pos+=4;
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
double mdb_get_double(MdbHandle *mdb, int offset)
|
||||||
|
{
|
||||||
|
double d, d2;
|
||||||
|
unsigned char *c;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (offset <0 || offset+4 > mdb->pg_size) return -1;
|
||||||
|
|
||||||
|
memcpy(&d, &mdb->pg_buf[offset], 8);
|
||||||
|
|
||||||
|
#ifdef HW_BIG_ENDIAN
|
||||||
|
d2 = d;
|
||||||
|
for (i=0; i<sizeof(d); i++) {
|
||||||
|
*(((unsigned char *)&d)+i) =
|
||||||
|
*(((unsigned char *)&d2)+sizeof(d)-1-i);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
mdb->cur_pos+=8;
|
||||||
|
return d;
|
||||||
|
|
||||||
|
}
|
||||||
int mdb_set_pos(MdbHandle *mdb, int pos)
|
int mdb_set_pos(MdbHandle *mdb, int pos)
|
||||||
{
|
{
|
||||||
if (pos<0 || pos >= mdb->pg_size) return 0;
|
if (pos<0 || pos >= mdb->pg_size) return 0;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
# Generated automatically from Makefile.in by configure.
|
# Generated automatically from Makefile.in by configure.
|
||||||
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
|
|
||||||
top_srcdir = ..
|
top_srcdir = ..
|
||||||
@ -14,11 +13,12 @@ mandir = $(exec_prefix)/man/man1
|
|||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CPPFLAGS =
|
CPPFLAGS =
|
||||||
CFLAGS = $(CPPFLAG) -g -O2
|
CFLAGS = $(CPPFLAG) -g -O2 -DHW_LITTLE_ENDIAN
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
LIBS =
|
LIBS =
|
||||||
INSTALL= @INSTALL@
|
INSTALL= @INSTALL@
|
||||||
INC = -I ../include `glib-config --cflags`
|
INC = -I ../include `glib-config --cflags`
|
||||||
|
MDBLIB = ../libmdb/libmdb.a
|
||||||
LIBS = -L ../libmdb -lmdb `glib-config --libs`
|
LIBS = -L ../libmdb -lmdb `glib-config --libs`
|
||||||
PROGS = prcat prkkd prtable prdata prdump mdb-schema mdb-export mdb-tables mdb-header mdb-parsecsv mdb-array
|
PROGS = prcat prkkd prtable prdata prdump mdb-schema mdb-export mdb-tables mdb-header mdb-parsecsv mdb-array
|
||||||
PRCATOBJS = prcat.o
|
PRCATOBJS = prcat.o
|
||||||
@ -35,44 +35,44 @@ ARROBJS = mdb-array.o
|
|||||||
|
|
||||||
all: $(PROGS)
|
all: $(PROGS)
|
||||||
|
|
||||||
prcat: $(PRCATOBJS)
|
prcat: $(PRCATOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(PRCATOBJS) $(LIBS)
|
$(CC) -g -o $@ $(PRCATOBJS) $(LIBS)
|
||||||
|
|
||||||
prkkd: $(PRKKDOBJS)
|
prkkd: $(PRKKDOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(PRKKDOBJS) $(LIBS)
|
$(CC) -g -o $@ $(PRKKDOBJS) $(LIBS)
|
||||||
|
|
||||||
prtable: $(PRTABLEOBJS)
|
prtable: $(PRTABLEOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(PRTABLEOBJS) $(LIBS)
|
$(CC) -g -o $@ $(PRTABLEOBJS) $(LIBS)
|
||||||
|
|
||||||
prdata: $(PRDATAOBJS)
|
prdata: $(PRDATAOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(PRDATAOBJS) $(LIBS)
|
$(CC) -g -o $@ $(PRDATAOBJS) $(LIBS)
|
||||||
|
|
||||||
prdump: $(PRDUMPOBJS)
|
prdump: $(PRDUMPOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(PRDUMPOBJS) $(LIBS)
|
$(CC) -g -o $@ $(PRDUMPOBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-schema: $(SCHEMAOBJS)
|
mdb-schema: $(SCHEMAOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(SCHEMAOBJS) $(LIBS)
|
$(CC) -g -o $@ $(SCHEMAOBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-export: $(EXPORTOBJS)
|
mdb-export: $(EXPORTOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(EXPORTOBJS) $(LIBS)
|
$(CC) -g -o $@ $(EXPORTOBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-tables: $(TABLEOBJS)
|
mdb-tables: $(TABLEOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(TABLEOBJS) $(LIBS)
|
$(CC) -g -o $@ $(TABLEOBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-header: $(HEADEROBJS)
|
mdb-header: $(HEADEROBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(HEADEROBJS) $(LIBS)
|
$(CC) -g -o $@ $(HEADEROBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-parsecsv: $(CSVOBJS)
|
mdb-parsecsv: $(CSVOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(CSVOBJS) $(LIBS)
|
$(CC) -g -o $@ $(CSVOBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-array: $(ARROBJS)
|
mdb-array: $(ARROBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(ARROBJS) $(LIBS)
|
$(CC) -g -o $@ $(ARROBJS) $(LIBS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f core *.o $(PROGS)
|
rm -f core *.o $(PROGS)
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) -g -c $< $(INC)
|
$(CC) $(CFLAGS) -g -c $< $(INC)
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@for prog in $(PROGS); do \
|
@for prog in $(PROGS); do \
|
||||||
@ -85,3 +85,16 @@ uninstall:
|
|||||||
echo " removing $$prog from $(bindir)"; \
|
echo " removing $$prog from $(bindir)"; \
|
||||||
rm -f $(bindir)/$$prog; \
|
rm -f $(bindir)/$$prog; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
header.o: header.c ../include/mdbtools.h
|
||||||
|
mdb-array.o: mdb-array.c ../include/mdbtools.h
|
||||||
|
mdb-export.o: mdb-export.c ../include/mdbtools.h
|
||||||
|
parsecsv.o: parsecsv.c ../include/mdbtools.h
|
||||||
|
prcat.o: prcat.c ../include/mdbtools.h
|
||||||
|
prdata.o: prdata.c ../include/mdbtools.h
|
||||||
|
prdump.o: prdump.c ../include/mdbtools.h
|
||||||
|
prkkd.o: prkkd.c ../include/mdbtools.h
|
||||||
|
prtable.o: prtable.c ../include/mdbtools.h
|
||||||
|
schema.o: schema.c ../include/mdbtools.h
|
||||||
|
tables.o: tables.c ../include/mdbtools.h
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
|
|
||||||
@ -19,6 +18,7 @@ LDFLAGS = @LDFLAGS@
|
|||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
INSTALL= @INSTALL@
|
INSTALL= @INSTALL@
|
||||||
INC = -I ../include `glib-config --cflags`
|
INC = -I ../include `glib-config --cflags`
|
||||||
|
MDBLIB = ../libmdb/libmdb.a
|
||||||
LIBS = -L ../libmdb -lmdb `glib-config --libs`
|
LIBS = -L ../libmdb -lmdb `glib-config --libs`
|
||||||
PROGS = prcat prkkd prtable prdata prdump mdb-schema mdb-export mdb-tables mdb-header mdb-parsecsv mdb-array
|
PROGS = prcat prkkd prtable prdata prdump mdb-schema mdb-export mdb-tables mdb-header mdb-parsecsv mdb-array
|
||||||
PRCATOBJS = prcat.o
|
PRCATOBJS = prcat.o
|
||||||
@ -35,44 +35,44 @@ ARROBJS = mdb-array.o
|
|||||||
|
|
||||||
all: $(PROGS)
|
all: $(PROGS)
|
||||||
|
|
||||||
prcat: $(PRCATOBJS)
|
prcat: $(PRCATOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(PRCATOBJS) $(LIBS)
|
$(CC) -g -o $@ $(PRCATOBJS) $(LIBS)
|
||||||
|
|
||||||
prkkd: $(PRKKDOBJS)
|
prkkd: $(PRKKDOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(PRKKDOBJS) $(LIBS)
|
$(CC) -g -o $@ $(PRKKDOBJS) $(LIBS)
|
||||||
|
|
||||||
prtable: $(PRTABLEOBJS)
|
prtable: $(PRTABLEOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(PRTABLEOBJS) $(LIBS)
|
$(CC) -g -o $@ $(PRTABLEOBJS) $(LIBS)
|
||||||
|
|
||||||
prdata: $(PRDATAOBJS)
|
prdata: $(PRDATAOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(PRDATAOBJS) $(LIBS)
|
$(CC) -g -o $@ $(PRDATAOBJS) $(LIBS)
|
||||||
|
|
||||||
prdump: $(PRDUMPOBJS)
|
prdump: $(PRDUMPOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(PRDUMPOBJS) $(LIBS)
|
$(CC) -g -o $@ $(PRDUMPOBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-schema: $(SCHEMAOBJS)
|
mdb-schema: $(SCHEMAOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(SCHEMAOBJS) $(LIBS)
|
$(CC) -g -o $@ $(SCHEMAOBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-export: $(EXPORTOBJS)
|
mdb-export: $(EXPORTOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(EXPORTOBJS) $(LIBS)
|
$(CC) -g -o $@ $(EXPORTOBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-tables: $(TABLEOBJS)
|
mdb-tables: $(TABLEOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(TABLEOBJS) $(LIBS)
|
$(CC) -g -o $@ $(TABLEOBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-header: $(HEADEROBJS)
|
mdb-header: $(HEADEROBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(HEADEROBJS) $(LIBS)
|
$(CC) -g -o $@ $(HEADEROBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-parsecsv: $(CSVOBJS)
|
mdb-parsecsv: $(CSVOBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(CSVOBJS) $(LIBS)
|
$(CC) -g -o $@ $(CSVOBJS) $(LIBS)
|
||||||
|
|
||||||
mdb-array: $(ARROBJS)
|
mdb-array: $(ARROBJS) $(MDBLIB)
|
||||||
$(CC) -g -o $@ $(ARROBJS) $(LIBS)
|
$(CC) -g -o $@ $(ARROBJS) $(LIBS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f core *.o $(PROGS)
|
rm -f core *.o $(PROGS)
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) -g -c $< $(INC)
|
$(CC) $(CFLAGS) -g -c $< $(INC)
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@for prog in $(PROGS); do \
|
@for prog in $(PROGS); do \
|
||||||
@ -85,3 +85,16 @@ uninstall:
|
|||||||
echo " removing $$prog from $(bindir)"; \
|
echo " removing $$prog from $(bindir)"; \
|
||||||
rm -f $(bindir)/$$prog; \
|
rm -f $(bindir)/$$prog; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
header.o: header.c ../include/mdbtools.h
|
||||||
|
mdb-array.o: mdb-array.c ../include/mdbtools.h
|
||||||
|
mdb-export.o: mdb-export.c ../include/mdbtools.h
|
||||||
|
parsecsv.o: parsecsv.c ../include/mdbtools.h
|
||||||
|
prcat.o: prcat.c ../include/mdbtools.h
|
||||||
|
prdata.o: prdata.c ../include/mdbtools.h
|
||||||
|
prdump.o: prdump.c ../include/mdbtools.h
|
||||||
|
prkkd.o: prkkd.c ../include/mdbtools.h
|
||||||
|
prtable.o: prtable.c ../include/mdbtools.h
|
||||||
|
schema.o: schema.c ../include/mdbtools.h
|
||||||
|
tables.o: tables.c ../include/mdbtools.h
|
||||||
|
|
||||||
|
@ -27,7 +27,6 @@ main (int argc, char **argv)
|
|||||||
{
|
{
|
||||||
int rows;
|
int rows;
|
||||||
int i, j;
|
int i, j;
|
||||||
unsigned char buf [2048];
|
|
||||||
MdbHandle *mdb;
|
MdbHandle *mdb;
|
||||||
MdbCatalogEntry entry;
|
MdbCatalogEntry entry;
|
||||||
MdbTableDef *table;
|
MdbTableDef *table;
|
||||||
@ -62,7 +61,7 @@ int started;
|
|||||||
|
|
||||||
for (j = 0; j < table->num_cols; j++)
|
for (j = 0; j < table->num_cols; j++)
|
||||||
{
|
{
|
||||||
bound_values [j] = (char *) malloc (256);
|
bound_values [j] = (char *) malloc (MDB_BIND_SIZE);
|
||||||
bound_values [j] [0] = '\0';
|
bound_values [j] [0] = '\0';
|
||||||
mdb_bind_column (table, j + 1, bound_values [j]);
|
mdb_bind_column (table, j + 1, bound_values [j]);
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ char quote_text = 1;
|
|||||||
mdb_rewind_table(table);
|
mdb_rewind_table(table);
|
||||||
|
|
||||||
for (j=0;j<table->num_cols;j++) {
|
for (j=0;j<table->num_cols;j++) {
|
||||||
bound_values[j] = (char *) malloc(256);
|
bound_values[j] = (char *) malloc(MDB_BIND_SIZE);
|
||||||
bound_values[j][0] = '\0';
|
bound_values[j][0] = '\0';
|
||||||
mdb_bind_column(table, j+1, bound_values[j]);
|
mdb_bind_column(table, j+1, bound_values[j]);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user