Exemple #1
0
/* callbacks */
static void
gmdb_sql_write_rslt_cb(GtkWidget *w, GladeXML *xml)
{
	/* We need to re-run the whole query because some information is not stored
	 * in the TreeStore, such as column types.
	 */
	gchar *file_path;
	GladeXML *sql_xml;
	GtkWidget *filesel, *dlg;
	FILE *outfile;
	int i;
	int need_headers = 0;
	gchar delimiter[11];
	gchar quotechar[5];
	gchar escape_char[5];
	int bin_mode;
	gchar lineterm[5];

	guint len;
	gchar *buf;
	GtkTextIter start, end;
	GtkTextBuffer *txtbuffer;
	GtkWidget *textview;
	char **bound_values;
	int *bound_lens; 
	MdbSQLColumn *sqlcol;
	long row;
	char *value;
	size_t length;
	MdbTableDef *table;
	MdbColumn *col = NULL;

	gmdb_export_get_delimiter(xml, delimiter, sizeof(delimiter));
	gmdb_export_get_lineterm(xml, lineterm, sizeof(lineterm));
	gmdb_export_get_quotechar(xml, quotechar, sizeof(quotechar));
	gmdb_export_get_escapechar(xml, escape_char, sizeof(escape_char));
	bin_mode = gmdb_export_get_binmode(xml);
	need_headers = gmdb_export_get_headers(xml);
	file_path = gmdb_export_get_filepath(xml);

	if ((outfile=fopen(file_path, "w"))==NULL) {
		dlg = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (w)),
		    GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE,
		    _("Unable to open file."));
		gtk_dialog_run (GTK_DIALOG (dlg));
		gtk_widget_destroy (dlg);
		return;
	}

	/* Get SQL */
	filesel = glade_xml_get_widget (xml, "export_dialog");
	sql_xml = g_object_get_data(G_OBJECT(filesel), "sql_xml");
	//printf("sql_xml %p\n",sql_xml);
	textview = glade_xml_get_widget(sql_xml, "sql_textview");
	txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
	len = gtk_text_buffer_get_char_count(txtbuffer);
	gtk_text_buffer_get_iter_at_offset (txtbuffer, &start, 0);
	gtk_text_buffer_get_iter_at_offset (txtbuffer, &end, len);
	buf = gtk_text_buffer_get_text(txtbuffer, &start, &end, FALSE);


	/* ok now execute it */
	mdb_sql_run_query(sql, buf);
	if (mdb_sql_has_error(sql)) {
		GtkWidget* dlg = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (w)),
		    GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE,
		    "%s", mdb_sql_last_error(sql));
		gtk_dialog_run (GTK_DIALOG (dlg));
		gtk_widget_destroy (dlg);
		mdb_sql_reset(sql);
		
		fclose(outfile);
		gtk_widget_destroy(filesel);
		return;
	}

	bound_values = (char **) g_malloc(sql->num_columns * sizeof(char *));
	bound_lens = (int *) g_malloc(sql->num_columns * sizeof(int));

	for (i=0; i<sql->num_columns; i++) {
		/* bind columns */
		bound_values[i] = (char *) g_malloc0(MDB_BIND_SIZE); 
		mdb_sql_bind_column(sql, i+1, bound_values[i], &bound_lens[i]);

		/* display column titles */
		if (need_headers) {
			if (i>0)
				fputs(delimiter, outfile);
			sqlcol = g_ptr_array_index(sql->columns,i);
			gmdb_print_col(outfile, sqlcol->name, quotechar[0]!='\0', MDB_TEXT, 0, quotechar, escape_char, bin_mode);
		}
	}

	row = 0;
	while (mdb_fetch_row(sql->cur_table)) {
		row++;
		for (i=0; i<sql->num_columns; i++) { 
			if (i>0)
				fputs(delimiter, outfile);

			sqlcol = g_ptr_array_index(sql->columns, i);

			/* Find col matching sqlcol */
			table = sql->cur_table;
			for (i=0; i<table->num_cols; i++) {
				col = g_ptr_array_index(table->columns, i);
				if (!g_ascii_strcasecmp(sqlcol->name, col->name))
					break;
			}
			/* assert(i!=table->num_cols). Can't happen, already checked. */

			/* Don't quote NULLs */
			if (bound_lens[i] && sqlcol->bind_type != MDB_OLE) {
				if (col->col_type == MDB_OLE) {
					value = mdb_ole_read_full(mdb, col, &length);
				} else {
					value = bound_values[i];
					length = bound_lens[i];
				}
				gmdb_print_col(outfile, value, quotechar[0]!='\0', col->col_type, length, quotechar, escape_char, bin_mode);
				if (col->col_type == MDB_OLE)
					free(value);
			}
		}
		fputs(lineterm, outfile);
	}

	/* free the memory used to bind */
	for (i=0; i<sql->num_columns; i++) {
		g_free(bound_values[i]);
	}

	mdb_sql_reset(sql);
	g_free(buf);

	fclose(outfile);

	dlg = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (w)),
	    GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE,
	    _("%ld rows successfully exported."), row);
	gtk_dialog_run (GTK_DIALOG (dlg));
	gtk_widget_destroy (dlg);
	
	gtk_widget_destroy(filesel);
}
Exemple #2
0
int
main(int argc, char **argv)
{
	MdbHandle *mdb;
	MdbTableDef *table;
	gchar name[256];
	gchar *propColName;
	void *buf;
	int col_num;
	int found = 0;

	if (argc < 3) {
		fprintf(stderr,"Usage: %s <file> <object name> [<prop col>]\n",
			argv[0]);
		return 1;
	}
	if (argc < 4)
		propColName = "LvProp";
	else
		propColName = argv[3];

	mdb_init();

	mdb = mdb_open(argv[1], MDB_NOFLAGS);
	if (!mdb) {
		mdb_exit();
		return 1;
	}

	table = mdb_read_table_by_name(mdb, "MSysObjects", MDB_ANY);
	if (!table) {
		mdb_close(mdb);
		mdb_exit();
		return 1;
	}
	mdb_read_columns(table);
	mdb_rewind_table(table);

	mdb_bind_column_by_name(table, "Name", name, NULL);
	buf = g_malloc(MDB_BIND_SIZE);
	col_num = mdb_bind_column_by_name(table, propColName, buf, NULL);
	if (col_num < 1) {
		g_free(buf);
		mdb_free_tabledef(table);
		mdb_close(mdb);
		mdb_exit();
		printf("Column %s not found in MSysObjects!\n", argv[3]);
		return 1;
	}

	while(mdb_fetch_row(table)) {
		if (!strcmp(name, argv[2])) {
			found = 1;
			break;
		}
	}

	if (found) {
		MdbColumn *col = g_ptr_array_index(table->columns, col_num-1);
		size_t size;
		void *kkd = mdb_ole_read_full(mdb, col, &size);
		dump_kkd(mdb, kkd, size);
		free(kkd);
	}

	g_free(buf);
	mdb_free_tabledef(table);
	mdb_close(mdb);
	mdb_exit();

	return 0;
}