286 lines
7.8 KiB
C
286 lines
7.8 KiB
C
/*
|
|
* Copyright (C) 2012 - Juan Ferrer Toribio
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "vn-consulter.h"
|
|
#include "stdlib.h"
|
|
|
|
#define FILE_KW "sql://"
|
|
|
|
G_DEFINE_TYPE (VnConsulter, vn_consulter, VN_TYPE_FORM);
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
|
|
|
|
void vn_consulter_clean_clicked (GtkButton * button, VnConsulter * obj)
|
|
{
|
|
gtk_list_store_clear (obj->model);
|
|
}
|
|
|
|
void vn_consulter_on_stop_clicked (GtkButton * button, VnConsulter * obj)
|
|
{
|
|
db_conn_kill_query (VN_FORM (obj)->conn);
|
|
}
|
|
|
|
static void vn_consulter_set_message (VnConsulter * obj, const gchar * msg)
|
|
{
|
|
GtkTreePath * path;
|
|
GtkTreeIter iter;
|
|
|
|
gtk_list_store_append (obj->model, &iter);
|
|
gtk_list_store_set (obj->model, &iter, 0, msg, -1);
|
|
path = gtk_tree_model_get_path (GTK_TREE_MODEL (obj->model), &iter);
|
|
gtk_tree_view_scroll_to_cell (obj->tv, path, NULL, FALSE, 0, 0);
|
|
gtk_tree_path_free (path);
|
|
}
|
|
|
|
static void vn_consulter_model_status_changed (DbModel * model,
|
|
DbModelStatus status, VnConsulter * obj)
|
|
{
|
|
GList * n;
|
|
GtkTreeView * tv = GTK_TREE_VIEW (obj->grid);
|
|
GList * cols = gtk_tree_view_get_columns (tv);
|
|
|
|
for (n = cols; n; n = n->next)
|
|
{
|
|
GtkTreeViewColumn * col = n->data;
|
|
gtk_tree_view_remove_column (tv, col);
|
|
}
|
|
|
|
g_list_free (cols);
|
|
|
|
switch (status)
|
|
{
|
|
case DB_MODEL_STATUS_READY:
|
|
{
|
|
gint i;
|
|
|
|
for (i = 0; i < db_model_get_ncols (model); i++)
|
|
{
|
|
VnColumn * column;
|
|
GType col_type, type = db_model_get_column_type (model, i);
|
|
gboolean image = FALSE;
|
|
gchar * format = NULL;
|
|
/*col_type = VN_TYPE_COLUMN_ENTRY;
|
|
if (type == G_TYPE_INT)
|
|
format = "%d";
|
|
else if (type == G_TYPE_UINT)
|
|
format = "%u";
|
|
else*/
|
|
if (type == G_TYPE_FLOAT || type == G_TYPE_DOUBLE
|
|
|| type == G_TYPE_INT || type == G_TYPE_UINT)
|
|
col_type = VN_TYPE_COLUMN_SPIN;
|
|
//format = "%.2f";
|
|
else if (type == G_TYPE_BYTES)
|
|
col_type = VN_TYPE_COLUMN_IMAGE;
|
|
else if (type == G_TYPE_BOOLEAN)
|
|
col_type = VN_TYPE_COLUMN_CHECK;
|
|
//format = "%b";
|
|
else if (type == G_TYPE_STRING && !g_utf8_collate
|
|
(g_utf8_casefold (db_model_get_column_name (model, i), -1)
|
|
,g_utf8_casefold ("image", -1)))
|
|
{
|
|
image = TRUE;
|
|
col_type = VN_TYPE_COLUMN_IMAGE;
|
|
}
|
|
/*else if (type == G_TYPE_DATE)
|
|
format = "%Y-%m-%d";
|
|
else if (type == G_TYPE_DATE_TIME)
|
|
format = "%Y-%m-%d %T";
|
|
*/ else
|
|
{
|
|
col_type = VN_TYPE_COLUMN_ENTRY;
|
|
//format = "%s";
|
|
}
|
|
|
|
column = vn_grid_append_column (obj->grid, i
|
|
,db_model_get_column_name (model, i)
|
|
,col_type
|
|
,TRUE, FALSE
|
|
);
|
|
|
|
if (format)
|
|
g_object_set (column, "format", format, NULL);
|
|
|
|
if (type == G_TYPE_INT)
|
|
g_object_set (column,
|
|
"lower", (gdouble)G_MININT,
|
|
"upper", (gdouble)G_MAXINT,
|
|
NULL);
|
|
else if (type == G_TYPE_UINT)
|
|
g_object_set (column,
|
|
"upper", (gdouble)G_MAXUINT,
|
|
NULL);
|
|
else if (type == G_TYPE_FLOAT || type == G_TYPE_DOUBLE)
|
|
g_object_set (column,
|
|
"digits", 2,
|
|
"lower", -1000.0,
|
|
"upper", 1000.0,
|
|
"step-increment", 0.1,
|
|
// "editable", FALSE,
|
|
NULL);
|
|
else
|
|
if (image)
|
|
g_object_set (column,
|
|
"host", "www.verdnatura.es",
|
|
"path", "image/cache/catalog/icon",
|
|
"tooltip-path", "../full",
|
|
NULL);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case DB_MODEL_STATUS_ERROR:
|
|
vn_consulter_set_message (obj, "Error");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
gtk_widget_set_sensitive (GTK_WIDGET (obj->mode), TRUE);
|
|
}
|
|
|
|
void vn_consulter_mode_toggled (GtkToggleButton * mode, VnConsulter * obj)
|
|
{
|
|
DbIterator * iterator = vn_handler_get_iterator (obj->handler);
|
|
|
|
db_iterator_set_mode (iterator
|
|
,(gtk_toggle_button_get_active (mode)) ?
|
|
DB_ITERATOR_MODE_ON_CHANGE:
|
|
DB_ITERATOR_MODE_ON_DEMAND
|
|
);
|
|
}
|
|
|
|
void vn_consulter_send (GtkButton * button, VnConsulter * obj)
|
|
{
|
|
DbIterator * iterator;
|
|
DbModel * model;
|
|
gchar * sql;
|
|
|
|
sql = gtk_combo_box_text_get_active_text (obj->combo);
|
|
|
|
vn_consulter_set_message (obj, sql);
|
|
|
|
if (g_str_has_prefix (sql, FILE_KW))
|
|
model = db_model_new_with_file (VN_FORM (obj)->conn,
|
|
sql + g_utf8_strlen (FILE_KW, -1));
|
|
else
|
|
model = db_model_new_with_sql (VN_FORM (obj)->conn, sql);
|
|
|
|
// Get sure to connect after the columns do, to destroy them.
|
|
g_signal_connect_after (model, "status-changed",
|
|
G_CALLBACK (vn_consulter_model_status_changed), obj);
|
|
|
|
iterator = db_iterator_new (model);
|
|
iterator->mode = DB_ITERATOR_MODE_ON_DEMAND;
|
|
vn_handler_set_iterator (obj->handler, iterator);
|
|
vn_grid_set_iterator (obj->grid, iterator);
|
|
|
|
vn_consulter_mode_toggled (GTK_TOGGLE_BUTTON (obj->mode), obj);
|
|
|
|
g_free (sql);
|
|
g_object_unref (model);
|
|
g_object_unref (iterator);
|
|
}
|
|
|
|
static void vn_consulter_open (VnConsulter * obj)
|
|
{
|
|
gint i;
|
|
VnForm * form = VN_FORM (obj);
|
|
|
|
obj->file = g_strconcat
|
|
(FILE_KW, vn_mod_get_name (form->mod), "/consulter", NULL);
|
|
|
|
gchar * queries[] =
|
|
{
|
|
//MySQL (kk schema)
|
|
"/*my*/SELECT id, name, item_id, item_id2, amount, item.price "
|
|
"FROM movement JOIN item USING (item_id, item_id2)"
|
|
,"/*my*/SELECT item_id,item_id2, i.name, m.id, m.amount, m.price "
|
|
"FROM item i LEFT JOIN movement m USING (item_id, item_id2)"
|
|
,"/*my*/SELECT item_id, item_id2, name, price FROM item"
|
|
//PgSQL (test schema)
|
|
,"/*pg*/SELECT pg_sleep(120)"
|
|
,"/*pg*/SELECT i.id, i.name, i.color, m.id, m.amount "
|
|
"FROM item i LEFT JOIN movement m ON i.id = m.item_id"
|
|
,"/*pg*/SELECT m.id, amount, item_id, name, color "
|
|
"FROM movement m JOIN item ON m.item_id = item.id"
|
|
,obj->file
|
|
,"/*pg*/ SELECT id1, id2, name, ok, date, number, floating, image "
|
|
"FROM prueben"
|
|
,"/*pg*/ SELECT id1, number, floating FROM prueben LIMIT 1"
|
|
,NULL
|
|
};
|
|
|
|
obj->model = vn_form_get (form, "model");
|
|
obj->combo = vn_form_get (form, "query");
|
|
obj->tv = vn_form_get (form, "treeview");
|
|
obj->mode = vn_form_get (form, "mode");
|
|
obj->grid = vn_form_get (form, "consulter");
|
|
obj->handler = vn_form_get (form, "handler");
|
|
gtk_entry_set_placeholder_text (vn_form_get (form, "combo-entry"),
|
|
_("Type or select a query"));
|
|
|
|
gtk_tree_view_insert_column_with_attributes (obj->tv, -1, _("Message"),
|
|
gtk_cell_renderer_text_new (), "text", 0, NULL);
|
|
|
|
for (i = 0; i < g_strv_length (queries); i++)
|
|
gtk_combo_box_text_prepend_text (obj->combo, queries[i]);
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Actions
|
|
|
|
void vn_consulter_on_send_activated (GSimpleAction * a, GVariant * p, gpointer obj)
|
|
{
|
|
vn_consulter_send (NULL, VN_CONSULTER (obj));
|
|
}
|
|
|
|
void vn_consulter_on_clean_activated (GSimpleAction * a, GVariant * p, gpointer obj)
|
|
{
|
|
vn_consulter_clean_clicked (NULL, VN_CONSULTER (obj));
|
|
}
|
|
|
|
static const GActionEntry actions[] =
|
|
{
|
|
{"send", vn_consulter_on_send_activated}
|
|
,{"clean", vn_consulter_on_clean_activated}
|
|
};
|
|
|
|
const GActionEntry * vn_consulter_get_actions (VnForm * obj, gint * size)
|
|
{
|
|
*size = G_N_ELEMENTS (actions);
|
|
return actions;
|
|
}
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
|
|
|
|
static void vn_consulter_init (VnConsulter * obj)
|
|
{
|
|
obj->source = 0;
|
|
}
|
|
|
|
static void vn_consulter_finalize (VnConsulter * obj)
|
|
{
|
|
g_free (obj->file);
|
|
G_OBJECT_CLASS (vn_consulter_parent_class)->finalize (G_OBJECT (obj));
|
|
}
|
|
|
|
static void vn_consulter_class_init (VnConsulterClass * k)
|
|
{
|
|
G_OBJECT_CLASS (k)->finalize = (GObjectFinalizeFunc) vn_consulter_finalize;
|
|
VN_FORM_CLASS (k)->open = (VnFormOpenFunc) vn_consulter_open;
|
|
VN_FORM_CLASS (k)->get_actions = vn_consulter_get_actions;
|
|
}
|