mirror of
https://github.com/mdbtools/mdbtools.git
synced 2026-03-10 00:20:54 +08:00
commiting gmdb
doc updates odbc fixes
This commit is contained in:
11
src/Makefile
11
src/Makefile
@@ -1,7 +1,7 @@
|
||||
# Generated automatically from Makefile.in by configure.
|
||||
# Makefile.in generated automatically by automake 1.4 from Makefile.am
|
||||
# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
@@ -62,6 +62,7 @@ host_triplet = i686-pc-linux-gnu
|
||||
AS = @AS@
|
||||
CC = gcc
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME =
|
||||
LD = /usr/bin/ld
|
||||
LEX = flex
|
||||
LIBTOOL = $(SHELL) $(top_builddir)/libtool
|
||||
@@ -78,9 +79,9 @@ SQL =
|
||||
VERSION = 0.3
|
||||
YACC = bison -y
|
||||
SUBDIRS = libmdb sql util extras
|
||||
#SUBDIRS = libmdb util extras
|
||||
#SUBDIRS = #libmdb util extras
|
||||
DEFDIR = $(prefix)
|
||||
#DEFDIR = $(prefix)
|
||||
#DEFDIR = #$(prefix)
|
||||
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||
CONFIG_CLEAN_FILES =
|
||||
DIST_COMMON = Makefile.am Makefile.in
|
||||
@@ -137,7 +138,7 @@ maintainer-clean-recursive:
|
||||
dot_seen=no; \
|
||||
rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
rev="$$subdir $$rev"; \
|
||||
test "$$subdir" = "." && dot_seen=yes; \
|
||||
test "$$subdir" != "." || dot_seen=yes; \
|
||||
done; \
|
||||
test "$$dot_seen" = "no" && rev=". $$rev"; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Makefile.in generated automatically by automake 1.4 from Makefile.am
|
||||
# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
@@ -62,6 +62,7 @@ host_triplet = @host@
|
||||
AS = @AS@
|
||||
CC = @CC@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME = @HAVE_GNOME@
|
||||
LD = @LD@
|
||||
LEX = @LEX@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
@@ -77,10 +78,10 @@ READLINE_LIBS = @READLINE_LIBS@
|
||||
SQL = @SQL@
|
||||
VERSION = @VERSION@
|
||||
YACC = @YACC@
|
||||
@SQL_TRUE@SUBDIRS = libmdb sql util extras
|
||||
@SQL_FALSE@SUBDIRS = libmdb util extras
|
||||
@SQL_TRUE@DEFDIR = $(prefix)
|
||||
@SQL_FALSE@DEFDIR = $(prefix)
|
||||
@SQL_TRUE@SUBDIRS = @SQL_TRUE@libmdb sql util extras
|
||||
@SQL_FALSE@SUBDIRS = @SQL_FALSE@libmdb util extras
|
||||
@SQL_TRUE@DEFDIR = @SQL_TRUE@$(prefix)
|
||||
@SQL_FALSE@DEFDIR = @SQL_FALSE@$(prefix)
|
||||
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||
CONFIG_CLEAN_FILES =
|
||||
DIST_COMMON = Makefile.am Makefile.in
|
||||
@@ -137,7 +138,7 @@ maintainer-clean-recursive:
|
||||
dot_seen=no; \
|
||||
rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
rev="$$subdir $$rev"; \
|
||||
test "$$subdir" = "." && dot_seen=yes; \
|
||||
test "$$subdir" != "." || dot_seen=yes; \
|
||||
done; \
|
||||
test "$$dot_seen" = "no" && rev=". $$rev"; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Generated automatically from Makefile.in by configure.
|
||||
# Makefile.in generated automatically by automake 1.4 from Makefile.am
|
||||
# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
@@ -62,6 +62,7 @@ host_triplet = i686-pc-linux-gnu
|
||||
AS = @AS@
|
||||
CC = gcc
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME =
|
||||
LD = /usr/bin/ld
|
||||
LEX = flex
|
||||
LIBTOOL = $(SHELL) $(top_builddir)/libtool
|
||||
@@ -95,7 +96,7 @@ mdb_dump_OBJECTS = mdb-dump.o mdbsupport.o
|
||||
mdb_dump_LDADD = $(LDADD)
|
||||
mdb_dump_DEPENDENCIES = ../libmdb/libmdb.la
|
||||
mdb_dump_LDFLAGS =
|
||||
CFLAGS = -g -O2 -DUNIXODBC -DSQL
|
||||
CFLAGS = -g -O2 -DUNIXODBC -DSQL -DHAVE_GNOME
|
||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
CCLD = $(CC)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Makefile.in generated automatically by automake 1.4 from Makefile.am
|
||||
# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
@@ -62,6 +62,7 @@ host_triplet = @host@
|
||||
AS = @AS@
|
||||
CC = @CC@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME = @HAVE_GNOME@
|
||||
LD = @LD@
|
||||
LEX = @LEX@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
|
||||
10
src/gmdb/Makefile.am
Normal file
10
src/gmdb/Makefile.am
Normal file
@@ -0,0 +1,10 @@
|
||||
bin_PROGRAMS = gmdb
|
||||
gmdb_SOURCES = debug.c file.c form.c gtkhlist.c info.c macro.c main.c \
|
||||
module.c query.c report.c sql.c table.c table_data.c table_def.c \
|
||||
table_export.c util.c
|
||||
LIBS = `gnome-config gnome gnomeui --libs` @LEXLIB@
|
||||
INCLUDES = -I$(top_srcdir)/include `gnome-config gnome gnomeui --cflags`
|
||||
LDADD = ../libmdb/libmdb.la
|
||||
if SQL
|
||||
gmdb_LDADD = ../libmdb/libmdb.la ../sql/libmdbsql.la
|
||||
endif
|
||||
22
src/gmdb/code.xpm
Normal file
22
src/gmdb/code.xpm
Normal file
@@ -0,0 +1,22 @@
|
||||
/* XPM */
|
||||
static char * code_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c None",
|
||||
". c #000000",
|
||||
"+ c #777777",
|
||||
" ",
|
||||
" ",
|
||||
" .. ",
|
||||
" .++. ",
|
||||
" . . . ",
|
||||
" . .. ..",
|
||||
" . .+ +.",
|
||||
".... . .+ +. .",
|
||||
" . . .+. .",
|
||||
" . .+ +.+ +.",
|
||||
" . .. +. .+ ..",
|
||||
" . . . . . ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
||||
495
src/gmdb/debug.c
Normal file
495
src/gmdb/debug.c
Normal file
@@ -0,0 +1,495 @@
|
||||
#include "gmdb.h"
|
||||
#include "gtkhlist.h"
|
||||
#include "debug.xpm"
|
||||
|
||||
extern GtkWidget *app;
|
||||
extern MdbHandle *mdb;
|
||||
|
||||
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;
|
||||
|
||||
void gmdb_debug_redraw(GtkWidget *textbox, GdkFont *font,
|
||||
GdkColor *fg, GdkColor *bg, int start_byte, int end_byte);
|
||||
GtkCTreeNode *gmdb_debug_add_item(GMdbDebugTab *dbug, GtkCTreeNode *parent, gchar *text, int start, int end);
|
||||
void gmdb_debug_clear(GMdbDebugTab *dbug);
|
||||
void gmdb_debug_dissect(GMdbDebugTab *dbug, 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);
|
||||
|
||||
/* value to string stuff */
|
||||
typedef struct GMdbValStr {
|
||||
gint value;
|
||||
gchar *string;
|
||||
} GMdbValStr;
|
||||
|
||||
GMdbValStr table_types[] = {
|
||||
{ 0x4e, "System Table" },
|
||||
{ 0x53, "User Table" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
GMdbValStr object_types[] = {
|
||||
{ 0x00, "Database Definition Page" },
|
||||
{ 0x01, "Data Page" },
|
||||
{ 0x02, "Table Definition Page" },
|
||||
{ 0x03, "Index Page" },
|
||||
{ 0x03, "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));
|
||||
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_redraw(dbug->textbox, dbug->font, &dbug->white, &dbug->black,
|
||||
dbug->linesz * start_row + start_col,
|
||||
dbug->linesz * start_row + end_col + 2);
|
||||
} else {
|
||||
gmdb_debug_redraw(dbug->textbox, dbug->font, &dbug->white, &dbug->black,
|
||||
dbug->linesz * start_row + start_col,
|
||||
/* 55 = 8 (addr) + 15 (bytes) * 3 (%02x " ") + 2 (last byte) */
|
||||
dbug->linesz * start_row + 55);
|
||||
for (i=start_row + 1; i < end_row; i++) {
|
||||
gmdb_debug_redraw(dbug->textbox, dbug->font,
|
||||
&dbug->white, &dbug->black,
|
||||
dbug->linesz * i + 8, dbug->linesz * i + 55);
|
||||
}
|
||||
gmdb_debug_redraw(dbug->textbox, dbug->font, &dbug->white, &dbug->black,
|
||||
dbug->linesz * end_row + 8,
|
||||
dbug->linesz * end_row + end_col + 2);
|
||||
}
|
||||
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));
|
||||
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_redraw(dbug->textbox, dbug->font, &dbug->black, &dbug->white,
|
||||
dbug->linesz * start_row + start_col,
|
||||
dbug->linesz * start_row + end_col + 2);
|
||||
} else {
|
||||
gmdb_debug_redraw(dbug->textbox, dbug->font, &dbug->black, &dbug->white,
|
||||
dbug->linesz * start_row + start_col,
|
||||
/* 55 = 8 (addr) + 15 (bytes) * 3 (%02x " ") + 2 (last byte) */
|
||||
dbug->linesz * start_row + 55);
|
||||
for (i=start_row + 1; i < end_row; i++) {
|
||||
gmdb_debug_redraw(dbug->textbox, dbug->font,
|
||||
&dbug->black, &dbug->white,
|
||||
dbug->linesz * i + 8, dbug->linesz * i + 55);
|
||||
}
|
||||
gmdb_debug_redraw(dbug->textbox, dbug->font, &dbug->black, &dbug->white,
|
||||
dbug->linesz * end_row + 8,
|
||||
dbug->linesz * end_row + end_col + 2);
|
||||
}
|
||||
}
|
||||
void
|
||||
gmdb_debug_display_cb(GtkWidget *w, GMdbDebugTab *dbug)
|
||||
{
|
||||
int page;
|
||||
off_t pos;
|
||||
unsigned char *fbuf;
|
||||
unsigned char *tbuf;
|
||||
int i,j;
|
||||
int length;
|
||||
char line[80];
|
||||
char field[10];
|
||||
|
||||
gmdb_debug_clear(dbug);
|
||||
|
||||
page = atol(gtk_entry_get_text(GTK_ENTRY(dbug->entry)));
|
||||
if (page>dbug->max_page || page<0) {
|
||||
gmdb_info_msg("Page entered is outside valid page range.");
|
||||
}
|
||||
|
||||
|
||||
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 (length<mdb->pg_size) {
|
||||
}
|
||||
i = 0;
|
||||
while (i<length) {
|
||||
sprintf(line,"%06x ", i);
|
||||
|
||||
for(j=0; j<16; j++) {
|
||||
sprintf(field, "%02x ", fbuf[i+j]);
|
||||
strcat(line,field);
|
||||
}
|
||||
|
||||
strcat(line, " |");
|
||||
|
||||
for(j=0; j<16; j++) {
|
||||
sprintf(field, "%c", (isprint(fbuf[i+j])) ? fbuf[i+j] : '.');
|
||||
strcat(line,field);
|
||||
}
|
||||
strcat(line, "|\n");
|
||||
i += 16;
|
||||
strcat(tbuf, line);
|
||||
if (!dbug->linesz) dbug->linesz = strlen(line);
|
||||
}
|
||||
gtk_text_insert (GTK_TEXT (dbug->textbox), dbug->font,
|
||||
&dbug->black, &dbug->white,
|
||||
tbuf, strlen(tbuf));
|
||||
//gtk_editable_select_region(GTK_EDITABLE(dbug->textbox), 9, 15);
|
||||
gmdb_debug_dissect(dbug, fbuf, 0, length);
|
||||
free(fbuf);
|
||||
free(tbuf);
|
||||
}
|
||||
|
||||
/* functions */
|
||||
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_index1(GMdbDebugTab *dbug, GtkCTreeNode *parent, char *fbuf, int offset)
|
||||
{
|
||||
gchar str[100];
|
||||
GtkCTreeNode *node;
|
||||
|
||||
snprintf(str, 100, "Unknown");
|
||||
gmdb_debug_add_item(dbug, parent, str, offset, offset+3);
|
||||
snprintf(str, 100, "Rows in Index: %lu", get_uint32(&fbuf[offset+4]));
|
||||
gmdb_debug_add_item(dbug, parent, str, offset+4, offset+7);
|
||||
}
|
||||
void
|
||||
gmdb_debug_add_page_ptr(GMdbDebugTab *dbug, GtkCTreeNode *parent, char *fbuf, const char *label, int offset)
|
||||
{
|
||||
gchar str[100];
|
||||
GtkCTreeNode *node;
|
||||
|
||||
snprintf(str, 100, "%s", label);
|
||||
node = gmdb_debug_add_item(dbug, parent, str, offset, offset+3);
|
||||
|
||||
snprintf(str, 100, "Row Number: %u", fbuf[offset]);
|
||||
gmdb_debug_add_item(dbug, node, str, offset, offset);
|
||||
snprintf(str, 100, "Page Number: %lu", get_uint24(&fbuf[offset+1]));
|
||||
gmdb_debug_add_item(dbug, node, str, offset+1, offset+3);
|
||||
}
|
||||
void
|
||||
gmdb_debug_dissect_tabledef_pg(GMdbDebugTab *dbug, char *fbuf, int offset, int len)
|
||||
{
|
||||
gchar str[100];
|
||||
guint32 i, num_idx;
|
||||
int newbase;
|
||||
GtkCTreeNode *node;
|
||||
|
||||
snprintf(str, 100, "Next TDEF Page: 0x%06x (%lu)",
|
||||
get_uint32(&fbuf[offset+4]), get_uint32(&fbuf[offset+4]));
|
||||
gmdb_debug_add_item(dbug, NULL, str, offset+4, offset+7);
|
||||
snprintf(str, 100, "Length of Data: %lu", get_uint32(&fbuf[offset+8]));
|
||||
gmdb_debug_add_item(dbug, NULL, str, offset+8, offset+11);
|
||||
snprintf(str, 100, "# of Records: %lu", get_uint32(&fbuf[offset+12]));
|
||||
gmdb_debug_add_item(dbug, NULL, str, offset+12, offset+15);
|
||||
snprintf(str, 100, "Autonumber Value: %lu", get_uint32(&fbuf[offset+16]));
|
||||
gmdb_debug_add_item(dbug, 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(dbug, NULL, str, offset+20, offset+20);
|
||||
snprintf(str, 100, "# of Columns: %u",
|
||||
get_uint16(&fbuf[offset+21]));
|
||||
gmdb_debug_add_item(dbug, NULL, str, offset+21, offset+22);
|
||||
snprintf(str, 100, "# of VarCols: %u",
|
||||
get_uint16(&fbuf[offset+23]));
|
||||
gmdb_debug_add_item(dbug, NULL, str, offset+23, offset+24);
|
||||
snprintf(str, 100, "# of Columns: %u",
|
||||
get_uint16(&fbuf[offset+25]));
|
||||
gmdb_debug_add_item(dbug, NULL, str, offset+25, offset+26);
|
||||
snprintf(str, 100, "# of Index Entries: %lu",
|
||||
get_uint32(&fbuf[offset+27]));
|
||||
gmdb_debug_add_item(dbug, 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(dbug, NULL, str, offset+31, offset+34);
|
||||
gmdb_debug_add_page_ptr(dbug, NULL, fbuf, "Used Pages Pointer", offset+35);
|
||||
|
||||
for (i=0;i<num_idx;i++) {
|
||||
snprintf(str, 100, "Index %d", i);
|
||||
node = gmdb_debug_add_item(dbug, NULL, str, offset+43+(8*i), offset+43+(8*i)+8);
|
||||
gmdb_debug_dissect_index1(dbug, node, fbuf, offset+43+(8*i));
|
||||
}
|
||||
newbase = offset + 43 + (8*i);
|
||||
}
|
||||
void gmdb_debug_dissect(GMdbDebugTab *dbug, char *fbuf, int offset, int len)
|
||||
{
|
||||
gchar str[100];
|
||||
|
||||
snprintf(str, 100, "Object Type: 0x%02x (%s)", fbuf[offset],
|
||||
gmdb_val_to_str(object_types, fbuf[offset]));
|
||||
gmdb_debug_add_item(dbug, NULL, str, 0, 0);
|
||||
switch (fbuf[offset]) {
|
||||
case 0x00:
|
||||
//gmdb_debug_dissect_dbpage(dbug, fbuf, 1, len);
|
||||
break;
|
||||
case 0x01:
|
||||
//gmdb_debug_dissect_dbpage(dbug, fbuf, 1, len);
|
||||
break;
|
||||
case 0x02:
|
||||
gmdb_debug_dissect_tabledef_pg(dbug, fbuf, 0, len);
|
||||
break;
|
||||
case 0x03:
|
||||
//gmdb_debug_dissect_dbpage(dbug, fbuf, 1, len);
|
||||
break;
|
||||
case 0x04:
|
||||
//gmdb_debug_dissect_dbpage(dbug, fbuf, 1, len);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gmdb_debug_clear(GMdbDebugTab *dbug)
|
||||
{
|
||||
GtkCTreeNode *node;
|
||||
gpointer data;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
GtkCTreeNode *
|
||||
gmdb_debug_add_item(GMdbDebugTab *dbug, GtkCTreeNode *parent, gchar *text, int start, int end)
|
||||
{
|
||||
gchar *nodetext[2];
|
||||
GtkCTreeNode *node;
|
||||
GMdbDebugRange *range;
|
||||
|
||||
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);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
void
|
||||
gmdb_debug_redraw(GtkWidget *textbox,
|
||||
GdkFont *font, GdkColor *fg, GdkColor *bg,
|
||||
int start_byte, int end_byte)
|
||||
{
|
||||
gchar *text;
|
||||
|
||||
gtk_text_set_point(GTK_TEXT(textbox), start_byte);
|
||||
text = gtk_editable_get_chars(GTK_EDITABLE(textbox), start_byte, end_byte);
|
||||
gtk_text_forward_delete(GTK_TEXT(textbox), end_byte - start_byte);
|
||||
gtk_text_insert (GTK_TEXT (textbox), font, fg, bg, text, strlen(text));
|
||||
g_free(text);
|
||||
}
|
||||
|
||||
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;
|
||||
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);
|
||||
|
||||
dbug->ctree = gtk_ctree_new (1, 0);
|
||||
gtk_widget_show (dbug->ctree);
|
||||
gtk_container_add (GTK_CONTAINER (hpane), 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);
|
||||
|
||||
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(frame), scroll);
|
||||
|
||||
dbug->textbox = gtk_text_new (NULL,NULL);
|
||||
gtk_widget_show (dbug->textbox);
|
||||
gtk_container_add(GTK_CONTAINER(scroll), dbug->textbox);
|
||||
|
||||
/* set selection callback for list */
|
||||
//gtk_signal_connect ( GTK_OBJECT (table_hlist),
|
||||
// "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);
|
||||
}
|
||||
|
||||
void gmdb_debug_init(MdbHandle *mdb)
|
||||
{
|
||||
struct stat st;
|
||||
char tmpstr[100];
|
||||
|
||||
assert( fstat(mdb->fd, &st)!=-1 );
|
||||
dbug->max_page = st.st_size/mdb->pg_size;
|
||||
sprintf(tmpstr, "(0-%d):", dbug->max_page);
|
||||
gtk_label_set_text(GTK_LABEL(dbug->pglabel), tmpstr);
|
||||
gtk_widget_grab_focus(GTK_WIDGET(dbug->entry));
|
||||
}
|
||||
23
src/gmdb/debug.xpm
Normal file
23
src/gmdb/debug.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static char * debug_xpm[] = {
|
||||
"16 16 4 1",
|
||||
" c None",
|
||||
". c #ED2D2D",
|
||||
"+ c #635757",
|
||||
"@ c #000000",
|
||||
" ",
|
||||
" ..... ",
|
||||
" ... ... ",
|
||||
" .. +@+ .. ",
|
||||
" .... @@@ .. ",
|
||||
" .@+..+@+ +@. ",
|
||||
".. @+..@@ +@ .. ",
|
||||
". @@..@@@ . ",
|
||||
". @@..@ . ",
|
||||
". @@@@@@..@@@ . ",
|
||||
".. @@@@.. .. ",
|
||||
" . @@@@@@.. . ",
|
||||
" ..@+ @@@ +... ",
|
||||
" .. .. ",
|
||||
" ... ... ",
|
||||
" ..... "};
|
||||
61
src/gmdb/file.c
Normal file
61
src/gmdb/file.c
Normal file
@@ -0,0 +1,61 @@
|
||||
#include "gmdb.h"
|
||||
#include <mdbtools.h>
|
||||
|
||||
GtkWidget *file_selector;
|
||||
MdbHandle *mdb;
|
||||
extern int main_show_debug;
|
||||
|
||||
void
|
||||
gmdb_file_open(gchar *file_path)
|
||||
{
|
||||
mdb = mdb_open(file_path);
|
||||
if (!mdb) {
|
||||
gmdb_info_msg("Unable to open file.");
|
||||
return;
|
||||
}
|
||||
sql->mdb = mdb;
|
||||
mdb_read_catalog(mdb, MDB_TABLE);
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
}
|
||||
53
src/gmdb/form.c
Normal file
53
src/gmdb/form.c
Normal file
@@ -0,0 +1,53 @@
|
||||
#include "gmdb.h"
|
||||
#include "gtkhlist.h"
|
||||
|
||||
GtkWidget *form_hlist;
|
||||
extern GtkWidget *app;
|
||||
|
||||
void
|
||||
gmdb_form_add_icon(gchar *text)
|
||||
{
|
||||
GList *glist = NULL;
|
||||
GtkWidget *li;
|
||||
GtkWidget *label;
|
||||
GtkWidget *box;
|
||||
GtkWidget *pixmapwid;
|
||||
GdkPixmap *pixmap;
|
||||
GdkBitmap *mask;
|
||||
|
||||
li = gtk_list_item_new ();
|
||||
box = gtk_hbox_new (FALSE,5);
|
||||
pixmap = gdk_pixmap_colormap_create_from_xpm( NULL,
|
||||
gtk_widget_get_colormap(app), &mask, NULL, "table.xpm");
|
||||
|
||||
/* a pixmap widget to contain the pixmap */
|
||||
pixmapwid = gtk_pixmap_new( pixmap, mask );
|
||||
gtk_widget_show( pixmapwid );
|
||||
gtk_box_pack_start (GTK_BOX (box), pixmapwid, FALSE, TRUE, 0);
|
||||
|
||||
label = gtk_label_new (text);
|
||||
gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(li), box);
|
||||
glist = g_list_append (glist, li);
|
||||
gtk_widget_show (label);
|
||||
gtk_widget_show_all (li);
|
||||
gtk_hlist_append_items(GTK_HLIST(form_hlist), glist);
|
||||
}
|
||||
|
||||
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 */
|
||||
}
|
||||
126
src/gmdb/forms.xpm
Normal file
126
src/gmdb/forms.xpm
Normal file
@@ -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 "};
|
||||
59
src/gmdb/gmdb.h
Normal file
59
src/gmdb/gmdb.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#include <mdbtools.h>
|
||||
#include <mdbsql.h>
|
||||
#include <assert.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#ifdef HAVE_GNOME
|
||||
#include <gnome.h>
|
||||
#endif
|
||||
|
||||
#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_hlist;
|
||||
extern GtkWidget *form_hlist;
|
||||
extern GtkWidget *query_hlist;
|
||||
extern GtkWidget *report_hlist;
|
||||
extern GtkWidget *macro_hlist;
|
||||
extern GtkWidget *module_hlist;
|
||||
|
||||
extern MdbSQL *sql;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif
|
||||
2825
src/gmdb/gtkhlist.c
Normal file
2825
src/gmdb/gtkhlist.c
Normal file
File diff suppressed because it is too large
Load Diff
148
src/gmdb/gtkhlist.h
Normal file
148
src/gmdb/gtkhlist.h
Normal file
@@ -0,0 +1,148 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
|
||||
* file for a list of people on the GTK+ Team. See the ChangeLog
|
||||
* files for a list of changes. These files are distributed with
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_HLIST_H__
|
||||
#define __GTK_HLIST_H__
|
||||
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gtk/gtkenums.h>
|
||||
#include <gtk/gtkcontainer.h>
|
||||
#include <gtk/gtklistitem.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#define GTK_TYPE_HLIST (gtk_hlist_get_type ())
|
||||
#define GTK_HLIST(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_HLIST, GtkHList))
|
||||
#define GTK_HLIST_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_HLIST, GtkHListClass))
|
||||
#define GTK_IS_HLIST(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_HLIST))
|
||||
#define GTK_IS_HLIST_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_HLIST))
|
||||
|
||||
|
||||
typedef struct _GtkHList GtkHList;
|
||||
typedef struct _GtkHListClass GtkHListClass;
|
||||
|
||||
struct _GtkHList
|
||||
{
|
||||
GtkContainer container;
|
||||
|
||||
GList *children;
|
||||
GList *selection;
|
||||
|
||||
GList *undo_selection;
|
||||
GList *undo_unselection;
|
||||
|
||||
GtkWidget *last_focus_child;
|
||||
GtkWidget *undo_focus_child;
|
||||
|
||||
guint htimer;
|
||||
guint vtimer;
|
||||
|
||||
gint anchor;
|
||||
gint drag_pos;
|
||||
GtkStateType anchor_state;
|
||||
|
||||
guint selection_mode : 2;
|
||||
guint drag_selection:1;
|
||||
guint add_mode:1;
|
||||
|
||||
gboolean horizontal;
|
||||
guint horiz_spacing;
|
||||
};
|
||||
|
||||
struct _GtkHListClass
|
||||
{
|
||||
GtkContainerClass parent_class;
|
||||
|
||||
void (* selection_changed) (GtkHList *list);
|
||||
void (* select_child) (GtkHList *list,
|
||||
GtkWidget *child);
|
||||
void (* unselect_child) (GtkHList *list,
|
||||
GtkWidget *child);
|
||||
};
|
||||
|
||||
|
||||
GtkType gtk_hlist_get_type (void);
|
||||
GtkWidget* gtk_hlist_new (void);
|
||||
void gtk_hlist_insert_items (GtkHList *list,
|
||||
GList *items,
|
||||
gint position);
|
||||
void gtk_hlist_append_items (GtkHList *list,
|
||||
GList *items);
|
||||
void gtk_hlist_prepend_items (GtkHList *list,
|
||||
GList *items);
|
||||
void gtk_hlist_remove_items (GtkHList *list,
|
||||
GList *items);
|
||||
void gtk_hlist_remove_items_no_unref (GtkHList *list,
|
||||
GList *items);
|
||||
void gtk_hlist_clear_items (GtkHList *list,
|
||||
gint start,
|
||||
gint end);
|
||||
void gtk_hlist_select_item (GtkHList *list,
|
||||
gint item);
|
||||
void gtk_hlist_unselect_item (GtkHList *list,
|
||||
gint item);
|
||||
void gtk_hlist_select_child (GtkHList *list,
|
||||
GtkWidget *child);
|
||||
void gtk_hlist_unselect_child (GtkHList *list,
|
||||
GtkWidget *child);
|
||||
gint gtk_hlist_child_position (GtkHList *list,
|
||||
GtkWidget *child);
|
||||
void gtk_hlist_set_selection_mode (GtkHList *list,
|
||||
GtkSelectionMode mode);
|
||||
void gtk_hlist_set_horizontal_mode (GtkHList *list,
|
||||
gboolean horiz);
|
||||
|
||||
void gtk_hlist_extend_selection (GtkHList *list,
|
||||
GtkScrollType scroll_type,
|
||||
gfloat position,
|
||||
gboolean auto_start_selection);
|
||||
void gtk_hlist_start_selection (GtkHList *list);
|
||||
void gtk_hlist_end_selection (GtkHList *list);
|
||||
void gtk_hlist_select_all (GtkHList *list);
|
||||
void gtk_hlist_unselect_all (GtkHList *list);
|
||||
void gtk_hlist_scroll_horizontal (GtkHList *list,
|
||||
GtkScrollType scroll_type,
|
||||
gfloat position);
|
||||
void gtk_hlist_scroll_vertical (GtkHList *list,
|
||||
GtkScrollType scroll_type,
|
||||
gfloat position);
|
||||
void gtk_hlist_toggle_add_mode (GtkHList *list);
|
||||
void gtk_hlist_toggle_focus_row (GtkHList *list);
|
||||
void gtk_hlist_toggle_row (GtkHList *list,
|
||||
GtkWidget *item);
|
||||
void gtk_hlist_undo_selection (GtkHList *list);
|
||||
void gtk_hlist_end_drag_selection (GtkHList *list);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif /* __GTK_HLIST_H__ */
|
||||
89
src/gmdb/info.c
Normal file
89
src/gmdb/info.c
Normal file
@@ -0,0 +1,89 @@
|
||||
#include "gmdb.h"
|
||||
#include "gtkhlist.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;
|
||||
}
|
||||
53
src/gmdb/macro.c
Normal file
53
src/gmdb/macro.c
Normal file
@@ -0,0 +1,53 @@
|
||||
#include "gmdb.h"
|
||||
#include "gtkhlist.h"
|
||||
|
||||
GtkWidget *macro_hlist;
|
||||
extern GtkWidget *app;
|
||||
|
||||
void
|
||||
gmdb_macro_add_icon(gchar *text)
|
||||
{
|
||||
GList *glist = NULL;
|
||||
GtkWidget *li;
|
||||
GtkWidget *label;
|
||||
GtkWidget *box;
|
||||
GtkWidget *pixmapwid;
|
||||
GdkPixmap *pixmap;
|
||||
GdkBitmap *mask;
|
||||
|
||||
li = gtk_list_item_new ();
|
||||
box = gtk_hbox_new (FALSE,5);
|
||||
pixmap = gdk_pixmap_colormap_create_from_xpm( NULL,
|
||||
gtk_widget_get_colormap(app), &mask, NULL, "table.xpm");
|
||||
|
||||
/* a pixmap widget to contain the pixmap */
|
||||
pixmapwid = gtk_pixmap_new( pixmap, mask );
|
||||
gtk_widget_show( pixmapwid );
|
||||
gtk_box_pack_start (GTK_BOX (box), pixmapwid, FALSE, TRUE, 0);
|
||||
|
||||
label = gtk_label_new (text);
|
||||
gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(li), box);
|
||||
glist = g_list_append (glist, li);
|
||||
gtk_widget_show (label);
|
||||
gtk_widget_show_all (li);
|
||||
gtk_hlist_append_items(GTK_HLIST(macro_hlist), glist);
|
||||
}
|
||||
|
||||
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 */
|
||||
}
|
||||
137
src/gmdb/macros.xpm
Normal file
137
src/gmdb/macros.xpm
Normal file
@@ -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 /.<.[.}. "};
|
||||
322
src/gmdb/main.c
Normal file
322
src/gmdb/main.c
Normal file
@@ -0,0 +1,322 @@
|
||||
#include "gtkhlist.h"
|
||||
#include <mdbtools.h>
|
||||
#include <mdbsql.h>
|
||||
#include "gmdb.h"
|
||||
#include "code.xpm"
|
||||
#include "forms.xpm"
|
||||
#include "macros.xpm"
|
||||
#include "query.xpm"
|
||||
#include "reports.xpm"
|
||||
|
||||
|
||||
GtkWidget *app;
|
||||
MdbSQL *sql;
|
||||
|
||||
GtkWidget *main_notebook;
|
||||
int main_show_debug;
|
||||
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
static void
|
||||
gmdb_info_cb(GtkWidget *button, gpointer data)
|
||||
{
|
||||
gmdb_info_new();
|
||||
}
|
||||
|
||||
/* show the debug tab */
|
||||
static void
|
||||
show_debug_cb(GtkWidget *button, gpointer data)
|
||||
{
|
||||
if (main_show_debug) {
|
||||
main_show_debug = 0;
|
||||
gtk_notebook_remove_page(GTK_NOTEBOOK(main_notebook), 6);
|
||||
} else {
|
||||
main_show_debug = 1;
|
||||
gmdb_debug_tab_new(main_notebook);
|
||||
gtk_notebook_set_page(GTK_NOTEBOOK(main_notebook), -1);
|
||||
}
|
||||
}
|
||||
/* a callback for the buttons */
|
||||
static void
|
||||
gmdb_about_cb(GtkWidget *button, gpointer data)
|
||||
{
|
||||
const gchar *authors[] = {
|
||||
"Brian Bruns",
|
||||
NULL
|
||||
};
|
||||
#ifdef HAVE_GNOME
|
||||
gtk_widget_show (gnome_about_new ("Gtk MDB Viewer", "0.1",
|
||||
"Copyright 2002 Brian Bruns",
|
||||
(const gchar **) authors,
|
||||
_("The Gtk-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."),
|
||||
NULL));
|
||||
#else
|
||||
gmdb_info_msg("Gtk MDB Viewer 0.1\nCopyright 2002 Brian Bruns\n"
|
||||
"The Gtk-MDB Viewer is the grapical interface to\n"
|
||||
"MDB Tools. It lets you view, print and export data\n"
|
||||
"from MDB files produced by MS Access 97/2000/XP.\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
/* a callback for the buttons */
|
||||
static void
|
||||
a_callback(GtkWidget *button, gpointer data)
|
||||
{
|
||||
|
||||
/*just print a string so that we know we got there*/
|
||||
g_print("Inside Callback\n");
|
||||
}
|
||||
|
||||
#ifdef HAVE_GNOME
|
||||
|
||||
GnomeUIInfo file_menu[] = {
|
||||
GNOMEUIINFO_MENU_OPEN_ITEM(gmdb_file_select_cb, "Open Database..."),
|
||||
GNOMEUIINFO_MENU_CLOSE_ITEM(gmdb_file_close_cb, "Close Database"),
|
||||
GNOMEUIINFO_SEPARATOR,
|
||||
GNOMEUIINFO_MENU_PRINT_SETUP_ITEM(a_callback, NULL),
|
||||
GNOMEUIINFO_MENU_PRINT_ITEM("Print...",NULL),
|
||||
GNOMEUIINFO_SEPARATOR,
|
||||
GNOMEUIINFO_MENU_EXIT_ITEM(gtk_main_quit,NULL),
|
||||
GNOMEUIINFO_END
|
||||
};
|
||||
|
||||
GnomeUIInfo edit_menu[] = {
|
||||
GNOMEUIINFO_MENU_UNDO_ITEM("Undo", a_callback),
|
||||
GNOMEUIINFO_SEPARATOR,
|
||||
GNOMEUIINFO_MENU_CUT_ITEM("Cut",a_callback),
|
||||
GNOMEUIINFO_MENU_COPY_ITEM("Copy", a_callback),
|
||||
GNOMEUIINFO_MENU_PASTE_ITEM("Paste", a_callback),
|
||||
GNOMEUIINFO_END
|
||||
};
|
||||
GnomeUIInfo view_menu[] = {
|
||||
GNOMEUIINFO_ITEM_NONE("File _Info","Display Information about MDB File",
|
||||
gmdb_info_cb),
|
||||
GNOMEUIINFO_ITEM_NONE("_Debug Tab","Show file debugger tab",
|
||||
show_debug_cb),
|
||||
GNOMEUIINFO_END
|
||||
};
|
||||
GnomeUIInfo tools_menu[] = {
|
||||
GNOMEUIINFO_ITEM_NONE("S_QL Window...","Run SQL Query Tool", gmdb_sql_new_window_cb),
|
||||
GNOMEUIINFO_ITEM_NONE("E_xport Schema...","Export the database schema DDL to a file",
|
||||
a_callback),
|
||||
GNOMEUIINFO_END
|
||||
};
|
||||
|
||||
GnomeUIInfo help_menu[] = {
|
||||
GNOMEUIINFO_MENU_ABOUT_ITEM(gmdb_about_cb, NULL),
|
||||
GNOMEUIINFO_END
|
||||
};
|
||||
|
||||
GnomeUIInfo menubar[] = {
|
||||
GNOMEUIINFO_MENU_FILE_TREE(file_menu),
|
||||
GNOMEUIINFO_SUBTREE("_Edit",edit_menu),
|
||||
GNOMEUIINFO_SUBTREE("_View",view_menu),
|
||||
GNOMEUIINFO_SUBTREE("_Tools",tools_menu),
|
||||
GNOMEUIINFO_MENU_HELP_TREE(help_menu),
|
||||
GNOMEUIINFO_END
|
||||
};
|
||||
#else
|
||||
static GtkItemFactoryEntry menu_items[] = {
|
||||
{ "/_File", NULL, NULL, 0, "<Branch>" },
|
||||
{ "/_File/_Open", "<control>O", gmdb_file_select_cb, 0, NULL },
|
||||
{ "/_File/_Close", "<control>C", gmdb_file_close_cb, 0, NULL },
|
||||
{ "/_File/sep1", NULL, NULL, 0, "<Separator>" },
|
||||
{ "/_File/Print Setup", NULL, NULL, 0, NULL },
|
||||
{ "/_File/_Print", NULL, NULL, 0, NULL },
|
||||
{ "/_File/E_xit", "<control>Q", gtk_main_quit, 0, NULL },
|
||||
{ "/_Edit", NULL, NULL, 0, "<Branch>" },
|
||||
{ "/_Edit/_Undo", NULL, NULL, 0, NULL },
|
||||
{ "/_File/sep2", NULL, NULL, 0, "<Separator>" },
|
||||
{ "/_Edit/Cu_t", NULL, NULL, 0, NULL },
|
||||
{ "/_Edit/_Copy", NULL, NULL, 0, NULL },
|
||||
{ "/_Edit/_Paste", NULL, NULL, 0, NULL },
|
||||
{ "/_View", NULL, NULL, 0, "<Branch>" },
|
||||
{ "/_View/File _Info", NULL, gmdb_info_cb, 0, NULL },
|
||||
{ "/_View/_Debug Tab", NULL, show_debug_cb, 0, NULL },
|
||||
{ "/_Tools", NULL, NULL, 0, "<Branch>" },
|
||||
{ "/_Tools/S_QL Window...", NULL, gmdb_sql_new_window_cb, 0, NULL },
|
||||
{ "/_Tools/E_xport Schema...", NULL, a_callback, 0, NULL },
|
||||
{ "/_Help", NULL, NULL, 0, "<Branch>" },
|
||||
{ "/_Help/About...", NULL, gmdb_about_cb, 0, NULL },
|
||||
};
|
||||
#endif
|
||||
|
||||
GtkWidget *
|
||||
add_tab(GtkWidget *notebook, gchar **xpm, gchar *text)
|
||||
{
|
||||
GtkWidget *tabbox;
|
||||
GtkWidget *label;
|
||||
GtkWidget *pixmapwid;
|
||||
GtkWidget *frame;
|
||||
GtkWidget *hlist;
|
||||
GdkPixmap *pixmap;
|
||||
GdkBitmap *mask;
|
||||
|
||||
frame = gtk_frame_new (NULL);
|
||||
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
|
||||
gtk_widget_set_usize (frame, 100, 75);
|
||||
gtk_widget_show (frame);
|
||||
|
||||
hlist = gtk_hlist_new ();
|
||||
gtk_widget_show (hlist);
|
||||
gtk_container_add(GTK_CONTAINER(frame), hlist);
|
||||
|
||||
|
||||
/* 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, 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, TRUE, TRUE, 0);
|
||||
|
||||
label = gtk_label_new (text);
|
||||
gtk_widget_show (label);
|
||||
gtk_box_pack_start (GTK_BOX (tabbox), label, TRUE, TRUE, 0);
|
||||
|
||||
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, tabbox);
|
||||
|
||||
return hlist;
|
||||
}
|
||||
|
||||
void
|
||||
add_icon(GtkWidget *list, gchar **xpm, gchar *text)
|
||||
{
|
||||
GList *glist = NULL;
|
||||
GtkWidget *li;
|
||||
GtkWidget *label;
|
||||
GtkWidget *box;
|
||||
GtkWidget *pixmapwid;
|
||||
GdkPixmap *pixmap;
|
||||
GdkBitmap *mask;
|
||||
//GtkStyle *style;
|
||||
|
||||
li = gtk_list_item_new ();
|
||||
box = gtk_hbox_new (FALSE,5);
|
||||
//style = gtk_widget_get_style( app );
|
||||
pixmap = gdk_pixmap_colormap_create_from_xpm_d( NULL,
|
||||
gtk_widget_get_colormap(app), &mask, NULL, xpm);
|
||||
//pixmap = gdk_pixmap_create_from_xpm_d( app->window, &mask,
|
||||
//&style->bg[GTK_STATE_NORMAL],
|
||||
//(gchar **)xpm );
|
||||
|
||||
/* a pixmap widget to contain the pixmap */
|
||||
pixmapwid = gtk_pixmap_new( pixmap, mask );
|
||||
gtk_widget_show( pixmapwid );
|
||||
gtk_box_pack_start (GTK_BOX (box), pixmapwid, TRUE, TRUE, 0);
|
||||
|
||||
label = gtk_label_new (text);
|
||||
gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(li), box);
|
||||
glist = g_list_append (glist, li);
|
||||
gtk_widget_show (label);
|
||||
gtk_widget_show (li);
|
||||
gtk_hlist_append_items(GTK_HLIST(list), glist);
|
||||
}
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
GtkWidget *hbox;
|
||||
#ifndef HAVE_GNOME
|
||||
GtkWidget *vbox;
|
||||
GtkWidget *menubar;
|
||||
GtkItemFactory *item_factory;
|
||||
GtkAccelGroup *accel_group;
|
||||
gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
|
||||
|
||||
#endif
|
||||
|
||||
/* initialize the SQL engine */
|
||||
sql = mdb_sql_init();
|
||||
/* initialize MDB Tools library */
|
||||
mdb_init();
|
||||
|
||||
#ifdef HAVE_GNOME
|
||||
/* Initialize GNOME */
|
||||
gnome_init ("gtk-mdb-viewer", "0.1", argc, argv);
|
||||
/* Create a Gnome app widget, which sets up a basic window
|
||||
for your application */
|
||||
app = gnome_app_new ("gtk-mdb-viewer", "gtk-MDB File Viewer");
|
||||
#else
|
||||
gtk_init(&argc, &argv);
|
||||
app = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
vbox = gtk_vbox_new (FALSE,1);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
|
||||
gtk_container_add (GTK_CONTAINER (app), vbox);
|
||||
gtk_widget_show (vbox);
|
||||
#endif
|
||||
|
||||
gtk_widget_set_uposition(GTK_WIDGET(app), 50, 50);
|
||||
|
||||
/* bind "delete_event", which is the event we get when
|
||||
the user closes the window with the window manager,
|
||||
to gtk_main_quit, which is a function that causes
|
||||
the gtk_main loop to exit, and consequently to quit
|
||||
the application */
|
||||
gtk_signal_connect (GTK_OBJECT (app), "delete_event",
|
||||
GTK_SIGNAL_FUNC (delete_event), NULL);
|
||||
|
||||
#ifdef HAVE_GNOME
|
||||
gnome_app_create_menus (GNOME_APP (app), menubar);
|
||||
/* create a horizontal box for the buttons and add it
|
||||
** into the app widget */
|
||||
hbox = gtk_hbox_new (FALSE,5);
|
||||
gnome_app_set_contents (GNOME_APP (app), hbox);
|
||||
#else
|
||||
accel_group = gtk_accel_group_new ();
|
||||
item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group);
|
||||
gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
|
||||
gtk_window_add_accel_group (GTK_WINDOW (app), accel_group);
|
||||
/* Finally, return the actual menu bar created by the item factory. */
|
||||
menubar = gtk_item_factory_get_widget (item_factory, "<main>");
|
||||
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
|
||||
hbox = gtk_hbox_new (FALSE,5);
|
||||
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
|
||||
#endif
|
||||
|
||||
/* create the tabbed interface */
|
||||
main_notebook = gtk_notebook_new();
|
||||
gtk_box_pack_start (GTK_BOX (hbox), main_notebook, TRUE, TRUE, 0);
|
||||
|
||||
gmdb_table_add_tab(main_notebook);
|
||||
query_hlist = add_tab(main_notebook, query_xpm, "Queries");
|
||||
form_hlist = add_tab(main_notebook, forms_xpm, "Forms");
|
||||
report_hlist = add_tab(main_notebook, reports_xpm, "Reports");
|
||||
macro_hlist = add_tab(main_notebook, macros_xpm, "Macros");
|
||||
module_hlist = add_tab(main_notebook, code_xpm, "Modules");
|
||||
|
||||
//add_icon(table_hlist, "table.xpm", "Table1");
|
||||
|
||||
/* show everything inside this app widget and the app
|
||||
widget itself */
|
||||
gtk_widget_show_all(app);
|
||||
|
||||
if (argc>1) {
|
||||
gmdb_file_open(argv[1]);
|
||||
}
|
||||
|
||||
/* enter the main loop */
|
||||
gtk_main ();
|
||||
|
||||
/* free MDB Tools library */
|
||||
mdb_sql_exit(sql);
|
||||
mdb_exit();
|
||||
|
||||
return 0;
|
||||
}
|
||||
53
src/gmdb/module.c
Normal file
53
src/gmdb/module.c
Normal file
@@ -0,0 +1,53 @@
|
||||
#include "gmdb.h"
|
||||
#include "gtkhlist.h"
|
||||
|
||||
GtkWidget *module_hlist;
|
||||
extern GtkWidget *app;
|
||||
|
||||
void
|
||||
gmdb_module_add_icon(gchar *text)
|
||||
{
|
||||
GList *glist = NULL;
|
||||
GtkWidget *li;
|
||||
GtkWidget *label;
|
||||
GtkWidget *box;
|
||||
GtkWidget *pixmapwid;
|
||||
GdkPixmap *pixmap;
|
||||
GdkBitmap *mask;
|
||||
|
||||
li = gtk_list_item_new ();
|
||||
box = gtk_hbox_new (FALSE,5);
|
||||
pixmap = gdk_pixmap_colormap_create_from_xpm( NULL,
|
||||
gtk_widget_get_colormap(app), &mask, NULL, "table.xpm");
|
||||
|
||||
/* a pixmap widget to contain the pixmap */
|
||||
pixmapwid = gtk_pixmap_new( pixmap, mask );
|
||||
gtk_widget_show( pixmapwid );
|
||||
gtk_box_pack_start (GTK_BOX (box), pixmapwid, FALSE, TRUE, 0);
|
||||
|
||||
label = gtk_label_new (text);
|
||||
gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(li), box);
|
||||
glist = g_list_append (glist, li);
|
||||
gtk_widget_show (label);
|
||||
gtk_widget_show_all (li);
|
||||
gtk_hlist_append_items(GTK_HLIST(module_hlist), glist);
|
||||
}
|
||||
|
||||
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 */
|
||||
}
|
||||
24
src/gmdb/pk.xpm
Normal file
24
src/gmdb/pk.xpm
Normal file
@@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static char * pk_xpm[] = {
|
||||
"16 16 5 1",
|
||||
" c None",
|
||||
". c #FFBF00",
|
||||
"+ c #1C59DD",
|
||||
"@ c #000000",
|
||||
"# c #E8AC17",
|
||||
" ",
|
||||
" .... +++ ",
|
||||
" ..@@.. + + ",
|
||||
" ...... + + ",
|
||||
" ...... +++ ",
|
||||
" .... + ",
|
||||
" .# + ",
|
||||
" .# ",
|
||||
" .# + + ",
|
||||
" .#. + + ",
|
||||
" .#.. ++ ",
|
||||
" .# + + ",
|
||||
" .#. + + ",
|
||||
" .#.. + + ",
|
||||
" ",
|
||||
" "};
|
||||
52
src/gmdb/query.c
Normal file
52
src/gmdb/query.c
Normal file
@@ -0,0 +1,52 @@
|
||||
#include "gmdb.h"
|
||||
#include "gtkhlist.h"
|
||||
|
||||
GtkWidget *query_hlist;
|
||||
extern GtkWidget *app;
|
||||
|
||||
void
|
||||
gmdb_query_add_icon(gchar *text)
|
||||
{
|
||||
GList *glist = NULL;
|
||||
GtkWidget *li;
|
||||
GtkWidget *label;
|
||||
GtkWidget *box;
|
||||
GtkWidget *pixmapwid;
|
||||
GdkPixmap *pixmap;
|
||||
GdkBitmap *mask;
|
||||
|
||||
li = gtk_list_item_new ();
|
||||
box = gtk_hbox_new (FALSE,5);
|
||||
pixmap = gdk_pixmap_colormap_create_from_xpm( NULL,
|
||||
gtk_widget_get_colormap(app), &mask, NULL, "query.xpm");
|
||||
|
||||
/* a pixmap widget to contain the pixmap */
|
||||
pixmapwid = gtk_pixmap_new( pixmap, mask );
|
||||
gtk_widget_show( pixmapwid );
|
||||
gtk_box_pack_start (GTK_BOX (box), pixmapwid, FALSE, TRUE, 0);
|
||||
|
||||
label = gtk_label_new (text);
|
||||
gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(li), box);
|
||||
glist = g_list_append (glist, li);
|
||||
gtk_widget_show (label);
|
||||
gtk_widget_show_all (li);
|
||||
gtk_hlist_append_items(GTK_HLIST(query_hlist), glist);
|
||||
}
|
||||
|
||||
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 */
|
||||
}
|
||||
46
src/gmdb/query.xpm
Normal file
46
src/gmdb/query.xpm
Normal file
@@ -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 "};
|
||||
53
src/gmdb/report.c
Normal file
53
src/gmdb/report.c
Normal file
@@ -0,0 +1,53 @@
|
||||
#include "gmdb.h"
|
||||
#include "gtkhlist.h"
|
||||
|
||||
GtkWidget *report_hlist;
|
||||
extern GtkWidget *app;
|
||||
|
||||
void
|
||||
gmdb_report_add_icon(gchar *text)
|
||||
{
|
||||
GList *glist = NULL;
|
||||
GtkWidget *li;
|
||||
GtkWidget *label;
|
||||
GtkWidget *box;
|
||||
GtkWidget *pixmapwid;
|
||||
GdkPixmap *pixmap;
|
||||
GdkBitmap *mask;
|
||||
|
||||
li = gtk_list_item_new ();
|
||||
box = gtk_hbox_new (FALSE,5);
|
||||
pixmap = gdk_pixmap_colormap_create_from_xpm( NULL,
|
||||
gtk_widget_get_colormap(app), &mask, NULL, "table.xpm");
|
||||
|
||||
/* a pixmap widget to contain the pixmap */
|
||||
pixmapwid = gtk_pixmap_new( pixmap, mask );
|
||||
gtk_widget_show( pixmapwid );
|
||||
gtk_box_pack_start (GTK_BOX (box), pixmapwid, FALSE, TRUE, 0);
|
||||
|
||||
label = gtk_label_new (text);
|
||||
gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(li), box);
|
||||
glist = g_list_append (glist, li);
|
||||
gtk_widget_show (label);
|
||||
gtk_widget_show_all (li);
|
||||
gtk_hlist_append_items(GTK_HLIST(report_hlist), glist);
|
||||
}
|
||||
|
||||
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 */
|
||||
}
|
||||
95
src/gmdb/reports.xpm
Normal file
95
src/gmdb/reports.xpm
Normal file
@@ -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% ",
|
||||
" %%% "};
|
||||
291
src/gmdb/sql.c
Normal file
291
src/gmdb/sql.c
Normal file
@@ -0,0 +1,291 @@
|
||||
#include "gmdb.h"
|
||||
#include "gtkhlist.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;
|
||||
|
||||
|
||||
void gmdb_sql_ctree_populate(MdbHandle *mdb, GMdbSQLWindow *sqlwin);
|
||||
|
||||
/* callbacks */
|
||||
gint
|
||||
gmdb_sql_close(GtkHList *hlist, 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;
|
||||
|
||||
buf = selection_data->data;
|
||||
if (gtk_text_get_length(GTK_TEXT(sqlwin->textbox))==0) {
|
||||
gtk_text_insert(GTK_TEXT(sqlwin->textbox), NULL, NULL, NULL, "select * from ", 14);
|
||||
}
|
||||
gtk_text_insert(GTK_TEXT(sqlwin->textbox), NULL, NULL, NULL, buf, strlen(buf));
|
||||
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;
|
||||
|
||||
child_num = gtk_list_child_position(list, w);
|
||||
buf = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(sqlwin->combo)->entry));
|
||||
gtk_editable_delete_text(GTK_EDITABLE(sqlwin->textbox), 0, -1);
|
||||
gtk_text_insert(GTK_TEXT(sqlwin->textbox), NULL, NULL, NULL, 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];
|
||||
|
||||
/* stuff this query on the history */
|
||||
len = gtk_text_get_length(GTK_TEXT(sqlwin->textbox));
|
||||
buf = gtk_editable_get_chars(GTK_EDITABLE(sqlwin->textbox), 0, -1);
|
||||
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;i<sql->num_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;i<sql->num_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;
|
||||
|
||||
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_new (NULL,NULL);
|
||||
gtk_widget_show (sqlwin->textbox);
|
||||
gtk_text_set_editable(GTK_TEXT(sqlwin->textbox), TRUE);
|
||||
gtk_container_add(GTK_CONTAINER(frame1), sqlwin->textbox);
|
||||
|
||||
gtk_signal_connect ( GTK_OBJECT (sqlwin->textbox),
|
||||
"activate", GTK_SIGNAL_FUNC (gmdb_sql_execute_cb), sqlwin);
|
||||
|
||||
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 */
|
||||
gmdb_sql_ctree_populate(mdb, sqlwin);
|
||||
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 */
|
||||
void gmdb_sql_ctree_populate(MdbHandle *mdb, GMdbSQLWindow *sqlwin)
|
||||
{
|
||||
int i;
|
||||
MdbCatalogEntry *entry;
|
||||
gchar *text[2];
|
||||
|
||||
/* 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] = "";
|
||||
gtk_ctree_insert_node(GTK_CTREE(sqlwin->ctree), NULL, NULL, text, 0, NULL, NULL, NULL, NULL, FALSE, FALSE);
|
||||
}
|
||||
} /* if MDB_TABLE */
|
||||
} /* for */
|
||||
}
|
||||
#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
|
||||
208
src/gmdb/table.c
Normal file
208
src/gmdb/table.c
Normal file
@@ -0,0 +1,208 @@
|
||||
#include "gmdb.h"
|
||||
#include "gtkhlist.h"
|
||||
#include "table.xpm"
|
||||
|
||||
GtkWidget *table_hlist;
|
||||
GtkWidget *table_data_window;
|
||||
GtkWidget *table_def_window;
|
||||
extern GtkWidget *app;
|
||||
extern MdbHandle *mdb;
|
||||
int selected_child = -1;
|
||||
int selected_table = -1;
|
||||
extern char *mdb_access_types[];
|
||||
|
||||
/* callbacks */
|
||||
void
|
||||
gmdb_table_def_cb(GtkHList *hlist, 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_def_new(entry);
|
||||
}
|
||||
|
||||
void
|
||||
gmdb_table_export_cb(GtkHList *hlist, 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(GtkHList *hlist, 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(GtkHList *hlist, GtkWidget *w, gpointer data)
|
||||
{
|
||||
int child_num;
|
||||
int i,j=0;
|
||||
MdbCatalogEntry *entry;
|
||||
|
||||
child_num = gtk_hlist_child_position(hlist, w);
|
||||
selected_child = child_num;
|
||||
for (i=0;i<mdb->num_catalog;i++) {
|
||||
entry = g_ptr_array_index(mdb->catalog,i);
|
||||
if (entry->object_type==MDB_TABLE &&
|
||||
strncmp(entry->object_name,"MSys",4)) {
|
||||
if (j==child_num) {
|
||||
selected_table = i;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* functions */
|
||||
void
|
||||
gmdb_table_add_icon(gchar *text)
|
||||
{
|
||||
GList *glist = NULL;
|
||||
GtkWidget *li;
|
||||
GtkWidget *label;
|
||||
GtkWidget *box;
|
||||
GtkWidget *pixmapwid;
|
||||
GdkPixmap *pixmap;
|
||||
GdkBitmap *mask;
|
||||
|
||||
li = gtk_list_item_new ();
|
||||
box = gtk_hbox_new (FALSE,5);
|
||||
pixmap = gdk_pixmap_colormap_create_from_xpm_d( NULL,
|
||||
gtk_widget_get_colormap(app), &mask, NULL, table_xpm);
|
||||
|
||||
/* a pixmap widget to contain the pixmap */
|
||||
pixmapwid = gtk_pixmap_new( pixmap, mask );
|
||||
gtk_widget_show( pixmapwid );
|
||||
gtk_box_pack_start (GTK_BOX (box), pixmapwid, FALSE, TRUE, 0);
|
||||
|
||||
label = gtk_label_new (text);
|
||||
gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(li), box);
|
||||
glist = g_list_append (glist, li);
|
||||
gtk_widget_show (label);
|
||||
gtk_widget_show_all (li);
|
||||
gtk_hlist_append_items(GTK_HLIST(table_hlist), glist);
|
||||
}
|
||||
|
||||
void
|
||||
gmdb_table_add_tab(GtkWidget *notebook)
|
||||
{
|
||||
GtkWidget *tabbox;
|
||||
GtkWidget *label;
|
||||
GtkWidget *pixmapwid;
|
||||
GtkWidget *frame;
|
||||
GtkWidget *hbox;
|
||||
GtkWidget *vbbox;
|
||||
GtkWidget *button1;
|
||||
GtkWidget *button2;
|
||||
GtkWidget *button3;
|
||||
GdkPixmap *pixmap;
|
||||
GdkBitmap *mask;
|
||||
|
||||
hbox = gtk_hbox_new (FALSE,5);
|
||||
gtk_widget_show (hbox);
|
||||
|
||||
frame = gtk_frame_new (NULL);
|
||||
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
|
||||
gtk_widget_set_usize (frame, 100, 75);
|
||||
gtk_widget_show (frame);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
|
||||
|
||||
table_hlist = gtk_hlist_new ();
|
||||
gtk_widget_show (table_hlist);
|
||||
gtk_container_add(GTK_CONTAINER(frame), table_hlist);
|
||||
|
||||
/* set selection callback for list */
|
||||
gtk_signal_connect (
|
||||
GTK_OBJECT (table_hlist),
|
||||
"select-child", GTK_SIGNAL_FUNC (gmdb_table_select_cb), NULL);
|
||||
|
||||
vbbox = gtk_vbutton_box_new ();
|
||||
gtk_container_set_border_width (GTK_CONTAINER (vbbox), 10);
|
||||
gtk_vbutton_box_set_layout_default ( GTK_BUTTONBOX_START );
|
||||
gtk_button_box_set_child_size ( GTK_BUTTON_BOX( vbbox), 80, 20);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), vbbox, FALSE, FALSE, 10);
|
||||
gtk_widget_show( vbbox );
|
||||
|
||||
button1 = gtk_button_new_with_label("Definition");
|
||||
gtk_box_pack_start (GTK_BOX (vbbox), button1, FALSE, TRUE, 0);
|
||||
gtk_widget_show( button1 );
|
||||
|
||||
gtk_signal_connect ( GTK_OBJECT (button1),
|
||||
"clicked", GTK_SIGNAL_FUNC (gmdb_table_def_cb), NULL);
|
||||
|
||||
button2 = gtk_button_new_with_label("Data");
|
||||
gtk_box_pack_start (GTK_BOX (vbbox), button2, FALSE, FALSE, 0);
|
||||
gtk_widget_show( button2 );
|
||||
|
||||
gtk_signal_connect ( GTK_OBJECT (button2),
|
||||
"clicked", GTK_SIGNAL_FUNC (gmdb_table_data_cb), NULL);
|
||||
|
||||
button3 = gtk_button_new_with_label("Export");
|
||||
gtk_box_pack_start (GTK_BOX (vbbox), button3, FALSE, FALSE, 0);
|
||||
gtk_widget_show( button3 );
|
||||
|
||||
gtk_signal_connect ( GTK_OBJECT (button3),
|
||||
"clicked", GTK_SIGNAL_FUNC (gmdb_table_export_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, table_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 ("Tables");
|
||||
gtk_widget_show (label);
|
||||
gtk_box_pack_start (GTK_BOX (tabbox), label, FALSE, TRUE, 0);
|
||||
|
||||
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), hbox, tabbox);
|
||||
}
|
||||
|
||||
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 */
|
||||
}
|
||||
19
src/gmdb/table.xpm
Normal file
19
src/gmdb/table.xpm
Normal file
@@ -0,0 +1,19 @@
|
||||
/* XPM */
|
||||
static char * table_xpm[] = {
|
||||
"10 12 4 1",
|
||||
" c None",
|
||||
". c #1874B1",
|
||||
"+ c #606060",
|
||||
"@ c #D7D2D2",
|
||||
"..........",
|
||||
"..........",
|
||||
"+@@+@@@+@+",
|
||||
"++++++++++",
|
||||
"+@@+@@@+@+",
|
||||
"++++++++++",
|
||||
"+@@+@@@+@+",
|
||||
"++++++++++",
|
||||
"+@@+@@@+@+",
|
||||
"++++++++++",
|
||||
"+@@+@@@+@+",
|
||||
"++++++++++"};
|
||||
97
src/gmdb/table_data.c
Normal file
97
src/gmdb/table_data.c
Normal file
@@ -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;i<g_list_length(window_list);i++) {
|
||||
dataw = g_list_nth_data(window_list, i);
|
||||
if (!strcmp(dataw->table_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;i<table->num_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;i<table->num_cols;i++) {
|
||||
free(bound_data[i]);
|
||||
}
|
||||
|
||||
/* add this one to the window list */
|
||||
window_list = g_list_append(window_list, dataw);
|
||||
|
||||
return dataw->window;
|
||||
}
|
||||
130
src/gmdb/table_def.c
Normal file
130
src/gmdb/table_def.c
Normal file
@@ -0,0 +1,130 @@
|
||||
#include "gmdb.h"
|
||||
#include "gtkhlist.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(GtkHList *hlist, 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;i<g_list_length(window_list);i++) {
|
||||
defw = g_list_nth_data(window_list, i);
|
||||
if (!strcmp(defw->table_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;i<table->num_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;i<table->num_idxs;i++) {
|
||||
idx = g_ptr_array_index (table->indices, i);
|
||||
if (idx->index_type==1) {
|
||||
for (j=0;j<idx->num_keys;j++) {
|
||||
gtk_clist_set_pixmap(GTK_CLIST(clist), idx->key_col_num[j]-1,0, pixmap, mask);
|
||||
}
|
||||
// } else {
|
||||
//for (j=0;j<idx->num_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;
|
||||
}
|
||||
185
src/gmdb/table_export.c
Normal file
185
src/gmdb/table_export.c
Normal file
@@ -0,0 +1,185 @@
|
||||
#include "gmdb.h"
|
||||
|
||||
extern GtkWidget *app;
|
||||
extern MdbHandle *mdb;
|
||||
|
||||
typedef struct GMdbTableExportDialog {
|
||||
MdbCatalogEntry *entry;
|
||||
GtkWidget *dialog;
|
||||
GtkWidget *lineterm;
|
||||
GtkWidget *colsep;
|
||||
GtkWidget *quote;
|
||||
GtkWidget *headers;
|
||||
GtkWidget *filesel;
|
||||
} GMdbTableExportDialog;
|
||||
|
||||
GMdbTableExportDialog *export;
|
||||
|
||||
void
|
||||
gmdb_export_file_cb(GtkWidget *selector, GMdbTableExportDialog *export)
|
||||
{
|
||||
gchar *file_path;
|
||||
FILE *outfile;
|
||||
gchar *bound_data[256];
|
||||
MdbTableDef *table;
|
||||
MdbColumn *col;
|
||||
int i;
|
||||
|
||||
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;i<table->num_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 (i>0) fprintf(outfile,"\t");
|
||||
fprintf(outfile,"%s", col->name);
|
||||
}
|
||||
fprintf(outfile,"\n");
|
||||
|
||||
/* fetch those rows! */
|
||||
while(mdb_fetch_row(table)) {
|
||||
for (i=0;i<table->num_cols;i++) {
|
||||
if (i>0) fprintf(outfile,"\t");
|
||||
fprintf(outfile,"%s", bound_data[i]);
|
||||
}
|
||||
fprintf(outfile,"\n");
|
||||
}
|
||||
|
||||
/* free the memory used to bind */
|
||||
for (i=0;i<table->num_cols;i++) {
|
||||
free(bound_data[i]);
|
||||
}
|
||||
|
||||
fclose(outfile);
|
||||
gtk_widget_destroy(export->dialog);
|
||||
}
|
||||
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, "Unix (linefeed only)");
|
||||
glist = g_list_append(glist, "Mac (carriage return only)");
|
||||
glist = g_list_append(glist, "Windows (CR + LF)");
|
||||
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, "Automatic (where necessary)");
|
||||
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->quote = 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);
|
||||
}
|
||||
24
src/gmdb/util.c
Normal file
24
src/gmdb/util.c
Normal file
@@ -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);
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
# Generated automatically from Makefile.in by configure.
|
||||
# Makefile.in generated automatically by automake 1.4 from Makefile.am
|
||||
# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
@@ -62,6 +62,7 @@ host_triplet = i686-pc-linux-gnu
|
||||
AS = @AS@
|
||||
CC = gcc
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME =
|
||||
LD = /usr/bin/ld
|
||||
LEX = flex
|
||||
LIBTOOL = $(SHELL) $(top_builddir)/libtool
|
||||
@@ -94,7 +95,7 @@ libmdb_la_LDFLAGS =
|
||||
libmdb_la_LIBADD =
|
||||
libmdb_la_OBJECTS = catalog.lo mem.lo file.lo kkd.lo table.lo data.lo \
|
||||
dump.lo backend.lo money.lo sargs.lo index.lo like.lo
|
||||
CFLAGS = -g -O2 -DUNIXODBC -DSQL
|
||||
CFLAGS = -g -O2 -DUNIXODBC -DSQL -DHAVE_GNOME
|
||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
CCLD = $(CC)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Makefile.in generated automatically by automake 1.4 from Makefile.am
|
||||
# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
@@ -62,6 +62,7 @@ host_triplet = @host@
|
||||
AS = @AS@
|
||||
CC = @CC@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME = @HAVE_GNOME@
|
||||
LD = @LD@
|
||||
LEX = @LEX@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
|
||||
@@ -35,6 +35,13 @@ MdbColumn *col;
|
||||
col=g_ptr_array_index(table->columns, col_num - 1);
|
||||
col->bind_ptr = bind_ptr;
|
||||
}
|
||||
void mdb_bind_len(MdbTableDef *table, int col_num, int *len_ptr)
|
||||
{
|
||||
MdbColumn *col;
|
||||
|
||||
col=g_ptr_array_index(table->columns, col_num - 1);
|
||||
col->len_ptr = len_ptr;
|
||||
}
|
||||
int mdb_find_end_of_row(MdbHandle *mdb, int row)
|
||||
{
|
||||
int row_start, row_end, i;
|
||||
@@ -88,6 +95,7 @@ static int mdb_xfer_bound_bool(MdbHandle *mdb, MdbColumn *col, int value)
|
||||
}
|
||||
static int mdb_xfer_bound_data(MdbHandle *mdb, int start, MdbColumn *col, int len)
|
||||
{
|
||||
int ret;
|
||||
//if (!strcmp("Name",col->name)) {
|
||||
//printf("start %d %d\n",start, len);
|
||||
//}
|
||||
@@ -102,10 +110,14 @@ static int mdb_xfer_bound_data(MdbHandle *mdb, int start, MdbColumn *col, int le
|
||||
if (len) {
|
||||
strcpy(col->bind_ptr,
|
||||
mdb_col_to_string(mdb, start, col->col_type, len));
|
||||
return col->col_size;
|
||||
} else {
|
||||
strcpy(col->bind_ptr, "");
|
||||
}
|
||||
ret = strlen(col->bind_ptr);
|
||||
if (col->len_ptr) {
|
||||
*col->len_ptr = ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ host_triplet = i686-pc-linux-gnu
|
||||
AS = @AS@
|
||||
CC = gcc
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME =
|
||||
LD = /usr/bin/ld
|
||||
LEX = flex
|
||||
LIBTOOL = $(SHELL) $(top_builddir)/libtool
|
||||
@@ -116,7 +117,7 @@ unittest_OBJECTS = unittest.o
|
||||
unittest_DEPENDENCIES = libmdbodbc.la ../libmdb/libmdb.la \
|
||||
../sql/libmdbsql.la
|
||||
unittest_LDFLAGS =
|
||||
CFLAGS = -g -O2 -DUNIXODBC -DSQL
|
||||
CFLAGS = -g -O2 -DUNIXODBC -DSQL -DHAVE_GNOME
|
||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
CCLD = $(CC)
|
||||
|
||||
@@ -62,6 +62,7 @@ host_triplet = @host@
|
||||
AS = @AS@
|
||||
CC = @CC@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME = @HAVE_GNOME@
|
||||
LD = @LD@
|
||||
LEX = @LEX@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
|
||||
@@ -396,7 +396,7 @@ static int GetNextItem (FILE* stream, char** name, char** value)
|
||||
s = fgets (line, max_line, stream);
|
||||
if (s == NULL)
|
||||
{
|
||||
perror ("fgets");
|
||||
//perror ("fgets");
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
|
||||
387
src/odbc/odbc.c
387
src/odbc/odbc.c
@@ -32,7 +32,7 @@
|
||||
|
||||
#include "connectparams.h"
|
||||
|
||||
static char software_version[] = "$Id: odbc.c,v 1.5 2002/04/03 23:02:54 brianb Exp $";
|
||||
static char software_version[] = "$Id: odbc.c,v 1.6 2002/04/09 01:19:26 brianb Exp $";
|
||||
static void *no_unused_var_warn[] = {software_version,
|
||||
no_unused_var_warn};
|
||||
|
||||
@@ -51,6 +51,9 @@ static SQLRETURN SQL_API _SQLFreeStmt(SQLHSTMT hstmt, SQLUSMALLINT fOption);
|
||||
#define _MAX_ERROR_LEN 255
|
||||
static char lastError[_MAX_ERROR_LEN+1];
|
||||
|
||||
//#define TRACE(x) fprintf(stderr,"Function %s\n", x);
|
||||
#define TRACE(x)
|
||||
|
||||
/* The SQL engine is presently non-reenterrant and non-thread safe.
|
||||
See _SQLExecute for details.
|
||||
*/
|
||||
@@ -104,6 +107,8 @@ SQLRETURN SQL_API SQLDriverConnect(
|
||||
ConnectParams* params;
|
||||
SQLRETURN ret;
|
||||
|
||||
TRACE("DriverConnect");
|
||||
|
||||
strcpy (lastError, "");
|
||||
|
||||
params = ((ODBCConnection*) hdbc)->params;
|
||||
@@ -140,6 +145,7 @@ SQLRETURN SQL_API SQLBrowseConnect(
|
||||
SQLSMALLINT cbConnStrOutMax,
|
||||
SQLSMALLINT FAR *pcbConnStrOut)
|
||||
{
|
||||
TRACE("BrowseConnect");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -154,6 +160,7 @@ SQLRETURN SQL_API SQLColumnPrivileges(
|
||||
SQLCHAR FAR *szColumnName,
|
||||
SQLSMALLINT cbColumnName)
|
||||
{
|
||||
TRACE("SQLColumnPrivileges");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -165,6 +172,7 @@ SQLRETURN SQL_API SQLDescribeParam(
|
||||
SQLSMALLINT FAR *pibScale,
|
||||
SQLSMALLINT FAR *pfNullable)
|
||||
{
|
||||
TRACE("SQLDescribeParam");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -175,6 +183,7 @@ SQLRETURN SQL_API SQLExtendedFetch(
|
||||
SQLUINTEGER FAR *pcrow,
|
||||
SQLUSMALLINT FAR *rgfRowStatus)
|
||||
{
|
||||
TRACE("SQLExtendedFetch");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -193,12 +202,14 @@ SQLRETURN SQL_API SQLForeignKeys(
|
||||
SQLCHAR FAR *szFkTableName,
|
||||
SQLSMALLINT cbFkTableName)
|
||||
{
|
||||
TRACE("SQLForeignKeys");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLMoreResults(
|
||||
SQLHSTMT hstmt)
|
||||
{
|
||||
TRACE("SQLMoreResults");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -210,6 +221,7 @@ SQLRETURN SQL_API SQLNativeSql(
|
||||
SQLINTEGER cbSqlStrMax,
|
||||
SQLINTEGER FAR *pcbSqlStr)
|
||||
{
|
||||
TRACE("SQLNativeSql");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -217,6 +229,7 @@ SQLRETURN SQL_API SQLNumParams(
|
||||
SQLHSTMT hstmt,
|
||||
SQLSMALLINT FAR *pcpar)
|
||||
{
|
||||
TRACE("SQLNumParams");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -225,6 +238,7 @@ SQLRETURN SQL_API SQLParamOptions(
|
||||
SQLUINTEGER crow,
|
||||
SQLUINTEGER FAR *pirow)
|
||||
{
|
||||
TRACE("SQLParamOptions");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -237,6 +251,7 @@ SQLRETURN SQL_API SQLPrimaryKeys(
|
||||
SQLCHAR FAR *szTableName,
|
||||
SQLSMALLINT cbTableName)
|
||||
{
|
||||
TRACE("SQLPrimaryKeys");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -251,6 +266,7 @@ SQLRETURN SQL_API SQLProcedureColumns(
|
||||
SQLCHAR FAR *szColumnName,
|
||||
SQLSMALLINT cbColumnName)
|
||||
{
|
||||
TRACE("SQLProcedureColumns");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -263,6 +279,7 @@ SQLRETURN SQL_API SQLProcedures(
|
||||
SQLCHAR FAR *szProcName,
|
||||
SQLSMALLINT cbProcName)
|
||||
{
|
||||
TRACE("SQLProcedures");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -272,6 +289,7 @@ SQLRETURN SQL_API SQLSetPos(
|
||||
SQLUSMALLINT fOption,
|
||||
SQLUSMALLINT fLock)
|
||||
{
|
||||
TRACE("SQLSetPos");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -284,6 +302,7 @@ SQLRETURN SQL_API SQLTablePrivileges(
|
||||
SQLCHAR FAR *szTableName,
|
||||
SQLSMALLINT cbTableName)
|
||||
{
|
||||
TRACE("SQLTablePrivileges");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -297,6 +316,7 @@ SQLRETURN SQL_API SQLDrivers(
|
||||
SQLSMALLINT cbDrvrAttrMax,
|
||||
SQLSMALLINT FAR *pcbDrvrAttr)
|
||||
{
|
||||
TRACE("SQLDrivers");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
SQLRETURN SQL_API SQLSetEnvAttr (
|
||||
@@ -305,6 +325,7 @@ SQLRETURN SQL_API SQLSetEnvAttr (
|
||||
SQLPOINTER Value,
|
||||
SQLINTEGER StringLength)
|
||||
{
|
||||
TRACE("SQLSetEnvAttr");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -323,6 +344,7 @@ SQLRETURN SQL_API SQLBindParameter(
|
||||
{
|
||||
struct _hstmt *stmt;
|
||||
|
||||
TRACE("SQLBindParameter");
|
||||
stmt = (struct _hstmt *) hstmt;
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
@@ -332,6 +354,7 @@ SQLRETURN SQL_API SQLAllocHandle(
|
||||
SQLHANDLE InputHandle,
|
||||
SQLHANDLE * OutputHandle)
|
||||
{
|
||||
TRACE("SQLAllocHandle");
|
||||
switch(HandleType) {
|
||||
case SQL_HANDLE_STMT:
|
||||
return _SQLAllocStmt(InputHandle,OutputHandle);
|
||||
@@ -351,6 +374,7 @@ static SQLRETURN SQL_API _SQLAllocConnect(
|
||||
struct _henv *env;
|
||||
ODBCConnection* dbc;
|
||||
|
||||
TRACE("_SQLAllocConnect");
|
||||
env = (struct _henv *) henv;
|
||||
dbc = (SQLHDBC) malloc (sizeof (ODBCConnection));
|
||||
memset(dbc,'\0',sizeof (ODBCConnection));
|
||||
@@ -365,6 +389,7 @@ SQLRETURN SQL_API SQLAllocConnect(
|
||||
SQLHENV henv,
|
||||
SQLHDBC FAR *phdbc)
|
||||
{
|
||||
TRACE("SQLAllocConnect");
|
||||
return _SQLAllocConnect(henv, phdbc);
|
||||
}
|
||||
|
||||
@@ -373,6 +398,7 @@ static SQLRETURN SQL_API _SQLAllocEnv(
|
||||
{
|
||||
struct _henv *env;
|
||||
|
||||
TRACE("_SQLAllocEnv");
|
||||
env = (SQLHENV) malloc(sizeof(struct _henv));
|
||||
memset(env,'\0',sizeof(struct _henv));
|
||||
*phenv=env;
|
||||
@@ -382,6 +408,7 @@ struct _henv *env;
|
||||
SQLRETURN SQL_API SQLAllocEnv(
|
||||
SQLHENV FAR *phenv)
|
||||
{
|
||||
TRACE("SQLAllocEnv");
|
||||
return _SQLAllocEnv(phenv);
|
||||
}
|
||||
|
||||
@@ -392,6 +419,7 @@ static SQLRETURN SQL_API _SQLAllocStmt(
|
||||
struct _hdbc *dbc;
|
||||
struct _hstmt *stmt;
|
||||
|
||||
TRACE("_SQLAllocStmt");
|
||||
dbc = (struct _hdbc *) hdbc;
|
||||
|
||||
stmt = (SQLHSTMT) malloc(sizeof(struct _hstmt));
|
||||
@@ -405,6 +433,7 @@ SQLRETURN SQL_API SQLAllocStmt(
|
||||
SQLHDBC hdbc,
|
||||
SQLHSTMT FAR *phstmt)
|
||||
{
|
||||
TRACE("SQLAllocStmt");
|
||||
return _SQLAllocStmt(hdbc,phstmt);
|
||||
}
|
||||
|
||||
@@ -419,8 +448,43 @@ SQLRETURN SQL_API SQLBindCol(
|
||||
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||
struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
||||
struct _henv *env = (struct _henv *) dbc->henv;
|
||||
struct _sql_bind_info *cur, *prev, *newitem;
|
||||
|
||||
mdbsql_bind_column(env->sql, icol, rgbValue);
|
||||
TRACE("SQLBindCol");
|
||||
/* find available item in list */
|
||||
cur = stmt->bind_head;
|
||||
while (cur) {
|
||||
if (cur->column_number==icol)
|
||||
break;
|
||||
cur = cur->next;
|
||||
}
|
||||
/* if this is a repeat */
|
||||
if (cur) {
|
||||
cur->column_bindtype = fCType;
|
||||
cur->column_bindlen = cbValueMax;
|
||||
cur->varaddr = (char *) rgbValue;
|
||||
} else {
|
||||
/* didn't find it create a new one */
|
||||
newitem = (struct _sql_bind_info *) malloc(sizeof(struct _sql_bind_info));
|
||||
memset(newitem, 0, sizeof(struct _sql_bind_info));
|
||||
newitem->column_number = icol;
|
||||
newitem->column_bindtype = fCType;
|
||||
newitem->column_bindlen = cbValueMax;
|
||||
newitem->column_lenbind = pcbValue;
|
||||
newitem->varaddr = (char *) rgbValue;
|
||||
/* if there's no head yet */
|
||||
if (! stmt->bind_head) {
|
||||
stmt->bind_head = newitem;
|
||||
} else {
|
||||
/* find the tail of the list */
|
||||
cur = stmt->bind_head;
|
||||
while (cur) {
|
||||
prev = cur;
|
||||
cur = cur->next;
|
||||
}
|
||||
prev->next = newitem;
|
||||
}
|
||||
}
|
||||
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
@@ -428,6 +492,7 @@ struct _henv *env = (struct _henv *) dbc->henv;
|
||||
SQLRETURN SQL_API SQLCancel(
|
||||
SQLHSTMT hstmt)
|
||||
{
|
||||
TRACE("SQLCancel");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -444,6 +509,7 @@ SQLRETURN SQL_API SQLConnect(
|
||||
ConnectParams* params;
|
||||
SQLRETURN ret;
|
||||
|
||||
TRACE("SQLConnect");
|
||||
strcpy (lastError, "");
|
||||
|
||||
params = ((ODBCConnection*) hdbc)->params;
|
||||
@@ -483,6 +549,7 @@ MdbSQLColumn *sqlcol;
|
||||
MdbColumn *col;
|
||||
MdbTableDef *table;
|
||||
|
||||
TRACE("SQLDescribeCol");
|
||||
if (icol<1 || icol>sql->num_columns) {
|
||||
return SQL_ERROR;
|
||||
}
|
||||
@@ -536,6 +603,7 @@ MdbSQLColumn *sqlcol;
|
||||
MdbColumn *col;
|
||||
MdbTableDef *table;
|
||||
|
||||
TRACE("SQLColAttributes");
|
||||
stmt = (struct _hstmt *) hstmt;
|
||||
dbc = (struct _hdbc *) stmt->hdbc;
|
||||
env = (struct _henv *) dbc->henv;
|
||||
@@ -562,6 +630,7 @@ MdbTableDef *table;
|
||||
}
|
||||
}
|
||||
|
||||
// fprintf(stderr,"fDescType = %d\n", fDescType);
|
||||
switch(fDescType) {
|
||||
case SQL_COLUMN_NAME:
|
||||
case SQL_COLUMN_LABEL:
|
||||
@@ -570,7 +639,7 @@ MdbTableDef *table;
|
||||
*((char *)&rgbDesc[namelen])='\0';
|
||||
break;
|
||||
case SQL_COLUMN_TYPE:
|
||||
*pcbDesc = SQL_CHAR;
|
||||
*pfDesc = SQL_CHAR;
|
||||
break;
|
||||
case SQL_COLUMN_LENGTH:
|
||||
break;
|
||||
@@ -603,6 +672,7 @@ MdbTableDef *table;
|
||||
SQLRETURN SQL_API SQLDisconnect(
|
||||
SQLHDBC hdbc)
|
||||
{
|
||||
TRACE("SQLDisconnect");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -618,6 +688,7 @@ SQLRETURN SQL_API SQLError(
|
||||
{
|
||||
SQLRETURN result = SQL_NO_DATA_FOUND;
|
||||
|
||||
TRACE("SQLError");
|
||||
if (strlen (lastError) > 0)
|
||||
{
|
||||
strcpy (szSqlState, "08001");
|
||||
@@ -640,8 +711,9 @@ struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||
struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
||||
struct _henv *env = (struct _henv *) dbc->henv;
|
||||
int ret;
|
||||
TRACE("_SQLExecute");
|
||||
|
||||
fprintf(stderr,"query = %s\n",stmt->query);
|
||||
/* fprintf(stderr,"query = %s\n",stmt->query); */
|
||||
_odbc_fix_literals(stmt);
|
||||
|
||||
mdb_sql_reset(env->sql);
|
||||
@@ -669,6 +741,7 @@ SQLRETURN SQL_API SQLExecDirect(
|
||||
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||
int ret;
|
||||
|
||||
TRACE("SQLExecDirect");
|
||||
strcpy(stmt->query, szSqlStr);
|
||||
|
||||
return _SQLExecute(hstmt);
|
||||
@@ -677,6 +750,7 @@ int ret;
|
||||
SQLRETURN SQL_API SQLExecute(
|
||||
SQLHSTMT hstmt)
|
||||
{
|
||||
TRACE("SQLExecute");
|
||||
return _SQLExecute(hstmt);
|
||||
}
|
||||
|
||||
@@ -686,9 +760,37 @@ SQLRETURN SQL_API SQLFetch(
|
||||
struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||
struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
||||
struct _henv *env = (struct _henv *) dbc->henv;
|
||||
struct _sql_bind_info *cur;
|
||||
|
||||
TRACE("SQLFetch");
|
||||
/* if we bound columns, transfer them to res_info now that we have one */
|
||||
if (stmt->rows_affected==0) {
|
||||
cur = stmt->bind_head;
|
||||
while (cur) {
|
||||
if (cur->column_number>0 &&
|
||||
cur->column_number <= env->sql->num_columns) {
|
||||
mdbsql_bind_column(env->sql,
|
||||
cur->column_number, cur->varaddr);
|
||||
if (cur->column_lenbind)
|
||||
mdbsql_bind_len(env->sql,
|
||||
cur->column_number, cur->column_lenbind);
|
||||
} else {
|
||||
/* log error ? */
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
}
|
||||
//cur = stmt->bind_head;
|
||||
//while (cur) {
|
||||
//if (cur->column_number>0 &&
|
||||
//cur->column_number <= env->sql->num_columns) {
|
||||
// if (cur->column_lenbind) *(cur->column_lenbind) = 4;
|
||||
//}
|
||||
//cur = cur->next;
|
||||
//}
|
||||
|
||||
if (mdb_fetch_row(env->sql->cur_table)) {
|
||||
stmt->row_affected++;
|
||||
stmt->rows_affected++;
|
||||
return SQL_SUCCESS;
|
||||
} else {
|
||||
return SQL_NO_DATA_FOUND;
|
||||
@@ -699,6 +801,7 @@ SQLRETURN SQL_API SQLFreeHandle(
|
||||
SQLSMALLINT HandleType,
|
||||
SQLHANDLE Handle)
|
||||
{
|
||||
TRACE("SQLFreeHandle");
|
||||
switch(HandleType) {
|
||||
case SQL_HANDLE_STMT:
|
||||
_SQLFreeStmt(Handle,SQL_DROP);
|
||||
@@ -718,6 +821,7 @@ static SQLRETURN SQL_API _SQLFreeConnect(
|
||||
{
|
||||
ODBCConnection* dbc = (ODBCConnection*) hdbc;
|
||||
|
||||
TRACE("_SQLFreeConnect");
|
||||
|
||||
FreeConnectParams (dbc->params);
|
||||
free (dbc);
|
||||
@@ -727,17 +831,20 @@ static SQLRETURN SQL_API _SQLFreeConnect(
|
||||
SQLRETURN SQL_API SQLFreeConnect(
|
||||
SQLHDBC hdbc)
|
||||
{
|
||||
TRACE("SQLFreeConnect");
|
||||
return _SQLFreeConnect(hdbc);
|
||||
}
|
||||
|
||||
static SQLRETURN SQL_API _SQLFreeEnv(
|
||||
SQLHENV henv)
|
||||
{
|
||||
TRACE("_SQLFreeEnv");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
SQLRETURN SQL_API SQLFreeEnv(
|
||||
SQLHENV henv)
|
||||
{
|
||||
TRACE("SQLFreeEnv");
|
||||
return _SQLFreeEnv(henv);
|
||||
}
|
||||
|
||||
@@ -747,6 +854,7 @@ static SQLRETURN SQL_API _SQLFreeStmt(
|
||||
{
|
||||
struct _hstmt *stmt=(struct _hstmt *)hstmt;
|
||||
|
||||
TRACE("_SQLFreeStmt");
|
||||
if (fOption==SQL_DROP) {
|
||||
free (hstmt);
|
||||
} else if (fOption==SQL_CLOSE) {
|
||||
@@ -758,6 +866,7 @@ SQLRETURN SQL_API SQLFreeStmt(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT fOption)
|
||||
{
|
||||
TRACE("SQLFreeStmt");
|
||||
return _SQLFreeStmt(hstmt, fOption);
|
||||
}
|
||||
|
||||
@@ -768,6 +877,7 @@ SQLRETURN SQL_API SQLGetStmtAttr (
|
||||
SQLINTEGER BufferLength,
|
||||
SQLINTEGER * StringLength)
|
||||
{
|
||||
TRACE("SQLGetStmtAttr");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -777,6 +887,7 @@ SQLRETURN SQL_API SQLGetCursorName(
|
||||
SQLSMALLINT cbCursorMax,
|
||||
SQLSMALLINT FAR *pcbCursor)
|
||||
{
|
||||
TRACE("SQLGetCursorName");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -788,6 +899,7 @@ struct _hstmt *stmt = (struct _hstmt *) hstmt;
|
||||
struct _hdbc *dbc = (struct _hdbc *) stmt->hdbc;
|
||||
struct _henv *env = (struct _henv *) dbc->henv;
|
||||
|
||||
TRACE("SQLNumResultCols");
|
||||
*pccol = env->sql->num_columns;
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
@@ -799,6 +911,7 @@ SQLRETURN SQL_API SQLPrepare(
|
||||
{
|
||||
struct _hstmt *stmt=(struct _hstmt *)hstmt;
|
||||
|
||||
TRACE("SQLPrepare");
|
||||
if (cbSqlStr!=SQL_NTS) {
|
||||
strncpy(stmt->query, szSqlStr, cbSqlStr);
|
||||
stmt->query[cbSqlStr]='\0';
|
||||
@@ -815,7 +928,8 @@ SQLRETURN SQL_API SQLRowCount(
|
||||
{
|
||||
struct _hstmt *stmt=(struct _hstmt *)hstmt;
|
||||
|
||||
*pcrow = stmt->row_affected;
|
||||
TRACE("SQLRowCount");
|
||||
*pcrow = stmt->rows_affected;
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -824,6 +938,7 @@ SQLRETURN SQL_API SQLSetCursorName(
|
||||
SQLCHAR FAR *szCursor,
|
||||
SQLSMALLINT cbCursor)
|
||||
{
|
||||
TRACE("SQLSetCursorName");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -832,6 +947,7 @@ SQLRETURN SQL_API SQLTransact(
|
||||
SQLHDBC hdbc,
|
||||
SQLUSMALLINT fType)
|
||||
{
|
||||
TRACE("SQLTransact");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -846,6 +962,7 @@ SQLRETURN SQL_API SQLSetParam( /* Use SQLBindParameter */
|
||||
SQLPOINTER rgbValue,
|
||||
SQLINTEGER FAR *pcbValue)
|
||||
{
|
||||
TRACE("SQLSetParam");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -860,6 +977,7 @@ SQLRETURN SQL_API SQLColumns(
|
||||
SQLCHAR FAR *szColumnName,
|
||||
SQLSMALLINT cbColumnName)
|
||||
{
|
||||
TRACE("SQLColumns");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -868,6 +986,7 @@ SQLRETURN SQL_API SQLGetConnectOption(
|
||||
SQLUSMALLINT fOption,
|
||||
SQLPOINTER pvParam)
|
||||
{
|
||||
TRACE("SQLGetConnectOption");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -891,6 +1010,7 @@ MdbColumn *col;
|
||||
MdbTableDef *table;
|
||||
int i;
|
||||
|
||||
TRACE("SQLGetData");
|
||||
stmt = (struct _hstmt *) hstmt;
|
||||
dbc = (struct _hdbc *) stmt->hdbc;
|
||||
env = (struct _henv *) dbc->henv;
|
||||
@@ -923,6 +1043,7 @@ SQLRETURN SQL_API SQLGetFunctions(
|
||||
SQLUSMALLINT fFunction,
|
||||
SQLUSMALLINT FAR *pfExists)
|
||||
{
|
||||
TRACE("SQLGetFunctions");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -933,6 +1054,7 @@ SQLRETURN SQL_API SQLGetInfo(
|
||||
SQLSMALLINT cbInfoValueMax,
|
||||
SQLSMALLINT FAR *pcbInfoValue)
|
||||
{
|
||||
TRACE("SQLGetInfo");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -941,6 +1063,7 @@ SQLRETURN SQL_API SQLGetStmtOption(
|
||||
SQLUSMALLINT fOption,
|
||||
SQLPOINTER pvParam)
|
||||
{
|
||||
TRACE("SQLGetStmtOption");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -950,136 +1073,145 @@ SQLRETURN SQL_API SQLGetTypeInfo(
|
||||
{
|
||||
struct _hstmt *stmt;
|
||||
|
||||
TRACE("SQLGetStmtOption");
|
||||
stmt = (struct _hstmt *) hstmt;
|
||||
if (!fSqlType) {
|
||||
strcpy(stmt->query, "SELECT * FROM tds_typeinfo");
|
||||
strcpy(stmt->query, "SELECT * FROM typeinfo");
|
||||
} else {
|
||||
sprintf(stmt->query, "SELECT * FROM tds_typeinfo WHERE SQL_DATA_TYPE = %d", fSqlType);
|
||||
}
|
||||
|
||||
return _SQLExecute(hstmt);
|
||||
sprintf(stmt->query, "SELECT * FROM typeinfo WHERE SQL_DATA_TYPE = %d", fSqlType);
|
||||
}
|
||||
|
||||
/* return _SQLExecute(hstmt); */
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLParamData(
|
||||
SQLHSTMT hstmt,
|
||||
SQLPOINTER FAR *prgbValue)
|
||||
{
|
||||
return SQL_SUCCESS;
|
||||
SQLRETURN SQL_API SQLParamData(
|
||||
SQLHSTMT hstmt,
|
||||
SQLPOINTER FAR *prgbValue)
|
||||
{
|
||||
TRACE("SQLParamData");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLPutData(
|
||||
SQLHSTMT hstmt,
|
||||
SQLPOINTER rgbValue,
|
||||
SQLINTEGER cbValue)
|
||||
{
|
||||
TRACE("SQLPutData");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLSetConnectOption(
|
||||
SQLHDBC hdbc,
|
||||
SQLUSMALLINT fOption,
|
||||
SQLUINTEGER vParam)
|
||||
{
|
||||
TRACE("SQLSetConnectOption");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLSetStmtOption(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT fOption,
|
||||
SQLUINTEGER vParam)
|
||||
{
|
||||
TRACE("SQLSetStmtOption");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLSpecialColumns(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT fColType,
|
||||
SQLCHAR FAR *szCatalogName,
|
||||
SQLSMALLINT cbCatalogName,
|
||||
SQLCHAR FAR *szSchemaName,
|
||||
SQLSMALLINT cbSchemaName,
|
||||
SQLCHAR FAR *szTableName,
|
||||
SQLSMALLINT cbTableName,
|
||||
SQLUSMALLINT fScope,
|
||||
SQLUSMALLINT fNullable)
|
||||
{
|
||||
TRACE("SQLSpecialColumns");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLStatistics(
|
||||
SQLHSTMT hstmt,
|
||||
SQLCHAR FAR *szCatalogName,
|
||||
SQLSMALLINT cbCatalogName,
|
||||
SQLCHAR FAR *szSchemaName,
|
||||
SQLSMALLINT cbSchemaName,
|
||||
SQLCHAR FAR *szTableName,
|
||||
SQLSMALLINT cbTableName,
|
||||
SQLUSMALLINT fUnique,
|
||||
SQLUSMALLINT fAccuracy)
|
||||
{
|
||||
TRACE("SQLStatistics");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLTables(
|
||||
SQLHSTMT hstmt,
|
||||
SQLCHAR FAR *szCatalogName,
|
||||
SQLSMALLINT cbCatalogName,
|
||||
SQLCHAR FAR *szSchemaName,
|
||||
SQLSMALLINT cbSchemaName,
|
||||
SQLCHAR FAR *szTableName,
|
||||
SQLSMALLINT cbTableName,
|
||||
SQLCHAR FAR *szTableType,
|
||||
SQLSMALLINT cbTableType)
|
||||
{
|
||||
char *query, *p;
|
||||
char *sptables = "exec sp_tables ";
|
||||
int querylen, clen, slen, tlen, ttlen;
|
||||
int first = 1;
|
||||
struct _hstmt *stmt;
|
||||
|
||||
TRACE("SQLTables");
|
||||
stmt = (struct _hstmt *) hstmt;
|
||||
|
||||
clen = _odbc_get_string_size(cbCatalogName, szCatalogName);
|
||||
slen = _odbc_get_string_size(cbSchemaName, szSchemaName);
|
||||
tlen = _odbc_get_string_size(cbTableName, szTableName);
|
||||
ttlen = _odbc_get_string_size(cbTableType, szTableType);
|
||||
|
||||
querylen = strlen(sptables) + clen + slen + tlen + ttlen + 40; /* a little padding for quotes and commas */
|
||||
query = (char *) malloc(querylen);
|
||||
p = query;
|
||||
|
||||
strcpy(p, sptables);
|
||||
p += strlen(sptables);
|
||||
|
||||
if (tlen) {
|
||||
*p++ = '"';
|
||||
strncpy(p, szTableName, tlen); *p+=tlen;
|
||||
*p++ = '"';
|
||||
first = 0;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLPutData(
|
||||
SQLHSTMT hstmt,
|
||||
SQLPOINTER rgbValue,
|
||||
SQLINTEGER cbValue)
|
||||
{
|
||||
return SQL_SUCCESS;
|
||||
if (slen) {
|
||||
if (!first) *p++ = ',';
|
||||
*p++ = '"';
|
||||
strncpy(p, szSchemaName, slen); *p+=slen;
|
||||
*p++ = '"';
|
||||
first = 0;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLSetConnectOption(
|
||||
SQLHDBC hdbc,
|
||||
SQLUSMALLINT fOption,
|
||||
SQLUINTEGER vParam)
|
||||
{
|
||||
return SQL_SUCCESS;
|
||||
if (clen) {
|
||||
if (!first) *p++ = ',';
|
||||
*p++ = '"';
|
||||
strncpy(p, szCatalogName, clen); *p+=clen;
|
||||
*p++ = '"';
|
||||
first = 0;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLSetStmtOption(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT fOption,
|
||||
SQLUINTEGER vParam)
|
||||
{
|
||||
return SQL_SUCCESS;
|
||||
if (ttlen) {
|
||||
if (!first) *p++ = ',';
|
||||
*p++ = '"';
|
||||
strncpy(p, szTableType, ttlen); *p+=ttlen;
|
||||
*p++ = '"';
|
||||
first = 0;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLSpecialColumns(
|
||||
SQLHSTMT hstmt,
|
||||
SQLUSMALLINT fColType,
|
||||
SQLCHAR FAR *szCatalogName,
|
||||
SQLSMALLINT cbCatalogName,
|
||||
SQLCHAR FAR *szSchemaName,
|
||||
SQLSMALLINT cbSchemaName,
|
||||
SQLCHAR FAR *szTableName,
|
||||
SQLSMALLINT cbTableName,
|
||||
SQLUSMALLINT fScope,
|
||||
SQLUSMALLINT fNullable)
|
||||
{
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLStatistics(
|
||||
SQLHSTMT hstmt,
|
||||
SQLCHAR FAR *szCatalogName,
|
||||
SQLSMALLINT cbCatalogName,
|
||||
SQLCHAR FAR *szSchemaName,
|
||||
SQLSMALLINT cbSchemaName,
|
||||
SQLCHAR FAR *szTableName,
|
||||
SQLSMALLINT cbTableName,
|
||||
SQLUSMALLINT fUnique,
|
||||
SQLUSMALLINT fAccuracy)
|
||||
{
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
SQLRETURN SQL_API SQLTables(
|
||||
SQLHSTMT hstmt,
|
||||
SQLCHAR FAR *szCatalogName,
|
||||
SQLSMALLINT cbCatalogName,
|
||||
SQLCHAR FAR *szSchemaName,
|
||||
SQLSMALLINT cbSchemaName,
|
||||
SQLCHAR FAR *szTableName,
|
||||
SQLSMALLINT cbTableName,
|
||||
SQLCHAR FAR *szTableType,
|
||||
SQLSMALLINT cbTableType)
|
||||
{
|
||||
char *query, *p;
|
||||
char *sptables = "exec sp_tables ";
|
||||
int querylen, clen, slen, tlen, ttlen;
|
||||
int first = 1;
|
||||
struct _hstmt *stmt;
|
||||
|
||||
stmt = (struct _hstmt *) hstmt;
|
||||
|
||||
clen = _odbc_get_string_size(cbCatalogName, szCatalogName);
|
||||
slen = _odbc_get_string_size(cbSchemaName, szSchemaName);
|
||||
tlen = _odbc_get_string_size(cbTableName, szTableName);
|
||||
ttlen = _odbc_get_string_size(cbTableType, szTableType);
|
||||
|
||||
querylen = strlen(sptables) + clen + slen + tlen + ttlen + 40; /* a little padding for quotes and commas */
|
||||
query = (char *) malloc(querylen);
|
||||
p = query;
|
||||
|
||||
strcpy(p, sptables);
|
||||
p += strlen(sptables);
|
||||
|
||||
if (tlen) {
|
||||
*p++ = '"';
|
||||
strncpy(p, szTableName, tlen); *p+=tlen;
|
||||
*p++ = '"';
|
||||
first = 0;
|
||||
}
|
||||
if (slen) {
|
||||
if (!first) *p++ = ',';
|
||||
*p++ = '"';
|
||||
strncpy(p, szSchemaName, slen); *p+=slen;
|
||||
*p++ = '"';
|
||||
first = 0;
|
||||
}
|
||||
if (clen) {
|
||||
if (!first) *p++ = ',';
|
||||
*p++ = '"';
|
||||
strncpy(p, szCatalogName, clen); *p+=clen;
|
||||
*p++ = '"';
|
||||
first = 0;
|
||||
}
|
||||
if (ttlen) {
|
||||
if (!first) *p++ = ',';
|
||||
*p++ = '"';
|
||||
strncpy(p, szTableType, ttlen); *p+=ttlen;
|
||||
*p++ = '"';
|
||||
first = 0;
|
||||
}
|
||||
*p++ = '\0';
|
||||
// fprintf(stderr,"\nquery = %s\n",query);
|
||||
*p++ = '\0';
|
||||
// fprintf(stderr,"\nquery = %s\n",query);
|
||||
|
||||
strcpy(stmt->query, query);
|
||||
return _SQLExecute(hstmt);
|
||||
@@ -1096,6 +1228,7 @@ SQLRETURN SQL_API SQLDataSources(
|
||||
SQLSMALLINT cbDescriptionMax,
|
||||
SQLSMALLINT FAR *pcbDescription)
|
||||
{
|
||||
TRACE("SQLDataSources");
|
||||
return SQL_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
static char software_version[] = "$Id: unittest.c,v 1.5 2002/01/24 12:34:13 brianb Exp $";
|
||||
static char software_version[] = "$Id: unittest.c,v 1.6 2002/04/09 01:19:26 brianb Exp $";
|
||||
static void *no_unused_var_warn[] = {software_version,
|
||||
no_unused_var_warn};
|
||||
|
||||
@@ -168,6 +168,7 @@ int i;
|
||||
long sAge = 1023;
|
||||
long cbAge = sizeof(long);
|
||||
UCHAR szCol1[60];
|
||||
SQLINTEGER length;
|
||||
|
||||
printf("excecuting first statement\n");
|
||||
retcode = SQLExecute(hstmt);
|
||||
@@ -185,7 +186,7 @@ int i;
|
||||
szSqlState, szErrorMsg);
|
||||
exit(1);
|
||||
}
|
||||
SQLBindCol(hstmt, 3, SQL_CHAR, szCol1, 60, NULL);
|
||||
SQLBindCol(hstmt, 3, SQL_CHAR, szCol1, 60, &length);
|
||||
//SQLBindCol(hstmt, 1, SQL_CHAR, szCol1, 60, NULL);
|
||||
|
||||
/* Execute statement with first row. */
|
||||
@@ -194,7 +195,7 @@ int i;
|
||||
while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS)
|
||||
{
|
||||
i++;
|
||||
printf("%d: szCol1 = %s\n",i,szCol1);
|
||||
printf("%d: szCol1 = %s (%d)\n",i,szCol1, length);
|
||||
}
|
||||
if (retcode != SQL_NO_DATA_FOUND)
|
||||
{
|
||||
|
||||
@@ -62,6 +62,7 @@ host_triplet = i686-pc-linux-gnu
|
||||
AS = @AS@
|
||||
CC = gcc
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME =
|
||||
LD = /usr/bin/ld
|
||||
LEX = flex
|
||||
LIBTOOL = $(SHELL) $(top_builddir)/libtool
|
||||
@@ -96,7 +97,7 @@ libmdbsql_la_LIBADD =
|
||||
libmdbsql_la_OBJECTS = mdbsql.lo parser.lo lexer.lo
|
||||
LEX_OUTPUT_ROOT = lex.yy
|
||||
LEXLIB = -lfl
|
||||
CFLAGS = -g -O2 -DUNIXODBC -DSQL
|
||||
CFLAGS = -g -O2 -DUNIXODBC -DSQL -DHAVE_GNOME
|
||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
CCLD = $(CC)
|
||||
|
||||
@@ -62,6 +62,7 @@ host_triplet = @host@
|
||||
AS = @AS@
|
||||
CC = @CC@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME = @HAVE_GNOME@
|
||||
LD = @LD@
|
||||
LEX = @LEX@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
|
||||
@@ -476,6 +476,24 @@ int i, j;
|
||||
}
|
||||
}
|
||||
}
|
||||
void mdbsql_bind_len(MdbSQL *sql, int colnum, int *len_ptr)
|
||||
{
|
||||
MdbTableDef *table = sql->cur_table;
|
||||
MdbSQLColumn *sqlcol;
|
||||
MdbColumn *col;
|
||||
int i, j;
|
||||
|
||||
/* sql columns are traditionally 1 based, so decrement colnum */
|
||||
sqlcol = g_ptr_array_index(sql->columns,colnum - 1);
|
||||
for (j=0;j<table->num_cols;j++) {
|
||||
col=g_ptr_array_index(table->columns,j);
|
||||
if (!strcasecmp(sqlcol->name, col->name)) {
|
||||
/* bind the column length to its listed (SQL) position */
|
||||
mdb_bind_len(table, j+1, len_ptr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void mdbsql_bind_all(MdbSQL *sql)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -62,6 +62,7 @@ host_triplet = i686-pc-linux-gnu
|
||||
AS = @AS@
|
||||
CC = gcc
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME =
|
||||
LD = /usr/bin/ld
|
||||
LEX = flex
|
||||
LIBTOOL = $(SHELL) $(top_builddir)/libtool
|
||||
@@ -156,7 +157,7 @@ prdump_OBJECTS = prdump.o
|
||||
prdump_LDADD = $(LDADD)
|
||||
prdump_DEPENDENCIES = ../libmdb/libmdb.la
|
||||
prdump_LDFLAGS =
|
||||
CFLAGS = -g -O2 -DUNIXODBC -DSQL
|
||||
CFLAGS = -g -O2 -DUNIXODBC -DSQL -DHAVE_GNOME
|
||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
CCLD = $(CC)
|
||||
|
||||
@@ -62,6 +62,7 @@ host_triplet = @host@
|
||||
AS = @AS@
|
||||
CC = @CC@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
HAVE_GNOME = @HAVE_GNOME@
|
||||
LD = @LD@
|
||||
LEX = @LEX@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
|
||||
Reference in New Issue
Block a user