From 3c0d61076dba3922d09adc9825522bc55cd080c5 Mon Sep 17 00:00:00 2001 From: brianb Date: Mon, 30 Dec 2002 16:38:47 +0000 Subject: [PATCH] lots more gmdb2 stuff, converted table export to glade, added schema export, toolbars, properties window to glade, et al. --- configure.in | 8 +- src/gmdb2/Makefile.am | 6 +- src/gmdb2/debug.c | 417 +++++++-------------- src/gmdb2/gladefiles/gmdb-debug.glade | 67 +--- src/gmdb2/gladefiles/gmdb-export.glade | 487 +++++++++++++++++++++++++ src/gmdb2/gladefiles/gmdb-props.glade | 304 +++++++++++++++ src/gmdb2/gladefiles/gmdb-schema.glade | 422 +++++++++++++++++++++ src/gmdb2/gladefiles/gmdb-sql.glade | 176 ++++----- src/gmdb2/gladefiles/gmdb.glade | 185 +++++----- src/gmdb2/gmdb.h | 2 +- src/gmdb2/info.c | 103 ++---- src/gmdb2/main2.c | 24 +- src/gmdb2/schema.c | 172 +++++++++ src/gmdb2/sql.c | 300 +++++++-------- src/gmdb2/table.c | 23 +- src/gmdb2/table_export.c | 146 ++------ src/libmdb/write.c | 42 ++- src/util/mdb-schema.c | 4 - 18 files changed, 1969 insertions(+), 919 deletions(-) create mode 100644 src/gmdb2/gladefiles/gmdb-export.glade create mode 100644 src/gmdb2/gladefiles/gmdb-props.glade create mode 100644 src/gmdb2/gladefiles/gmdb-schema.glade create mode 100644 src/gmdb2/schema.c diff --git a/configure.in b/configure.in index 7717ea8..5aed735 100644 --- a/configure.in +++ b/configure.in @@ -81,11 +81,11 @@ if test "$no_glib" == yes; then exit 1 fi -AM_PATH_GTK_2_0(2.0.0) -AM_CONDITIONAL(HAVE_GTK, test x$no_gtk = xtrue) -AC_SUBST(HAVE_GTK) +PKG_CHECK_MODULES(GNOME,libglade-2.0 libgnomeui-2.0) -if test "$no_gtk" != yes; then +if test "$GNOME_CFLAGS" != ""; then + AC_SUBST(GNOME_CFLAGS) + AC_SUBST(GNOME_LIBS) OPTDIRS="$OPTDIRS gmdb2" fi diff --git a/src/gmdb2/Makefile.am b/src/gmdb2/Makefile.am index c5050b7..ae73a85 100644 --- a/src/gmdb2/Makefile.am +++ b/src/gmdb2/Makefile.am @@ -1,9 +1,9 @@ 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) +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 sql.c schema.c +LIBS = -rdynamic $(GNOME_LIBS) @LEXLIB@ +INCLUDES = -I$(top_srcdir)/include $(GNOME_CFLAGS) #LDADD = ../libmdb/libmdb.la LDADD = ../libmdb/libmdb.la ../sql/libmdbsql.la #if SQL diff --git a/src/gmdb2/debug.c b/src/gmdb2/debug.c index 2004de3..31f28c5 100644 --- a/src/gmdb2/debug.c +++ b/src/gmdb2/debug.c @@ -7,31 +7,12 @@ 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); +static void gmdb_debug_init(MdbHandle *mdb, GladeXML *xml); +static void gmdb_debug_text_on(GtkWidget *textbox, int start_byte, int end_byte); +static void gmdb_debug_text_off(GtkWidget *textbox); GtkTreeIter *gmdb_debug_add_item(GtkTreeStore *store, GtkTreeIter *iter, gchar *text, int start, int end); -void gmdb_debug_clear(GMdbDebugTab *dbug); +static void gmdb_debug_clear(GladeXML *xml); 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); @@ -45,8 +26,8 @@ typedef struct GMdbValStr { } GMdbValStr; GMdbValStr table_types[] = { - { 0x4e, "System Table" }, - { 0x53, "User Table" }, + { 0x4e, "User Table" }, + { 0x53, "System Table" }, { 0, NULL } }; GMdbValStr column_types[] = { @@ -76,105 +57,67 @@ GMdbValStr object_types[] = { }; /* callbacks */ void -gmdb_debug_select_cb(GtkCTree *tree, GList *node, gint column, GMdbDebugTab *dbug) +gmdb_debug_select_cb(GtkTreeSelection *select, GladeXML *xml) { -GMdbDebugRange *range; int start_row, end_row; int start_col, end_col; int i; +GtkTreeIter iter; +GtkTreeModel *model; +gchar *fieldname; +gint32 start, end; +GtkWidget *textview; - 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; + if (!select) 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); + if (gtk_tree_selection_get_selected (select, &model, &iter)) { + gtk_tree_model_get (model, &iter, 0, &fieldname, + 1, &start, + 2, &end, -1); + g_free (fieldname); } - /* 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; + if (start == -1 || end == -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; + start_row = start / 16; + end_row = end / 16; + start_col = 8 + (start % 16) * 3; + end_col = 8 + (end % 16) * 3; + + textview = glade_xml_get_widget (xml, "debug_textview"); + gmdb_debug_text_off(textview); 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); + gmdb_debug_text_on(textview, + LINESZ * start_row + start_col, + LINESZ * start_row + end_col + 2); + gmdb_debug_text_on(textview, + LINESZ * start_row + 59 + (start % 16), + LINESZ * start_row + 59 + (end % 16) + 1); } else { - gmdb_debug_text_off(dbug->textbox, - dbug->linesz * start_row + start_col, + gmdb_debug_text_on(textview, + 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); + LINESZ * start_row + 55); + gmdb_debug_text_on(textview, + LINESZ * start_row + 59 + (start % 16), + 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_on(textview, + LINESZ * i + 8, LINESZ * i + 55); + gmdb_debug_text_on(textview, + LINESZ * i + 59, 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); + gmdb_debug_text_on(textview, + LINESZ * end_row + 8, + LINESZ * end_row + end_col + 2); + gmdb_debug_text_on(textview, + LINESZ * end_row + 59, + LINESZ * end_row + 59 + (end % 16) + 1); } } void -gmdb_debug_display_cb(GtkWidget *w, gpointer *dbug) +gmdb_debug_display_cb(GtkWidget *w, GladeXML *xml) { int page; off_t pos; @@ -189,17 +132,18 @@ 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"); + entry = glade_xml_get_widget (xml, "debug_entry"); + textview = glade_xml_get_widget (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); + gmdb_debug_clear(xml); pos = lseek(mdb->fd, 0, SEEK_CUR); lseek(mdb->fd, page * mdb->pg_size, SEEK_SET); @@ -228,24 +172,16 @@ GtkTextView *textview; strcat(line, "|\n"); i += 16; strcat(tbuf, line); - //if (!dbug->linesz) 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); + GtkWidget *tree = glade_xml_get_widget(xml, "debug_treeview"); + GtkTreeView *store = gtk_tree_view_get_model(GTK_TREE_VIEW(tree)); + + gmdb_debug_dissect(store, fbuf, 0, length); - 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); } @@ -346,7 +282,7 @@ void gmdb_debug_add_page_ptr(GtkTreeStore *store, GtkTreeIter *parent, char *fbuf, const char *label, int offset) { gchar str[100]; -GtkCTreeNode *node; +GtkTreeIter *node; snprintf(str, 100, "%s", label); node = gmdb_debug_add_item(store, parent, str, offset, offset+3); @@ -453,35 +389,22 @@ gchar str[100]; } } -gmdb_clear_node_cb(GtkWidget *ctree, GtkCTreeNode *node, gpointer data) +static void +gmdb_debug_clear(GladeXML *xml) { -gpointer rowdata; - - rowdata = gtk_ctree_node_get_row_data(GTK_CTREE(ctree), node); - g_free(rowdata); - gtk_ctree_remove_node(GTK_CTREE(ctree), node); -} - -void -gmdb_debug_clear(GMdbDebugTab *dbug) -{ -GtkCTreeNode *node; gpointer data; GtkTextBuffer *buffer; +GtkWidget *treeview, *textview, *store; + + textview = glade_xml_get_widget (xml, "debug_textview"); + treeview = glade_xml_get_widget (xml, "debug_treeview"); + store = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); /* clear the tree */ - gtk_ctree_post_recursive(dbug->ctree, 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); -*/ + gtk_tree_store_clear(GTK_TREE_STORE(store)); /* 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)); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); gtk_text_buffer_set_text(buffer, "", 0); } @@ -489,28 +412,16 @@ GtkTextBuffer *buffer; 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 + gtk_tree_store_set(store, iter2, 0, text, 1, start, 2, end, -1); return iter2; } -void +static void gmdb_debug_text_on(GtkWidget *textbox, int start_byte, int end_byte) { @@ -528,18 +439,18 @@ GtkTextIter start, end; 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), + gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(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) +gmdb_debug_text_off(GtkWidget *textbox) { gchar *text; GtkTextBuffer *buffer; GtkTextTag *tag; +int end_byte; GtkTextIter start, end; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textbox)); @@ -549,158 +460,64 @@ GtkTextIter start, end; tag = gtk_text_buffer_create_tag (buffer, NULL, "background", "white", NULL); - gtk_text_buffer_get_iter_at_offset (buffer, &start, start_byte); + end_byte = gtk_text_buffer_get_char_count(buffer); + gtk_text_buffer_get_iter_at_offset (buffer, &start, 0); 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) +gint +gmdb_debug_delete_cb(GtkWidget *w, GladeXML *xml) { -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); + return FALSE; } -#endif void -gmdb_debug_close_cb(GtkWidget *w, gpointer *data) +gmdb_debug_close_cb(GtkWidget *w, GladeXML *xml) { - GtkWidget *w; - w = glade_xml_get_widget (debugwin_xml, "debug_window"); - gtk_widget_destroy(w); + GtkWidget *win; + win = glade_xml_get_widget (xml, "debug_window"); + if (win) gtk_widget_destroy(win); } void gmdb_debug_new_cb(GtkWidget *w, gpointer *data) { GtkTextView *textview; +guint32 page; +GtkWidget *entry, *mi, *button, *debugwin; +gchar text[20]; /* 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); + /* set signals with user data, anyone know how to do this in glade? */ + entry = glade_xml_get_widget (debugwin_xml, "debug_entry"); + g_signal_connect (G_OBJECT (entry), "activate", + G_CALLBACK (gmdb_debug_display_cb), debugwin_xml); + + mi = glade_xml_get_widget (debugwin_xml, "close_menu"); + g_signal_connect (G_OBJECT (mi), "activate", + G_CALLBACK (gmdb_debug_close_cb), debugwin_xml); + + button = glade_xml_get_widget (debugwin_xml, "debug_button"); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (gmdb_debug_display_cb), debugwin_xml); + + debugwin = glade_xml_get_widget (debugwin_xml, "debug_window"); + gtk_signal_connect (GTK_OBJECT (debugwin), "delete_event", + GTK_SIGNAL_FUNC (gmdb_debug_delete_cb), 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; + /* set up treeview, libglade only gives us the empty widget */ 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); + GtkTreeStore *store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store)); GtkCellRenderer *renderer; GtkTreeViewColumn *column; @@ -708,17 +525,33 @@ GtkTextView *textview; column = gtk_tree_view_column_new_with_attributes("Field", renderer, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW (tree), column); - */ + + GtkTreeSelection *select = + gtk_tree_view_get_selection (GTK_TREE_VIEW (tree)); + gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE); + g_signal_connect (G_OBJECT (select), "changed", + G_CALLBACK (gmdb_debug_select_cb), debugwin_xml); + + /* check if initial page was passed */ + if (mdb) { + gmdb_debug_init(mdb, debugwin_xml); + if (data) { + page = *((guint32 *)data); + sprintf(text,"%lu",page); + gtk_entry_set_text(GTK_ENTRY(entry),text); + gmdb_debug_display_cb(w, debugwin_xml); + } + } } -void gmdb_debug_init(MdbHandle *mdb) +static void gmdb_debug_init(MdbHandle *mdb, GladeXML *xml) { struct stat st; char tmpstr[100]; GtkWidget *pglabel, *entry; - pglabel = glade_xml_get_widget (debugwin_xml, "debug_num_label"); + pglabel = glade_xml_get_widget (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"); + entry = glade_xml_get_widget (xml, "debug_entry"); gtk_widget_grab_focus(GTK_WIDGET(entry)); } diff --git a/src/gmdb2/gladefiles/gmdb-debug.glade b/src/gmdb2/gladefiles/gmdb-debug.glade index 0caece8..108e355 100644 --- a/src/gmdb2/gladefiles/gmdb-debug.glade +++ b/src/gmdb2/gladefiles/gmdb-debug.glade @@ -38,70 +38,9 @@ - - 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 - @@ -213,7 +152,6 @@ True * False - 0 @@ -223,13 +161,12 @@ - + True True _Display True GTK_RELIEF_NORMAL - 0 diff --git a/src/gmdb2/gladefiles/gmdb-export.glade b/src/gmdb2/gladefiles/gmdb-export.glade new file mode 100644 index 0000000..c4b0746 --- /dev/null +++ b/src/gmdb2/gladefiles/gmdb-export.glade @@ -0,0 +1,487 @@ + + + + + + + + True + dialog1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + -6 + + + + + + + True + True + True + GTK_RELIEF_NORMAL + -5 + + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-convert + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Export + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + 0 + False + True + GTK_PACK_END + + + + + + 30 + True + 6 + 2 + False + 8 + 30 + + + + True + <b>File Name:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + <b>Line Terminator:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + <b>Column Separator:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + <b>Quotes:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + <b>Quote Character:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + + True + <b>Options:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 5 + 6 + fill + + + + + + + True + False + True + False + True + False + + + + True + True + True + True + 0 + + True + * + False + + + + + + True + GTK_SELECTION_BROWSE + + + + + 1 + 2 + 1 + 2 + + + + + + + True + False + True + False + True + False + + + + True + True + True + True + 0 + + True + * + False + + + + + + True + GTK_SELECTION_BROWSE + + + + + 1 + 2 + 2 + 3 + + + + + + + True + False + True + False + True + False + + + + True + True + False + True + 0 + + True + * + False + + + + + + True + GTK_SELECTION_BROWSE + + + + + 1 + 2 + 3 + 4 + + + + + + + True + False + True + False + True + False + + + + True + True + True + True + 0 + + True + * + False + + + + + + True + GTK_SELECTION_BROWSE + + + + + 1 + 2 + 4 + 5 + + + + + + + True + True + Include Headers + True + GTK_RELIEF_NORMAL + True + False + True + + + 1 + 2 + 5 + 6 + fill + + + + + + + True + 10 + False + False + + + + True + True + True + True + 0 + + True + * + False + + + + + 1 + 2 + 0 + 1 + + + + + + 0 + True + True + + + + + + + diff --git a/src/gmdb2/gladefiles/gmdb-props.glade b/src/gmdb2/gladefiles/gmdb-props.glade new file mode 100644 index 0000000..3612db9 --- /dev/null +++ b/src/gmdb2/gladefiles/gmdb-props.glade @@ -0,0 +1,304 @@ + + + + + + + True + dialog1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + -5 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + 10 + True + 5 + 2 + False + 8 + 30 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 3 + 4 + fill + + + + + + + True + <b>Number of Objects:</b> + False + True + GTK_JUSTIFY_RIGHT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 4 + 5 + + + + + + + True + <b>Number of Pages:</b> + False + True + GTK_JUSTIFY_RIGHT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 3 + 4 + + + + + + + True + <b>File Size:</b> + False + True + GTK_JUSTIFY_RIGHT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 2 + 3 + + + + + + + True + <b>JET Version:</b> + False + True + GTK_JUSTIFY_RIGHT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 1 + 2 + + + + + + + True + <b>File Name:</b> + False + True + GTK_JUSTIFY_RIGHT + False + False + 0 + 0.5 + 0 + 0 + okbutton1 + + + 0 + 1 + 0 + 1 + + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 0 + 1 + fill + + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 2 + 3 + fill + + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 4 + 5 + fill + + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 1 + 2 + fill + + + + + + 0 + False + False + + + + + + + diff --git a/src/gmdb2/gladefiles/gmdb-schema.glade b/src/gmdb2/gladefiles/gmdb-schema.glade new file mode 100644 index 0000000..aef2bb0 --- /dev/null +++ b/src/gmdb2/gladefiles/gmdb-schema.glade @@ -0,0 +1,422 @@ + + + + + + + + True + Export Schema + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + -6 + + + + + + + True + True + True + GTK_RELIEF_NORMAL + -5 + + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-convert + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Export + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + 0 + False + True + GTK_PACK_END + + + + + + 33 + True + 5 + 2 + False + 8 + 30 + + + + True + <b>Table:</b> + False + True + GTK_JUSTIFY_RIGHT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + <b>Schema Dialect:</b> + False + True + GTK_JUSTIFY_RIGHT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + False + True + False + True + False + + + + True + True + True + True + 0 + + True + * + False + + + + + + True + GTK_SELECTION_BROWSE + + + + + 1 + 2 + 1 + 2 + + + + + + + True + True + False + False + True + False + + + + True + True + False + True + 0 + + True + * + False + + + + + + True + GTK_SELECTION_BROWSE + + + + True + True + Access + + + + + + True + True + Oracle + + + + + + True + True + Sybase + + + + + + True + True + MS SQL Server + + + + + + True + True + PostgreSQL + + + + + + + 1 + 2 + 2 + 3 + + + + + + + True + True + Include Relationships + True + GTK_RELIEF_NORMAL + True + False + True + + + 1 + 2 + 3 + 4 + fill + + + + + + + True + <b>Options:</b> + False + True + GTK_JUSTIFY_RIGHT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + True + Include Drop Table commands + True + GTK_RELIEF_NORMAL + True + False + True + + + 1 + 2 + 4 + 5 + fill + + + + + + + True + <b>File Name:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + 10 + False + False + + + + True + True + True + True + 0 + + True + * + False + + + + + 1 + 2 + 0 + 1 + + + + + + 0 + True + False + + + + + + + diff --git a/src/gmdb2/gladefiles/gmdb-sql.glade b/src/gmdb2/gladefiles/gmdb-sql.glade index fb67d27..6947116 100644 --- a/src/gmdb2/gladefiles/gmdb-sql.glade +++ b/src/gmdb2/gladefiles/gmdb-sql.glade @@ -5,8 +5,9 @@ - + True + MDB Query Tool GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False @@ -78,7 +79,7 @@ - + True _Execute True @@ -106,7 +107,7 @@ - + True GNOMEUIINFO_MENU_CLOSE_ITEM @@ -156,46 +157,11 @@ - - - - True - - - - - - True - GNOMEUIINFO_MENU_PROPERTIES_ITEM - - - - - - - True - - - - - - True - GNOMEUIINFO_MENU_PREFERENCES_ITEM - - - - - - True - GNOMEUIINFO_MENU_VIEW_TREE - - - True @@ -208,7 +174,7 @@ True GNOMEUIINFO_MENU_ABOUT_ITEM - + @@ -237,13 +203,13 @@ 1 True GTK_ORIENTATION_HORIZONTAL - GTK_TOOLBAR_BOTH + GTK_TOOLBAR_ICONS True True - New Query + Start new query gtk-new True @@ -252,7 +218,7 @@ True - Load Query from File + Load query from file gtk-open True @@ -261,15 +227,16 @@ True - Save Query + Save query to file gtk-save True - + True + Execute query gtk-execute True @@ -279,8 +246,9 @@ - + True + Close this window gtk-close True @@ -309,24 +277,35 @@ True True + 0 - + + 5 True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_NONE - GTK_CORNER_TOP_LEFT + 0 + 0.5 + GTK_SHADOW_IN - + True True - False - False - False - True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + False + False + False + True + + @@ -343,30 +322,40 @@ 0 - + + 4 True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_NONE - GTK_CORNER_TOP_LEFT + 0 + 0.5 + GTK_SHADOW_IN - - 1 + True True - True - GTK_JUSTIFY_LEFT - GTK_WRAP_NONE - True - 0 - 0 - 0 - 0 - 0 - 0 - + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + 50 + True + True + True + GTK_JUSTIFY_LEFT + GTK_WRAP_NONE + True + 0 + 0 + 0 + 0 + 0 + 0 + + + @@ -406,7 +395,7 @@ - + True False True @@ -415,7 +404,8 @@ False - + + 24 True Recently Executed Querys True @@ -463,22 +453,32 @@ - + + 3 True - True - GTK_POLICY_ALWAYS - GTK_POLICY_ALWAYS - GTK_SHADOW_NONE - GTK_CORNER_TOP_LEFT + 0 + 0.5 + GTK_SHADOW_IN - + True True - True - False - False - True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + + diff --git a/src/gmdb2/gladefiles/gmdb.glade b/src/gmdb2/gladefiles/gmdb.glade index 1c99c8b..7a39db6 100644 --- a/src/gmdb2/gladefiles/gmdb.glade +++ b/src/gmdb2/gladefiles/gmdb.glade @@ -54,21 +54,8 @@ True - Information - True + GNOMEUIINFO_MENU_PROPERTIES_ITEM - - - - True - gtk-dialog-info - 1 - 0.5 - 0.5 - 0 - 0 - - @@ -78,28 +65,6 @@ - - - True - GNOMEUIINFO_MENU_PRINT_ITEM - - - - - - - True - GNOMEUIINFO_MENU_PRINT_SETUP_ITEM - - - - - - - True - - - True @@ -180,58 +145,6 @@ - - - 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 @@ -258,7 +171,7 @@ True S_QL Window True - + @@ -271,7 +184,7 @@ - + True debug.xpm 0.5 @@ -288,10 +201,10 @@ True E_xport Schema True - + - + True gtk-convert 1 @@ -354,6 +267,84 @@ + + + True + GTK_SHADOW_OUT + + + + 1 + True + GTK_ORIENTATION_HORIZONTAL + GTK_TOOLBAR_ICONS + True + + + + True + Open an MDB database file + gtk-open + True + + + + + + + True + View database file properties + gtk-properties + True + + + + + + + True + Close this database + gtk-close + True + + + + + + True + Open SQL query window + SQL + True + gtk-execute + + + + True + + + + + + True + Export schema definition + Export Schema + True + gtk-convert + + + + + + + + BONOBO_DOCK_TOP + 1 + 0 + 0 + BONOBO_DOCK_ITEM_BEH_EXCLUSIVE + + + True @@ -595,7 +586,7 @@ True - label22 + False False GTK_JUSTIFY_LEFT @@ -716,7 +707,7 @@ True - label24 + False False GTK_JUSTIFY_LEFT @@ -837,7 +828,7 @@ True - label27 + False False GTK_JUSTIFY_LEFT @@ -958,7 +949,7 @@ True - label26 + False False GTK_JUSTIFY_LEFT @@ -1079,7 +1070,7 @@ True - label25 + False False GTK_JUSTIFY_LEFT diff --git a/src/gmdb2/gmdb.h b/src/gmdb2/gmdb.h index 99c9309..0babfb2 100644 --- a/src/gmdb2/gmdb.h +++ b/src/gmdb2/gmdb.h @@ -6,6 +6,7 @@ #include #include #include +#include #ifndef _gmdb_h_ #define _gmdb_h_ @@ -35,7 +36,6 @@ 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); diff --git a/src/gmdb2/info.c b/src/gmdb2/info.c index b85f6be..c4da447 100644 --- a/src/gmdb2/info.c +++ b/src/gmdb2/info.c @@ -10,79 +10,48 @@ typedef struct 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]; +GtkWidget *propswin, *label; +GladeXML *propswin_xml; +gchar title[100]; +gchar tmpstr[20]; +gchar *filename, *filepath; +int i; 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); + /* load the interface */ + propswin_xml = glade_xml_new("gladefiles/gmdb-props.glade", NULL, NULL); + /* connect the signals in the interface */ + glade_xml_signal_autoconnect(propswin_xml); + + filepath = g_strdup(mdb->filename); + for (i=strlen(filepath);i>0 && filepath[i-1]!='/';i--); + filename=&filepath[i]; + + propswin = glade_xml_get_widget (propswin_xml, "props_dialog"); + g_snprintf(title, 100, "%s Properties",filename); + gtk_window_set_title(GTK_WINDOW(propswin), title); + + label = glade_xml_get_widget (propswin_xml, "props_filename"); + gtk_label_set_text(GTK_LABEL(label), filename); + + label = glade_xml_get_widget (propswin_xml, "props_jetver"); + gtk_label_set_text(GTK_LABEL(label), mdb->jet_version == MDB_VER_JET3 ? "3 (Access 97)" : "4 (Access 2000/XP)"); + + assert( fstat(mdb->fd, &st)!=-1 ); + sprintf(tmpstr, "%ld K", st.st_size/1024); + label = glade_xml_get_widget (propswin_xml, "props_filesize"); + gtk_label_set_text(GTK_LABEL(label), tmpstr); + sprintf(tmpstr, "%ld", st.st_size / mdb->pg_size); - gmdb_info_add_keyvalue(table, 3, "Number of Pages:", tmpstr); + label = glade_xml_get_widget (propswin_xml, "props_numpages"); + gtk_label_set_text(GTK_LABEL(label), tmpstr); + sprintf(tmpstr, "%d", mdb->num_catalog); - gmdb_info_add_keyvalue(table, 4, "Number of Tables:", tmpstr); + label = glade_xml_get_widget (propswin_xml, "props_numobjs"); + gtk_label_set_text(GTK_LABEL(label), 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; + g_free(filepath); } diff --git a/src/gmdb2/main2.c b/src/gmdb2/main2.c index 3aa029d..a40c0b7 100644 --- a/src/gmdb2/main2.c +++ b/src/gmdb2/main2.c @@ -7,10 +7,8 @@ GtkWidget *app; GladeXML *mainwin_xml; MdbSQL *sql; -gmdb_table_popup_cb(GtkWidget *button, GdkEvent *event); - /* called when the user closes the window */ -static gint +gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) { /* signal the main loop to quit */ @@ -38,7 +36,7 @@ pixbuf = gdk_pixbuf_new_from_file ("logo.xpm", 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 " + "MDB Tools. It lets you view and export data and schema" "from MDB files produced by MS Access 97/2000/XP."), (const gchar **) authors, (const gchar **) authors, @@ -94,17 +92,17 @@ gmdb_reset_widgets() GnomeIconList *gil; int pos; - gil = glade_xml_get_widget (mainwin_xml, "table_iconlist"); + gil = (GnomeIconList *) glade_xml_get_widget (mainwin_xml, "table_iconlist"); gnome_icon_list_clear(gil); - gil = glade_xml_get_widget (mainwin_xml, "query_iconlist"); + gil = (GnomeIconList *) glade_xml_get_widget (mainwin_xml, "query_iconlist"); gnome_icon_list_clear(gil); - gil = glade_xml_get_widget (mainwin_xml, "form_iconlist"); + gil = (GnomeIconList *) glade_xml_get_widget (mainwin_xml, "form_iconlist"); gnome_icon_list_clear(gil); - gil = glade_xml_get_widget (mainwin_xml, "report_iconlist"); + gil = (GnomeIconList *) glade_xml_get_widget (mainwin_xml, "report_iconlist"); gnome_icon_list_clear(gil); - gil = glade_xml_get_widget (mainwin_xml, "macro_iconlist"); + gil = (GnomeIconList *) glade_xml_get_widget (mainwin_xml, "macro_iconlist"); gnome_icon_list_clear(gil); - gil = glade_xml_get_widget (mainwin_xml, "module_iconlist"); + gil = (GnomeIconList *) glade_xml_get_widget (mainwin_xml, "module_iconlist"); gnome_icon_list_clear(gil); } @@ -115,8 +113,7 @@ void gmdb_init_popups() int main(int argc, char *argv[]) { -GtkWidget *menuitem; -GtkWidget *menulabel; +GtkWidget *gmdb; #ifdef SQL /* initialize the SQL engine */ @@ -136,7 +133,8 @@ GtkWidget *menulabel; /* connect the signals in the interface */ glade_xml_signal_autoconnect(mainwin_xml); - gtk_signal_connect (GTK_OBJECT (app), "delete_event", + gmdb = glade_xml_get_widget (mainwin_xml, "gmdb"); + gtk_signal_connect (GTK_OBJECT (gmdb), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); if (argc>1) { diff --git a/src/gmdb2/schema.c b/src/gmdb2/schema.c new file mode 100644 index 0000000..4b5e5bf --- /dev/null +++ b/src/gmdb2/schema.c @@ -0,0 +1,172 @@ +#include "gmdb.h" + +extern GtkWidget *app; +extern MdbHandle *mdb; + +GladeXML *schemawin_xml; +static gchar backend[100]; +static gchar tabname[100]; +static gchar file_path[256]; +static gchar relation; +static gchar drops; + +#define ALL_TABLES "(All Tables)" + +void +gmdb_schema_export() +{ +FILE *outfile; +MdbTableDef *table; +MdbCatalogEntry *entry; +MdbColumn *col; +int i,k; +int need_headers = 0; +int need_quote = 0; +gchar delimiter[11]; +gchar quotechar; +gchar lineterm[5]; +gchar *str; +int rows=0; +char msg[100]; +char *the_relation; + + + printf("file path %s\n",file_path); + if ((outfile=fopen(file_path, "w"))==NULL) { + gmdb_info_msg("Unable to Open File!"); + return; + } + mdb_set_default_backend(mdb,backend); + + 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 ((strlen(tabname) && !strcmp(entry->object_name,tabname)) || + (!strlen(tabname) && strncmp (entry->object_name, "MSys", 4))) { + + /* make sure it's a table (may be redundant) */ + + if (!strcmp (mdb_get_objtype_string (entry->object_type), "Table")) { + /* drop the table if it exists */ + if (drops=='Y') + fprintf(outfile, "DROP TABLE %s;\n", entry->object_name); + + /* create the table */ + fprintf (outfile, "CREATE TABLE %s\n", entry->object_name); + fprintf (outfile, " (\n"); + + table = mdb_read_table (entry); + + /* get the columns */ + mdb_read_columns (table); + + /* loop over the columns, dumping the names and types */ + + for (k = 0; k < table->num_cols; k++) { + col = g_ptr_array_index (table->columns, k); + + fprintf (outfile, "\t%s\t\t\t%s", col->name, + mdb_get_coltype_string (mdb->default_backend, col->col_type)); + + if (col->col_size != 0) + fprintf (outfile, " (%d)", col->col_size); + + if (k < table->num_cols - 1) + fprintf (outfile, ", \n"); + else + fprintf (outfile, "\n"); + } + + fprintf (outfile, "\n);\n"); + fprintf (outfile, "-- CREATE ANY INDEXES ...\n"); + fprintf (outfile, "\n"); + } + } + } + } + fprintf (outfile, "\n\n"); + + if (relation=='Y') { + fprintf (outfile, "-- CREATE ANY Relationships ...\n"); + fprintf (outfile, "\n"); + the_relation=mdb_get_relationships(mdb); + while (the_relation[0] != '\0') { + fprintf(outfile,"%s\n",the_relation); + the_relation=mdb_get_relationships(mdb); + } + } + + fclose(outfile); + sprintf(msg,"Schema exported successfully.\n"); + gmdb_info_msg(msg); +} +void +gmdb_schema_export_cb(GtkWidget *w, gpointer data) +{ +GtkWidget *schemawin, *combo, *checkbox, *entry; + + schemawin = glade_xml_get_widget (schemawin_xml, "schema_dialog"); + + entry = glade_xml_get_widget (schemawin_xml, "filename_entry"); + strncpy(file_path,gtk_entry_get_text(GTK_ENTRY(entry)),255); + combo = glade_xml_get_widget (schemawin_xml, "table_combo"); + strncpy(tabname,gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)),99); + if (!strcmp(tabname,ALL_TABLES)) tabname[0]='\0'; + combo = glade_xml_get_widget (schemawin_xml, "backend_combo"); + if (!strcmp(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)),"Oracle")) strcpy(backend,"oracle"); + else if (!strcmp(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)),"Sybase")) strcpy(backend,"sybase"); + else if (!strcmp(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)),"MS SQL Server")) strcpy(backend,"sybase"); + else if (!strcmp(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)),"PostgreSQL")) strcpy(backend,"postgres"); + else strcpy(backend,"access"); + checkbox = glade_xml_get_widget (schemawin_xml, "rel_checkbox"); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox))) + relation = 'Y'; + else + relation = 'N'; + checkbox = glade_xml_get_widget (schemawin_xml, "drop_checkbox"); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox))) + drops = 'Y'; + else + drops = 'N'; + //printf("%s %s %c\n",tabname,backend,relation); + + gtk_widget_destroy(schemawin); + gmdb_schema_export(); +} + +void +gmdb_schema_new_cb(GtkWidget *w, gpointer data) { +GList *glist = NULL; +GtkWidget *combo; +MdbCatalogEntry *entry; +int i; + + /* load the interface */ + schemawin_xml = glade_xml_new("gladefiles/gmdb-schema.glade", NULL, NULL); + /* connect the signals in the interface */ + glade_xml_signal_autoconnect(schemawin_xml); + + /* set signals with user data, anyone know how to do this in glade? */ + combo = glade_xml_get_widget (schemawin_xml, "table_combo"); + + glist = g_list_append(glist, ALL_TABLES); + /* 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 list */ + glist = g_list_append(glist, entry->object_name); + } + } /* if MDB_TABLE */ + } /* for */ + gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist); + g_list_free(glist); +} diff --git a/src/gmdb2/sql.c b/src/gmdb2/sql.c index 9e3272f..2d032c7 100644 --- a/src/gmdb2/sql.c +++ b/src/gmdb2/sql.c @@ -14,45 +14,61 @@ typedef struct GMdbSQLWindow { } GMdbSQLWindow; GList *window_list; +GladeXML *sqlwin_xml; extern GtkWidget *app; extern MdbHandle *mdb; extern MdbSQL *sql; - -GtkCTreeNode *gmdb_sql_ctree_populate(MdbHandle *mdb, GMdbSQLWindow *sqlwin); +void gmdb_sql_tree_populate(MdbHandle *mdb, GladeXML *xml); /* callbacks */ +#if 0 gint -gmdb_sql_close(GtkList *list, GtkWidget *w, GMdbSQLWindow *sqlwin) +gmdb_sql_close_cb(GtkList *list, GtkWidget *w, GMdbSQLWindow *sqlwin) { window_list = g_list_remove(window_list, sql); g_free(sql); return FALSE; } - +#endif void -gmdb_sql_tree_select_cb(GtkCTree *tree, GList *node, gint column, GMdbSQLWindow *sqlwin) +gmdb_sql_close_cb(GtkWidget *w, GladeXML *xml) { - sqlwin->current_node = node; + GtkWidget *win; + win = glade_xml_get_widget (xml, "sql_window"); + if (win) gtk_widget_destroy(win); } + void gmdb_sql_dnd_dataget_cb( GtkWidget *w, GdkDragContext *dc, GtkSelectionData *selection_data, guint info, guint t, - GMdbSQLWindow *sqlwin) + GladeXML *xml) { gchar tablename[256]; -gchar *text[2]; +//gchar *tablename = "Orders"; +gchar *name; +GtkTreeSelection *select; +GtkTreeStore *store; +GtkTreeView *tree; +GtkTreeIter *iter, iter2; - gtk_ctree_get_node_info(GTK_CTREE(sqlwin->ctree), sqlwin->current_node, text, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + tree = (GtkTreeView *) glade_xml_get_widget(sqlwin_xml, "sql_treeview"); + select = gtk_tree_view_get_selection(GTK_TREE_VIEW (tree)); + store = (GtkTreeStore *) gtk_tree_view_get_model(tree); + gtk_tree_selection_get_selected (select, NULL, &iter2); + gtk_tree_model_get (GTK_TREE_MODEL(store), &iter2, 0, &name, -1); + strcpy(tablename,name); + g_free(name); + printf("table %s\n",tablename); //strcpy(tablename, "Shippers"); gtk_selection_data_set( selection_data, GDK_SELECTION_TYPE_STRING, 8, /* 8 bits per character. */ - text[0], strlen(text[0])); + tablename, strlen(tablename)); } void gmdb_sql_dnd_datareceived_cb( GtkWidget *w, @@ -60,31 +76,22 @@ void gmdb_sql_dnd_datareceived_cb( gint x, gint y, GtkSelectionData *selection_data, guint info, guint t, - GMdbSQLWindow *sqlwin) + GladeXML *xml) { gchar *buf, *lastbuf; GtkTextIter iter, start, end; GtkTextBuffer *txtbuffer; int len; +GtkWidget *textview; + textview = glade_xml_get_widget(xml, "sql_textview"); buf = selection_data->data; - txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sqlwin->textbox)); + txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); 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)); + gtk_widget_grab_focus(GTK_WIDGET(textview)); } void @@ -95,13 +102,13 @@ gchar *buf; GtkTextBuffer *txtbuffer; child_num = gtk_list_child_position(list, w); - buf = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(sqlwin->combo)->entry)); + buf = (gchar *) 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) +gmdb_sql_execute_cb(GtkWidget *w, GladeXML *xml) { guint len; gchar *buf; @@ -111,44 +118,76 @@ MdbSQLColumn *sqlcol; gchar *titles[256]; GtkTextBuffer *txtbuffer; GtkTextIter start, end; +GtkWidget *textview, *combo, *treeview, *store; +GList *history; +GType *gtypes; +GtkTreeIter iter; +GtkTreeViewColumn *column; /* stuff this query on the history */ - txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sqlwin->textbox)); + textview = glade_xml_get_widget(xml, "sql_textview"); + combo = glade_xml_get_widget(xml, "sql_combo"); + txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); 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); + /* add to the history */ + history = g_object_get_data(G_OBJECT(combo),"hist_list"); + history = g_list_prepend(history, g_strdup(buf)); + g_object_set_data(G_OBJECT(combo), "hist_list", history); + gtk_combo_set_popdown_strings(GTK_COMBO(combo), history); /* ok now execute it */ g_input_ptr = buf; - /* begin unsafe */ + /* 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); - } + treeview = glade_xml_get_widget(xml, "sql_results"); + + gtypes = g_malloc(sizeof(GType) * sql->num_columns); + for (i=0;inum_columns;i++) + gtypes[i]=G_TYPE_STRING; + + store = gtk_tree_view_get_model(treeview); + if (store) { + i=0; + while (column = gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), i)) { + gtk_tree_view_remove_column(GTK_TREE_VIEW(treeview), column); + } + gtk_widget_destroy(store); + } + store = (GtkWidget *) gtk_list_store_newv(sql->num_columns, gtypes); + g_free(gtypes); + + gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store)); + + GtkCellRenderer *renderer; + renderer = gtk_cell_renderer_text_new(); + + 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); + column = gtk_tree_view_column_new_with_attributes(sqlcol->name, renderer, "text", i, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW (treeview), column); + } + + while(mdb_fetch_row(sql->cur_table)) { + gtk_list_store_append(GTK_LIST_STORE(store), &iter); + for (i=0;inum_columns;i++) { + gtk_list_store_set(GTK_LIST_STORE(store), + &iter, i, (gchar *) bound_data[i], -1); + } + } /* free the memory used to bind */ @@ -161,136 +200,81 @@ GtkTextIter start, end; } void -gmdb_sql_new_window_cb(GtkWidget *w, gpointer data) +gmdb_sql_new_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; +GtkWidget *mi, *but; - 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); + /* load the interface */ + sqlwin_xml = glade_xml_new("gladefiles/gmdb-sql.glade", NULL, NULL); + /* connect the signals in the interface */ + glade_xml_signal_autoconnect(sqlwin_xml); - gtk_signal_connect (GTK_OBJECT (sqlwin->window), "delete_event", - GTK_SIGNAL_FUNC (gmdb_sql_close), sqlwin); + mi = glade_xml_get_widget (sqlwin_xml, "close_menu"); + g_signal_connect (G_OBJECT (mi), "activate", + G_CALLBACK (gmdb_sql_close_cb), sqlwin_xml); - 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); + but = glade_xml_get_widget (sqlwin_xml, "close_button"); + g_signal_connect (G_OBJECT (but), "clicked", + G_CALLBACK (gmdb_sql_close_cb), sqlwin_xml); - 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); + mi = glade_xml_get_widget (sqlwin_xml, "execute_menu"); + g_signal_connect (G_OBJECT (mi), "activate", + G_CALLBACK (gmdb_sql_execute_cb), sqlwin_xml); - 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); + but = glade_xml_get_widget (sqlwin_xml, "execute_button"); + g_signal_connect (G_OBJECT (but), "clicked", + G_CALLBACK (gmdb_sql_execute_cb), sqlwin_xml); - sqlwin->ctree = gtk_ctree_new (1, 0); - gtk_widget_show (sqlwin->ctree); - gtk_container_add (GTK_CONTAINER (scroll), sqlwin->ctree); + /* set up treeview, libglade only gives us the empty widget */ + GtkWidget *tree = glade_xml_get_widget(sqlwin_xml, "sql_treeview"); + GtkTreeStore *store = gtk_tree_store_new(1, G_TYPE_STRING); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store)); + + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Name", + renderer, "text", 0, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW (tree), column); + + GtkTreeSelection *select = + gtk_tree_view_get_selection (GTK_TREE_VIEW (tree)); + gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE); + //g_signal_connect (G_OBJECT (select), "changed", + //G_CALLBACK (gmdb_sql_select_cb), sqlwin_xml); - 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); + gmdb_sql_tree_populate(mdb, sqlwin_xml); + + GtkWidget *textview = glade_xml_get_widget(sqlwin_xml, "sql_textview"); 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_drag_source_set( tree, GDK_BUTTON1_MASK, &src, 1, GDK_ACTION_COPY); + gtk_drag_dest_set( textview, //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_signal_connect( GTK_OBJECT(tree), "drag_data_get", + GTK_SIGNAL_FUNC(gmdb_sql_dnd_dataget_cb), sqlwin_xml); + gtk_signal_connect( GTK_OBJECT(textview), "drag_data_received", + GTK_SIGNAL_FUNC(gmdb_sql_dnd_datareceived_cb), sqlwin_xml); - gtk_widget_grab_focus(GTK_WIDGET(sqlwin->textbox)); - - /* add this one to the window list */ - window_list = g_list_append(window_list, sql); + gtk_widget_grab_focus(GTK_WIDGET(textview)); } /* functions */ -GtkCTreeNode * -gmdb_sql_ctree_populate(MdbHandle *mdb, GMdbSQLWindow *sqlwin) +void +gmdb_sql_tree_populate(MdbHandle *mdb, GladeXML *xml) { int i; MdbCatalogEntry *entry; -gchar *text[2]; -GtkCTreeNode *node, *first_node = NULL; +GtkTreeIter *iter1, *iter2; + + GtkWidget *tree = glade_xml_get_widget(sqlwin_xml, "sql_treeview"); + GtkTreeStore *store = (GtkTreeStore *) gtk_tree_view_get_model(GTK_TREE_VIEW(tree)); /* loop over each entry in the catalog */ for (i=0; i < mdb->num_catalog; i++) { @@ -301,19 +285,17 @@ GtkCTreeNode *node, *first_node = NULL; /* 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; - } + iter2 = g_malloc(sizeof(GtkTreeIter)); + gtk_tree_store_append(store, iter2, NULL); + gtk_tree_store_set(store, iter2, 0, entry->object_name, -1); + } } /* if MDB_TABLE */ } /* for */ - return first_node; } #else void -gmdb_sql_new_window_cb(GtkWidget *w, gpointer data) +gmdb_sql_new_cb(GtkWidget *w, gpointer data) { gmdb_info_msg("SQL support was not built in.\nRun configure with the --enable-sql option."); } diff --git a/src/gmdb2/table.c b/src/gmdb2/table.c index a5b8531..5d27b28 100644 --- a/src/gmdb2/table.c +++ b/src/gmdb2/table.c @@ -12,11 +12,24 @@ extern char *mdb_access_types[]; /* callbacks */ void +gmdb_table_debug_cb(GtkList *list, GtkWidget *w, gpointer data) +{ +MdbCatalogEntry *entry; +guint32 page; + + /* nothing selected yet? */ + if (selected_table==-1) { + return; + } + + entry = g_ptr_array_index(mdb->catalog,selected_table); + gmdb_debug_new_cb(w, &entry->table_pg); +} +void gmdb_table_def_cb(GtkList *list, GtkWidget *w, gpointer data) { MdbCatalogEntry *entry; - printf("here\n"); /* nothing selected yet? */ if (selected_table==-1) { return; @@ -63,7 +76,6 @@ 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); @@ -83,7 +95,6 @@ GdkEventButton *event_button; if (event_button->button == 3) { gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event_button->button, event_button->time); - g_print("button press\n"); return TRUE; } } @@ -107,15 +118,21 @@ GtkWidget *menu, *mi; gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); mi = gtk_menu_item_new_with_label("Data"); gtk_widget_show(mi); + g_signal_connect_swapped (G_OBJECT (mi), "activate", + G_CALLBACK (gmdb_table_data_cb), gil); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); mi = gtk_menu_item_new_with_label("Export"); gtk_widget_show(mi); + g_signal_connect_swapped (G_OBJECT (mi), "activate", + G_CALLBACK (gmdb_table_export_cb), gil); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); mi = gtk_separator_menu_item_new(); gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); mi = gtk_menu_item_new_with_label("Debug"); gtk_widget_show(mi); + g_signal_connect_swapped (G_OBJECT (mi), "activate", + G_CALLBACK (gmdb_table_debug_cb), gil); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); mi = gtk_menu_item_new_with_label("Usage Map"); gtk_widget_show(mi); diff --git a/src/gmdb2/table_export.c b/src/gmdb2/table_export.c index 811533a..2d28d81 100644 --- a/src/gmdb2/table_export.c +++ b/src/gmdb2/table_export.c @@ -2,19 +2,8 @@ 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; +GladeXML *exportwin_xml; +MdbCatalogEntry *cat_entry; #define COMMA "Comma (,)" #define TAB "Tab" @@ -44,7 +33,7 @@ print_quote(FILE *outfile, int need_quote, char quotechar, char *colsep, char *s } void -gmdb_export_file_cb(GtkWidget *selector, GMdbTableExportDialog *export) +gmdb_table_export_button_cb(GtkWidget *w, gpointer data) { gchar *file_path; FILE *outfile; @@ -60,9 +49,12 @@ gchar lineterm[5]; gchar *str; int rows=0; char msg[100]; +GtkWidget *combo, *fentry, *checkbox; +GtkWidget *exportwin; - str = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(export->colsep)->entry)); + combo = glade_xml_get_widget (exportwin_xml, "sep_combo"); + str = (gchar *) gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)); if (!strcmp(str,COMMA)) { strcpy(delimiter, ","); } else if (!strcmp(str,TAB)) { strcpy(delimiter, "\t"); } else if (!strcmp(str,SPACE)) { strcpy(delimiter, " "); } @@ -74,24 +66,32 @@ char msg[100]; delimiter[10]='\0'; } - str = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(export->lineterm)->entry)); + combo = glade_xml_get_widget (exportwin_xml, "term_combo"); + str = (gchar *) gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->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)); + combo = glade_xml_get_widget (exportwin_xml, "quote_combo"); + str = (gchar *) gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->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)); + combo = glade_xml_get_widget (exportwin_xml, "qchar_combo"); + str = (gchar *) gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->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; + checkbox = glade_xml_get_widget (exportwin_xml, "header_checkbox"); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox))) + need_headers = 1; + else + need_headers = 0; + + fentry = glade_xml_get_widget (exportwin_xml, "filename_entry"); + file_path = (gchar *) gtk_entry_get_text(GTK_ENTRY(fentry)); - 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!"); @@ -99,7 +99,7 @@ char msg[100]; } /* read table */ - table = mdb_read_table(export->entry); + table = mdb_read_table(cat_entry); mdb_read_columns(table); mdb_rewind_table(table); @@ -138,76 +138,34 @@ char msg[100]; } fclose(outfile); - gtk_widget_destroy(export->dialog); + exportwin = glade_xml_get_widget (exportwin_xml, "export_dialog"); + gtk_widget_destroy(exportwin); 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; +GtkWidget *combo; - export = g_malloc(sizeof(GMdbTableExportDialog)); - export->entry = entry; + cat_entry = entry; + + /* load the interface */ + exportwin_xml = glade_xml_new("gladefiles/gmdb-export.glade", NULL, NULL); + /* connect the signals in the interface */ + glade_xml_signal_autoconnect(exportwin_xml); + /* 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); - + combo = glade_xml_get_widget (exportwin_xml, "term_combo"); 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); + gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist); g_list_free(glist); - gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(export->lineterm)->entry), FALSE); + combo = glade_xml_get_widget (exportwin_xml, "sep_combo"); glist = NULL; glist = g_list_append(glist, COMMA); glist = g_list_append(glist, TAB); @@ -215,46 +173,22 @@ GtkWidget *table; 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); + gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist); g_list_free(glist); + combo = glade_xml_get_widget (exportwin_xml, "quote_combo"); 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); + gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist); g_list_free(glist); - gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(export->quote)->entry), FALSE); + combo = glade_xml_get_widget (exportwin_xml, "qchar_combo"); 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); + gtk_combo_set_popdown_strings(GTK_COMBO(combo), 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/libmdb/write.c b/src/libmdb/write.c index 39c430b..2f2a4ab 100644 --- a/src/libmdb/write.c +++ b/src/libmdb/write.c @@ -28,6 +28,7 @@ typedef struct { int siz; unsigned char is_null; unsigned char is_fixed; + int colnum; } MdbField; static int @@ -44,26 +45,17 @@ MdbIndex *idx; } 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 var_cols, fixed_cols, num_cols, i, totcols; +unsigned char *nullmask; int bitmask_sz; +int byte_num, bit_num; + printf("field 0 %s\n", fields[0].value); @@ -73,20 +65,36 @@ int bitmask_sz; num_cols = mdb->pg_buf[row_start]; } + totcols = 0; 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)) + if (mdb_is_fixed_col(col)) { fixed_cols++; - else + fields[totcols++].colnum = i; + fields[totcols].siz = col->col_size; + fields[totcols].is_fixed = 1; + } + } + for (i = 0; i < table->num_cols; i++) { + col = g_ptr_array_index (table->columns, i); + if (!mdb_is_fixed_col(col)) { var_cols++; + fields[totcols++].colnum = i; + fields[totcols].is_fixed = 0; + } } bitmask_sz = (num_cols - 1) / 8 + 1; + nullmask = &mdb->pg_buf[row_end - bitmask_sz + 1]; - for (i=0;ipg_buf[row_end - bitmask_sz + i + 1]; + for (i=0;i []\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) {