This repository has been archived on 2024-07-15. You can view files and clone it, but cannot push or open issues or pull requests.
hedera/module/src/vn-consulter.c

250 lines
6.4 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"
G_DEFINE_TYPE (VnConsulter, vn_consulter, VN_TYPE_FORM);
#define FILE_KW "sql://"
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
void vn_consulter_clean_clicked (GtkButton * button, VnConsulter * obj)
{
gtk_list_store_clear (obj->model);
}
static gboolean idle_sender (VnConsulter * obj)
{
static int a = 0;
if (a < 100)
{
db_model_refresh (vn_grid_get_model (obj->grid));
a++;
return TRUE;
}
a = 0;
obj->source = 0;
return FALSE;
}
void vn_consulter_multisend_clicked (GtkButton * button, VnConsulter * obj)
{
if (vn_grid_get_model (obj->grid))
{
if (!obj->source)
obj->source = g_timeout_add (100, (GSourceFunc) idle_sender, obj);
else if (g_source_remove (obj->source))
obj->source = 0;
}
}
void vn_consulter_start_clicked (GtkButton * button, VnConsulter * obj)
{
db_conn_start_transaction (VN_FORM (obj)->conn);
}
void vn_consulter_on_stop_clicked (GtkButton * button, VnConsulter * obj)
{
db_conn_kill_query (VN_FORM (obj)->conn);
}
void vn_consulter_commit_clicked (GtkButton * button, VnConsulter * obj)
{
db_conn_commit (VN_FORM (obj)->conn);
}
void vn_consulter_rollback_clicked (GtkButton * button, VnConsulter * obj)
{
db_conn_rollback (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);
if (type == G_TYPE_BYTES)
col_type = VN_TYPE_COLUMN_IMAGE;
else if (type == G_TYPE_BOOLEAN)
col_type = VN_TYPE_COLUMN_CHECK;
else
col_type = VN_TYPE_COLUMN_ENTRY;
if (i == 7)
col_type = VN_TYPE_COLUMN_IMAGE;
column = vn_grid_append_column (obj->grid, i
,db_model_get_column_name (model, i)
,col_type
,TRUE, FALSE
);
if (i == 7)
g_object_set (column,
"host", "www.verdnatura.es",
"path", "image/cache/catalog/icon",
"tooltip-path", "../full",
NULL);
if (type == G_TYPE_FLOAT || type == G_TYPE_DOUBLE)
g_object_set (column, "digits", 3, 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);
g_signal_connect (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);
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"
,FILE_KW"example/consulter"
,"/*pg*/ SELECT id1, id2, name, ok, date, number, floating, image "
"FROM prueben"
,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, "Mensaje",
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]);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
static void vn_consulter_init (VnConsulter * obj)
{
obj->source = 0;
}
static void vn_consulter_class_init (VnConsulterClass * k)
{
VN_FORM_CLASS (k)->open = (VnFormOpenFunc) vn_consulter_open;
}