myadm

Simple MySQL client for the terminal
git clone git://git.bitsmanent.org/myadm
Log | Files | Refs | README | LICENSE

commit d5ce6702209c37b75f3a43caf107ff3cac4a351f
parent d4483dc5b41827b5073b18c3557bab48dc573349
Author: Claudio Alessi <smoppy@gmail.com>
Date:   Wed, 24 Feb 2016 23:57:35 +0100

Introduce selitem.
This has its drawback (annoted at the top of the file). A fresh getitem() clean up the things a bit, many more to be done.

Diffstat:
Mcore.c | 48++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 40 insertions(+), 8 deletions(-)

diff --git a/core.c b/core.c @@ -2,6 +2,7 @@ /* http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html */ /* What about don't allocate item->name in mysql_items() but just assign it to * row[i], then only free res instead of all items? */ +/* selitem dereferences a NULL pointer if the previous view gets destroyed */ #include <stdio.h> #include <stdarg.h> @@ -68,6 +69,7 @@ void detachitemfrom(Item *i, Item **ii); void *ecalloc(size_t nmemb, size_t size); void cleanupview(View *v); void cleanupitems(Item *i); +Item *getitem(void); void flagas(const Arg *arg); void apply(const Arg *arg); void quit(const Arg *arg); @@ -106,8 +108,8 @@ static Key keys[] = { { "databases", L"q", quit, {.i = 0} }, { "databases", L"ENTER", usedb, {.v = &modes[1]} }, { "databases", L"SPACE", usedb, {.v = &modes[1]} }, - { "tables", L"ENTER", usetable, {0} }, - { "tables", L"SPACE", usetable, {0} }, + { "tables", L"ENTER", usetable, {.v = &modes[2]} }, + { "tables", L"SPACE", usetable, {.v = &modes[2]} }, { "records", L"ENTER", userecord, {0} }, { "records", L"d", flagas, {.v = "D"} }, { "records", L"t", flagas, {.v = "*"} }, @@ -118,9 +120,10 @@ static Key keys[] = { /* variables */ static int running = 1; -static MYSQL *mysql = NULL; +static MYSQL *mysql; static View *views, *selview; static struct stfl_ipool *ipool; +static Item *selitem; /* function implementations */ void @@ -302,29 +305,58 @@ tables(void) { void records(void) { + Item *item; + MYSQL_RES *res; + char txt[256]; + int i; + + snprintf(txt, sizeof txt, "select * from `%s`", selitem->name); + + if(!(res = mysql_exec(txt))) + die("tables\n"); + + cleanupitems(selview->items); + selview->nitems = mysql_items(res, &selview->items); + mysql_free_result(res); + + if(!selview->form) + selview->form = stfl_create(L"<records.stfl>"); + i = 0; + stfl_modify(selview->form, L"records", L"replace_inner", L"vbox"); /* clear */ + for(item = selview->items; item; item = item->next) { + snprintf(txt, sizeof txt, "listitem[%d] text:\"%s\"", i++, item->name); + stfl_modify(selview->form, L"records", L"append", stfl_ipool_towc(ipool, txt)); + } + stfl_set(selview->form, L"pos", 0); } void text(void) { } -void -usedb(const Arg *arg) { - Item *item; - int i = 0; - +Item * +getitem(void) { int pos = atoi(stfl_ipool_fromwc(ipool, stfl_get(selview->form, L"pos"))); + int i = 0; + Item *item = NULL; for(item = selview->items; item; item = item->next) if(i++ == pos) break; + return item; +} +void +usedb(const Arg *arg) { + Item *item = getitem(); mysql_select_db(mysql, item->name); setmode(arg); } void usetable(const Arg *arg) { + selitem = getitem(); + setmode(arg); } void