diff --git a/HACKING b/HACKING index c91852d..00f25d5 100644 --- a/HACKING +++ b/HACKING @@ -47,6 +47,7 @@ pages have the following values: 0x02 Table definition 0x03 Index pages 0x04 Index pages (Leaf nodes?) +0x05 Page Usage Bitmaps (extended page usage) The second byte is always 0x01 as far as I can tell. @@ -256,6 +257,65 @@ Beyond this are a series of 20 byte fields for each 'index entry'. There may be It is currently unknown how indexes are mapped to columns or the format of the index pages. (end old stuff) +Page Usage Map +-------------- + +The purpose of the page usage bitmap (called object allocation map (OAM) by +SQL Server, not sure what the official terminology is for Access) is to store +a bitmap of page allocations for a table. This determines quickly which pages +are owned by the table and helps speed up access to the data. + +The table definition contains a data pointer to a usage bitmap of pages +allocated to this table. It appears to be of a fixed size for both Jet 3 +and 4 (128 and 64 bytes respectively). The first byte of the map is a type +field. + +Type 0 page usage map definition follows: + ++------+---------+---------------------------------------------------------+ +| data | length | name | description | ++------+---------+---------------------------------------------------------+ +| 0x00 | 1 byte | map_type | 0x00 indicates map stored within. | +| ???? | 4 byte | page_start | first page for which this map applies | ++------+---------+---------------------------------------------------------+ +| Iterate for the length of map | ++--------------------------------------------------------------------------+ +| ???? | 1 byte | bitmap | each bit encodes the allocation status of a| +| | | | page. 1 indicates allocated to this table. | +| | | | Pages are stored from msb to lsb. | ++--------------------------------------------------------------------------+ + +If you're paying attention then you'll realize that the relatively small size of the map (128*8*2048 or 64*8*4096 = 2 Meg) means that this scheme won't work with larger database files although the initial start page helps a bit. To overcome this there is a second page usage map scheme with the map_type of 0x01 as follows: + ++------+---------+---------------------------------------------------------+ +| data | length | name | description | ++------+---------+---------------------------------------------------------+ +| 0x01 | 1 byte | map_type | 0x01 indicates this is a indirection list. | ++------+---------+---------------------------------------------------------+ +| Iterate for the length of map | ++--------------------------------------------------------------------------+ +| ???? | 4 bytes | map_page | pointer to page type 0x05 containing map | ++--------------------------------------------------------------------------+ + +Note that the intial start page is gone and is reused for the first page indirection. The 0x05 type page header looks like: + ++------+---------+---------------------------------------------------------+ +| data | length | name | description | ++------+---------+---------------------------------------------------------+ +| 0x05 | 1 byte | page_type | allocation map page | +| 0x01 | 1 byte | unknown | always 1 as with other page types | +| 0x00 | 2 bytes | unknown | | ++------+---------+---------------------------------------------------------+ + +The rest of the page is the allocation bitmap following the same scheme (lsb +to msb order, 1 bit per page) as a type 0 map. This yields a maximum of +2044*8=16352 (jet3) or 4092*8 = 32736 (jet4) pages mapped per type 0x05 page. +Given 128/4+1 = 33 or 64/4+1 = 17 page pointers per indirection row (remember +the start page field is reused, thus the +1), this yields 33*16352*2048 = 1053 +Meg (jet3) or 17*32736*4096 = 2173 Meg (jet4) or enough to cover the maximum +size of each of the database formats comfortably, so there is no reason to +believe any other page map schemes exist. + Data Pages ---------- @@ -322,6 +382,8 @@ Note: it is possible for the offset to the beginning of a variable length column to require more than one byte (if the sum of the lengths of columns is greater than 255). I have no idea how this is represented in the data as I have not looked at tables large enough for this to occur yet. +Update: This is currently implemented using a jump counter for Jet 3 files, see +src/libmdb/data.c for details. Each memo column (or other long binary data) in a row looks like this (12 bytes): @@ -421,13 +483,15 @@ Design View table definitions appear to be stored in 'KKD' records (my name for them...they always start with 'KKD\0'). Again these reside on pages, packed to the end of the page. +Update: The KKD records are stored in LvProp column of MSysObjects so they are stored as other OLE/Memo fields are. + They look a little like this: (this needs work...see the kkd.c) 'K' 'K' 'D' 0x00 16 bit length value (this includes the length) 0x00 0x00 0x80 0x00 (0x80 seems to indicate a header) -Then one of more of: 16 bit length field and a value of that size. +Then one or more of: 16 bit length field and a value of that size. For instance: 0x0d 0x00 and 'AccessVersion' (AccessVersion is 13 bytes, 0x0d 0x00 intel order) diff --git a/INSTALL b/INSTALL index 1ca82fd..ab1fc5e 100644 --- a/INSTALL +++ b/INSTALL @@ -30,6 +30,7 @@ prcat -- prints the catalog table from an mdb file, prkkd -- dump of information about design view data given the offset to it. prtable -- dump of a table definition. prdata -- dump of the data given a table name. +prole -- dump of ole columns given a table name and sargs. Once MDB Tools has been compiled, libmdb.[so|a] will be in the src/libmdb directory and the utility programs will be in the src/util directory. @@ -42,8 +43,8 @@ Installation Options configure can be passed any of the following flags to turn on other capabilities. ---enable-sql will cause the SQL engine to be built, you must have flex and - bison installed for this option. +--enable-sql will cause the SQL engine to be built, you must have flex + and bison installed for this option. --with-unixodbc specifies the location of the unixODBC driver manager and causes the ODBC driver to be built. diff --git a/TODO b/TODO index 123489b..39d14fb 100644 --- a/TODO +++ b/TODO @@ -17,12 +17,13 @@ libmdb: . Sargs need to support all datatypes . Need a way to express logical relationships between sargs (tree) . Add support for index scanning when using sargs -. Use allocation maps to read tables, should be more efficient +. Use allocation maps to read tables, should be more efficient (done + if -DFAST_READ specified) . write support utils: -. need program to unpack VBA script to file +. need program to unpack VBA script to file (see prole) . Access forms to glade converter ? SQL Engine: @@ -32,6 +33,7 @@ SQL Engine: . OR clauses using sarg trees from above . insert/updates . bogus column name in where clause not caught +. const = const type operations not working (e.g. WHERE 0=1) ODBC: diff --git a/configure.in b/configure.in index cc541d9..c043056 100644 --- a/configure.in +++ b/configure.in @@ -17,92 +17,71 @@ AC_CHECK_HEADERS(wordexp.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_SIZE_T - AC_C_BIGENDIAN +dnl no optional stuff by default +OPTDIRS="" + dnl --------------------------------------------------------------------- dnl Compile time options dnl --------------------------------------------------------------------- -AC_ARG_WITH(iodbc, -[ --with-iodbc=/path/to/iodbc build odbc driver against iODBC]) -if test "$with_iodbc"; then - CFLAGS="$CFLAGS -DIODBC"; - ODBC_INC=$with_iodbc/include; - odbc=true -fi - -AC_ARG_WITH(iodbc, -[ --with-unixodbc=/path/to/unixodbc build odbc driver against unixODBC]) -if test "$with_unixodbc"; then - CFLAGS="$CFLAGS -DUNIXODBC" - ODBC_INC=$with_unixodbc/include - odbc=true -fi -AM_CONDITIONAL(HAVE_ODBC, test x$odbc = xtrue) -AC_SUBST(HAVE_ODBC) -AC_SUBST(ODBC_INC) - AC_ARG_ENABLE(sql, [ --enable-sql Enable SQL engine]) if test "$enable_sql" = "yes" ; then CFLAGS="$CFLAGS -DSQL" sql=true + OPTDIRS="$OPTDIRS sql" fi AM_CONDITIONAL(SQL, test x$sql = xtrue) AC_SUBST(SQL) -dnl gnome check modified from gnome-db -AC_MSG_CHECKING(for GTK >= 1.2.0) -if gnome-config --version > /dev/null 2>&1 -then - verstxt=`gtk-config --version` - vers=`echo "$verstxt" | \ - awk -F. '{ printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'` - if test "$vers" -ge 1002000 - then - AC_MSG_RESULT(found) - GMDB_LIBS=`gtk-config --libs` - GMDB_CFLAGS=`gtk-config --cflags` - havegtk=true - else - AC_MSG_RESULT(not found) - havegtk=false - fi -else - AC_MSG_RESULT(not found) - havegtk=false +dnl check for iODBC + +AC_ARG_WITH(iodbc, +[ --with-iodbc=/path/to/iodbc build odbc driver against iODBC]) +if test "$with_iodbc"; then + CFLAGS="$CFLAGS -DIODBC"; + ODBC_INC=$with_iodbc/include; + odbc=true + OPTDIRS="$OPTDIRS odbc" + if test "$enable_sql" != "yes" ; then + echo + echo ODBC requires the --enable-sql flag + exit 1 + fi fi -AM_CONDITIONAL(HAVE_GTK, test x$havegtk = xtrue) + +dnl check for unixODBC +AC_ARG_WITH(unixodbc, +[ --with-unixodbc=/path/to/unixodbc build odbc driver against unixODBC]) +if test "$with_unixodbc"; then + CFLAGS="$CFLAGS -DUNIXODBC" + ODBC_INC=$with_unixodbc/include + odbc=true + OPTDIRS="$OPTDIRS odbc" + if test "$enable_sql" != "yes" ; then + echo + echo ODBC requires the --enable-sql flag + exit 1 + fi +fi +AM_CONDITIONAL(HAVE_ODBC, test x$odbc = xtrue) +AC_SUBST(HAVE_ODBC) +AC_SUBST(ODBC_INC) + +dnl check for glib/gtk/gnome +AM_PATH_GLIB_2_0(2.0.0) +AM_PATH_GTK_2_0(2.0.0) +AM_CONDITIONAL(HAVE_GTK, test x$no_gtk = xtrue) AC_SUBST(HAVE_GTK) -dnl gnome check modified from gnome-db -AC_MSG_CHECKING(for Gnome >= 1.2.0) -if gnome-config --version > /dev/null 2>&1 -then - verstxt=`gnome-config --version` - vers=`echo "$verstxt" | sed -e "s/^gnome-libs //" | \ - awk -F. '{ printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'` - if test "$vers" -ge 1002000 - then - AC_MSG_RESULT(found) - CFLAGS="$CFLAGS -DHAVE_GNOME" - GMDB_LIBS=`gnome-config gnome gnomeui --libs` - GMDB_CFLAGS=`gnome-config gnome gnomeui --cflags` - havegnome=true - else - AC_MSG_RESULT(not found) - havegnome=false - fi -else - AC_MSG_RESULT(not found) - havegnome=false +if test "$no_gtk" != yes; then + OPTDIRS="$OPTDIRS gmdb2" fi -AM_CONDITIONAL(HAVE_GNOME, test x$havegnome = xtrue) -AC_SUBST(HAVE_GNOME) -AC_SUBST(GMDB_LIBS) -AC_SUBST(GMDB_CFLAGS) +AC_SUBST([OPTDIRS]) +AC_CONFIG_FILES([src/Makefile]) dnl Checks for library functions. @@ -122,4 +101,4 @@ LDFLAGS=$OLDLDFLAGS AC_SUBST(READLINE_LIBS) -AC_OUTPUT(src/util/Makefile src/extras/Makefile Makefile include/Makefile src/Makefile src/libmdb/Makefile include/Makefile src/sql/Makefile src/odbc/Makefile src/gmdb/Makefile) +AC_OUTPUT(src/util/Makefile src/extras/Makefile Makefile include/Makefile src/Makefile src/libmdb/Makefile include/Makefile src/sql/Makefile src/odbc/Makefile src/gmdb2/Makefile) diff --git a/include/mdbtools.h b/include/mdbtools.h index 76c328a..8327ca3 100644 --- a/include/mdbtools.h +++ b/include/mdbtools.h @@ -56,7 +56,8 @@ enum { MDB_RELATIONSHIP, MDB_UNKNOWN_09, MDB_UNKNOWN_0A, - MDB_DATABASE_PROPERTY + MDB_DATABASE_PROPERTY, + MDB_ANY = -1 }; enum { MDB_BOOL = 0x01, @@ -114,6 +115,9 @@ typedef struct { char db_passwd[14]; MdbBackend *default_backend; char *backend_name; + /* free map */ + int map_sz; + unsigned char *free_map; /* offset to row count on data pages...version dependant */ guint16 row_count_offset; guint16 tab_num_rows_offset; diff --git a/src/Makefile.am b/src/Makefile.am index 642b5ae..c130faf 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,3 @@ -if SQL -SUBDIRS = libmdb sql util extras odbc gmdb +SUBDIRS = libmdb extras $(OPTDIRS) util +DIST_SUBDIRS = libmdb extras sql odbc gmdb2 util DEFDIR = $(prefix) -else -SUBDIRS = libmdb util extras -DEFDIR = $(prefix) -endif diff --git a/src/extras/mdb-dump.c b/src/extras/mdb-dump.c index fb3afd0..9554d27 100644 --- a/src/extras/mdb-dump.c +++ b/src/extras/mdb-dump.c @@ -26,11 +26,26 @@ int main(int argc, char **argv) int pg=0; char addr[10]; int jet4 = 0; + int pg_size = 2048; if (argc < 1) { - fprintf(stderr, "Usage: mdb-dump \n\n"); + fprintf(stderr, "Usage: mdb-dump []\n\n"); exit(1); } + if (argc>2) { + if (!strncmp(argv[2],"0x",2)) { + for (i=2;i '9' ? argv[2][i] - 'a' + 10 : argv[2][i] - '0'; + } + } else { + pg = atol(argv[2]); + } + } + printf("page num %d\n", pg); if ((in = fopen(argv[1],"r"))==NULL) { fprintf(stderr, "Couldn't open file %s\n", argv[1]); exit(1); @@ -39,10 +54,14 @@ int main(int argc, char **argv) fread(data,1,1,in); if (data[0]==0x01) { jet4 = 1; + pg_size = 4096; } - fseek(in,0,SEEK_SET); + fseek(in,(pg*pg_size),SEEK_SET); + i = 0; while (length = fread(data,1,16,in)) { sprintf(addr, "%06x", i); + //if (!strcmp(&addr[3],"000") || (!jet4 && !strcmp(&addr[3],"800")) && + //pg) break; if (!strcmp(&addr[3],"000") || (!jet4 && !strcmp(&addr[3],"800"))) { fprintf(stdout,"-- Page 0x%04x (%d) --\n", pg, pg); pg++; diff --git a/src/gmdb2/Makefile.am b/src/gmdb2/Makefile.am new file mode 100644 index 0000000..c5050b7 --- /dev/null +++ b/src/gmdb2/Makefile.am @@ -0,0 +1,11 @@ +bin_PROGRAMS = gmdb2 +include_HEADERS = gmdb.h debug.xpm forms.xpm macros.xpm pk.xpm \ + table.xpm query.xpm code.xpm reports.xpm +gmdb2_SOURCES = main2.c file.c util.c table.c query.c module.c macro.c report.c form.c info.c table_def.c table_data.c table_export.c debug.c +LIBS = -rdynamic $(GNOME_LIBS) $(GLADE_LIBS) @LEXLIB@ +INCLUDES = -I$(top_srcdir)/include $(GNOME_CFLAGS) $(GLADE_CFLAGS) +#LDADD = ../libmdb/libmdb.la +LDADD = ../libmdb/libmdb.la ../sql/libmdbsql.la +#if SQL +#gmdb_LDADD = ../libmdb/libmdb.la ../sql/libmdbsql.la +#endif diff --git a/src/gmdb2/code.xpm b/src/gmdb2/code.xpm new file mode 100644 index 0000000..0432bf4 --- /dev/null +++ b/src/gmdb2/code.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static char * code_xpm[] = { +"16 16 3 1", +" c None", +". c #000000", +"+ c #777777", +" ", +" ", +" .. ", +" .++. ", +" . . . ", +" . .. ..", +" . .+ +.", +".... . .+ +. .", +" . . .+. .", +" . .+ +.+ +.", +" . .. +. .+ ..", +" . . . . . ", +" ", +" ", +" ", +" "}; diff --git a/src/gmdb2/debug.c b/src/gmdb2/debug.c new file mode 100644 index 0000000..2004de3 --- /dev/null +++ b/src/gmdb2/debug.c @@ -0,0 +1,724 @@ +#include "gmdb.h" +#include +extern GtkWidget *app; +extern MdbHandle *mdb; + +GladeXML *debugwin_xml; + +#define LINESZ 77 + +typedef struct GMdbDebugTab { + GtkWidget *ctree; + GtkWidget *textbox; + GtkWidget *entry; + GtkWidget *pglabel; + int page_num; + int max_page; + int linesz; + GdkFont *font; + GdkColor black; + GdkColor white; +} GMdbDebugTab; + +typedef struct GMdbDebugRange { + gint start_byte; + gint end_byte; +} GMdbDebugRange; + +GMdbDebugTab *dbug; + +/* prototypes */ +void gmdb_debug_text_on(GtkWidget *textbox, int start_byte, int end_byte); +void gmdb_debug_text_off(GtkWidget *textbox, int start_byte, int end_byte); +GtkTreeIter *gmdb_debug_add_item(GtkTreeStore *store, GtkTreeIter *iter, gchar *text, int start, int end); +void gmdb_debug_clear(GMdbDebugTab *dbug); +void gmdb_debug_dissect(GtkTreeStore *store, char *fbuf, int offset, int len); +static guint16 get_uint16(unsigned char *c); +static guint32 get_uint24(unsigned char *c); +static guint32 get_uint32(unsigned char *c); +static long gmdb_get_max_page(MdbHandle *mdb); + +/* value to string stuff */ +typedef struct GMdbValStr { + gint value; + gchar *string; +} GMdbValStr; + +GMdbValStr table_types[] = { + { 0x4e, "System Table" }, + { 0x53, "User Table" }, + { 0, NULL } +}; +GMdbValStr column_types[] = { + { 0x01, "boolean" }, + { 0x02, "byte" }, + { 0x03, "int" }, + { 0x04, "longint" }, + { 0x05, "money" }, + { 0x06, "float" }, + { 0x07, "double" }, + { 0x08, "short datetime" }, + { 0x09, "binary" }, + { 0x0a, "text" }, + { 0x0b, "OLE" }, + { 0x0c, "memo/hyperlink" }, + { 0x0d, "Unknown" }, + { 0x0f, "GUID" }, + { 0, NULL } +}; +GMdbValStr object_types[] = { + { 0x00, "Database Definition Page" }, + { 0x01, "Data Page" }, + { 0x02, "Table Definition Page" }, + { 0x03, "Index Page" }, + { 0x04, "Leaf Index Page" }, + { 0, NULL } +}; +/* callbacks */ +void +gmdb_debug_select_cb(GtkCTree *tree, GList *node, gint column, GMdbDebugTab *dbug) +{ +GMdbDebugRange *range; +int start_row, end_row; +int start_col, end_col; +int i; + + range = gtk_ctree_node_get_row_data(tree, GTK_CTREE_NODE(node)); + /* container node or otherwise non-represented in the data */ + if (range->start_byte == -1 || range->end_byte == -1) return; + + start_row = range->start_byte / 16; + end_row = range->end_byte / 16; + start_col = 8 + (range->start_byte % 16) * 3; + end_col = 8 + (range->end_byte % 16) * 3; + + /* freeze/thaw needed because of redrawing glitch...only part of text had + ** correct colors, rest would come back on resize. */ + /* + gtk_text_freeze(GTK_TEXT(dbug->textbox)); + */ + if (start_row == end_row) { + gmdb_debug_text_on(dbug->textbox, + dbug->linesz * start_row + start_col, + dbug->linesz * start_row + end_col + 2); + gmdb_debug_text_on(dbug->textbox, + dbug->linesz * start_row + 59 + (range->start_byte % 16), + dbug->linesz * start_row + 59 + (range->end_byte % 16) + 1); + } else { + gmdb_debug_text_on(dbug->textbox, + dbug->linesz * start_row + start_col, + /* 55 = 8 (addr) + 15 (bytes) * 3 (%02x " ") + 2 (last byte) */ + dbug->linesz * start_row + 55); + gmdb_debug_text_on(dbug->textbox, + dbug->linesz * start_row + 59 + (range->start_byte % 16), + dbug->linesz * start_row + 75); + for (i=start_row + 1; i < end_row; i++) { + gmdb_debug_text_on(dbug->textbox, + dbug->linesz * i + 8, dbug->linesz * i + 55); + gmdb_debug_text_on(dbug->textbox, + dbug->linesz * i + 59, dbug->linesz * i + 75); + } + gmdb_debug_text_on(dbug->textbox, + dbug->linesz * end_row + 8, + dbug->linesz * end_row + end_col + 2); + gmdb_debug_text_on(dbug->textbox, + dbug->linesz * end_row + 59, + dbug->linesz * end_row + 59 + (range->end_byte % 16) + 1); + } + /* gtk_text_thaw(GTK_TEXT(dbug->textbox)); */ +} +void +gmdb_debug_unselect_cb(GtkCTree *tree, GList *node, gint column, GMdbDebugTab *dbug) +{ +GMdbDebugRange *range; +int start_row, end_row; +int start_col, end_col; +int i; + + range = gtk_ctree_node_get_row_data(tree, GTK_CTREE_NODE(node)); + /* container node or otherwise non-represented in the data */ + if (range->start_byte == -1 || range->end_byte == -1) return; + + start_row = range->start_byte / 16; + end_row = range->end_byte / 16; + start_col = 8 + (range->start_byte % 16) * 3; + end_col = 8 + (range->end_byte % 16) * 3; + + if (start_row == end_row) { + gmdb_debug_text_off(dbug->textbox, + dbug->linesz * start_row + start_col, + dbug->linesz * start_row + end_col + 2); + gmdb_debug_text_off(dbug->textbox, + dbug->linesz * start_row + 59 + (range->start_byte % 16), + dbug->linesz * start_row + 59 + (range->end_byte % 16) + 1); + } else { + gmdb_debug_text_off(dbug->textbox, + dbug->linesz * start_row + start_col, + /* 55 = 8 (addr) + 15 (bytes) * 3 (%02x " ") + 2 (last byte) */ + dbug->linesz * start_row + 55); + gmdb_debug_text_off(dbug->textbox, + dbug->linesz * start_row + 59 + (range->start_byte % 16), + dbug->linesz * start_row + 75); + for (i=start_row + 1; i < end_row; i++) { + gmdb_debug_text_off(dbug->textbox, + dbug->linesz * i + 8, dbug->linesz * i + 55); + gmdb_debug_text_off(dbug->textbox, + dbug->linesz * i + 59, dbug->linesz * i + 75); + } + gmdb_debug_text_off(dbug->textbox, + dbug->linesz * end_row + 8, + dbug->linesz * end_row + end_col + 2); + gmdb_debug_text_off(dbug->textbox, + dbug->linesz * end_row + 59, + dbug->linesz * end_row + 59 + (range->end_byte % 16) + 1); + } +} +void +gmdb_debug_display_cb(GtkWidget *w, gpointer *dbug) +{ +int page; +off_t pos; +unsigned char *fbuf; +unsigned char *tbuf; +int i,j; +int length; +char line[80]; +char field[10]; +GtkTextBuffer *buffer; +GtkTextIter iter; +GtkWidget *entry; +GtkTextView *textview; + + if (!mdb) return; + + entry = glade_xml_get_widget (debugwin_xml, "debug_entry"); + textview = glade_xml_get_widget (debugwin_xml, "debug_textview"); + + page = atol(gtk_entry_get_text(GTK_ENTRY(entry))); + if (page>gmdb_get_max_page(mdb) || page<0) { + gmdb_info_msg("Page entered is outside valid page range."); + } + + // gmdb_debug_clear(dbug); + + pos = lseek(mdb->fd, 0, SEEK_CUR); + lseek(mdb->fd, page * mdb->pg_size, SEEK_SET); + + fbuf = (unsigned char *) malloc(mdb->pg_size); + tbuf = (unsigned char *) malloc( (mdb->pg_size / 16) * 80); + memset(tbuf, 0, (mdb->pg_size / 16) * 80); + length = read(mdb->fd, fbuf, mdb->pg_size); + if (lengthpg_size) { + } + i = 0; + while (ilinesz) dbug->linesz = strlen(line); + } + buffer = gtk_text_view_get_buffer(textview); + gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0); + gtk_text_buffer_insert(buffer,&iter,tbuf,strlen(tbuf)); + //gtk_editable_select_region(GTK_EDITABLE(dbug->textbox), 9, 15); + + GtkWidget *tree = glade_xml_get_widget(debugwin_xml, "debug_treeview"); + GtkTreeStore *store = gtk_tree_store_new(1, G_TYPE_STRING); + gmdb_debug_dissect(store, fbuf, 0, length); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree), store); + + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Field", + renderer, "text", 0, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW (tree), column); + free(fbuf); + free(tbuf); +} +/* functions */ +static long +gmdb_get_max_page(MdbHandle *mdb) +{ +struct stat st; + + assert( fstat(mdb->fd, &st)!=-1 ); + return st.st_size/mdb->pg_size; +} +gchar * +gmdb_val_to_str(GMdbValStr *valstr, gint val) +{ +gchar *strptr; +int i = 0; + + do { + strptr = valstr[i].string; + if (val == valstr[i].value) { + return strptr; + } + i++; + } while (*strptr); + return "unknown"; +} +static guint16 +get_uint16(unsigned char *c) +{ +guint16 i; + +i =c[1]; i<<=8; +i+=c[0]; + +return i; +} +static guint32 +get_uint24(unsigned char *c) +{ +guint32 l; + +l =c[2]; l<<=8; +l+=c[1]; l<<=8; +l+=c[0]; + +return l; +} +static guint32 +get_uint32(unsigned char *c) +{ +guint32 l; + +l =c[3]; l<<=8; +l+=c[2]; l<<=8; +l+=c[1]; l<<=8; +l+=c[0]; + +return l; +} +void +gmdb_debug_dissect_column(GtkTreeStore *store, GtkTreeIter *parent, char *fbuf, int offset) +{ +gchar str[100]; +GtkCTreeNode *node; + + snprintf(str, 100, "Column Type: 0x%02x (%s)", fbuf[offset], + gmdb_val_to_str(column_types, fbuf[offset])); + gmdb_debug_add_item(store, parent, str, offset, offset); + snprintf(str, 100, "Column #: %d", get_uint16(&fbuf[offset+1])); + gmdb_debug_add_item(store, parent, str, offset+1, offset+2); + snprintf(str, 100, "VarCol Offset: %d", get_uint16(&fbuf[offset+3])); + gmdb_debug_add_item(store, parent, str, offset+3, offset+4); + snprintf(str, 100, "Unknown", get_uint32(&fbuf[offset+5])); + gmdb_debug_add_item(store, parent, str, offset+5, offset+8); + snprintf(str, 100, "Unknown", get_uint32(&fbuf[offset+9])); + gmdb_debug_add_item(store, parent, str, offset+9, offset+12); + snprintf(str, 100, "Variable Column: %s", + fbuf[offset+13] & 0x01 ? "No" : "Yes"); + gmdb_debug_add_item(store, parent, str, offset+13, offset+13); + snprintf(str, 100, "Fixed Col Offset: %d", get_uint16(&fbuf[offset+14])); + gmdb_debug_add_item(store, parent, str, offset+14, offset+15); + snprintf(str, 100, "Column Length: %d", get_uint16(&fbuf[offset+16])); + gmdb_debug_add_item(store, parent, str, offset+16, offset+17); +} +void +gmdb_debug_dissect_index1(GtkTreeStore *store, GtkTreeIter *parent, char *fbuf, int offset) +{ +gchar str[100]; +GtkCTreeNode *node; + + snprintf(str, 100, "Unknown"); + gmdb_debug_add_item(store, parent, str, offset, offset+3); + snprintf(str, 100, "Rows in Index: %lu", get_uint32(&fbuf[offset+4])); + gmdb_debug_add_item(store, parent, str, offset+4, offset+7); +} +void +gmdb_debug_add_page_ptr(GtkTreeStore *store, GtkTreeIter *parent, char *fbuf, const char *label, int offset) +{ +gchar str[100]; +GtkCTreeNode *node; + + snprintf(str, 100, "%s", label); + node = gmdb_debug_add_item(store, parent, str, offset, offset+3); + + snprintf(str, 100, "Row Number: %u", fbuf[offset]); + gmdb_debug_add_item(store, node, str, offset, offset); + snprintf(str, 100, "Page Number: %lu", get_uint24(&fbuf[offset+1])); + gmdb_debug_add_item(store, node, str, offset+1, offset+3); +} +void +gmdb_debug_dissect_tabledef_pg(GtkTreeStore *store, char *fbuf, int offset, int len) +{ +gchar str[100]; +guint32 i, num_idx, num_cols; +int newbase; +GtkTreeIter *node, *container; + + snprintf(str, 100, "Next TDEF Page: 0x%06x (%lu)", + get_uint32(&fbuf[offset+4]), get_uint32(&fbuf[offset+4])); + gmdb_debug_add_item(store, NULL, str, offset+4, offset+7); + snprintf(str, 100, "Length of Data: %lu", get_uint32(&fbuf[offset+8])); + gmdb_debug_add_item(store, NULL, str, offset+8, offset+11); + snprintf(str, 100, "# of Records: %lu", get_uint32(&fbuf[offset+12])); + gmdb_debug_add_item(store, NULL, str, offset+12, offset+15); + snprintf(str, 100, "Autonumber Value: %lu", get_uint32(&fbuf[offset+16])); + gmdb_debug_add_item(store, NULL, str, offset+16, offset+19); + snprintf(str, 100, "Table Type: 0x%02x (%s)", fbuf[offset+20], + gmdb_val_to_str(table_types, fbuf[offset+20])); + gmdb_debug_add_item(store, NULL, str, offset+20, offset+20); + num_cols = get_uint16(&fbuf[offset+21]); + snprintf(str, 100, "# of Columns: %u", num_cols); + gmdb_debug_add_item(store, NULL, str, offset+21, offset+22); + snprintf(str, 100, "# of VarCols: %u", + get_uint16(&fbuf[offset+23])); + gmdb_debug_add_item(store, NULL, str, offset+23, offset+24); + snprintf(str, 100, "# of Columns: %u", + get_uint16(&fbuf[offset+25])); + gmdb_debug_add_item(store, NULL, str, offset+25, offset+26); + snprintf(str, 100, "# of Index Entries: %lu", + get_uint32(&fbuf[offset+27])); + gmdb_debug_add_item(store, NULL, str, offset+27, offset+30); + + num_idx = get_uint32(&fbuf[offset+31]); + snprintf(str, 100, "# of Real Indices: %lu", num_idx); + + gmdb_debug_add_item(store, NULL, str, offset+31, offset+34); + gmdb_debug_add_page_ptr(store, NULL, fbuf, "Used Pages Pointer", offset+35); + + container = gmdb_debug_add_item(store, NULL, "Index Entries", -1, -1); + for (i=0;ictree, NULL, gmdb_clear_node_cb, NULL); + +/* + node = gtk_ctree_node_nth(GTK_CTREE(dbug->ctree), 0); + data = gtk_ctree_node_get_row_data(GTK_CTREE(dbug->ctree), node); + g_free(data); + gtk_ctree_remove_node(GTK_CTREE(dbug->ctree), node); +*/ + + /* call delete text last because remove_node fires unselect signal */ + //gtk_editable_delete_text(GTK_EDITABLE(dbug->textbox),0, -1); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dbug->textbox)); + gtk_text_buffer_set_text(buffer, "", 0); + +} + +GtkTreeIter * +gmdb_debug_add_item(GtkTreeStore *store, GtkTreeIter *iter1, gchar *text, int start, int end) +{ +gchar *nodetext[2]; +GtkCTreeNode *node; +GMdbDebugRange *range; +GtkTreeIter *iter2; + + iter2 = g_malloc(sizeof(GtkTreeIter)); + gtk_tree_store_append(store, iter2, iter1); + gtk_tree_store_set(store, iter2, 0, text, -1); +#if 0 + nodetext[0] = text; + nodetext[1] = "0"; + node = gtk_ctree_insert_node(GTK_CTREE(dbug->ctree), parent, NULL, nodetext, 0, NULL, NULL, NULL, NULL, FALSE, FALSE); + range = g_malloc(sizeof(GMdbDebugRange)); + range->start_byte = start; + range->end_byte = end; + gtk_ctree_node_set_row_data(GTK_CTREE(dbug->ctree), node, range); +#endif + + return iter2; +} + +void +gmdb_debug_text_on(GtkWidget *textbox, + int start_byte, int end_byte) +{ +gchar *text; +GtkTextBuffer *buffer; +GtkTextTag *tag; +GtkTextIter start, end; + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textbox)); + + tag = gtk_text_buffer_create_tag (buffer, NULL, + "foreground", "white", NULL); + tag = gtk_text_buffer_create_tag (buffer, NULL, + "background", "blue", NULL); + + gtk_text_buffer_get_iter_at_offset (buffer, &start, start_byte); + gtk_text_buffer_get_iter_at_offset (buffer, &end, end_byte); + gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(dbug->textbox), + &start, 0.0, FALSE, 0.0, 0.0); + gtk_text_buffer_apply_tag (buffer, tag, &start, &end); +} + +static void +gmdb_debug_text_off(GtkWidget *textbox, + int start_byte, int end_byte) +{ +gchar *text; +GtkTextBuffer *buffer; +GtkTextTag *tag; +GtkTextIter start, end; + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textbox)); + + tag = gtk_text_buffer_create_tag (buffer, NULL, + "foreground", "black", NULL); + tag = gtk_text_buffer_create_tag (buffer, NULL, + "background", "white", NULL); + + gtk_text_buffer_get_iter_at_offset (buffer, &start, start_byte); + gtk_text_buffer_get_iter_at_offset (buffer, &end, end_byte); + gtk_text_buffer_apply_tag (buffer, tag, &start, &end); +} + +#if 0 +void +gmdb_debug_tab_new(GtkWidget *notebook) +{ +GtkWidget *tabbox; +GtkWidget *label; +GtkWidget *label1; +GtkWidget *button; +GtkWidget *pixmapwid; +GtkWidget *frame; +GtkWidget *hbox; +GtkWidget *hpane; +GtkWidget *vbox; +GtkWidget *scroll; +GtkWidget *scroll2; +GdkPixmap *pixmap; +GdkBitmap *mask; +GdkColormap *cmap; + + dbug = g_malloc0(sizeof(GMdbDebugTab)); + dbug->max_page = -1; + dbug->font = gdk_font_load("-*-*-medium-r-normal-*-10-*-*-*-m-*-*-*"); + cmap = gdk_colormap_get_system(); + gdk_color_white(cmap, &dbug->white); + gdk_color_black(cmap, &dbug->black); + + vbox = gtk_vbox_new (FALSE,5); + gtk_widget_show (vbox); + + hbox = gtk_hbox_new (FALSE,5); + gtk_widget_show (hbox); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 10); + + label1 = gtk_label_new ("Page Number"); + gtk_widget_show (label1); + gtk_box_pack_start (GTK_BOX (hbox), label1, FALSE, FALSE, 10); + + dbug->pglabel = gtk_label_new (":"); + gtk_widget_show (dbug->pglabel); + gtk_box_pack_start (GTK_BOX (hbox), dbug->pglabel, FALSE, FALSE, 0); + + dbug->entry = gtk_entry_new (); + gtk_widget_show (dbug->entry); + gtk_box_pack_start (GTK_BOX (hbox), dbug->entry, TRUE, TRUE, 0); + gtk_signal_connect ( GTK_OBJECT (dbug->entry), + "activate", GTK_SIGNAL_FUNC (gmdb_debug_display_cb), dbug); + + button = gtk_button_new_with_label ("Display"); + gtk_widget_show (button); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + + gtk_signal_connect ( GTK_OBJECT (button), + "clicked", GTK_SIGNAL_FUNC (gmdb_debug_display_cb), dbug); + + hpane = gtk_hpaned_new (); + gtk_paned_set_position(GTK_PANED(hpane), 200); + gtk_paned_set_gutter_size(GTK_PANED(hpane), 12); + gtk_widget_show(hpane); + gtk_box_pack_start (GTK_BOX (vbox), hpane, TRUE, TRUE, 10); + + scroll = gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_widget_show (scroll); + gtk_container_add(GTK_CONTAINER(hpane), scroll); + + dbug->ctree = gtk_ctree_new (1, 0); + gtk_widget_show (dbug->ctree); + gtk_container_add (GTK_CONTAINER (scroll), dbug->ctree); + + gtk_signal_connect ( GTK_OBJECT (dbug->ctree), + "tree-select-row", GTK_SIGNAL_FUNC (gmdb_debug_select_cb), dbug); + gtk_signal_connect ( GTK_OBJECT (dbug->ctree), + "tree-unselect-row", GTK_SIGNAL_FUNC (gmdb_debug_unselect_cb), dbug); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); + gtk_container_set_border_width (GTK_CONTAINER (frame), 0); + //gtk_widget_set_usize (frame, 100, 75); + gtk_widget_show (frame); + gtk_container_add (GTK_CONTAINER (hpane), frame); + + scroll2 = gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll2), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_widget_show (scroll2); + gtk_container_add(GTK_CONTAINER(frame), scroll2); + + dbug->textbox = gtk_text_view_new (); + gtk_widget_modify_font(dbug->textbox, + pango_font_description_from_string("Courier")); + gtk_widget_show (dbug->textbox); + gtk_container_add(GTK_CONTAINER(scroll2), dbug->textbox); + + /* set selection callback for list */ + //gtk_signal_connect ( GTK_OBJECT (table_list), + // "select-child", GTK_SIGNAL_FUNC (gmdb_table_select_cb), NULL); + + /* create a picture/label box and use for tab */ + tabbox = gtk_hbox_new (FALSE,5); + pixmap = gdk_pixmap_colormap_create_from_xpm_d( NULL, + gtk_widget_get_colormap(app), &mask, NULL, debug_xpm); + + /* a pixmap widget to contain the pixmap */ + pixmapwid = gtk_pixmap_new( pixmap, mask ); + gtk_widget_show( pixmapwid ); + gtk_box_pack_start (GTK_BOX (tabbox), pixmapwid, FALSE, TRUE, 0); + + label = gtk_label_new ("Debug"); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (tabbox), label, FALSE, TRUE, 0); + + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, tabbox); + + if (mdb) gmdb_debug_init(mdb); +} +#endif +void +gmdb_debug_close_cb(GtkWidget *w, gpointer *data) +{ + GtkWidget *w; + w = glade_xml_get_widget (debugwin_xml, "debug_window"); + gtk_widget_destroy(w); +} +void +gmdb_debug_new_cb(GtkWidget *w, gpointer *data) +{ +GtkTextView *textview; + + /* load the interface */ + debugwin_xml = glade_xml_new("gladefiles/gmdb-debug.glade", NULL, NULL); + /* connect the signals in the interface */ + glade_xml_signal_autoconnect(debugwin_xml); + + /* this should be a preference, needs to be fixed width */ + textview = glade_xml_get_widget (debugwin_xml, "debug_textview"); + gtk_widget_modify_font(textview, + pango_font_description_from_string("Courier")); + + if (mdb) gmdb_debug_init(mdb); +/* + GtkTreeIter iter; + GtkWidget *tree = glade_xml_get_widget(debugwin_xml, "debug_treeview"); + GtkTreeStore *store = gtk_tree_store_new(1, G_TYPE_STRING); + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, 0, "Test", -1); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree), store); + + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Field", + renderer, "text", 0, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW (tree), column); + */ +} +void gmdb_debug_init(MdbHandle *mdb) +{ +struct stat st; +char tmpstr[100]; +GtkWidget *pglabel, *entry; + + pglabel = glade_xml_get_widget (debugwin_xml, "debug_num_label"); + sprintf(tmpstr, "(0-%d):", gmdb_get_max_page(mdb)); + gtk_label_set_text(GTK_LABEL(pglabel), tmpstr); + entry = glade_xml_get_widget (debugwin_xml, "debug_entry"); + gtk_widget_grab_focus(GTK_WIDGET(entry)); +} diff --git a/src/gmdb2/debug.xpm b/src/gmdb2/debug.xpm new file mode 100644 index 0000000..dcec39c --- /dev/null +++ b/src/gmdb2/debug.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static char * debug_xpm[] = { +"16 16 4 1", +" c None", +". c #ED2D2D", +"+ c #635757", +"@ c #000000", +" ", +" ..... ", +" ... ... ", +" .. +@+ .. ", +" .... @@@ .. ", +" .@+..+@+ +@. ", +".. @+..@@ +@ .. ", +". @@..@@@ . ", +". @@..@ . ", +". @@@@@@..@@@ . ", +".. @@@@.. .. ", +" . @@@@@@.. . ", +" ..@+ @@@ +... ", +" .. .. ", +" ... ... ", +" ..... "}; diff --git a/src/gmdb2/file.c b/src/gmdb2/file.c new file mode 100644 index 0000000..977d179 --- /dev/null +++ b/src/gmdb2/file.c @@ -0,0 +1,142 @@ +#include "gmdb.h" +#include + +GtkWidget *file_selector; +MdbHandle *mdb; +extern int main_show_debug; + +void gmdb_file_open_recent_1() { gmdb_file_open_recent("menu_recent1"); } +void gmdb_file_open_recent_2() { gmdb_file_open_recent("menu_recent2"); } +void gmdb_file_open_recent_3() { gmdb_file_open_recent("menu_recent3"); } +void gmdb_file_open_recent_4() { gmdb_file_open_recent("menu_recent4"); } +void gmdb_file_open_recent(gchar *menuname) +{ +gchar *text, cfgname[100]; + + sprintf(cfgname,"/gmdb/RecentFiles/%s.filepath", menuname); + text = gnome_config_get_string(cfgname); + gmdb_file_open(text); + g_free(text); + gmdb_load_recent_files(); +} +static void +gmdb_file_shuffle_recent(gchar *file_path) +{ +gchar *text, cfgname[100]; +int i, index=0; + + for (i=1; i<=4; i++) { + sprintf(cfgname,"/gmdb/RecentFiles/menu_recent%d.filepath", i); + text = gnome_config_get_string(cfgname); + if (text && !strcmp(text,file_path)) { + index = i; + break; + } + g_free(text); + } + printf("found file %slocation at menu %d\n",file_path, index); + /* it is the most recently used file, we're done */ + if (index==1) return; + + /* if this file is not on the recent list bump item 4 */ + if (!index) index=4; + + for (i=1; i=0 && file_path[i]!='/';i--); + if (file_path[i]=='/') { + strncpy(basename,&file_path[i+1],32); + } else { + strncpy(basename,file_path,32); + } + basename[33]='\0'; + gnome_config_set_string("/gmdb/RecentFiles/menu_recent1.basename", basename); + gnome_config_set_string("/gmdb/RecentFiles/menu_recent1.filepath", file_path); + gnome_config_sync(); +} +void +gmdb_file_open(gchar *file_path) +{ + gmdb_reset_widgets(); + mdb = mdb_open(file_path); + if (!mdb) { + gmdb_info_msg("Unable to open file."); + return; + } + gmdb_file_shuffle_recent(file_path); + gmdb_file_add_recent(file_path); + + sql->mdb = mdb; + mdb_read_catalog(mdb, MDB_ANY); + gmdb_table_populate(mdb); + gmdb_query_populate(mdb); + gmdb_form_populate(mdb); + gmdb_report_populate(mdb); + gmdb_macro_populate(mdb); + gmdb_module_populate(mdb); + //if (main_show_debug) gmdb_debug_init(mdb); +} + +void +gmdb_file_open_cb(GtkWidget *selector, gpointer data) +{ +gchar *file_path; + file_path = gtk_file_selection_get_filename (GTK_FILE_SELECTION(file_selector)); + gmdb_file_open(file_path); + gmdb_load_recent_files(); +} + + +void +gmdb_file_select_cb(GtkWidget *button, gpointer data) +{ + /*just print a string so that we know we got there*/ + file_selector = gtk_file_selection_new("Please select a database."); + + gtk_signal_connect ( + GTK_OBJECT (GTK_FILE_SELECTION(file_selector)->ok_button), + "clicked", GTK_SIGNAL_FUNC (gmdb_file_open_cb), NULL); + + gtk_signal_connect_object ( GTK_OBJECT ( + GTK_FILE_SELECTION(file_selector)->ok_button), + "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), + (gpointer) file_selector); + + gtk_signal_connect_object ( + GTK_OBJECT (GTK_FILE_SELECTION(file_selector)->cancel_button), + "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), + (gpointer) file_selector); + + gtk_widget_show (file_selector); +} +void +gmdb_file_close_cb(GtkWidget *button, gpointer data) +{ + gmdb_reset_widgets(); +} diff --git a/src/gmdb2/form.c b/src/gmdb2/form.c new file mode 100644 index 0000000..5471e35 --- /dev/null +++ b/src/gmdb2/form.c @@ -0,0 +1,31 @@ +#include "gmdb.h" +#include + +extern GladeXML* mainwin_xml; +extern GtkWidget *app; + +void +gmdb_form_add_icon(gchar *text) +{ +GnomeIconList *gil; + + gil = glade_xml_get_widget(mainwin_xml, "form_iconlist"); + gnome_icon_list_append(gil, "form_big.xpm", text); +} + +void gmdb_form_populate(MdbHandle *mdb) +{ +int i; +MdbCatalogEntry *entry; + + /* loop over each entry in the catalog */ + for (i=0; i < mdb->num_catalog; i++) { + entry = g_ptr_array_index (mdb->catalog, i); + + /* if it's a form */ + if (entry->object_type == MDB_FORM) { + /* add table to tab */ + gmdb_form_add_icon(entry->object_name); + } /* if MDB_FORM */ + } /* for */ +} diff --git a/src/gmdb2/form_big.xpm b/src/gmdb2/form_big.xpm new file mode 100644 index 0000000..2200b20 --- /dev/null +++ b/src/gmdb2/form_big.xpm @@ -0,0 +1,234 @@ +/* XPM */ +static char * form_big_xpm[] = { +"20 20 211 2", +" c None", +". c #585858", +"+ c #635C56", +"@ c #B97943", +"# c #EAB476", +"$ c #747474", +"% c #808080", +"& c #707070", +"* c #645C55", +"= c #816751", +"- c #CB8E57", +"; c #F0AE62", +"> c #B6B6B6", +", c #E0E0E0", +"' c #E1E1E1", +") c #DFDFDF", +"! c #DEDEDE", +"~ c #DAD4CE", +"{ c #CD894D", +"] c #F5BA7A", +"^ c #FD9D2E", +"/ c #EDEDED", +"( c #FCFCFC", +"_ c #E7E7E7", +": c #DDDDDD", +"< c #CAA88C", +"[ c #D39155", +"} c #F5BA77", +"| c #FD9325", +"1 c #FE8A09", +"2 c #EEEEEE", +"3 c #FFFFFF", +"4 c #E8E8E8", +"5 c #FDFDFD", +"6 c #FDFCFB", +"7 c #EFE5DC", +"8 c #D2AB8C", +"9 c #D8A371", +"0 c #EFAB63", +"a c #FC9930", +"b c #FE8A0B", +"c c #F58104", +"d c #E6E6E6", +"e c #E3E3E3", +"f c #FAF8F5", +"g c #EFE5DB", +"h c #D7AF8E", +"i c #DBA470", +"j c #EDA45A", +"k c #FC9E39", +"l c #FC8709", +"m c #F28004", +"n c #D56C04", +"o c #EBE8E7", +"p c #F1E4DB", +"q c #E0BEA2", +"r c #D4965F", +"s c #EFAA61", +"t c #FC9D38", +"u c #FB8508", +"v c #F27F03", +"w c #D46C04", +"x c #954803", +"y c #E9E9E9", +"z c #E6DDD8", +"A c #E6C6B1", +"B c #DB9B6B", +"C c #F4BC85", +"D c #FC962D", +"E c #FC8505", +"F c #D66D04", +"G c #9D4A04", +"H c #431F02", +"I c #F1F1F1", +"J c #EFE1D7", +"K c #F5D7C2", +"L c #F9D3B8", +"M c #EE9E6E", +"N c #F68725", +"O c #F07D06", +"P c #D36C03", +"Q c #9B4904", +"R c #3A1B02", +"S c #EAD1C2", +"T c #F3D4BC", +"U c #F9D7BD", +"V c #F2BB9B", +"W c #DD8154", +"X c #DB712A", +"Y c #C86312", +"Z c #944806", +"` c #472102", +" . c #EFEFEF", +".. c #E2E1DD", +"+. c #E9CBB6", +"@. c #F6CFB2", +"#. c #F4C7A8", +"$. c #D79371", +"%. c #B2673D", +"&. c #9D5A2F", +"*. c #7C421A", +"=. c #51290E", +"-. c #2A2019", +";. c #FCFAF8", +">. c #EAD7C9", +",. c #EECFB7", +"'. c #F0C3A5", +"). c #DCA282", +"!. c #AB6D4D", +"~. c #754D2D", +"{. c #5D4733", +"]. c #544234", +"^. c #483A31", +"/. c #303030", +"(. c #FBFBFA", +"_. c #F8F1EC", +":. c #E7B598", +"<. c #ECBB9D", +"[. c #D49B7C", +"}. c #A86C4C", +"|. c #785037", +"1. c #463D32", +"2. c #4C4946", +"3. c #877D6F", +"4. c #928673", +"5. c #E1DDD9", +"6. c #D8CCBC", +"7. c #9B8770", +"8. c #A47A5F", +"9. c #825C46", +"0. c #5A473B", +"a. c #66605B", +"b. c #9D9C99", +"c. c #A5A5A3", +"d. c #B1A797", +"e. c #92846F", +"f. c #E8E6E5", +"g. c #DFD9D1", +"h. c #A69A88", +"i. c #474034", +"j. c #5D4E43", +"k. c #796B62", +"l. c #8F8981", +"m. c #A9A5A0", +"n. c #C9C6C4", +"o. c #D5CBBC", +"p. c #CAB99F", +"q. c #92836D", +"r. c #E4DED6", +"s. c #CDC2B1", +"t. c #857A6A", +"u. c #605A50", +"v. c #7B746B", +"w. c #A7A094", +"x. c #CCC2B3", +"y. c #D9CDBD", +"z. c #E1D5C5", +"A. c #E6D4BA", +"B. c #D2BC9C", +"C. c #928269", +"D. c #E0D9CD", +"E. c #CCBFA9", +"F. c #9C9383", +"G. c #B2A99B", +"H. c #C5BAAA", +"I. c #DDCFBA", +"J. c #EDDCC3", +"K. c #EBD8BD", +"L. c #E9D5B7", +"M. c #E7D1B0", +"N. c #D1B995", +"O. c #928066", +"P. c #B4B4B3", +"Q. c #E5E2DB", +"R. c #EFE7DA", +"S. c #EDE3D3", +"T. c #ECE0CC", +"U. c #EADBC6", +"V. c #E9D8BF", +"W. c #E7D4B8", +"X. c #E5D1B2", +"Y. c #E3CDAC", +"Z. c #E2C9A5", +"`. c #CEB48D", +" + c #927F62", +".+ c #A7A49D", +"++ c #C9C5BA", +"@+ c #CAC4B7", +"#+ c #C8C1B0", +"$+ c #C8BDA8", +"%+ c #C7B9A1", +"&+ c #C5B59A", +"*+ c #C4B293", +"=+ c #C3AE8C", +"-+ c #C2AA85", +";+ c #C1A67E", +">+ c #BEA177", +",+ c #927D5F", +"'+ c #5B5A58", +")+ c #5D5B58", +"!+ c #5D5B57", +"~+ c #5C5A55", +"{+ c #5C5953", +"]+ c #5C5851", +"^+ c #5B574E", +"/+ c #5B564C", +"(+ c #5B544A", +"_+ c #5B5348", +":+ c #5A5246", +"<+ c #5A5145", +"[+ c #4D473E", +" . . . . . . . . . . . . . . + @ # ", +" . $ % % % % % % % % % % & * = - ; ", +" . > , ' ' ' ) , ' ' ' ! ~ { ] ^ ", +" . > / ( ( ( _ / ( ( ( : < [ } | 1 ", +" . > 2 3 3 3 4 / 5 6 7 8 9 0 a b c ", +" . > d 2 2 2 e / f g h i j k l m n ", +" . > e 4 4 4 ' o p q r s t u v w x ", +" . > 2 3 3 3 y z A B C D E m F G H ", +" . > 2 3 3 3 I J K L M N O P Q R ", +" . > e 4 4 4 S T U V W X Y Z ` ", +" . > d ./ ..+.@.#.$.%.&.*.=.-. ", +" . > 2 3 ;.>.,.'.).!.~.{.].^./. ", +" . > / (._.:.<.[.}.|.1.2.3.4./. ", +" . > , 5.6.7.8.9.0.a.b.c.d.e./. ", +" . > f.g.h.i.j.k.l.m.n.o.p.q./. ", +" . > r.s.t.u.v.w.x.y.z.A.B.C./. ", +" . > D.E.F.G.H.I.J.K.L.M.N.O./. ", +" . P.Q.R.S.T.U.V.W.X.Y.Z.`. +/. ", +" . .+++@+#+$+%+&+*+=+-+;+>+,+/. ", +" . '+)+!+~+{+]+^+/+(+_+:+<+[+/. "}; diff --git a/src/gmdb2/forms.xpm b/src/gmdb2/forms.xpm new file mode 100644 index 0000000..a7c32ae --- /dev/null +++ b/src/gmdb2/forms.xpm @@ -0,0 +1,126 @@ +/* XPM */ +static char * forms_xpm[] = { +"16 16 107 2", +" c None", +". c #585858", +"+ c #C47D41", +"@ c #FACB8D", +"# c #DEDEDE", +"$ c #C37B40", +"% c #FAC78C", +"& c #FE8F0C", +"* c #FFFFFF", +"= c #CECECE", +"- c #FAC689", +"; c #FE880E", +"> c #FE8801", +", c #FCFCFC", +"' c #FEFEFE", +") c #E5D6C8", +"! c #FAC98F", +"~ c #FD8810", +"{ c #FE8803", +"] c #EC7A03", +"^ c #FDFDFD", +"/ c #E7DACC", +"( c #FD850C", +"_ c #FE8703", +": c #E47604", +"< c #A54E04", +"[ c #ECDAD2", +"} c #D38F5D", +"| c #F8C58D", +"1 c #FE8406", +"2 c #FE8804", +"3 c #A34C04", +"4 c #1C0C01", +"5 c #EDEDED", +"6 c #F4D6C1", +"7 c #FFE2CD", +"8 c #EB9260", +"9 c #FA800A", +"0 c #E47702", +"a c #A04A04", +"b c #210F01", +"c c #DFDFDF", +"d c #EBB698", +"e c #FEE5CA", +"f c #F1B492", +"g c #D37043", +"h c #CF6524", +"i c #A04B0A", +"j c #231001", +"k c #E4E0D8", +"l c #EFD0B5", +"m c #FFD1B1", +"n c #C67E5D", +"o c #87542B", +"p c #5C4733", +"q c #241008", +"r c #303030", +"s c #FDFDFC", +"t c #EFB493", +"u c #F7C9AC", +"v c #C67D5A", +"w c #825234", +"x c #332E23", +"y c #474544", +"z c #BCAB90", +"A c #DCD0BF", +"B c #897862", +"C c #A36F52", +"D c #4C392C", +"E c #5B5957", +"F c #B0B0AF", +"G c #BCA88A", +"H c #FAF6F2", +"I c #A09380", +"J c #1A1812", +"K c #534F4C", +"L c #9F9C96", +"M c #C4BFB9", +"N c #DAD6D3", +"O c #E9D6BA", +"P c #BCA685", +"Q c #DAC8AB", +"R c #736A5A", +"S c #9C9488", +"T c #BDB4A4", +"U c #EEDFC8", +"V c #ECDAC0", +"W c #E9D6B9", +"X c #E7D1B0", +"Y c #BCA37F", +"Z c #F4EDE1", +"` c #F2E8D8", +" . c #F0E4D0", +".. c #EEDEC8", +"+. c #ECDABF", +"@. c #E9D6B8", +"#. c #E5CCA7", +"$. c #BCA178", +"%. c #C6C1B6", +"&. c #C4BDAC", +"*. c #C3B8A3", +"=. c #C2B39A", +"-. c #C0AF91", +";. c #BFAA88", +">. c #BEA57F", +",. c #BDA076", +"'. c #BC9E73", +" . . . . . . . . . . . . + @ ", +" . # # # # # # # # # $ % & ", +" . # * * * # * * * = $ - ; > ", +" . # * * * # , ' ) $ ! ~ { ] ", +" . # # # # # ^ / $ ! ( _ : < ", +" . # * * * # [ } | 1 2 : 3 4 ", +" . # * * * 5 6 7 8 9 0 a b ", +" . c # # # d e f g h i j ", +" . # * * k l m n o p q r ", +" . # * s t u v w x y z r ", +" . # # A B C D E F F G r ", +" . # H I J K L M N O P r ", +" . # Q R S T U V W X Y r ", +" . # Z ` ...+.@.X #.$.r ", +" . %.%.&.*.=.-.;.>.,.'.r ", +" . r r r r r r r r r r r "}; diff --git a/src/gmdb2/gladefiles/gmdb-debug.glade b/src/gmdb2/gladefiles/gmdb-debug.glade new file mode 100644 index 0000000..0caece8 --- /dev/null +++ b/src/gmdb2/gladefiles/gmdb-debug.glade @@ -0,0 +1,375 @@ + + + + + + + + + True + MDB File Debugger + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + + + + True + True + + + + True + GTK_SHADOW_NONE + + + + True + + + + True + GNOMEUIINFO_MENU_FILE_TREE + + + + + + + True + GNOMEUIINFO_MENU_NEW_ITEM + _New + True + + + + + + + True + + + + + + True + GNOMEUIINFO_MENU_CLOSE_ITEM + + + + + + + + + + + True + GNOMEUIINFO_MENU_EDIT_TREE + + + + + + + True + GNOMEUIINFO_MENU_CUT_ITEM + + + + + + + True + GNOMEUIINFO_MENU_COPY_ITEM + + + + + + + True + GNOMEUIINFO_MENU_PASTE_ITEM + + + + + + + True + GNOMEUIINFO_MENU_CLEAR_ITEM + + + + + + + + + + + True + GNOMEUIINFO_MENU_HELP_TREE + + + + + + + True + GNOMEUIINFO_MENU_ABOUT_ITEM + + + + + + + + + + + + BONOBO_DOCK_TOP + 0 + 0 + 0 + BONOBO_DOCK_ITEM_BEH_EXCLUSIVE|BONOBO_DOCK_ITEM_BEH_NEVER_VERTICAL|BONOBO_DOCK_ITEM_BEH_LOCKED + + + + + + True + False + 0 + + + + 8 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + False + 12 + + + + True + Page Number + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + True + True + True + 0 + + True + * + False + + + + 0 + True + True + + + + + + True + True + _Display + True + GTK_RELIEF_NORMAL + + + + 0 + False + False + + + + + + + 0 + False + False + + + + + + True + False + 0 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + GTK_SHADOW_IN + + + + True + True + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + False + False + False + True + + + + + True + False + + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + True + GTK_JUSTIFY_LEFT + GTK_WRAP_NONE + True + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + True + True + + + + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + 0 + True + True + + + + + + True + True + True + + + 0 + True + True + + + + + diff --git a/src/gmdb2/gladefiles/gmdb-sql.glade b/src/gmdb2/gladefiles/gmdb-sql.glade new file mode 100644 index 0000000..fb67d27 --- /dev/null +++ b/src/gmdb2/gladefiles/gmdb-sql.glade @@ -0,0 +1,514 @@ + + + + + + + + + True + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + + + + True + True + + + + True + GTK_SHADOW_NONE + + + + True + + + + True + _Query + True + + + + + + + True + GNOMEUIINFO_MENU_NEW_ITEM + _New + True + + + + + + + True + GNOMEUIINFO_MENU_OPEN_ITEM + + + + + + + True + GNOMEUIINFO_MENU_SAVE_ITEM + + + + + + + True + GNOMEUIINFO_MENU_SAVE_AS_ITEM + + + + + + + True + + + + + + True + _Execute + True + + + + + + True + gtk-execute + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + + + + + + True + GNOMEUIINFO_MENU_CLOSE_ITEM + + + + + + + + + + + True + GNOMEUIINFO_MENU_EDIT_TREE + + + + + + + True + GNOMEUIINFO_MENU_CUT_ITEM + + + + + + + True + GNOMEUIINFO_MENU_COPY_ITEM + + + + + + + True + GNOMEUIINFO_MENU_PASTE_ITEM + + + + + + + True + GNOMEUIINFO_MENU_CLEAR_ITEM + + + + + + + True + + + + + + True + GNOMEUIINFO_MENU_PROPERTIES_ITEM + + + + + + + True + + + + + + True + GNOMEUIINFO_MENU_PREFERENCES_ITEM + + + + + + + + + + + True + GNOMEUIINFO_MENU_VIEW_TREE + + + + + + True + GNOMEUIINFO_MENU_HELP_TREE + + + + + + + True + GNOMEUIINFO_MENU_ABOUT_ITEM + + + + + + + + + + + + BONOBO_DOCK_TOP + 0 + 0 + 0 + BONOBO_DOCK_ITEM_BEH_EXCLUSIVE|BONOBO_DOCK_ITEM_BEH_NEVER_VERTICAL|BONOBO_DOCK_ITEM_BEH_LOCKED + + + + + + True + GTK_SHADOW_OUT + + + + 1 + True + GTK_ORIENTATION_HORIZONTAL + GTK_TOOLBAR_BOTH + True + + + + True + New Query + gtk-new + True + + + + + + True + Load Query from File + gtk-open + True + + + + + + True + Save Query + gtk-save + True + + + + + + True + gtk-execute + True + + + True + + + + + + True + gtk-close + True + + + True + + + + + + + BONOBO_DOCK_TOP + 1 + 0 + 0 + BONOBO_DOCK_ITEM_BEH_EXCLUSIVE + + + + + + True + True + + + + True + True + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + False + False + False + True + + + + + True + False + + + + + + True + False + 0 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + 1 + True + True + True + GTK_JUSTIFY_LEFT + GTK_WRAP_NONE + True + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 0 + True + True + + + + + + 5 + True + False + 0 + + + + True + Recent Querys: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + False + True + False + True + False + + + + True + Recently Executed Querys + True + True + True + 0 + + True + * + False + + + + + + True + GTK_SELECTION_BROWSE + + + + + 0 + True + True + + + + + 0 + False + False + + + + + True + True + + + + + True + False + + + + + + True + True + GTK_POLICY_ALWAYS + GTK_POLICY_ALWAYS + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + + + + + True + True + + + + + + + 0 + True + True + + + + + + True + True + True + + + 0 + True + True + + + + + diff --git a/src/gmdb2/gladefiles/gmdb.glade b/src/gmdb2/gladefiles/gmdb.glade new file mode 100644 index 0000000..1c99c8b --- /dev/null +++ b/src/gmdb2/gladefiles/gmdb.glade @@ -0,0 +1,1184 @@ + + + + + + + + + True + MDB File Viewer + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + + + + True + True + + + + True + GTK_SHADOW_NONE + + + + True + + + + True + GNOMEUIINFO_MENU_FILE_TREE + + + + + + + True + GNOMEUIINFO_MENU_OPEN_ITEM + + + + + + + True + + + + + + True + Information + True + + + + + True + gtk-dialog-info + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + + + + + + True + GNOMEUIINFO_MENU_PRINT_ITEM + + + + + + + True + GNOMEUIINFO_MENU_PRINT_SETUP_ITEM + + + + + + + True + + + + + + True + GNOMEUIINFO_MENU_CLOSE_ITEM + + + + + + + True + + + + + + True + item + True + + + + + + + + True + item3 + True + + + + + + + + True + item4 + True + + + + + + + + True + item5 + True + + + + + + + + True + + + + + + True + GNOMEUIINFO_MENU_EXIT_ITEM + + + + + + + + + + + True + GNOMEUIINFO_MENU_EDIT_TREE + + + + + + + True + GNOMEUIINFO_MENU_CUT_ITEM + + + + + + + True + GNOMEUIINFO_MENU_COPY_ITEM + + + + + + + True + GNOMEUIINFO_MENU_PASTE_ITEM + + + + + + + True + GNOMEUIINFO_MENU_CLEAR_ITEM + + + + + + + True + + + + + + True + GNOMEUIINFO_MENU_PROPERTIES_ITEM + + + + + + + True + + + + + + True + GNOMEUIINFO_MENU_PREFERENCES_ITEM + + + + + + + + + + + True + _Tools + True + + + + + + + True + S_QL Window + True + + + + + + + + True + _Debug Window + True + + + + + True + debug.xpm + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + E_xport Schema + True + + + + + True + gtk-convert + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + + + + + True + GNOMEUIINFO_MENU_HELP_TREE + + + + + + + True + GNOMEUIINFO_MENU_ABOUT_ITEM + + + + + + + True + + + + + + True + Contents + True + + + + + + + + + + + + BONOBO_DOCK_TOP + 0 + 0 + 0 + BONOBO_DOCK_ITEM_BEH_EXCLUSIVE|BONOBO_DOCK_ITEM_BEH_NEVER_VERTICAL|BONOBO_DOCK_ITEM_BEH_LOCKED + + + + + + True + False + 0 + + + + True + True + True + True + GTK_POS_TOP + False + 2 + 2 + False + + + + True + 0.5 + 0.5 + 1 + 1 + + + + True + False + 0 + + + + 10 + True + 0 + 0.5 + GTK_SHADOW_IN + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + GTK_SELECTION_SINGLE + 78 + 8 + 8 + 2 + False + True + + + + + + + + 0 + True + True + + + + + + 18 + 120 + True + False + 10 + + + + True + True + Definition + True + GTK_RELIEF_NORMAL + + + + 0 + False + False + + + + + + True + True + Data + True + GTK_RELIEF_NORMAL + + + + 0 + False + False + + + + + + True + True + Export + True + GTK_RELIEF_NORMAL + + + + 0 + False + False + + + + + 0 + False + False + + + + + + + False + True + + + + + + True + False + 2 + + + + True + table.xpm + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Tables + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + tab + + + + + + True + False + 0 + + + + 10 + True + 0 + 0.5 + GTK_SHADOW_IN + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + GTK_SELECTION_SINGLE + 78 + 8 + 8 + 2 + False + False + + + + + + + 0 + True + True + + + + + + True + label22 + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + False + True + + + + + + True + False + 2 + + + + True + query.xpm + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Querys + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + tab + + + + + + True + False + 0 + + + + 10 + True + 0 + 0.5 + GTK_SHADOW_IN + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + GTK_SELECTION_SINGLE + 78 + 8 + 8 + 2 + False + False + + + + + + + 0 + True + True + + + + + + True + label24 + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + False + True + + + + + + True + False + 2 + + + + True + forms.xpm + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Forms + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + tab + + + + + + True + False + 0 + + + + 10 + True + 0 + 0.5 + GTK_SHADOW_IN + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + GTK_SELECTION_SINGLE + 78 + 8 + 8 + 2 + False + False + + + + + + + 0 + True + True + + + + + + True + label27 + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + False + True + + + + + + True + False + 2 + + + + True + reports.xpm + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Reports + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + tab + + + + + + True + False + 0 + + + + 10 + True + 0 + 0.5 + GTK_SHADOW_IN + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + GTK_SELECTION_SINGLE + 78 + 8 + 8 + 2 + False + False + + + + + + + 0 + True + True + + + + + + True + label26 + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + False + True + + + + + + True + False + 2 + + + + True + macros.xpm + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Macros + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + tab + + + + + + True + False + 0 + + + + 10 + True + 0 + 0.5 + GTK_SHADOW_IN + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + GTK_SELECTION_SINGLE + 78 + 8 + 8 + 2 + False + False + + + + + + + 0 + True + True + + + + + + True + label25 + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + False + True + + + + + + True + False + 2 + + + + True + code.xpm + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Modules + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + tab + + + + + 0 + True + True + + + + + + + 0 + True + True + + + + + + True + True + True + + + 0 + True + True + + + + + diff --git a/src/gmdb2/gmdb.h b/src/gmdb2/gmdb.h new file mode 100644 index 0000000..99c9309 --- /dev/null +++ b/src/gmdb2/gmdb.h @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef _gmdb_h_ +#define _gmdb_h_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +void gmdb_info_msg(gchar *message); + +GtkWidget *gmdb_info_new(); + +GtkWidget *gmdb_table_data_new(MdbCatalogEntry *entry); +GtkWidget *gmdb_table_def_new(MdbCatalogEntry *entry); +GtkWidget *gmdb_table_export_new(MdbCatalogEntry *entry); + +void gmdb_file_select_cb(GtkWidget *w, gpointer data); +void gmdb_file_open_cb(GtkWidget *w, gpointer data); +void gmdb_file_close_cb(GtkWidget *w, gpointer data); +void gmdb_file_open(gchar *file_path); + +void gmdb_sql_new_window_cb(GtkWidget *w, gpointer data); + +void gmdb_table_populate(MdbHandle *mdb); +void gmdb_form_populate(MdbHandle *mdb); +void gmdb_query_populate(MdbHandle *mdb); +void gmdb_report_populate(MdbHandle *mdb); +void gmdb_macro_populate(MdbHandle *mdb); +void gmdb_module_populate(MdbHandle *mdb); +void gmdb_debug_init(MdbHandle *mdb); + +void gmdb_table_add_tab(GtkWidget *notebook); +void gmdb_debug_tab_new(GtkWidget *notebook); + +extern GtkWidget *table_list; +extern GtkWidget *form_list; +extern GtkWidget *query_list; +extern GtkWidget *report_list; +extern GtkWidget *macro_list; +extern GtkWidget *module_list; + +extern MdbSQL *sql; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#endif diff --git a/src/gmdb2/info.c b/src/gmdb2/info.c new file mode 100644 index 0000000..b85f6be --- /dev/null +++ b/src/gmdb2/info.c @@ -0,0 +1,88 @@ +#include "gmdb.h" + +extern GtkWidget *app; +extern MdbHandle *mdb; + +typedef struct GMdbInfoWindow { + GtkWidget *window; +} GMdbInfoWindow; + +GMdbInfoWindow *infow; + +/* callbacks */ +gint +gmdb_info_dismiss_cb(GtkWidget *w, gpointer data) +{ + g_free(infow); + infow = NULL; + + return FALSE; +} + +void +gmdb_info_add_keyvalue(GtkWidget *table, gint row, gchar *key, gchar *value) +{ +GtkWidget *label; + + label = gtk_label_new(key); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, + GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 0); + gtk_widget_show(label); + label = gtk_label_new(value); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); + gtk_table_attach(GTK_TABLE(table), label, 1, 2, row, row+1, + GTK_FILL| GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 0); + gtk_widget_show(label); +} + +GtkWidget * +gmdb_info_new() +{ +GtkWidget *vbox; +GtkWidget *button; +GtkWidget *table; +char tmpstr[20]; +struct stat st; + + if (infow) { + return infow->window; + } + + infow = g_malloc(sizeof(GMdbInfoWindow)); + infow->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(infow->window), "File Info"); + gtk_widget_set_uposition(infow->window, 300,300); + gtk_widget_show(infow->window); + + gtk_signal_connect ( GTK_OBJECT (infow->window), + "destroy", GTK_SIGNAL_FUNC (gmdb_info_dismiss_cb), infow->window); + + vbox = gtk_vbox_new(FALSE, 0); + gtk_widget_show(vbox); + gtk_container_add(GTK_CONTAINER(infow->window), vbox); + + table = gtk_table_new(3,2,FALSE); + gtk_widget_show(table); + gmdb_info_add_keyvalue(table, 0, "File Name:", mdb->filename); + gmdb_info_add_keyvalue(table, 1, "JET Version:", mdb->jet_version == MDB_VER_JET3 ? "3 (Access 97)" : "4 (Access 2000/XP)"); + assert( fstat(mdb->fd, &st)!=-1 ); + sprintf(tmpstr, "%ld", st.st_size); + gmdb_info_add_keyvalue(table, 2, "File Size:", tmpstr); + sprintf(tmpstr, "%ld", st.st_size / mdb->pg_size); + gmdb_info_add_keyvalue(table, 3, "Number of Pages:", tmpstr); + sprintf(tmpstr, "%d", mdb->num_catalog); + gmdb_info_add_keyvalue(table, 4, "Number of Tables:", tmpstr); + + gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 5); + + button = gtk_button_new_with_label("Close"); + gtk_widget_show (button); + gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 5); + + gtk_signal_connect_object ( GTK_OBJECT (button), + "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT(infow->window)); + + return infow->window; +} diff --git a/src/gmdb2/logo.xpm b/src/gmdb2/logo.xpm new file mode 100644 index 0000000..77ca296 --- /dev/null +++ b/src/gmdb2/logo.xpm @@ -0,0 +1,92 @@ +/* XPM */ +static char * logo_xpm[] = { +"93 73 16 1", +" c None", +". c #B2B2B2", +"+ c #C2C2C2", +"@ c #848484", +"# c #929292", +"$ c #FFFC10", +"% c #E2E2E2", +"& c #D2D2D2", +"* c #A2A2A2", +"= c #6D6D6D", +"- c #3A3A3A", +"; c #F3F164", +"> c #FFFFFF", +", c #F4F4F4", +"' c #ECEB95", +") c #FAF86B", +" + ", +" .#+#. ", +" +@.$$$.@+ ", +" +**%$$$$$@-#+ ", +" *#&$$$$$+=*.-=. ", +" +#+$$$$$%#@&$$=-@+", +" +#.$$$$$%*=+$$+=#@*+", +" +**%$$$$$.=*$$&#@&#** ", +" **&$$$$$+=*$$$##*==*+* ", +" +=+$$$$$%@=$>).=*#-+,&=+ ", +" +**$$$$$%*=.>>+#@*#-#>.@+ ", +" +#*%$$$$$.=.$$&@#*@*+=>.# ", +" .*&$$$$$&=#;$$*@*#@'$=%&@ ", +" +@+$$$$$%@@;$$.=**@&$$**,#+ ", +" +#.$$$$$$*=.$$+##*@.,&$&=,.. ", +" +#.%$$$$$.=.$$;@#*@.%&@#=-&%@ ", +" .@&$$$$$&=#$$$*=.#@'$@@%%==*=+ ", +" .*.$$$$$&#@&$$.##*@.$$@-*.#+ ++ ", +" ++ +@*$$$$$$#=.$$+=##@*$$$+@,-. ", +" +****#* *#&$$$$$.=*$$;@@*@#'$$+.=,+* ", +" +***#@*%+-. .@+$$$$$&@#$$;*=.*=&$$'@##-*# ", +" +.*#------+.-*+ +=@+ +#.$$$$$%#@+$$.@#.=-@#+*=&,.##+ ", +" .**--*%$$$*-&*=-=.@#.*.#.%$$$$$#=+$$+=**@==+%*---##+ ", +" +@.=-@$$$$$$$@->+.%$..%==%$$$$$+=*$$;#@.@*+-#&#. +## ", +" +**@--&$$$$$$$$&-%$$$$*-@+$$$$$&##&$$*@###&,=%@=+ ", +" **#--.$$$$$$$$$$$-+$$$$%.$$$$$$@=+$$.@*#@+$$**>#+ ", +" .*.=-#$$$$$$$$$$$$$=+$$$$$$$$$$.=.$$'##.@*$$$%=,.. ", +" +#.=-=$$$$$$$$$$$$$$$=+$$$$$$$$+=#$$'#@.@@$$$$$=+,@ ", +" .#@--&$$$$$$$$$$$$$$$$-+$$$$$$&@@&$$*@##@+$$$$&@=#@+ ", +" ##--.$$.-*$$$$$$$$$$$$$-.$$$$$@@$$$.=*#@+$$$$$#@&%-# ", +" *#-@$$&@#+#$$$$$$$$$$$$$=.$$$+=.$$'@#.@*$$$$$$#-.+@+ ", +" *@-*$$#@&$&#$$$$$$$$$$$$$=.$$#@'$&#####%$$$$$$+@,-* ", +" +=-.$*=+$$$+@$$$$$$$$$$$$$=+%=*$'@@.##&$$$$$$$$@%&* ", +" @-@$##$$$$*=@$$$$$$$$$$$$$===+&#=..@.$$$$$$$$$@@,*+ ", +" .=-$*@$$$+=++#$$$$$$$$$$$$+--#@#++@*$$$$$$$$$*@@-=. ", +" +@-&&=$$$+=+ +#$$$$$$$$$$$*-=.+&.@#%$$$$$$$$+=.,+@* ", +" *-=$@;$$&= +#$$$$$$$$$$%=%,*==+%$$$$$$$$$*--*#+ ", +" +@-&$#*;$=+ +#$$$$$$$$$$$==-#+#$$$$$$$$$+=*,-- ", +" +--$$$*#=* +#$$$$$$$$$$$+*-+&#$$$$$$$+@#%+*. ", +" *-#$$$$$*=. +#$$$$$$$$$$$$$-.&#$$$$$%@@&,#*+ ", +" +=-&$$$$$$$*@+ +@$$$$$$$$$$$$$-.&@$$$+*=+%.#+ ", +" *-=$$$$$$$$$%##*#$$$$$$$$$$$$$-*&#$+=--*+#+ ", +" @-.$$$$$$$$$$$+#$$$$$$$$$$$$$$-.&-@#&@'*-+ ", +" .@-$+=.$$$$$$$$$$$$$$$$$$$$$$$$-.$@&$$@$$*+ ", +" *-@$=%#@&$$$$$$$$$$$$$$$$$$$$$$-*$$$$'=+$.+ ", +" +#-'.#$$+-@+$$$$$$$$$$$$$$$$$$$$-*$$$.=*@*#+ ", +" +--$@&$$*++##%$$$$$$$$$$$$$$$$$$-*$$=#%$$.-+ ", +" #-.&@$$%# +=$$$$$$$$$$$$$$$$$$-*$=+$$$+#. ", +" +=-'*.$$.. +@$$$*.$$$$$$$$$$$$$-.#*$$$.# ", +" #-@$@$$$#+ @&$$+=@$$$$$$$$$$$$$-#@$$$.* ", +" +=-&&@$$&@ .*$$$=&#$$$$$$$$$$$$+-=&$$+# ", +" .=-$#+$$*+ @%$$*.%#$$$$$$$$$$$$#-@$$$@+ ", +" .-@$=$$$= .+$$%=$%#$$$$$$$$$$$$--.$$.* ", +" .-.$@$$+* +@$$$#.$%#$$$$$$$$$$$+-=%$$#+ ", +"+*-''@$$*+ @+$$&@$$%@$$$$$$$$$$%-=*$$%# ", +"+@-$$=$$@+ +#$$$@&$$+-$$$$$$$$$$@-=%$$.+ ", +"+#-%$#.$#+ #%$$.#$$$==$$$$$$$$$+-=.$$%# ", +"+*-+$$=%*+.*$$$=$$$.##$$$$$$$$%-=@$$$*+ ", +"+.-=$$+=%==%$$#*$$$@ #%$$$$$$+-==$$$+@ ", +" .+-&$$##-.$$&@$$$*+ #%$$$$$@-==%$$%@ ", +" *+=-$$$@#$$$#+$$&# #$$$$+--@=%$$$#+ ", +" @%-=$$$$$$&=$$$@+ =.$$%=-@@@$$$$#+ ", +" +*&-*$$$$$=%$$+=.@'$$@--*@*$$$&@+ ", +" *+*-%$$$.*$$$-=+$$*--@#*%$$$.#+ ", +" @%=-$$$*@+#=*$$&--#@@%$$$+@. ", +" +#%-=$$$*@*$$'@-=*=.$$$&.#+ ", +" +.&-.$$$$$$@-=#@*$$$$*#+ ", +" *+*-*$$$*--#@#%$$$+@+ ", +" @&*-----##@&$$$&#. ", +" +@+%+*.*@.$$$%.#+ ", +" +*==.*.$$$$.*+ ", +" +@#&$$$.@+ ", +" +####. "}; diff --git a/src/gmdb2/macro.c b/src/gmdb2/macro.c new file mode 100644 index 0000000..c03d1de --- /dev/null +++ b/src/gmdb2/macro.c @@ -0,0 +1,31 @@ +#include "gmdb.h" +#include + +extern GladeXML* mainwin_xml; +extern GtkWidget *app; + +void +gmdb_macro_add_icon(gchar *text) +{ +GnomeIconList *gil; + + gil = glade_xml_get_widget (mainwin_xml, "macro_iconlist"); + gnome_icon_list_append(gil, "macro_big.xpm", text); +} + +void gmdb_macro_populate(MdbHandle *mdb) +{ +int i; +MdbCatalogEntry *entry; + + /* loop over each entry in the catalog */ + for (i=0; i < mdb->num_catalog; i++) { + entry = g_ptr_array_index (mdb->catalog, i); + + /* if it's a macro */ + if (entry->object_type == MDB_MACRO) { + /* add table to tab */ + gmdb_macro_add_icon(entry->object_name); + } /* if MDB_MACRO */ + } /* for */ +} diff --git a/src/gmdb2/macro_big.xpm b/src/gmdb2/macro_big.xpm new file mode 100644 index 0000000..536ba84 --- /dev/null +++ b/src/gmdb2/macro_big.xpm @@ -0,0 +1,263 @@ +/* XPM */ +static char * macro_big_xpm[] = { +"20 20 240 2", +" c None", +". c #564F44", +"+ c #554D42", +"@ c #544C42", +"# c #585148", +"$ c #786F60", +"% c #7B7162", +"& c #756A5C", +"* c #756B5E", +"= c #635B4E", +"- c #695F51", +"; c #665C50", +"> c #625B4F", +", c #857A69", +"' c #8A7E6C", +") c #867968", +"! c #807565", +"~ c #817666", +"{ c #70685C", +"] c #7A7062", +"^ c #9B8C77", +"/ c #8E816E", +"( c #877B69", +"_ c #928470", +": c #B09E86", +"< c #A5957E", +"[ c #897B69", +"} c #B2A188", +"| c #BFAC91", +"1 c #B5A38A", +"2 c #8E806D", +"3 c #998A74", +"4 c #A0907A", +"5 c #9A8A75", +"6 c #6E6558", +"7 c #807465", +"8 c #BCA990", +"9 c #A89781", +"0 c #9D8E79", +"a c #B3A189", +"b c #CAB69A", +"c c #BCA98F", +"d c #9C8C78", +"e c #C0AD92", +"f c #CEB99C", +"g c #C6B397", +"h c #9D8E78", +"i c #AC9B83", +"j c #B8A68C", +"k c #B6A38A", +"l c #938674", +"m c #6D6356", +"n c #847767", +"o c #D4BEA1", +"p c #BBA88F", +"q c #AC9B84", +"r c #C2B095", +"s c #D6C1A3", +"t c #C8B499", +"u c #AB9A83", +"v c #C7B398", +"w c #CEBA9D", +"x c #C5B196", +"y c #A4947E", +"z c #AF9E85", +"A c #B8A58C", +"B c #908371", +"C c #807667", +"D c #6E6456", +"E c #857867", +"F c #D6BFA2", +"G c #BFAB92", +"H c #AF9E86", +"I c #BFAD93", +"J c #D7C1A4", +"K c #D0BB9E", +"L c #B9A78D", +"M c #CDB99D", +"N c #C4B096", +"O c #9E8E78", +"P c #9C8D76", +"Q c #92836F", +"R c #8C7E6B", +"S c #897C69", +"T c #8A7C69", +"U c #645A4E", +"V c #7C7061", +"W c #D3BDA0", +"X c #B5A28A", +"Y c #B2A088", +"Z c #D5BFA1", +"` c #D1BC9E", +" . c #B6A48B", +".. c #C8B498", +"+. c #B1A087", +"@. c #998B75", +"#. c #A99980", +"$. c #BFAC90", +"%. c #CBB799", +"&. c #C9B599", +"*. c #BAA88F", +"=. c #827665", +"-. c #5D554A", +";. c #74695B", +">. c #C5B297", +",. c #978873", +"'. c #CCB89B", +"). c #B6A48A", +"!. c #C4B195", +"~. c #B09F86", +"{. c #998A75", +"]. c #9B8C76", +"^. c #B3A288", +"/. c #C2AF93", +"(. c #C1AE93", +"_. c #D6C1A4", +":. c #DEC8AA", +"<. c #D2BDA0", +"[. c #887B69", +"}. c #5C554B", +"|. c #6F6659", +"1. c #B3A289", +"2. c #A89880", +"3. c #988974", +"4. c #BEAB90", +"5. c #C5B296", +"6. c #B5A489", +"7. c #C0AD91", +"8. c #A2927C", +"9. c #7F7362", +"0. c #8D806C", +"a. c #938570", +"b. c #E0C9AA", +"c. c #DAC4A6", +"d. c #948570", +"e. c #6F675B", +"f. c #7E7364", +"g. c #BAA78D", +"h. c #B7A48B", +"i. c #AB9A82", +"j. c #AA9981", +"k. c #AD9C83", +"l. c #B4A187", +"m. c #B6A289", +"n. c #9E8D77", +"o. c #857865", +"p. c #847664", +"q. c #AA9982", +"r. c #A7977F", +"s. c #D0BC9E", +"t. c #E3CCAC", +"u. c #DDC7A8", +"v. c #A6957D", +"w. c #776D5E", +"x. c #887C6A", +"y. c #C4B094", +"z. c #D2BC9F", +"A. c #CBB79A", +"B. c #C3B094", +"C. c #C4B095", +"D. c #CBB69A", +"E. c #C9B498", +"F. c #B2A087", +"G. c #A1917B", +"H. c #C1AD93", +"I. c #C9B598", +"J. c #DCC6A7", +"K. c #E4CEAD", +"L. c #A1917A", +"M. c #766C5C", +"N. c #8B7E6B", +"O. c #D5C0A1", +"P. c #E5CEAE", +"Q. c #E5CDAD", +"R. c #E2CCAC", +"S. c #E2CCAD", +"T. c #E4CDAE", +"U. c #E0C9AB", +"V. c #D3BEA1", +"W. c #E1CBAB", +"X. c #D3BEA0", +"Y. c #90826E", +"Z. c #6C6355", +"`. c #817664", +" + c #DFC9A9", +".+ c #E2CBAC", +"++ c #E4CDAD", +"@+ c #756B5C", +"#+ c #897D6A", +"$+ c #B6A58B", +"%+ c #E4CEAE", +"&+ c #D5BFA2", +"*+ c #B7A58C", +"=+ c #928571", +"-+ c #73695B", +";+ c #9E8F79", +">+ c #C3B095", +",+ c #DEC8A9", +"'+ c #DBC5A7", +")+ c #CDB99C", +"!+ c #B3A188", +"~+ c #988A76", +"{+ c #786E5F", +"]+ c #867A6A", +"^+ c #AE9E86", +"/+ c #D1BD9F", +"(+ c #E1CAAA", +"_+ c #DFC8A8", +":+ c #E4CCAC", +"<+ c #9A8C77", +"[+ c #7B6F60", +"}+ c #8F8370", +"|+ c #A69880", +"1+ c #D8C3A4", +"2+ c #DEC8A8", +"3+ c #E4CCAD", +"4+ c #E5CDAE", +"5+ c #E3CDAC", +"6+ c #A5957F", +"7+ c #6B6456", +"8+ c #897D6B", +"9+ c #CEBA9C", +"0+ c #E2CBAB", +"a+ c #90826F", +"b+ c #585249", +"c+ c #796F61", +"d+ c #C6B297", +"e+ c #E5CEAF", +"f+ c #E3CDAD", +"g+ c #E0CAAB", +"h+ c #B09F88", +"i+ c #908270", +"j+ c #645D53", +"k+ c #817768", +"l+ c #C6B398", +"m+ c #E3CEAE", +"n+ c #E2CDAE", +"o+ c #E1CBAD", +"p+ c #BAA890", +"q+ c #A0927D", +" . + @ # $ % & * * ", +" = - ; > , ' ) ! ~ ", +"{ ] ^ / ( _ : < [ } | 1 2 3 4 5 ", +"6 7 8 9 0 a b c d e f g h i j k l ", +"m n o p q r s t u v w x y z j A B C ", +"D E F G H I J K L M N H O P 3 Q R S T ", +"U V W X 4 Y Z ` ...+.@.#.$.%.&.t x *.=.", +"-.;.>.i ,.4 '.f ).!.~.{.].^./.(._.:.<.[.", +"}.|.1.2.3.Q 4.5.6.7.j 8.9.0.3.a.v b.c.d.", +"e.f.~.g.h.i.j.k.l.m.n.o.p.^ q.r.s.t.u.v.", +"w.x.y.z.<.A.B.C.D.E.F.G.: H.b I.J.K.J.L.", +"M.N.O.t.P.Q.R.S.T.U.V.'.u.t.P.P.P.W.X.Y.", +"Z.`.A. +P.P.P.P.P.T.t..+++P.P.P.++s L @+", +" #+$+V.%+P.P.P.P.P.P.P.P.P.P.++&+*+=+-+", +" ;+>+,+P.++t.t.++P.P.P.R.'+)+!+~+{+ ", +" ]+^+/+++(+_+_+t.:+t.P.u.>.<+[+m ", +" }+|+1+2+b.b.3+4+++5+| 6+ ", +" 7+8+9+J..+.+T.P.++0++.a+ ", +" b+c+d+J.P.P.e+%+f+g+h+i+ ", +" j+k+l+J.P.P.%+m+n+o+p+q+ "}; diff --git a/src/gmdb2/macros.xpm b/src/gmdb2/macros.xpm new file mode 100644 index 0000000..b4b72a4 --- /dev/null +++ b/src/gmdb2/macros.xpm @@ -0,0 +1,137 @@ +/* XPM */ +static char * macros_xpm[] = { +"14 14 120 2", +" c None", +". c #564F44", +"+ c #554C41", +"@ c #534D44", +"# c #817867", +"$ c #756A5C", +"% c #756B5E", +"& c #70685C", +"* c #A0907A", +"= c #827766", +"- c #998A75", +"; c #C8B498", +"> c #887A68", +", c #C5B195", +"' c #887B68", +") c #A8977F", +"! c #9A8A75", +"~ c #6D6356", +"{ c #DEC7A9", +"] c #A0907B", +"^ c #C4B196", +"/ c #DDC7A8", +"( c #A1917C", +"_ c #CDB99C", +": c #D9C3A5", +"< c #A2927C", +"[ c #C5B296", +"} c #7A7165", +"| c #6E6456", +"1 c #E1C9AB", +"2 c #A89781", +"3 c #BFAD93", +"4 c #E1CAAB", +"5 c #B6A48B", +"6 c #D3BEA1", +"7 c #B4A38A", +"8 c #9B8C76", +"9 c #9C8D76", +"0 c #92836F", +"a c #897C69", +"b c #8A7C69", +"c c #5F564B", +"d c #AC9A83", +"e c #E5CEAD", +"f c #B3A188", +"g c #CBB79A", +"h c #877A67", +"i c #B3A287", +"j c #E0C9A9", +"k c #E1CBAB", +"l c #E2CBAD", +"m c #D8C2A5", +"n c #6B6255", +"o c #595349", +"p c #BDAB90", +"q c #968772", +"r c #8F806C", +"s c #D6C1A3", +"t c #B4A388", +"u c #C5B295", +"v c #B2A088", +"w c #796D5D", +"x c #978973", +"y c #90826E", +"z c #DCC6A8", +"A c #E4CDAD", +"B c #7D705F", +"C c #756C5F", +"D c #B6A48A", +"E c #C5B196", +"F c #B2A188", +"G c #9E8F78", +"H c #B3A087", +"I c #B39F86", +"J c #7A6E5D", +"K c #867866", +"L c #B09F87", +"M c #AD9C83", +"N c #E3CDAC", +"O c #E5CEAE", +"P c #9D8C76", +"Q c #796E5E", +"R c #E3CCAA", +"S c #E5CDAD", +"T c #E0CAAB", +"U c #E4CDAE", +"V c #DDC7A9", +"W c #C0AD92", +"X c #DEC8A9", +"Y c #847764", +"Z c #6B6254", +"` c #D4BFA1", +" . c #E3CCAD", +".. c #BFAC91", +"+. c #5E574C", +"@. c #A89880", +"#. c #E3CDAD", +"$. c #E3CCAC", +"%. c #786E5F", +"&. c #867A6A", +"*. c #C9B699", +"=. c #DEC7A7", +"-. c #D7C2A4", +";. c #9A8C77", +">. c #797060", +",. c #D3BFA0", +"'. c #E0C9AA", +"). c #E5CDAE", +"!. c #E2CCAB", +"~. c #928470", +"{. c #565148", +"]. c #C6B297", +"^. c #E5CEAF", +"/. c #E4CEAE", +"(. c #8E806E", +"_. c #676056", +":. c #C6B398", +"<. c #E2CDAE", +"[. c #E1CBAD", +"}. c #A49681", +" . + @ # $ % ", +"& * = - ; > , ; ' ) ! ", +"~ { ] ^ / ( _ : < [ ; } ", +"| 1 2 3 4 5 6 7 8 9 0 a b ", +"c { 0 d e f g h i j k l m n ", +"o p q r s t u v w x y z A B ", +"C D E F G H I J K L M N O P ", +"Q R O S T U V W X O O O A Y ", +"Z ` O O O O O O O O O ...+.", +" @.#.O O O O O O O $.W %. ", +" &.*.A j =.A $.O -.;.~ ", +" >.,.4 '.).O !.~. ", +" {.].O O ^./.T (. ", +" _.:.O O /.<.[.}. "}; diff --git a/src/gmdb2/main2.c b/src/gmdb2/main2.c new file mode 100644 index 0000000..415bca3 --- /dev/null +++ b/src/gmdb2/main2.c @@ -0,0 +1,155 @@ +#include +#include +#include +#include + +GtkWidget *app; +GladeXML *mainwin_xml; +MdbSQL *sql; + +/* called when the user closes the window */ +static gint +delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + /* signal the main loop to quit */ + gtk_main_quit(); + /* return FALSE to continue closing the window */ + return FALSE; +} + + +void +gmdb_about_cb(GtkWidget *button, gpointer data) +{ +const gchar *authors[] = { + "Brian Bruns", + NULL +}; +const gchar *documenters[] = { + "Brian Bruns", + NULL +}; +GdkPixbuf *pixbuf; + +pixbuf = gdk_pixbuf_new_from_file ("logo.gif", NULL); + +gtk_widget_show (gnome_about_new ("Gnome MDB Viewer", "0.2", + "Copyright 2002-2003 Brian Bruns", + _("The Gnome-MDB Viewer is the grapical interface to " + "MDB Tools. It lets you view, print and export data " + "from MDB files produced by MS Access 97/2000/XP."), + (const gchar **) authors, + (const gchar **) authors, + NULL, + pixbuf)); +} +void +gmdb_info_cb(GtkWidget *button, gpointer data) +{ + gmdb_info_new(); +} + + +/* a callback for the buttons */ +void +a_callback(GtkWidget *button, gpointer data) +{ + + /*just print a string so that we know we got there*/ + g_print("Inside Callback\n"); +} + +void gmdb_load_recent_files() +{ +GtkWidget *menuitem; +GtkWidget *menulabel; +char menuname[100]; +char cfgname[100]; +int i; +gchar *text, *text2; + + for (i=4;i>=1;i--) { + sprintf(menuname, "menu_recent%d",i); + sprintf(cfgname, "/gmdb/RecentFiles/menu_recent%d.basename",i); + menuitem = glade_xml_get_widget (mainwin_xml, menuname); + menulabel = gtk_bin_get_child(GTK_BIN(menuitem)); + text = gnome_config_get_string(cfgname); + if (!text) { + gtk_widget_hide(menuitem); + } else { + text2 = g_malloc(strlen(text)+4); + sprintf(text2,"%d. %s",i,text); + gtk_label_set_text(GTK_LABEL(menulabel),text2); + gtk_widget_show(menuitem); + g_free(text2); + } + g_free(text); + } +} +void +gmdb_reset_widgets() +{ +GnomeIconList *gil; +int pos; + + gil = glade_xml_get_widget (mainwin_xml, "table_iconlist"); + gnome_icon_list_clear(gil); + gil = glade_xml_get_widget (mainwin_xml, "query_iconlist"); + gnome_icon_list_clear(gil); + gil = glade_xml_get_widget (mainwin_xml, "form_iconlist"); + gnome_icon_list_clear(gil); + gil = glade_xml_get_widget (mainwin_xml, "report_iconlist"); + gnome_icon_list_clear(gil); + gil = glade_xml_get_widget (mainwin_xml, "macro_iconlist"); + gnome_icon_list_clear(gil); + gil = glade_xml_get_widget (mainwin_xml, "module_iconlist"); + gnome_icon_list_clear(gil); +} +void gmdb_init_popups() +{ +} + +int main(int argc, char *argv[]) +{ +GtkWidget *menuitem; +GtkWidget *menulabel; + +#ifdef SQL + /* initialize the SQL engine */ + sql = mdb_sql_init(); +#endif + /* initialize MDB Tools library */ + mdb_init(); + + /* Initialize GNOME */ + gnome_init ("gmdb2", "0.2", argc, argv); + app = gnome_app_new ("gmdb2", "Gnome-MDB File Viewer"); + + glade_init(); + + /* load the interface */ + mainwin_xml = glade_xml_new("gladefiles/gmdb.glade", NULL, NULL); + /* connect the signals in the interface */ + glade_xml_signal_autoconnect(mainwin_xml); + + gtk_signal_connect (GTK_OBJECT (app), "delete_event", + GTK_SIGNAL_FUNC (delete_event), NULL); + + if (argc>1) { + gmdb_file_open(argv[1]); + } + + gmdb_load_recent_files(); + gmdb_init_popups(); + + /* start the event loop */ + gtk_main(); + +#ifdef SQL + /* free MDB Tools library */ + mdb_sql_exit(sql); +#endif + mdb_exit(); + + return 0; +} diff --git a/src/gmdb2/module.c b/src/gmdb2/module.c new file mode 100644 index 0000000..e3cd704 --- /dev/null +++ b/src/gmdb2/module.c @@ -0,0 +1,31 @@ +#include "gmdb.h" +#include + +extern GladeXML* mainwin_xml; +extern GtkWidget *app; + +void +gmdb_module_add_icon(gchar *text) +{ +GnomeIconList *gil; + + gil = glade_xml_get_widget (mainwin_xml, "module_iconlist"); + gnome_icon_list_append(gil, "module_big.xpm", text); +} + +void gmdb_module_populate(MdbHandle *mdb) +{ +int i; +MdbCatalogEntry *entry; + + /* loop over each entry in the catalog */ + for (i=0; i < mdb->num_catalog; i++) { + entry = g_ptr_array_index (mdb->catalog, i); + + /* if it's a module */ + if (entry->object_type == MDB_MODULE) { + /* add table to tab */ + gmdb_module_add_icon(entry->object_name); + } /* if MDB_MODULE */ + } /* for */ +} diff --git a/src/gmdb2/module_big.xpm b/src/gmdb2/module_big.xpm new file mode 100644 index 0000000..893971b --- /dev/null +++ b/src/gmdb2/module_big.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static char * module_big_xpm[] = { +"24 20 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" . .. . . ", +" . .. . . ", +" . . . ", +" . . . ", +" .... .. ... .. ..", +" . .. .. . ..", +" . .. .. . ..", +" . .. .. ..", +" . .. .. ..", +" . .. . .. ..", +" . . . .. . ", +" ... .. ... .... .. ", +" . . ", +" ", +" ", +" ", +" "}; diff --git a/src/gmdb2/pk.xpm b/src/gmdb2/pk.xpm new file mode 100644 index 0000000..a8f9b44 --- /dev/null +++ b/src/gmdb2/pk.xpm @@ -0,0 +1,24 @@ +/* XPM */ +static char * pk_xpm[] = { +"16 16 5 1", +" c None", +". c #FFBF00", +"+ c #1C59DD", +"@ c #000000", +"# c #E8AC17", +" ", +" .... +++ ", +" ..@@.. + + ", +" ...... + + ", +" ...... +++ ", +" .... + ", +" .# + ", +" .# ", +" .# + + ", +" .#. + + ", +" .#.. ++ ", +" .# + + ", +" .#. + + ", +" .#.. + + ", +" ", +" "}; diff --git a/src/gmdb2/query.c b/src/gmdb2/query.c new file mode 100644 index 0000000..89a142a --- /dev/null +++ b/src/gmdb2/query.c @@ -0,0 +1,32 @@ +#include "gmdb.h" +#include + +extern GladeXML* mainwin_xml; +GtkWidget *query_list; +extern GtkWidget *app; + +void +gmdb_query_add_icon(gchar *text) +{ +GnomeIconList *gil; + + gil = glade_xml_get_widget (mainwin_xml, "query_iconlist"); + gnome_icon_list_append(gil, "query_big.xpm", text); + +} + +void gmdb_query_populate(MdbHandle *mdb) +{ +int i; +MdbCatalogEntry *entry; + + /* loop over each entry in the catalog */ + for (i=0; i < mdb->num_catalog; i++) { + entry = g_ptr_array_index (mdb->catalog, i); + + /* if it's a query */ + if (entry->object_type == MDB_QUERY) { + gmdb_query_add_icon(entry->object_name); + } /* if MDB_QUERY */ + } /* for */ +} diff --git a/src/gmdb2/query.xpm b/src/gmdb2/query.xpm new file mode 100644 index 0000000..dd3a654 --- /dev/null +++ b/src/gmdb2/query.xpm @@ -0,0 +1,46 @@ +/* XPM */ +static char * query_xpm[] = { +"10 12 31 1", +" c None", +". c #C9C5C5", +"+ c #C2BEBE", +"@ c #D0CCCC", +"# c #DAD5D5", +"$ c #C1BDBD", +"% c #9B9B9B", +"& c #B6B5B5", +"* c #C0BCBC", +"= c #9D9C9C", +"- c #D4D1D1", +"; c #CCC8C8", +"> c #8C8C8C", +", c #A09F9F", +"' c #959696", +") c #A7A6A6", +"! c #C6C1C1", +"~ c #8D8E8E", +"{ c #A4A5A5", +"] c #BEBBBB", +"^ c #C3C0C0", +"/ c #9D9E9E", +"( c #AFACAC", +"_ c #949595", +": c #B9B7B7", +"< c #AEABAB", +"[ c #B0AEAE", +"} c #A2A2A2", +"| c #A5A5A5", +"1 c #979797", +"2 c #ACABAB", +" .+@ ", +" #$%&*%=- ", +" ;> ,' ", +" )> !~+", +" +{ ]~+", +" ^~/ ", +" (_: ", +" <[ ", +" } ", +" ", +" |+ ", +" +12 "}; diff --git a/src/gmdb2/query_big.xpm b/src/gmdb2/query_big.xpm new file mode 100644 index 0000000..baaa3b2 --- /dev/null +++ b/src/gmdb2/query_big.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static char * query_big_xpm[] = { +"20 24 2 1", +" c None", +". c #000000", +" ", +" ", +" ........ ", +" .. ..... ", +" .... ..... ", +" ..... ..... ", +" ..... ..... ", +" .... ..... ", +" ..... ", +" ..... ", +" .... ", +" .... ", +" .. ", +" .. ", +" . ", +" . ", +" ", +" ... ", +" ..... ", +" ..... ", +" ..... ", +" .... ", +" ", +" "}; diff --git a/src/gmdb2/report.c b/src/gmdb2/report.c new file mode 100644 index 0000000..62e4e87 --- /dev/null +++ b/src/gmdb2/report.c @@ -0,0 +1,31 @@ +#include "gmdb.h" +#include + +extern GladeXML* mainwin_xml; +extern GtkWidget *app; + +void +gmdb_report_add_icon(gchar *text) +{ +GnomeIconList *gil; + + gil = glade_xml_get_widget (mainwin_xml, "report_iconlist"); + gnome_icon_list_append(gil, "report_big.xpm", text); +} + +void gmdb_report_populate(MdbHandle *mdb) +{ +int i; +MdbCatalogEntry *entry; + + /* loop over each entry in the catalog */ + for (i=0; i < mdb->num_catalog; i++) { + entry = g_ptr_array_index (mdb->catalog, i); + + /* if it's a report */ + if (entry->object_type == MDB_REPORT) { + /* add table to tab */ + gmdb_report_add_icon(entry->object_name); + } /* if MDB_REPORT */ + } /* for */ +} diff --git a/src/gmdb2/report_big.xpm b/src/gmdb2/report_big.xpm new file mode 100644 index 0000000..d273df1 --- /dev/null +++ b/src/gmdb2/report_big.xpm @@ -0,0 +1,217 @@ +/* XPM */ +static char * report_big_xpm[] = { +"20 20 194 2", +" c None", +". c #45372B", +"+ c #746450", +"@ c #766654", +"# c #736250", +"$ c #625241", +"% c #5E4844", +"& c #D9C3A0", +"* c #EAD7B7", +"= c #E0CAAB", +"- c #9C8A71", +"; c #171512", +"> c #15120E", +", c #5F4946", +"' c #DFCAAB", +") c #EFE2CD", +"! c #F0E6D7", +"~ c #E8DBC9", +"{ c #D1BEA2", +"] c #BBA382", +"^ c #3F362B", +"/ c #020201", +"( c #000000", +"_ c #5D4D43", +": c #DFD1BF", +"< c #F5EDE2", +"[ c #FAF5EE", +"} c #FBF5EE", +"| c #F8EFE4", +"1 c #F0E3D3", +"2 c #BCAE9A", +"3 c #9B8A72", +"4 c #826F5B", +"5 c #564642", +"6 c #594A46", +"7 c #605346", +"8 c #E0D6C9", +"9 c #F8F2EA", +"0 c #FDF9F5", +"a c #FEFBF8", +"b c #FEFAF7", +"c c #FDF6F0", +"d c #F6EADB", +"e c #C3B19E", +"f c #7E6A5B", +"g c #4C3E3C", +"h c #584946", +"i c #2A2221", +"j c #65584A", +"k c #E4DACC", +"l c #F9F3EA", +"m c #FDF8F3", +"n c #FEFAF5", +"o c #FDF8F5", +"p c #FBF4EE", +"q c #FBF3EC", +"r c #AA9E99", +"s c #554643", +"t c #4E413D", +"u c #806F62", +"v c #28231F", +"w c #6E5E4F", +"x c #E8DECF", +"y c #FCF5EA", +"z c #FEF8EF", +"A c #FEF7EF", +"B c #FCF6F0", +"C c #F9F1E7", +"D c #FAF1E6", +"E c #A69A93", +"F c #514240", +"G c #5E4F49", +"H c #CAB695", +"I c #453F33", +"J c #624E3D", +"K c #A88A70", +"L c #F1E6D6", +"M c #FDF4E7", +"N c #FEF5EA", +"O c #FCF4E8", +"P c #F9F0E3", +"Q c #F7EEDE", +"R c #F7EDDD", +"S c #807A72", +"T c #090707", +"U c #0A0908", +"V c #161411", +"W c #4B3B2E", +"X c #766554", +"Y c #DECAB1", +"Z c #F8ECD7", +"` c #FDF2DF", +" . c #FEF3E0", +".. c #FCF1DE", +"+. c #F8EBD7", +"@. c #F5E8D3", +"#. c #F2E2CE", +"$. c #7A7167", +"%. c #030202", +"&. c #493A2E", +"*. c #7C6D5C", +"=. c #F4E4C9", +"-. c #F9EAD0", +";. c #FCEED4", +">. c #F5E5CA", +",. c #EFDFC6", +"'. c #EAD8BE", +"). c #756C5E", +"!. c #5D4D3C", +"~. c #8E7D67", +"{. c #F0DEBE", +"]. c #F1DFBE", +"^. c #F6E5C5", +"/. c #F5E4C5", +"(. c #F2E0C2", +"_. c #F0DDBF", +":. c #E9D7BA", +"<. c #E2CDAF", +"[. c #6F6555", +"}. c #584B40", +"|. c #584A3E", +"1. c #564739", +"2. c #7F6B55", +"3. c #B8A080", +"4. c #DBC5A0", +"5. c #E0C8A1", +"6. c #E9D1AE", +"7. c #EBD5B3", +"8. c #EAD5B4", +"9. c #EAD5B6", +"0. c #E6D1B2", +"a. c #CCB696", +"b. c #665A48", +"c. c #7B7067", +"d. c #ECE8E5", +"e. c #ECE5D8", +"f. c #DAC6AA", +"g. c #AB9177", +"h. c #866C58", +"i. c #907560", +"j. c #BDA381", +"k. c #D3B995", +"l. c #DBC19E", +"m. c #DEC5A1", +"n. c #E2C8A4", +"o. c #DAC09D", +"p. c #514839", +"q. c #15130E", +"r. c #726252", +"s. c #DECAB0", +"t. c #EFDEC5", +"u. c #F5E9D9", +"v. c #E8DCCE", +"w. c #D3C1AD", +"x. c #BFA486", +"y. c #9A7F66", +"z. c #997E66", +"A. c #AE9477", +"B. c #C5AB88", +"C. c #C9AF8C", +"D. c #C7AC89", +"E. c #3C3429", +"F. c #010100", +"G. c #544637", +"H. c #685A48", +"I. c #746A5A", +"J. c #C4B6A5", +"K. c #EDDFCA", +"L. c #F4E6D0", +"M. c #EBDCCA", +"N. c #C5B4A3", +"O. c #B69E86", +"P. c #9D856F", +"Q. c #8A7663", +"R. c #927C67", +"S. c #B29A7A", +"T. c #372F25", +"U. c #6E5F4B", +"V. c #9A8972", +"W. c #BBAE9C", +"X. c #F1E6DA", +"Y. c #F7EDDA", +"Z. c #CCB8A0", +"`. c #867364", +" + c #5F4E48", +".+ c #776651", +"++ c #2E281F", +"@+ c #3C3329", +"#+ c #7E6E64", +"$+ c #4F413E", +"%+ c #463A37", +"&+ c #594946", +"*+ c #181413", +"=+ c #1B1615", +" . . . . ", +" + @ # $ ", +" % & * = - ; > ", +" , ' ) ! ~ { ] ^ / ( ", +" _ : < [ } | 1 2 3 4 5 6 ", +" 7 8 9 0 a b c d e f g h i ", +" j k l m n o p q r s t u v ", +" w x y z A B C D E F G H I ", +" J K L M N O P Q R S T U V ", +" W X Y Z ` ...+.@.#.$.%. ", +" &.*.=.-.;.;.-.>.,.'.)./ ", +" !.~.{.].^./.(._.:.<.[.( ", +" }.|.1.2.3.4.5.6.7.8.9.0.a.b.( ", +". c.d.e.f.g.h.i.j.k.l.m.n.o.p.q. ", +". r.s.t.u.v.w.x.y.z.A.B.C.D.E.F. ", +". G.H.I.J.K.L.M.N.O.P.Q.R.S.T.( ", +" ( ( U.V.W.X.Y.Z.`.s +.+++ ", +" ( ( @+] { #+$+$+G U ", +" > ; %+&+u H V ", +" *+=+v I "}; diff --git a/src/gmdb2/reports.xpm b/src/gmdb2/reports.xpm new file mode 100644 index 0000000..66b4e11 --- /dev/null +++ b/src/gmdb2/reports.xpm @@ -0,0 +1,95 @@ +/* XPM */ +static char * reports_xpm[] = { +"16 16 76 1", +" c None", +". c #45372B", +"+ c #4F3939", +"@ c #E7D1AA", +"# c #EBD7B9", +"$ c #D1B692", +"% c #000000", +"& c #F0DBB9", +"* c #F0E7D9", +"= c #F5EBDF", +"- c #CDB18C", +"; c #050403", +"> c #4C3E31", +", c #EFE4D7", +"' c #FBF7F3", +") c #FFFCF9", +"! c #FDF6EF", +"~ c #554542", +"{ c #5A4A47", +"] c #55473A", +"^ c #F2E9DB", +"/ c #FBF6F0", +"( c #FEFBF8", +"_ c #FEFAF7", +": c #FCF4EF", +"< c #FAF3ED", +"[ c #413533", +"} c #57483A", +"| c #F7EDDE", +"1 c #FEF8F0", +"2 c #FEF8EF", +"3 c #FDF7F3", +"4 c #F9F1E7", +"5 c #FBF2E7", +"6 c #594946", +"7 c #EFD8B0", +"8 c #A78568", +"9 c #FBF2E3", +"0 c #FEF5E8", +"a c #FDF5EA", +"b c #F9EFE2", +"c c #F7EDDC", +"d c #F7ECDC", +"e c #4D3D30", +"f c #F1E2CA", +"g c #FCEFD9", +"h c #FEF2DC", +"i c #F8EAD3", +"j c #F4E5CE", +"k c #EEDBC5", +"l c #F5E5C7", +"m c #F7E7C9", +"n c #FCEED0", +"o c #F6E6C8", +"p c #F4E1C3", +"q c #E9D8BC", +"r c #E2CFB1", +"s c #AE9676", +"t c #E5CFA8", +"u c #E4CCA5", +"v c #EFD8B6", +"w c #EBD7B5", +"x c #E7D3B4", +"y c #D7BD99", +"z c #FFFCFB", +"A c #FFF8E9", +"B c #E2C7A3", +"C c #806553", +"D c #BFA582", +"E c #DBC19D", +"F c #020200", +"G c #E1C6A2", +"H c #836854", +"I c #B89F7D", +"J c #FEF7E8", +"K c #5D4B47", +" ... ", +" +@#$%% ", +" +&*=#-;% ", +" >,'))!#-~{ ", +" ]^/(_:<{[{%", +" }|12345{67%", +" .890abcd%%% ", +" efghhijk; ", +" .lmnopqr% ", +" ...stuvw#xy% ", +".zABCCDyEByF ", +".-#zAGHCIDD% ", +" %%-#zJB{Ks% ", +" %%-#{[{% ", +" %%{{7% ", +" %%% "}; diff --git a/src/gmdb2/sql.c b/src/gmdb2/sql.c new file mode 100644 index 0000000..9e3272f --- /dev/null +++ b/src/gmdb2/sql.c @@ -0,0 +1,321 @@ +#include "gmdb.h" + +#if SQL + +typedef struct GMdbSQLWindow { + GtkWidget *window; + GtkWidget *textbox; + GtkWidget *combo; + GtkWidget *clist; + GtkWidget *scroll; + GtkWidget *ctree; + GtkCTreeNode *current_node; + GList *history; +} GMdbSQLWindow; + +GList *window_list; + +extern GtkWidget *app; +extern MdbHandle *mdb; +extern MdbSQL *sql; + + +GtkCTreeNode *gmdb_sql_ctree_populate(MdbHandle *mdb, GMdbSQLWindow *sqlwin); + +/* callbacks */ +gint +gmdb_sql_close(GtkList *list, GtkWidget *w, GMdbSQLWindow *sqlwin) +{ + window_list = g_list_remove(window_list, sql); + g_free(sql); + return FALSE; +} + +void +gmdb_sql_tree_select_cb(GtkCTree *tree, GList *node, gint column, GMdbSQLWindow *sqlwin) +{ + sqlwin->current_node = node; +} +void +gmdb_sql_dnd_dataget_cb( + GtkWidget *w, GdkDragContext *dc, + GtkSelectionData *selection_data, guint info, guint t, + GMdbSQLWindow *sqlwin) +{ +gchar tablename[256]; +gchar *text[2]; + + gtk_ctree_get_node_info(GTK_CTREE(sqlwin->ctree), sqlwin->current_node, text, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + + //strcpy(tablename, "Shippers"); + gtk_selection_data_set( + selection_data, + GDK_SELECTION_TYPE_STRING, + 8, /* 8 bits per character. */ + text[0], strlen(text[0])); +} +void gmdb_sql_dnd_datareceived_cb( + GtkWidget *w, + GdkDragContext *dc, + gint x, gint y, + GtkSelectionData *selection_data, + guint info, guint t, + GMdbSQLWindow *sqlwin) +{ +gchar *buf, *lastbuf; +GtkTextIter iter, start, end; +GtkTextBuffer *txtbuffer; +int len; + + buf = selection_data->data; + txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sqlwin->textbox)); + if (gtk_text_buffer_get_char_count(txtbuffer)==0) { + gtk_text_buffer_get_iter_at_offset (txtbuffer, &iter, 0); + gtk_text_buffer_insert(txtbuffer, &iter, "select * from ", 14); + } +#if 0 + len = gtk_text_buffer_get_char_count(txtbuffer); + gtk_text_buffer_get_iter_at_offset (txtbuffer, &end, len); + gtk_text_buffer_get_iter_at_offset (txtbuffer, &start, len - strlen(buf)); + lastbuf = gtk_text_buffer_get_text(txtbuffer, &start, &end, FALSE); + printf("last buf %s\n", lastbuf); + + if (strcmp(buf,lastbuf)) { + //gtk_text_buffer_insert_at_cursor(txtbuffer,buf,strlen(buf)); + } +#endif + gtk_widget_grab_focus(GTK_WIDGET(sqlwin->textbox)); +} + +void +gmdb_sql_select_hist_cb(GtkList *list, GtkWidget *w, GMdbSQLWindow *sqlwin) +{ +guint child_num; +gchar *buf; +GtkTextBuffer *txtbuffer; + + child_num = gtk_list_child_position(list, w); + buf = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(sqlwin->combo)->entry)); + txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sqlwin->textbox)); + gtk_text_buffer_set_text(txtbuffer, buf, strlen(buf)); +} + +void +gmdb_sql_execute_cb(GtkWidget *w, GMdbSQLWindow *sqlwin) +{ +guint len; +gchar *buf; +gchar *bound_data[256]; +int i; +MdbSQLColumn *sqlcol; +gchar *titles[256]; +GtkTextBuffer *txtbuffer; +GtkTextIter start, end; + + /* stuff this query on the history */ + txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sqlwin->textbox)); + len = gtk_text_buffer_get_char_count(txtbuffer); + gtk_text_buffer_get_iter_at_offset (txtbuffer, &start, 0); + gtk_text_buffer_get_iter_at_offset (txtbuffer, &end, len); + buf = gtk_text_buffer_get_text(txtbuffer, &start, &end, FALSE); + + sqlwin->history = g_list_prepend(sqlwin->history, g_strdup(buf)); + gtk_combo_set_popdown_strings(GTK_COMBO(sqlwin->combo), sqlwin->history); + + /* ok now execute it */ + g_input_ptr = buf; + /* begin unsafe */ + _mdb_sql(sql); + if (yyparse()) { + /* end unsafe */ + gmdb_info_msg("Couldn't parse SQL"); + mdb_sql_reset(sql); + return; + } + for (i=0;inum_columns;i++) { + bound_data[i] = (char *) malloc(MDB_BIND_SIZE); + bound_data[i][0] = '\0'; + mdbsql_bind_column(sql, i+1, bound_data[i]); + sqlcol = g_ptr_array_index(sql->columns,i); + titles[i] = sqlcol->name; + } + if (sqlwin->clist) { + gtk_container_remove(GTK_CONTAINER(sqlwin->scroll), sqlwin->clist); + } + sqlwin->clist = gtk_clist_new_with_titles(sql->num_columns, titles); + gtk_container_add(GTK_CONTAINER(sqlwin->scroll),sqlwin->clist); + gtk_widget_show(sqlwin->clist); + + while(mdb_fetch_row(sql->cur_table)) { + gtk_clist_append(GTK_CLIST(sqlwin->clist), bound_data); + } + + + /* free the memory used to bind */ + for (i=0;inum_columns;i++) { + free(bound_data[i]); + } + + mdb_sql_reset(sql); + g_free(buf); +} + +void +gmdb_sql_new_window_cb(GtkWidget *w, gpointer data) +{ +GtkWidget *hpane; +GtkWidget *vpane; +GtkWidget *vbox; +GtkWidget *hbox; +GtkWidget *scroll; +GtkWidget *button; +GtkWidget *frame1; +GtkTargetEntry src; +GMdbSQLWindow *sqlwin; +GtkWindow *txtbuffer; +GtkCTreeNode *node; + + if (!mdb) { + gmdb_info_msg("No database is open."); + return; + } + sqlwin = g_malloc0(sizeof(GMdbSQLWindow)); + sqlwin->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(sqlwin->window), "Query Tool"); + gtk_widget_set_usize(sqlwin->window, 400,300); + gtk_widget_show(sqlwin->window); + + gtk_signal_connect (GTK_OBJECT (sqlwin->window), "delete_event", + GTK_SIGNAL_FUNC (gmdb_sql_close), sqlwin); + + vpane = gtk_vpaned_new(); + gtk_widget_show(vpane); + gtk_paned_set_position(GTK_PANED(vpane), 100); + gtk_paned_set_gutter_size(GTK_PANED(vpane), 12); + gtk_container_add(GTK_CONTAINER(sqlwin->window), vpane); + + hpane = gtk_hpaned_new(); + gtk_widget_show(hpane); + gtk_paned_set_position(GTK_PANED(hpane), 100); + gtk_paned_set_gutter_size(GTK_PANED(hpane), 12); + gtk_container_add(GTK_CONTAINER(vpane), hpane); + + scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_widget_show (scroll); + gtk_container_add(GTK_CONTAINER(hpane), scroll); + + sqlwin->ctree = gtk_ctree_new (1, 0); + gtk_widget_show (sqlwin->ctree); + gtk_container_add (GTK_CONTAINER (scroll), sqlwin->ctree); + + gtk_signal_connect ( GTK_OBJECT (sqlwin->ctree), + "tree-select-row", GTK_SIGNAL_FUNC (gmdb_sql_tree_select_cb), sqlwin); + + vbox = gtk_vbox_new(FALSE,0); + gtk_widget_show (vbox); + gtk_container_add(GTK_CONTAINER(hpane), vbox); + + frame1 = gtk_frame_new (NULL); + gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_IN); + gtk_widget_show (frame1); + gtk_box_pack_start (GTK_BOX (vbox), frame1, TRUE, TRUE, 0); + + sqlwin->textbox = gtk_text_view_new(); + gtk_widget_show (sqlwin->textbox); + gtk_container_add(GTK_CONTAINER(frame1), sqlwin->textbox); +#if 0 + + gtk_signal_connect ( GTK_OBJECT (sqlwin->textbox), + "activate", GTK_SIGNAL_FUNC (gmdb_sql_execute_cb), sqlwin); +#endif + + hbox = gtk_hbox_new(FALSE,0); + gtk_widget_show (hbox); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + + sqlwin->combo = gtk_combo_new(); + gtk_widget_show (sqlwin->combo); + gtk_box_pack_start (GTK_BOX (hbox), sqlwin->combo, TRUE, TRUE, 0); + gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(sqlwin->combo)->entry), FALSE); + + gtk_signal_connect ( GTK_OBJECT (GTK_COMBO(sqlwin->combo)->list), + "select-child", GTK_SIGNAL_FUNC (gmdb_sql_select_hist_cb), sqlwin); + + button = gtk_button_new_with_label("Execute"); + gtk_widget_show (button); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 5); + + gtk_signal_connect ( GTK_OBJECT (button), + "clicked", GTK_SIGNAL_FUNC (gmdb_sql_execute_cb), sqlwin); + + sqlwin->scroll = gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sqlwin->scroll), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_widget_show (sqlwin->scroll); + gtk_container_add(GTK_CONTAINER(vpane), sqlwin->scroll); + + sqlwin->clist = gtk_clist_new(1); + gtk_widget_show(sqlwin->clist); + gtk_container_add(GTK_CONTAINER(sqlwin->scroll),sqlwin->clist); + + /* populate first level of tree */ + node = gmdb_sql_ctree_populate(mdb, sqlwin); + gtk_ctree_select(sqlwin->ctree, node); + src.target = "table"; + src.flags = 0; + src.info = 1; + gtk_drag_source_set( sqlwin->ctree, GDK_BUTTON1_MASK, &src, 1, GDK_ACTION_COPY); + gtk_drag_dest_set( sqlwin->textbox, + //GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_HIGHLIGHT , + // GTK_DEST_DEFAULT_DROP, + &src, 1, GDK_ACTION_COPY | GDK_ACTION_MOVE); + gtk_signal_connect( GTK_OBJECT(sqlwin->ctree), "drag_data_get", + GTK_SIGNAL_FUNC(gmdb_sql_dnd_dataget_cb), sqlwin); + gtk_signal_connect( GTK_OBJECT(sqlwin->textbox), "drag_data_received", + GTK_SIGNAL_FUNC(gmdb_sql_dnd_datareceived_cb), sqlwin); + + gtk_widget_grab_focus(GTK_WIDGET(sqlwin->textbox)); + + /* add this one to the window list */ + window_list = g_list_append(window_list, sql); +} + +/* functions */ +GtkCTreeNode * +gmdb_sql_ctree_populate(MdbHandle *mdb, GMdbSQLWindow *sqlwin) +{ +int i; +MdbCatalogEntry *entry; +gchar *text[2]; +GtkCTreeNode *node, *first_node = NULL; + + /* loop over each entry in the catalog */ + for (i=0; i < mdb->num_catalog; i++) { + entry = g_ptr_array_index (mdb->catalog, i); + + /* if it's a table */ + if (entry->object_type == MDB_TABLE) { + /* skip the MSys tables */ + if (strncmp (entry->object_name, "MSys", 4)) { + /* add table to tab */ + text[0] = entry->object_name; + text[1] = ""; + node = gtk_ctree_insert_node(GTK_CTREE(sqlwin->ctree), NULL, NULL, text, 0, NULL, NULL, NULL, NULL, FALSE, FALSE); + if (! first_node) first_node = node; + } + } /* if MDB_TABLE */ + } /* for */ + return first_node; +} +#else + +void +gmdb_sql_new_window_cb(GtkWidget *w, gpointer data) +{ + gmdb_info_msg("SQL support was not built in.\nRun configure with the --enable-sql option."); +} + +#endif diff --git a/src/gmdb2/table.c b/src/gmdb2/table.c new file mode 100644 index 0000000..b3877cd --- /dev/null +++ b/src/gmdb2/table.c @@ -0,0 +1,107 @@ +#include "gmdb.h" +#include + +GtkWidget *table_list; +GtkWidget *table_data_window; +GtkWidget *table_def_window; +extern GtkWidget *app; +extern GladeXML* mainwin_xml; +extern MdbHandle *mdb; +int selected_table = -1; +extern char *mdb_access_types[]; + +/* callbacks */ +void +gmdb_table_def_cb(GtkList *list, GtkWidget *w, gpointer data) +{ +MdbCatalogEntry *entry; + + printf("here\n"); + /* nothing selected yet? */ + if (selected_table==-1) { + return; + } + + entry = g_ptr_array_index(mdb->catalog,selected_table); + + gmdb_table_def_new(entry); +} +void +gmdb_table_export_cb(GtkList *list, GtkWidget *w, gpointer data) +{ +MdbCatalogEntry *entry; + + /* nothing selected yet? */ + if (selected_table==-1) { + return; + } + + entry = g_ptr_array_index(mdb->catalog,selected_table); + + gmdb_table_export(entry); +} +void +gmdb_table_data_cb(GtkList *list, GtkWidget *w, gpointer data) +{ +MdbCatalogEntry *entry; + + /* nothing selected yet? */ + if (selected_table==-1) { + return; + } + + entry = g_ptr_array_index(mdb->catalog,selected_table); + + gmdb_table_data_new(entry); +} +void +gmdb_table_select_cb(GnomeIconList *gil, int num, GdkEvent *ev, gpointer data) +{ +int child_num; +int i,j=0; +MdbCatalogEntry *entry; +gchar *text; + + text = (gchar *) gnome_icon_list_get_icon_data(gil, num); + printf ("text !%s!\n",text); + + for (i=0;inum_catalog;i++) { + entry = g_ptr_array_index(mdb->catalog,i); + if (entry->object_type==MDB_TABLE && + !strcmp(entry->object_name,text)) { + selected_table = i; + } + } +} +/* functions */ +void +gmdb_table_add_icon(gchar *text) +{ +GnomeIconList *gil; +int pos; + + gil = glade_xml_get_widget (mainwin_xml, "table_iconlist"); + + pos = gnome_icon_list_append(gil, "table_big.xpm", text); + gnome_icon_list_set_icon_data(gil, pos, text); +} + +void gmdb_table_populate(MdbHandle *mdb) +{ +int i; +MdbCatalogEntry *entry; + + /* loop over each entry in the catalog */ + for (i=0; i < mdb->num_catalog; i++) { + entry = g_ptr_array_index (mdb->catalog, i); + + /* if it's a table */ + if (entry->object_type == MDB_TABLE) { + /* skip the MSys tables */ + if (strncmp (entry->object_name, "MSys", 4)) { + /* add table to tab */ + gmdb_table_add_icon(entry->object_name); + } + } /* if MDB_TABLE */ + } /* for */ +} diff --git a/src/gmdb2/table.xpm b/src/gmdb2/table.xpm new file mode 100644 index 0000000..871aeed --- /dev/null +++ b/src/gmdb2/table.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static char * table_xpm[] = { +"10 12 4 1", +" c None", +". c #1874B1", +"+ c #606060", +"@ c #D7D2D2", +"..........", +"..........", +"+@@+@@@+@+", +"++++++++++", +"+@@+@@@+@+", +"++++++++++", +"+@@+@@@+@+", +"++++++++++", +"+@@+@@@+@+", +"++++++++++", +"+@@+@@@+@+", +"++++++++++"}; diff --git a/src/gmdb2/table_big.xpm b/src/gmdb2/table_big.xpm new file mode 100644 index 0000000..7609d13 --- /dev/null +++ b/src/gmdb2/table_big.xpm @@ -0,0 +1,36 @@ +/* XPM */ +static char * table_big_xpm[] = { +"20 24 9 1", +" c None", +". c #1874B1", +"+ c #3C6A88", +"@ c #5A86A5", +"# c #78A3C2", +"$ c #606060", +"% c #9C9999", +"& c #D7D2D2", +"* c #7E7C7C", +"....................", +"....................", +"....................", +"....................", +"++@###@+@#####@+@#@+", +"$$%&&&%$%&&&&&%$%&%$", +"$$*%%%*$*%%%%%*$*%*$", +"$$$$$$$$$$$$$$$$$$$$", +"$$*%%%*$*%%%%%*$*%*$", +"$$%&&&%$%&&&&&%$%&%$", +"$$*%%%*$*%%%%%*$*%*$", +"$$$$$$$$$$$$$$$$$$$$", +"$$*%%%*$*%%%%%*$*%*$", +"$$%&&&%$%&&&&&%$%&%$", +"$$*%%%*$*%%%%%*$*%*$", +"$$$$$$$$$$$$$$$$$$$$", +"$$*%%%*$*%%%%%*$*%*$", +"$$%&&&%$%&&&&&%$%&%$", +"$$*%%%*$*%%%%%*$*%*$", +"$$$$$$$$$$$$$$$$$$$$", +"$$*%%%*$*%%%%%*$*%*$", +"$$%&&&%$%&&&&&%$%&%$", +"$$*%%%*$*%%%%%*$*%*$", +"$$$$$$$$$$$$$$$$$$$$"}; diff --git a/src/gmdb2/table_data.c b/src/gmdb2/table_data.c new file mode 100644 index 0000000..77a3e8c --- /dev/null +++ b/src/gmdb2/table_data.c @@ -0,0 +1,97 @@ +#include "gmdb.h" + +extern GtkWidget *app; +extern MdbHandle *mdb; + +typedef struct GMdbDataWindow { + gchar table_name[MDB_MAX_OBJ_NAME]; + GtkWidget *window; +} GMdbDataWindow; + +static GList *window_list; + +/* callbacks */ +gint +gmdb_table_data_close(GtkWidget *w, GdkEvent *event, GMdbDataWindow *dataw) +{ + window_list = g_list_remove(window_list, dataw); + g_free(dataw); + return FALSE; +} +/* functions */ +GtkWidget * +gmdb_table_data_new(MdbCatalogEntry *entry) +{ +MdbTableDef *table; +MdbColumn *col; +GtkWidget *clist; +GtkWidget *scroll; +int i, rownum; +gchar *bound_data[256]; +GMdbDataWindow *dataw = NULL; + + + /* do we have an active window for this object? if so raise it */ + for (i=0;itable_name, entry->object_name)) { + gdk_window_raise (dataw->window->window); + return dataw->window; + } + } + + dataw = g_malloc(sizeof(GMdbDataWindow)); + strcpy(dataw->table_name, entry->object_name); + + dataw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(dataw->window), entry->object_name); + gtk_widget_set_usize(dataw->window, 300,200); + gtk_widget_set_uposition(dataw->window, 50,50); + gtk_widget_show(dataw->window); + + gtk_signal_connect (GTK_OBJECT (dataw->window), "delete_event", + GTK_SIGNAL_FUNC (gmdb_table_data_close), dataw); + + + scroll = gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_widget_show (scroll); + gtk_container_add(GTK_CONTAINER(dataw->window), scroll); + + /* read table */ + table = mdb_read_table(entry); + mdb_read_columns(table); + mdb_rewind_table(table); + + clist = gtk_clist_new(table->num_cols); + gtk_widget_show(clist); + gtk_container_add(GTK_CONTAINER(scroll),clist); + + for (i=0;inum_cols;i++) { + /* bind columns */ + bound_data[i] = (char *) malloc(MDB_BIND_SIZE); + bound_data[i][0] = '\0'; + mdb_bind_column(table, i+1, bound_data[i]); + + /* display column titles */ + col=g_ptr_array_index(table->columns,i); + gtk_clist_set_column_title(GTK_CLIST(clist), i, col->name); + } + gtk_clist_column_titles_show(GTK_CLIST(clist)); + + /* fetch those rows! */ + while(mdb_fetch_row(table)) { + rownum = gtk_clist_append(GTK_CLIST(clist), bound_data); + } + + /* free the memory used to bind */ + for (i=0;inum_cols;i++) { + free(bound_data[i]); + } + + /* add this one to the window list */ + window_list = g_list_append(window_list, dataw); + + return dataw->window; +} diff --git a/src/gmdb2/table_def.c b/src/gmdb2/table_def.c new file mode 100644 index 0000000..61918dc --- /dev/null +++ b/src/gmdb2/table_def.c @@ -0,0 +1,129 @@ +#include "gmdb.h" +#include "pk.xpm" + +extern GtkWidget *app; +extern MdbHandle *mdb; +extern char *mdb_access_types[]; + +typedef struct GMdbDefWindow { + gchar table_name[MDB_MAX_OBJ_NAME]; + GtkWidget *window; +} GMdbDefWindow; + +static GList *window_list; + +/* callbacks */ +gint +gmdb_table_def_close(GtkList *list, GtkWidget *w, GMdbDefWindow *defw) +{ + window_list = g_list_remove(window_list, defw); + g_free(defw); + return FALSE; +} + +GtkWidget * +gmdb_table_def_new(MdbCatalogEntry *entry) +{ +MdbTableDef *table; +MdbIndex *idx; +MdbColumn *col; +GtkWidget *clist; +GtkWidget *scroll; +GdkPixmap *pixmap; +GdkBitmap *mask; +int i,j; +gchar *titles[] = { "", "Column", "Name", "Type", "Size", "Allow Nulls" }; +gchar *row[6]; +GMdbDefWindow *defw; + + /* do we have an active window for this object? if so raise it */ + for (i=0;itable_name, entry->object_name)) { + gdk_window_raise (defw->window->window); + return defw->window; + } + } + + defw = g_malloc(sizeof(GMdbDefWindow)); + strcpy(defw->table_name, entry->object_name); + + defw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(defw->window), entry->object_name); + gtk_widget_set_usize(defw->window, 300,200); + gtk_widget_show(defw->window); + + gtk_signal_connect (GTK_OBJECT (defw->window), "delete_event", + GTK_SIGNAL_FUNC (gmdb_table_def_close), defw); + + scroll = gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_widget_show (scroll); + gtk_container_add(GTK_CONTAINER(defw->window), scroll); + + /* read table */ + table = mdb_read_table(entry); + mdb_read_columns(table); + mdb_rewind_table(table); + + clist = gtk_clist_new_with_titles(5, titles); + gtk_clist_set_column_width (GTK_CLIST(clist), 0, 20); + gtk_clist_set_column_width (GTK_CLIST(clist), 1, 35); + gtk_clist_set_column_width (GTK_CLIST(clist), 2, 80); + gtk_clist_set_column_width (GTK_CLIST(clist), 3, 60); + gtk_clist_set_column_width (GTK_CLIST(clist), 4, 30); + gtk_clist_set_column_width (GTK_CLIST(clist), 5, 30); + gtk_widget_show(clist); + gtk_container_add(GTK_CONTAINER(scroll),clist); + + for (i=0;inum_cols;i++) { + /* display column titles */ + col=g_ptr_array_index(table->columns,i); + row[0] = (char *) malloc(MDB_BIND_SIZE); + memset(row[0],0,MDB_BIND_SIZE); + row[1] = (char *) malloc(MDB_BIND_SIZE); + memset(row[1],0,MDB_BIND_SIZE); + row[2] = (char *) malloc(MDB_BIND_SIZE); + memset(row[2],0,MDB_BIND_SIZE); + row[3] = (char *) malloc(MDB_BIND_SIZE); + memset(row[3],0,MDB_BIND_SIZE); + row[4] = (char *) malloc(MDB_BIND_SIZE); + memset(row[4],0,MDB_BIND_SIZE); + row[5] = (char *) malloc(MDB_BIND_SIZE); + memset(row[5],0,MDB_BIND_SIZE); + strcpy(row[0],""); + sprintf(row[1],"%d", col->col_num+1); + strcpy(row[2],col->name); + strcpy(row[3],mdb_access_types[col->col_type]); + sprintf(row[4],"%d",col->col_size); + if (col->is_fixed) { + strcpy(row[5],"No"); + } else { + strcpy(row[5],"Yes"); + } + gtk_clist_append(GTK_CLIST(clist), row); + } + pixmap = gdk_pixmap_colormap_create_from_xpm_d( NULL, + gtk_widget_get_colormap(app), &mask, NULL, pk_xpm); + + mdb_read_indices(table); + for (i=0;inum_idxs;i++) { + idx = g_ptr_array_index (table->indices, i); + if (idx->index_type==1) { + for (j=0;jnum_keys;j++) { + gtk_clist_set_pixmap(GTK_CLIST(clist), idx->key_col_num[j]-1,0, pixmap, mask); + } + // } else { + //for (j=0;jnum_keys;j++) { + //sprintf(tmpstr,"%s:%d",idx->name,j); + //gtk_clist_set_text(GTK_CLIST(clist), idx->key_col_num[j]-1,0, tmpstr); + //} + } + } /* for */ + + /* add this one to the window list */ + window_list = g_list_append(window_list, defw); + + return defw->window; +} diff --git a/src/gmdb2/table_export.c b/src/gmdb2/table_export.c new file mode 100644 index 0000000..811533a --- /dev/null +++ b/src/gmdb2/table_export.c @@ -0,0 +1,260 @@ +#include "gmdb.h" + +extern GtkWidget *app; +extern MdbHandle *mdb; + +typedef struct GMdbTableExportDialog { + MdbCatalogEntry *entry; + GtkWidget *dialog; + GtkWidget *lineterm; + GtkWidget *colsep; + GtkWidget *quote; + GtkWidget *quotechar; + GtkWidget *headers; + GtkWidget *filesel; +} GMdbTableExportDialog; + +GMdbTableExportDialog *export; + +#define COMMA "Comma (,)" +#define TAB "Tab" +#define SPACE "Space" +#define COLON "Colon (:)" +#define SEMICOLON "Semicolon (;)" +#define PIPE "Pipe (|)" + +#define LF "Unix (linefeed only)" +#define CR "Mac (carriage return only)" +#define CRLF "Windows (CR + LF)" + +#define ALWAYS "Always" +#define NEVER "Never" +#define AUTOMAT "Automatic (where necessary)" + +void +print_quote(FILE *outfile, int need_quote, char quotechar, char *colsep, char *str) +{ + if (need_quote==1) { + fprintf(outfile, "%c", quotechar); + } else if (need_quote==-1) { + if (strstr(str,colsep)) { + fprintf(outfile, "%c", quotechar); + } + } +} + +void +gmdb_export_file_cb(GtkWidget *selector, GMdbTableExportDialog *export) +{ +gchar *file_path; +FILE *outfile; +gchar *bound_data[256]; +MdbTableDef *table; +MdbColumn *col; +int i; +int need_headers = 0; +int need_quote = 0; +gchar delimiter[11]; +gchar quotechar; +gchar lineterm[5]; +gchar *str; +int rows=0; +char msg[100]; + + + str = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(export->colsep)->entry)); + if (!strcmp(str,COMMA)) { strcpy(delimiter, ","); } + else if (!strcmp(str,TAB)) { strcpy(delimiter, "\t"); } + else if (!strcmp(str,SPACE)) { strcpy(delimiter, " "); } + else if (!strcmp(str,COLON)) { strcpy(delimiter, ":"); } + else if (!strcmp(str,SEMICOLON)) { strcpy(delimiter, ";"); } + else if (!strcmp(str,PIPE)) { strcpy(delimiter, "|"); } + else { + strncpy(delimiter,str, 10); + delimiter[10]='\0'; + } + + str = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(export->lineterm)->entry)); + if (!strcmp(str,LF)) { strcpy(lineterm, "\n"); } + else if (!strcmp(str,CR)) { strcpy(lineterm, "\r"); } + else if (!strcmp(str,CRLF)) { strcpy(lineterm, "\r\n"); } + + str = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(export->quote)->entry)); + if (!strcmp(str,ALWAYS)) { need_quote = 1; } + else if (!strcmp(str,NEVER)) { need_quote = 0; } + else if (!strcmp(str,AUTOMAT)) { need_quote = -1; } + + str = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(export->quotechar)->entry)); + quotechar = str[0]; + + /* headers */ + str = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(export->headers)->entry)); + if (str && str[0]=='Y') need_headers = 1; + + file_path = gtk_file_selection_get_filename (GTK_FILE_SELECTION(export->filesel)); + // printf("file path %s\n",file_path); + if ((outfile=fopen(file_path, "w"))==NULL) { + gmdb_info_msg("Unable to Open File!"); + return; + } + + /* read table */ + table = mdb_read_table(export->entry); + mdb_read_columns(table); + mdb_rewind_table(table); + + for (i=0;inum_cols;i++) { + /* bind columns */ + bound_data[i] = (char *) malloc(MDB_BIND_SIZE); + bound_data[i][0] = '\0'; + mdb_bind_column(table, i+1, bound_data[i]); + + /* display column titles */ + col=g_ptr_array_index(table->columns,i); + if (need_headers) { + if (i>0) fprintf(outfile,delimiter); + print_quote(outfile, need_quote, quotechar, delimiter, col->name); + fprintf(outfile,"%s", col->name); + print_quote(outfile, need_quote, quotechar, delimiter, col->name); + } + } + if (need_headers) fprintf(outfile,lineterm); + + /* fetch those rows! */ + while(mdb_fetch_row(table)) { + for (i=0;inum_cols;i++) { + if (i>0) fprintf(outfile,delimiter); + print_quote(outfile, need_quote, quotechar, delimiter, bound_data[i]); + fprintf(outfile,"%s", bound_data[i]); + print_quote(outfile, need_quote, quotechar, delimiter, bound_data[i]); + } + fprintf(outfile,lineterm); + rows++; + } + + /* free the memory used to bind */ + for (i=0;inum_cols;i++) { + free(bound_data[i]); + } + + fclose(outfile); + gtk_widget_destroy(export->dialog); + sprintf(msg,"%d Rows exported successfully.\n", rows); + gmdb_info_msg(msg); +} +void +gmdb_export_button_cb(GtkWidget *w, GMdbTableExportDialog *export) +{ + /* just print a string so that we know we got there */ + export->filesel = gtk_file_selection_new("Please choose a filename."); + + gtk_signal_connect ( + GTK_OBJECT (GTK_FILE_SELECTION(export->filesel)->ok_button), + "clicked", GTK_SIGNAL_FUNC (gmdb_export_file_cb), export); + + gtk_signal_connect_object ( GTK_OBJECT ( + GTK_FILE_SELECTION(export->filesel)->ok_button), + "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), + (gpointer) export->filesel); + + gtk_signal_connect_object ( + GTK_OBJECT (GTK_FILE_SELECTION(export->filesel)->cancel_button), + "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), + (gpointer) export->filesel); + + gtk_widget_show (export->filesel); +} + +GtkWidget * +gmdb_export_add_combo(GtkWidget *table, int row, gchar *text, GList *strings) +{ +GtkWidget *combo; +GtkWidget *label; + + label = gtk_label_new(text); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row + 1, + GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 0); + gtk_widget_show(label); + + combo = gtk_combo_new(); + gtk_combo_set_popdown_strings(GTK_COMBO(combo), strings); + gtk_table_attach(GTK_TABLE(table), combo, 1, 2, row, row + 1, + GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 5, 0); + gtk_widget_show(combo); + return combo; +} + +void gmdb_table_export(MdbCatalogEntry *entry) { +GtkWidget *export_button; +GtkWidget *close_button; +GList *glist = NULL; +GtkWidget *table; + + export = g_malloc(sizeof(GMdbTableExportDialog)); + export->entry = entry; + + /* Create the widgets */ + export->dialog = gtk_dialog_new(); + gtk_widget_set_uposition(export->dialog, 300, 300); + + table = gtk_table_new(3,2,FALSE); + gtk_widget_show(table); + + glist = g_list_append(glist, LF); + glist = g_list_append(glist, CR); + glist = g_list_append(glist, CRLF); + export->lineterm = gmdb_export_add_combo(table, 0, "Line Terminator:",glist); + g_list_free(glist); + gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(export->lineterm)->entry), FALSE); + + glist = NULL; + glist = g_list_append(glist, COMMA); + glist = g_list_append(glist, TAB); + glist = g_list_append(glist, SPACE); + glist = g_list_append(glist, COLON); + glist = g_list_append(glist, SEMICOLON); + glist = g_list_append(glist, PIPE); + export->colsep = gmdb_export_add_combo(table, 1, "Column Separator:",glist); + g_list_free(glist); + + glist = NULL; + glist = g_list_append(glist, ALWAYS); + glist = g_list_append(glist, NEVER); + glist = g_list_append(glist, AUTOMAT); + export->quote = gmdb_export_add_combo(table, 2, "Quotes:",glist); + g_list_free(glist); + gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(export->quote)->entry), FALSE); + + glist = NULL; + glist = g_list_append(glist, "\""); + glist = g_list_append(glist, "'"); + glist = g_list_append(glist, "`"); + export->quotechar = gmdb_export_add_combo(table, 3, "Quote Character:",glist); + g_list_free(glist); + + glist = NULL; + glist = g_list_append(glist, "Yes"); + glist = g_list_append(glist, "No"); + export->headers = gmdb_export_add_combo(table, 4, "Include Headers:",glist); + g_list_free(glist); + gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(export->headers)->entry), FALSE); + + export_button = gtk_button_new_with_label("Export"); + gtk_signal_connect ( GTK_OBJECT (export_button), + "clicked", GTK_SIGNAL_FUNC (gmdb_export_button_cb), export); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(export->dialog)->action_area), + export_button); + + close_button = gtk_button_new_with_label("Cancel"); + gtk_signal_connect_object (GTK_OBJECT (close_button), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT(export->dialog)); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(export->dialog)->action_area), + close_button); + + /* Add the table, and show everything we've added to the dialog. */ + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(export->dialog)->vbox), table); + gtk_widget_show_all (export->dialog); +} diff --git a/src/gmdb2/util.c b/src/gmdb2/util.c new file mode 100644 index 0000000..8e39cee --- /dev/null +++ b/src/gmdb2/util.c @@ -0,0 +1,24 @@ +#include "gmdb.h" + +void gmdb_info_msg(gchar *message) { +GtkWidget *dialog, *label, *okay_button; + + /* Create the widgets */ + dialog = gtk_dialog_new(); + gtk_widget_set_uposition(dialog, 300, 300); + label = gtk_label_new (message); + gtk_widget_set_usize(label, 250, 100); + okay_button = gtk_button_new_with_label("Okay"); + + /* Ensure that the dialog box is destroyed when the user clicks ok. */ + + gtk_signal_connect_object (GTK_OBJECT (okay_button), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), dialog); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), + okay_button); + + /* Add the label, and show everything we've added to the dialog. */ + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), label); + gtk_widget_show_all (dialog); +} diff --git a/src/libmdb/Makefile.am b/src/libmdb/Makefile.am index 9cacf9f..4e9a2d5 100644 --- a/src/libmdb/Makefile.am +++ b/src/libmdb/Makefile.am @@ -1,4 +1,4 @@ lib_LTLIBRARIES = libmdb.la -libmdb_la_SOURCES= catalog.c mem.c file.c kkd.c table.c data.c dump.c backend.c money.c sargs.c index.c like.c -INCLUDES = -I$(top_srcdir)/include `glib-config --cflags` -LIBS = `glib-config --libs` +libmdb_la_SOURCES= catalog.c mem.c file.c kkd.c table.c data.c dump.c backend.c money.c sargs.c index.c like.c write.c +INCLUDES = -I$(top_srcdir)/include $(GLIB_CFLAGS) +LIBS = $(GLIB_LIBS) diff --git a/src/libmdb/catalog.c b/src/libmdb/catalog.c index 4ebc0d2..d64ca45 100644 --- a/src/libmdb/catalog.c +++ b/src/libmdb/catalog.c @@ -79,13 +79,13 @@ int type; while (mdb_fetch_row(table)) { type = atoi(tobjtype); - if (type == objtype) { + if (objtype==MDB_ANY || type == objtype) { // fprintf(stdout, "parentid: %10ld objtype: %-3d objname: %s\n", // (atol(parentid) & 0x00FFFFFF), type, objname); memset(&entry,0,sizeof(entry)); entry.mdb = mdb; strcpy(entry.object_name, objname); - entry.object_type = type; + entry.object_type = (type & 0x7F); entry.table_pg = atol(parentid) & 0x00FFFFFF; mdb->num_catalog++; data = g_memdup(&entry,sizeof(MdbCatalogEntry)); @@ -124,7 +124,7 @@ fprintf(stdout,"\n"); */ memset(entry, '\0', sizeof(MdbCatalogEntry)); - entry->object_type = mdb->pg_buf[offset+0x09]; + entry->object_type = (mdb->pg_buf[offset+0x09] & 0x7F); j=0; entry->mdb = mdb; entry->table_pg = mdb_get_int16(mdb,offset+1); @@ -221,7 +221,7 @@ MdbCatalogEntry *entry; mdb_read_catalog(mdb, obj_type); for (i=0;inum_catalog;i++) { entry = g_ptr_array_index(mdb->catalog,i); - if (obj_type==-1 || entry->object_type==obj_type) { + if (obj_type==MDB_ANY || entry->object_type==obj_type) { fprintf(stdout,"Type: %-10s Name: %-18s T pg: %04x KKD pg: %04x row: %2d\n", mdb_get_objtype_string(entry->object_type), entry->object_name, diff --git a/src/libmdb/data.c b/src/libmdb/data.c index 1242248..d21ce66 100644 --- a/src/libmdb/data.c +++ b/src/libmdb/data.c @@ -21,8 +21,6 @@ #include "time.h" #include "math.h" -//#define FAST_READ 1 - char *mdb_money_to_string(MdbHandle *mdb, int start, char *s); static int _mdb_attempt_bind(MdbHandle *mdb, MdbColumn *col, unsigned char isnull, int offset, int len); @@ -77,7 +75,7 @@ int row_end; return row_end; #endif } -static int mdb_is_null(unsigned char *null_mask, int col_num) +int mdb_is_null(unsigned char *null_mask, int col_num) { int byte_num = (col_num - 1) / 8; int bit_num = (col_num - 1) % 8; @@ -99,6 +97,24 @@ static int mdb_xfer_bound_bool(MdbHandle *mdb, MdbColumn *col, int value) return 0; } +static int mdb_xfer_bound_ole(MdbHandle *mdb, int start, MdbColumn *col, int len) +{ +int ret; + if (len) { + col->cur_value_start = start; + col->cur_value_len = len; + } else { + col->cur_value_start = 0; + col->cur_value_len = 0; + } + if (col->bind_ptr || col->len_ptr) { + ret = mdb_copy_ole(mdb, col->bind_ptr, start, len); + } + if (col->len_ptr) { + *col->len_ptr = ret; + } + return ret; +} static int mdb_xfer_bound_data(MdbHandle *mdb, int start, MdbColumn *col, int len) { int ret; @@ -329,6 +345,8 @@ static int _mdb_attempt_bind(MdbHandle *mdb, { if (col->col_type == MDB_BOOL) { mdb_xfer_bound_bool(mdb, col, isnull); + } else if (col->col_type == MDB_OLE) { + mdb_xfer_bound_ole(mdb, offset, col, len); } else if (isnull) { mdb_xfer_bound_data(mdb, 0, col, 0); } else { @@ -339,12 +357,11 @@ static int _mdb_attempt_bind(MdbHandle *mdb, } return 1; } -int mdb_read_next_dpg(MdbTableDef *table) +int +mdb_read_next_dpg_by_map0(MdbTableDef *table) { MdbCatalogEntry *entry = table->entry; MdbHandle *mdb = entry->mdb; - -#if FAST_READ int pgnum, i, bitn; pgnum = _mdb_get_int32(table->usage_map,1); @@ -364,14 +381,71 @@ int pgnum, i, bitn; } /* didn't find anything */ return 0; -#else +} +int +mdb_read_next_dpg_by_map1(MdbTableDef *table) +{ +MdbCatalogEntry *entry = table->entry; +MdbHandle *mdb = entry->mdb; +guint32 pgnum, i, j, bitn, map_pg; +unsigned char map_byte; + + pgnum = 0; + //printf("map size %ld\n", table->map_sz); + for (i=1;imap_sz-1;i+=4) { + map_pg = _mdb_get_int32(table->usage_map, i); + //printf("loop %d pg %ld %02x%02x%02x%02x\n",i, map_pg,table->usage_map[i],table->usage_map[i+1],table->usage_map[i+2],table->usage_map[i+3]); + + if (!map_pg) continue; + + if(mdb_read_alt_pg(mdb, map_pg) != mdb->pg_size) { + fprintf(stderr, "Oops! didn't get a full page at %d\n", map_pg); + exit(1); + } + //printf("reading page %ld\n",map_pg); + for (j=4;jpg_size;j++) { + for (bitn=0;bitn<8;bitn++) { + if (mdb->alt_pg_buf[j] & 1 << bitn && pgnum > table->cur_phys_pg) { + table->cur_phys_pg = pgnum; + if (!mdb_read_pg(mdb, pgnum)) { + return 0; + } else { + //printf("page found at %04x %d\n",pgnum, pgnum); + return pgnum; + } + } + pgnum++; + } + } + } + /* didn't find anything */ + //printf("returning 0\n"); + return 0; +} +int +mdb_read_next_dpg(MdbTableDef *table) +{ +MdbCatalogEntry *entry = table->entry; +MdbHandle *mdb = entry->mdb; +int map_type; + +#ifndef SLOW_READ + map_type = table->usage_map[0]; + if (map_type==0) { + return mdb_read_next_dpg_by_map0(table); + } else if (map_type==1) { + return mdb_read_next_dpg_by_map1(table); + } else { + fprintf(stderr,"Warning: unrecognized usage map type: %d, defaulting to brute force read\n",table->usage_map[0]); + } +#endif + /* can't do a fast read, go back to the old way */ do { if (!mdb_read_pg(mdb, table->cur_phys_pg++)) return 0; } while (mdb->pg_buf[0]!=0x01 || mdb_get_int32(mdb, 4)!=entry->table_pg); /* fprintf(stderr,"returning new page %ld\n", table->cur_phys_pg); */ return table->cur_phys_pg; -#endif } int mdb_rewind_table(MdbTableDef *table) { @@ -453,6 +527,99 @@ int i; return text; } +int mdb_copy_ole(MdbHandle *mdb, char *dest, int start, int size) +{ +guint16 ole_len; +guint16 ole_flags; +guint16 row_start, row_stop; +guint8 ole_row; +guint32 lval_pg; +guint16 len, cur; + + if (sizepg_buf[start + MDB_MEMO_OVERHEAD], + size - MDB_MEMO_OVERHEAD); + return len; + } else if (ole_flags == 0x4000) { + /* The 16 bit integer at offset 0 is the length of the memo field. + * The 24 bit integer at offset 5 is the page it is stored on. + */ + ole_row = mdb->pg_buf[start+4]; + + lval_pg = mdb_get_int24(mdb, start+5); +#if MDB_DEBUG + printf("Reading LVAL page %06x\n", lval_pg); +#endif + if(mdb_read_alt_pg(mdb, lval_pg) != mdb->pg_size) { + /* Failed to read */ + return 0; + } + /* swap the alt and regular page buffers, so we can call get_int16 */ + mdb_swap_pgbuf(mdb); + if (ole_row) { + row_stop = mdb_get_int16(mdb, 10 + (ole_row - 1) * 2) & 0x0FFF; + } else { + row_stop = mdb->pg_size - 1; + } + row_start = mdb_get_int16(mdb, 10 + ole_row * 2); +#if MDB_DEBUG + printf("row num %d row start %d row stop %d\n", ole_row, row_start, row_stop); +#endif + len = row_stop - row_start; + if (dest) memcpy(dest, &mdb->pg_buf[row_start], len); + /* make sure to swap page back */ + mdb_swap_pgbuf(mdb); + return len; + } else if (ole_flags == 0x0000) { + ole_row = mdb->pg_buf[start+4]; + lval_pg = mdb_get_int24(mdb, start+5); +#if MDB_DEBUG + printf("Reading LVAL page %06x\n", lval_pg); +#endif + /* swap the alt and regular page buffers, so we can call get_int16 */ + mdb_swap_pgbuf(mdb); + cur=0; + do { + if(mdb_read_pg(mdb, lval_pg) != mdb->pg_size) { + /* Failed to read */ + return 0; + } + if (ole_row) { + row_stop = mdb_get_int16(mdb, 10 + (ole_row - 1) * 2) & 0x0FFF; + } else { + row_stop = mdb->pg_size - 1; + } + row_start = mdb_get_int16(mdb, 10 + ole_row * 2); +#if MDB_DEBUG + printf("row num %d row start %d row stop %d\n", ole_row, row_start, row_stop); +#endif + len = row_stop - row_start; + if (dest) + memcpy(&dest[cur], &mdb->pg_buf[row_start+4], + len - 4); + cur += len - 4; + + /* find next lval page */ + ole_row = mdb->pg_buf[row_start]; + lval_pg = mdb_get_int24(mdb, row_start+1); + } while (lval_pg); + /* make sure to swap page back */ + mdb_swap_pgbuf(mdb); + return cur; + } else { + fprintf(stderr,"Unhandled ole field flags = %04x\n", ole_flags); + return 0; + } +} static char *mdb_memo_to_string(MdbHandle *mdb, int start, int size) { guint16 memo_len; diff --git a/src/libmdb/table.c b/src/libmdb/table.c index d198ac0..096f926 100644 --- a/src/libmdb/table.c +++ b/src/libmdb/table.c @@ -19,6 +19,8 @@ #include "mdbtools.h" +#define MDB_DEBUG_USAGE 0 + static gint mdb_col_comparer(MdbColumn *a, MdbColumn *b) { if (a->col_num > b->col_num) @@ -61,13 +63,17 @@ int rownum, row_start, row_end; mdb_swap_pgbuf(mdb); row_start = mdb_get_int16(mdb, (mdb->row_count_offset + 2) + (rownum*2)); row_end = mdb_find_end_of_row(mdb, rownum); - table->map_sz = row_end - row_start; + table->map_sz = row_end - row_start + 1; table->usage_map = malloc(table->map_sz); memcpy(table->usage_map, &mdb->pg_buf[row_start], table->map_sz); +#if MDB_DEBUG_USAGE buffer_dump(mdb->pg_buf, row_start, row_end); +#endif /* swap back */ mdb_swap_pgbuf(mdb); +#if MDB_DEBUG_USAGE printf ("usage map found on page %ld start %d end %d\n", mdb_get_int24(mdb, mdb->tab_usage_map_offset + 1), row_start, row_end); +#endif table->first_data_pg = mdb_get_int16(mdb, mdb->tab_first_dpg_offset); diff --git a/src/libmdb/write.c b/src/libmdb/write.c new file mode 100644 index 0000000..39c430b --- /dev/null +++ b/src/libmdb/write.c @@ -0,0 +1,152 @@ +/* MDB Tools - A library for reading MS Access database file + * Copyright (C) 2000 Brian Bruns + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "mdbtools.h" +#include "time.h" +#include "math.h" + +#define MDB_DEBUG_WRITE 1 + +typedef struct { + void *value; + int siz; + unsigned char is_null; + unsigned char is_fixed; +} MdbField; + +static int +mdb_is_col_indexed(MdbTableDef *table, int colnum) +{ +int i, j; +MdbIndex *idx; + + for (i=0;inum_idxs;i++) { + idx = g_ptr_array_index (table->indices, i); + for (j=0;jnum_keys;j++) { + if (idx->key_col_num[j]==colnum) return 1; + } + } + return 0; +} +static int mdb_is_null(unsigned char *null_mask, int col_num) +{ +int byte_num = (col_num - 1) / 8; +int bit_num = (col_num - 1) % 8; + + if ((1 << bit_num) & null_mask[byte_num]) { + return 0; + } else { + return 1; + } +} +int +mdb_crack_row(MdbTableDef *table, int row_start, int row_end, MdbField *fields) +{ +MdbCatalogEntry *entry = table->entry; +MdbHandle *mdb = entry->mdb; +MdbColumn *col; +int var_cols, fixed_cols, num_cols, i; +unsigned char null_mask[33]; /* 256 columns max / 8 bits per byte */ +int bitmask_sz; + + printf("field 0 %s\n", fields[0].value); + + if (mdb->jet_version==MDB_VER_JET4) { + num_cols = mdb_get_int16(mdb, row_start); + } else { + num_cols = mdb->pg_buf[row_start]; + } + + var_cols = 0; /* mdb->pg_buf[row_end-1]; */ + fixed_cols = 0; /* num_cols - var_cols; */ + for (i = 0; i < table->num_cols; i++) { + col = g_ptr_array_index (table->columns, i); + if (mdb_is_fixed_col(col)) + fixed_cols++; + else + var_cols++; + } + + bitmask_sz = (num_cols - 1) / 8 + 1; + + for (i=0;ipg_buf[row_end - bitmask_sz + i + 1]; + } + + return num_cols; + +} +int +mdb_pack_row(MdbTableDef *table, unsigned char *row_buffer, MdbField *fields) +{ +} +int +mdb_pg_get_freespace(MdbHandle *mdb) +{ +int rows, free_start, free_end; + + rows = mdb_get_int16(mdb, mdb->row_count_offset); + free_start = mdb->row_count_offset + 2 + (rows * 2); + free_end = mdb_get_int16(mdb, (mdb->row_count_offset + rows * 2)) -1; +#if MDB_DEBUG_WRITE + printf("free space left on page = %d\n", free_end - free_start); +#endif + return (free_end - free_start); +} +int +mdb_update_row(MdbTableDef *table) +{ +int row_start, row_end; +int i; +MdbColumn *col; +MdbCatalogEntry *entry = table->entry; +MdbHandle *mdb = entry->mdb; +MdbField fields[256]; +unsigned char row_buffer[4096]; +int old_row_size, new_row_size, delta, num_fields; + + fields[0].value = "hello"; + + row_start = mdb_get_int16(mdb, (mdb->row_count_offset + 2) + (table->cur_row*2)); + row_end = mdb_find_end_of_row(mdb, table->cur_row); + old_row_size = row_end - row_start; + + row_start &= 0x0FFF; /* remove flags */ + + for (i=0;inum_cols;i++) { + col = g_ptr_array_index(table->columns,i); + if (col->bind_ptr && mdb_is_col_indexed(table,i)) { + fprintf(stderr, "Attempting to update column that is part of an index\n"); + return 0; + } + } + num_fields = mdb_crack_row(table, row_start, row_end, &fields); + +#if MDB_DEBUG_WRITE + for (i=0;i= 85 ) + if ( yy_current_state >= 89 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 279 ); + while ( yy_base[yy_current_state] != 295 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -791,36 +797,45 @@ YY_RULE_SETUP case 16: YY_RULE_SETUP #line 42 "lexer.l" -{ yylval.name = strdup(yytext); return NAME; } +{ + yylval.name = strdup(&yytext[1]); + yylval.name[strlen(yylval.name)-1]='\0'; + return IDENT; + } YY_BREAK case 17: YY_RULE_SETUP -#line 43 "lexer.l" -{ yylval.name = strdup(yytext); return STRING; } +#line 47 "lexer.l" +{ yylval.name = strdup(yytext); return NAME; } YY_BREAK case 18: YY_RULE_SETUP -#line 44 "lexer.l" +#line 49 "lexer.l" +{ yylval.name = strdup(yytext); return STRING; } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 50 "lexer.l" { yylval.name = strdup(yytext); return NUMBER; } YY_BREAK -case 19: -YY_RULE_SETUP -#line 47 "lexer.l" -{ yylval.name = strdup(yytext); return PATH; } - YY_BREAK case 20: YY_RULE_SETUP -#line 48 "lexer.l" -{ return yytext[0]; } +#line 53 "lexer.l" +{ yylval.name = strdup(yytext); return PATH; } YY_BREAK case 21: YY_RULE_SETUP -#line 49 "lexer.l" +#line 54 "lexer.l" +{ return yytext[0]; } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 55 "lexer.l" ECHO; YY_BREAK -#line 824 "lex.yy.c" +#line 839 "lexer.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1112,7 +1127,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 85 ) + if ( yy_current_state >= 89 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -1147,11 +1162,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 85 ) + if ( yy_current_state >= 89 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 84); + yy_is_jam = (yy_current_state == 88); return yy_is_jam ? 0 : yy_current_state; } @@ -1701,7 +1716,7 @@ int main() return 0; } #endif -#line 49 "lexer.l" +#line 55 "lexer.l" int yywrap() diff --git a/src/sql/lexer.l b/src/sql/lexer.l index 5b24ed9..7492c63 100644 --- a/src/sql/lexer.l +++ b/src/sql/lexer.l @@ -39,7 +39,13 @@ describe { return DESCRIBE; } (>=) { return GTEQ; } like { return LIKE; } [ \t\r] ; +\"[A-z][A-z0-9 ]*\" { + yylval.name = strdup(&yytext[1]); + yylval.name[strlen(yylval.name)-1]='\0'; + return IDENT; + } [A-z][A-z0-9]* { yylval.name = strdup(yytext); return NAME; } + '.*' { yylval.name = strdup(yytext); return STRING; } ([0-9]+|([0-9]*\.[0-9+)([eE][-+]?[0-9]+)?) { yylval.name = strdup(yytext); return NUMBER; diff --git a/src/sql/parser.y b/src/sql/parser.y index 65c154e..740e4ba 100644 --- a/src/sql/parser.y +++ b/src/sql/parser.y @@ -41,7 +41,7 @@ static MdbSQL *g_sql; -%token NAME PATH STRING NUMBER +%token IDENT NAME PATH STRING NUMBER %token SELECT FROM WHERE CONNECT DISCONNECT TO LIST TABLES WHERE AND %token DESCRIBE TABLE %token LTEQ GTEQ LIKE @@ -112,6 +112,7 @@ database: table: NAME { mdb_sql_add_table(_mdb_sql(NULL), $1); free($1); } + | IDENT { mdb_sql_add_table(_mdb_sql(NULL), $1); free($1); } ; column_list: @@ -122,6 +123,7 @@ column_list: column: NAME { mdb_sql_add_column(_mdb_sql(NULL), $1); free($1); } + | IDENT { mdb_sql_add_column(_mdb_sql(NULL), $1); free($1); } ; %% diff --git a/src/util/Makefile.am b/src/util/Makefile.am index c17ddfc..8b991eb 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -1,6 +1,6 @@ -bin_PROGRAMS = mdb-export mdb-array mdb-schema mdb-tables mdb-parsecsv mdb-header mdb-sql mdb-ver prtable prcat prdata prkkd prdump -LIBS = `glib-config --libs` $(READLINE_LIBS) @LEXLIB@ -INCLUDES = -I$(top_srcdir)/include `glib-config --cflags` +bin_PROGRAMS = mdb-export mdb-array mdb-schema mdb-tables mdb-parsecsv mdb-header mdb-sql mdb-ver prtable prcat prdata prkkd prdump prole updrow +LIBS = $(GLIB_LIBS) $(READLINE_LIBS) @LEXLIB@ +INCLUDES = -I$(top_srcdir)/include $(GLIB_CFLAGS) LDADD = ../libmdb/libmdb.la if SQL mdb_sql_LDADD = ../libmdb/libmdb.la ../sql/libmdbsql.la diff --git a/src/util/mdb-schema.c b/src/util/mdb-schema.c index ec17c5b..673f3a4 100644 --- a/src/util/mdb-schema.c +++ b/src/util/mdb-schema.c @@ -28,19 +28,34 @@ MdbCatalogEntry *entry; MdbTableDef *table; MdbColumn *col; char *the_relation; +char *tabname = NULL; +int opt; if (argc < 2) { fprintf (stderr, "Usage: %s []\n",argv[0]); exit (1); } + if (argc < 2) { + fprintf (stderr, "Usage: %s [-S] [-1 | -d] \n",argv[0]); + exit (1); + } + + while ((opt=getopt(argc, argv, "T:"))!=-1) { + switch (opt) { + case 'T': + tabname = (char *) malloc(strlen(optarg)+1); + strcpy(tabname, optarg); + break; + } + } mdb_init(); /* open the database */ - mdb = mdb_open (argv[1]); - if (argc>2) { - if (!mdb_set_default_backend(mdb, argv[2])) { + mdb = mdb_open (argv[optind]); + if (argc - optind >2) { + if (!mdb_set_default_backend(mdb, argv[optind + 1])) { fprintf(stderr,"Invalid backend type\n"); mdb_exit(); exit(1); @@ -62,7 +77,8 @@ char *the_relation; if (entry->object_type == MDB_TABLE) { /* skip the MSys tables */ - if (strncmp (entry->object_name, "MSys", 4)) + if ((tabname && !strcmp(entry->object_name,tabname)) || + (!tabname && strncmp (entry->object_name, "MSys", 4))) { /* make sure it's a table (may be redundant) */ diff --git a/src/util/mdb-tables.c b/src/util/mdb-tables.c index 746236e..e17f7ba 100644 --- a/src/util/mdb-tables.c +++ b/src/util/mdb-tables.c @@ -29,15 +29,18 @@ MdbTableDef *table; MdbColumn *col; char *delimiter = NULL; int line_break=0; +int skip_sys=1; int opt; if (argc < 2) { - fprintf (stderr, "Usage: %s [-1 | -d] \n",argv[0]); + fprintf (stderr, "Usage: %s [-S] [-1 | -d] \n",argv[0]); exit (1); } - while ((opt=getopt(argc, argv, "1d:"))!=-1) { + while ((opt=getopt(argc, argv, "S1d:"))!=-1) { switch (opt) { + case 'S': + skip_sys = 0; case '1': line_break = 1; break; @@ -65,7 +68,7 @@ int opt; /* if it's a table */ if (entry->object_type == MDB_TABLE) { /* skip the MSys tables */ - if (strncmp (entry->object_name, "MSys", 4)) { + if (!skip_sys || strncmp (entry->object_name, "MSys", 4)) { if (line_break) fprintf (stdout, "%s\n", entry->object_name); else if (delimiter) diff --git a/src/util/prole.c b/src/util/prole.c new file mode 100644 index 0000000..4c5e5f9 --- /dev/null +++ b/src/util/prole.c @@ -0,0 +1,111 @@ +/* MDB Tools - A library for reading MS Access database file + * Copyright (C) 2000 Brian Bruns + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "mdbtools.h" + +void dump_ole(MdbTableDef *table, char *colname, char *sargname); + +main(int argc, char **argv) +{ +int rows; +int i; +unsigned char buf[2048]; +MdbHandle *mdb; +MdbCatalogEntry *entry; +MdbTableDef *table; +GList *l; +char *dot, *colname, *tabname; +char *sargname = NULL; + + + if (argc<2) { + fprintf(stderr,"Usage: %s [sargs]\n",argv[0]); + exit(1); + } + + mdb_init(); + mdb = mdb_open(argv[1]); + dot = strchr(argv[2],'.'); + if (argc>3) sargname = argv[3]; + + if (!dot) { + fprintf(stderr,"Usage: %s [sarg]\n",argv[0]); + exit(1); + } + tabname = argv[2]; + *dot='\0'; + colname = ++dot; + + mdb_read_catalog(mdb, MDB_TABLE); + + for (i=0;inum_catalog;i++) { + entry = g_ptr_array_index(mdb->catalog,i); + if (entry->object_type == MDB_TABLE && + !strcmp(entry->object_name,tabname)) { + table = mdb_read_table(entry); + mdb_read_columns(table); + dump_ole(table, colname, sargname); + } + } + + mdb_free_handle(mdb); + mdb_exit(); + + exit(0); +} + +void dump_ole(MdbTableDef *table, char *colname, char *sargname) +{ +int i, found = 0; +char ole_data[12000]; +int len; +MdbColumn *col; +MdbSarg sarg; +char *sargcol, *sargop, *sargval; + + for (i=0;i<=table->num_cols;i++) { + col=g_ptr_array_index(table->columns,i); + printf("%d colname %s\n", i, col->name); + if (col && !strcmp(col->name,colname)) { + found = i+1; + } + } + printf("column %d\n",found); + mdb_bind_column(table, found, ole_data); + mdb_bind_len(table, found, &len); + + if (sargname) { + sargcol = strtok(sargname," "); + sargop = strtok(NULL," "); + sargval = strtok(NULL," "); + printf("col %s op %s val %s\n",sargcol,sargop,sargval); + sarg.op = MDB_EQUAL; /* only support = for now, sorry */ + strcpy(sarg.value.s, sargval); + mdb_add_sarg_by_name(table, sargcol, &sarg); + } + + mdb_rewind_table(table); + while (mdb_fetch_row(table)) { + buffer_dump(ole_data, 0, len); + printf("---\n"); + } + +} + diff --git a/src/util/updrow.c b/src/util/updrow.c new file mode 100644 index 0000000..9ab42d2 --- /dev/null +++ b/src/util/updrow.c @@ -0,0 +1,115 @@ +/* MDB Tools - A library for reading MS Access database file + * Copyright (C) 2000 Brian Bruns + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "mdbtools.h" + +main(int argc, char **argv) +{ +int rows; +int i; +unsigned char buf[2048]; +MdbHandle *mdb; +MdbCatalogEntry *entry; +MdbTableDef *table; +GList *l; +char *dot, *colname, *tabname; +char *colop, *colval; +char *sargname = NULL; +char *updstr = NULL; +unsigned char data[255]; +int len; + + + if (argc<4) { + fprintf(stderr,"Usage: %s \n",argv[0]); + exit(1); + } + + mdb_init(); + mdb = mdb_open(argv[1]); + tabname = argv[2]; + sargname = argv[3]; + updstr = strdup(argv[4]); + + mdb_read_catalog(mdb, MDB_TABLE); + + for (i=0;inum_catalog;i++) { + entry = g_ptr_array_index(mdb->catalog,i); + if (entry->object_type == MDB_TABLE && + !strcmp(entry->object_name,tabname)) { + table = mdb_read_table(entry); + mdb_read_columns(table); + mdb_read_indices(table); + printf("updstr %s\n",updstr); + colname = strtok(updstr,"="); + colval = strtok(NULL,"="); + bind_column(table, colname, data, &len); + read_to_row(table, sargname); + mdb_update_row(table); + printf("current value of %s is %s, changing to %s\n", colname, data, colval); + } + } + + mdb_free_handle(mdb); + mdb_exit(); + + exit(0); +} + +int bind_column(MdbTableDef *table, char *colname, unsigned char *data, int *len) +{ +int i, found = 0; +MdbColumn *col; + + for (i=0;inum_cols;i++) { + col=g_ptr_array_index(table->columns,i); + printf("%d colname %s\n", i, col->name); + if (col && !strcmp(col->name,colname)) { + found = i+1; + } + } + printf("column %d\n",found); + mdb_bind_column(table, found, data); + mdb_bind_len(table, found, len); +} +void read_to_row(MdbTableDef *table, char *sargname) +{ +MdbSarg sarg; +char *sargcol, *sargop, *sargval; + + + if (sargname) { + sargcol = strtok(sargname," "); + sargop = strtok(NULL," "); + sargval = strtok(NULL," "); + printf("col %s op %s val %s\n",sargcol,sargop,sargval); + sarg.op = MDB_EQUAL; /* only support = for now, sorry */ + sarg.value.i = atoi(sargval); + mdb_add_sarg_by_name(table, sargcol, &sarg); + } + + mdb_rewind_table(table); + while (mdb_fetch_row(table)) { + printf("row found at page %d row %d\n", + table->cur_phys_pg, table->cur_row); + return; + } +} +