From 5ba1ed8f1d4cea5e51739a0522cdbdaf9cb55bcd Mon Sep 17 00:00:00 2001 From: Harbour Date: Thu, 24 Apr 2008 11:04:48 +0300 Subject: [PATCH] . --- faraon/x11_ui.C | 72 +++++++--------------------------------------------- faraon/x11_ui.fl | 70 +++++++++----------------------------------------- include/elements.H | 2 +- include/proto_data.H | 1 + include/sfinx.H | 9 ++++++- sfinx/sfinx.C | 61 +++++++++++++++++++++++++++++++++++++++++--- 6 files changed, 89 insertions(+), 126 deletions(-) diff --git a/faraon/x11_ui.C b/faraon/x11_ui.C index 244d951..4aaca6e 100644 --- a/faraon/x11_ui.C +++ b/faraon/x11_ui.C @@ -962,50 +962,13 @@ app->sfinx.send(note); Fl_Scroll_Resize *notes_tree_scroll=(Fl_Scroll_Resize *)0; static void cb_Delete3(Fl_Button*, void*) { - /*int n = notes_br->value(); -if (!n) + Fl_Toggle_Node *node = notes_tree->selected(); +if (!node || node->can_open()) return; -sfinx_file_t *file = ((sfinx_files_vector_t *)files_module_tree_br->user_data())->files[n - 1]; -string path; -if (current_files_module_tree_path.tid() == SFINX_FILES_MODULE_UNSORTED_TREE_REQUEST) { - // sure ? - string message = "Deleting \'" + file->name + "\'. Are you sure ?"; - if (fl_choice(message.c_str(), "Yes", "No", 0L)) - return; - app->files_module_conf.get(FILES_MODULE_UNSORTED_PATH, path); - path += "/" + file->name; - sfinx_string_t f(SFINX_FILES_MODULE_UNLINK); - f.set(path); - app->sfinx.send(f); -} else { - // sorted can be marked unsorted or deleted - string message = "Delete or Unsort \'" + file->name + "\' ?"; - int res = fl_choice(message.c_str(), "Cancel", "Unsort", "Delete"); - if (!res) - return; - if (res == 2) { // delete - file->tid(SFINX_FILES_MODULE_SORTED_UNLINK); - app->sfinx.send(file); - } else { - file->tid(SFINX_FILES_MODULE_UNSORT); - app->sfinx.send(file); - } -} -//files_module_tree_br->remove(n); -app->sfinx.send(current_files_module_tree_path);*/; -} - -static void cb_Reload1(Fl_Button*, void*) { - //app->sfinx.send(current_note); -} - -static void cb_Select1(Fl_Button*, void*) { - //for (int i = 1; i <= notes_br->size(); i++) -// notes_br->select(i); -} - -static void cb_Unselect1(Fl_Button*, void*) { - //notes_br->deselect(); +sfinx_object_t *obj = (sfinx_object_t *) node->user_data(); +delete_sfinx_note_to->value(obj->name.c_str()); +delete_note_w->user_data(obj); +delete_note_w->show(); } Fl_Double_Window *edit_note_w=(Fl_Double_Window *)0; @@ -1098,13 +1061,11 @@ static void cb_Cancelb(Fl_Button*, void*) { } static void cb_Delete4(Fl_Button*, void*) { - Fl_Toggle_Node *node = notes_tree->selected(); -if (!node || node->can_open()) - return; -sfinx_object_t *obj = (sfinx_object_t *) node->user_data(); + sfinx_object_t *obj = (sfinx_object_t *) delete_note_w->user_data(); sfinx_note_t note(note_deletion_type_ch->value() ? SFINX_NOTES_MODULE_UNLINK : SFINX_NOTES_MODULE_UNSORT); note.id = obj->id; app->sfinx.send(note); +delete_note_w->user_data(0); delete_note_w->hide(); fill_objects_tree(notes_tree, (1 << SFINX_SLICE_OBJECT) | (1 << SFINX_NOTE_OBJECT), 0, 1); // force refresh; } @@ -3288,7 +3249,7 @@ void x11_ui::init() { o->labeltype(FL_ENGRAVED_LABEL); o->callback((Fl_Callback*)cb_Edit1); } // Fl_Button* o - { notes_tree_scroll = new Fl_Scroll_Resize(13, 45, 705, 254); + { notes_tree_scroll = new Fl_Scroll_Resize(13, 10, 705, 289); notes_tree_scroll->box(FL_ENGRAVED_FRAME); notes_tree_scroll->color((Fl_Color)28); notes_tree_scroll->selection_color(FL_BACKGROUND_COLOR); @@ -3308,21 +3269,6 @@ void x11_ui::init() { o->labeltype(FL_ENGRAVED_LABEL); o->callback((Fl_Callback*)cb_Delete3); } // Fl_Button* o - { Fl_Button* o = new Fl_Button(35, 10, 112, 25, gettext("Up [ .. ]")); - o->labeltype(FL_ENGRAVED_LABEL); - } // Fl_Button* o - { Fl_Button* o = new Fl_Button(166, 10, 112, 25, gettext("Reload")); - o->labeltype(FL_ENGRAVED_LABEL); - o->callback((Fl_Callback*)cb_Reload1); - } // Fl_Button* o - { Fl_Button* o = new Fl_Button(297, 10, 112, 25, gettext("Select All")); - o->labeltype(FL_ENGRAVED_LABEL); - o->callback((Fl_Callback*)cb_Select1); - } // Fl_Button* o - { Fl_Button* o = new Fl_Button(428, 10, 112, 25, gettext("Unselect All")); - o->labeltype(FL_ENGRAVED_LABEL); - o->callback((Fl_Callback*)cb_Unselect1); - } // Fl_Button* o notes_w->end(); notes_w->resizable(notes_w); } // Fl_Double_Window* notes_w diff --git a/faraon/x11_ui.fl b/faraon/x11_ui.fl index 39ab3b1..29285d2 100644 --- a/faraon/x11_ui.fl +++ b/faraon/x11_ui.fl @@ -629,7 +629,7 @@ select_slice_action(slice);} } {} } Fl_Window slices_w { - label {Sfinx Data} + label {Sfinx Data} open xywh {200 315 866 370} type Double color 31 hide modal } { Fl_Button {} { @@ -1241,8 +1241,8 @@ note.id = obj->id; app->sfinx.send(note);} xywh {154 312 128 25} labeltype ENGRAVED_LABEL } - Fl_Scroll notes_tree_scroll { - xywh {13 45 705 254} box ENGRAVED_FRAME color 28 + Fl_Scroll notes_tree_scroll {selected + xywh {13 10 705 289} box ENGRAVED_FRAME color 28 code0 {notes_tree = new Fl_Toggle_Tree(12, 12, notes_tree_scroll->w(), 10);} code1 {notes_tree->callback(notes_tree_cb); notes_tree->user_data((void *)notes_tree_scroll);} code2 {notes_w->resizable(notes_tree_scroll);} @@ -1251,59 +1251,15 @@ app->sfinx.send(note);} } {} Fl_Button {} { label Delete - callback {/*int n = notes_br->value(); -if (!n) + callback {Fl_Toggle_Node *node = notes_tree->selected(); +if (!node || node->can_open()) return; -sfinx_file_t *file = ((sfinx_files_vector_t *)files_module_tree_br->user_data())->files[n - 1]; -string path; -if (current_files_module_tree_path.tid() == SFINX_FILES_MODULE_UNSORTED_TREE_REQUEST) { - // sure ? - string message = "Deleting \\'" + file->name + "\\'. Are you sure ?"; - if (fl_choice(message.c_str(), "Yes", "No", 0L)) - return; - app->files_module_conf.get(FILES_MODULE_UNSORTED_PATH, path); - path += "/" + file->name; - sfinx_string_t f(SFINX_FILES_MODULE_UNLINK); - f.set(path); - app->sfinx.send(f); -} else { - // sorted can be marked unsorted or deleted - string message = "Delete or Unsort \\'" + file->name + "\\' ?"; - int res = fl_choice(message.c_str(), "Cancel", "Unsort", "Delete"); - if (!res) - return; - if (res == 2) { // delete - file->tid(SFINX_FILES_MODULE_SORTED_UNLINK); - app->sfinx.send(file); - } else { - file->tid(SFINX_FILES_MODULE_UNSORT); - app->sfinx.send(file); - } -} -//files_module_tree_br->remove(n); -app->sfinx.send(current_files_module_tree_path);*/} +sfinx_object_t *obj = (sfinx_object_t *) node->user_data(); +delete_sfinx_note_to->value(obj->name.c_str()); +delete_note_w->user_data(obj); +delete_note_w->show();} xywh {300 312 112 25} labeltype ENGRAVED_LABEL } - Fl_Button {} { - label {Up [ .. ]} - xywh {35 10 112 25} labeltype ENGRAVED_LABEL - } - Fl_Button {} { - label Reload - callback {//app->sfinx.send(current_note);} - xywh {166 10 112 25} labeltype ENGRAVED_LABEL - } - Fl_Button {} { - label {Select All} - callback {//for (int i = 1; i <= notes_br->size(); i++) -// notes_br->select(i);} - xywh {297 10 112 25} labeltype ENGRAVED_LABEL - } - Fl_Button {} { - label {Unselect All} - callback {//notes_br->deselect();} - xywh {428 10 112 25} labeltype ENGRAVED_LABEL - } } Fl_Window edit_note_w { label {Edit Note} @@ -1418,15 +1374,13 @@ slices_w->show();} } Fl_Button {} { label Delete - callback {Fl_Toggle_Node *node = notes_tree->selected(); -if (!node || node->can_open()) - return; -sfinx_object_t *obj = (sfinx_object_t *) node->user_data(); + callback {sfinx_object_t *obj = (sfinx_object_t *) delete_note_w->user_data(); sfinx_note_t note(note_deletion_type_ch->value() ? SFINX_NOTES_MODULE_UNLINK : SFINX_NOTES_MODULE_UNSORT); note.id = obj->id; app->sfinx.send(note); +delete_note_w->user_data(0); delete_note_w->hide(); -fill_objects_tree(notes_tree, (1 << SFINX_SLICE_OBJECT) | (1 << SFINX_NOTE_OBJECT), 0, 1); // force refresh} selected +fill_objects_tree(notes_tree, (1 << SFINX_SLICE_OBJECT) | (1 << SFINX_NOTE_OBJECT), 0, 1); // force refresh} xywh {40 122 112 25} labeltype ENGRAVED_LABEL } Fl_Output delete_sfinx_note_to { diff --git a/include/elements.H b/include/elements.H index d3120c6..495f84c 100644 --- a/include/elements.H +++ b/include/elements.H @@ -237,7 +237,7 @@ class sfinx_object_t { string name, path_name, description; sfinx_timestamp_t ctime, etime; sfinx_object_t() { id = type = 0; } - sfinx_object_t(sfinx_type_t t, sfinx_id_t i, sfinx_id_t s) { + sfinx_object_t(sfinx_type_t t, sfinx_id_t i, sfinx_id_t s = 0) { type = t; id = i; slice_id = s; diff --git a/include/proto_data.H b/include/proto_data.H index 9eedd81..bb84349 100644 --- a/include/proto_data.H +++ b/include/proto_data.H @@ -92,6 +92,7 @@ _new_enum(SFINX_SLICE_RELINK) // objects _new_enum(SFINX_OBJECTS_TREE_REQUEST) _new_enum(SFINX_OBJECTS_TREE) +_new_enum(SFINX_OBJECTS_DELETE_RECURSIVLY) // files _new_enum(SFINX_FILES_MODULE_CONF_REQUEST) diff --git a/include/sfinx.H b/include/sfinx.H index e2b9b90..9072e34 100644 --- a/include/sfinx.H +++ b/include/sfinx.H @@ -109,8 +109,15 @@ class faraon_session : public sfinx_stream, public TCPSession { bool get_file_by_id(sfinx_file_t *f); bool get_object(sfinx_object_t *dst, sfinx_type_t obj_type, sfinx_id_t obj_id); bool get_object(sfinx_object_t *dst) { return get_object(dst, dst->type, dst->id); } + void delete_object_recursivly(sfinx_object_t *o); + void delete_from_notes(sfinx_object_t *o); + void delete_by_mtag_from_notes(sfinx_object_t *o); + void delete_by_mtag(sfinx_object_t *o) { + delete_by_mtag_from_notes(o); + // delete_by_mtag_from_files(o); + // ... + } void notes_module_add(sfinx_note_t *n); - void note_unlink(sfinx_note_t *n); void fill_notes(sfinx_slice_t *slice); void fill_files(sfinx_slice_t *slice); void add_slices_from_parent(sfinx_id_t parent_id, IBPP::Transaction tr, sfinx_slice_vector_t *slices, diff --git a/sfinx/sfinx.C b/sfinx/sfinx.C index 3a06323..e9897c6 100644 --- a/sfinx/sfinx.C +++ b/sfinx/sfinx.C @@ -555,9 +555,58 @@ void faraon_session::mark_file_unsorted(sfinx_file_t *f, bool remove) gen_desc_file(f->mtag_type, f->mtag_id, f->mtag_slice_id); } -void faraon_session::note_unlink(sfinx_note_t *n) +void faraon_session::delete_from_notes(sfinx_object_t *o) { - + IBPP::Transaction tr = sfinx->driver_->TransactionFactory(sfinx->db_, IBPP::amWrite, + IBPP::ilConcurrency, IBPP::lrWait); + tr->Start(); + IBPP::Statement st = sfinx->driver_->StatementFactory(sfinx->db_, tr); + // delete note tags + st->Prepare("delete from note_tags where note_id = ?"); + st->Set(1, (int64_t)o->id); + st->Execute(); + // delete note + st->Prepare("delete from notes where id = ?"); + st->Set(1, (int64_t)o->id); + st->Execute(); + tr->Commit(); +} + +void faraon_session::delete_by_mtag_from_notes(sfinx_object_t *o) +{ + IBPP::Transaction tr = sfinx->driver_->TransactionFactory(sfinx->db_, IBPP::amRead, + IBPP::ilConcurrency, IBPP::lrWait); + tr->Start(); + IBPP::Statement st = sfinx->driver_->StatementFactory(sfinx->db_, tr); + // search for note mtagged with o + st->Prepare("select id from notes where mtag_type = ? and mtag_id = ?"); + st->Set(1, (int32_t)o->type); + st->Set(2, (int64_t)o->id); + st->Execute(); + while(st->Fetch()) { + int64_t dn_id; + st->Get(1, &dn_id); + sfinx_object_t dn(SFINX_NOTE_OBJECT, dn_id); // depended note + // × Ó×ÏÀ ÏÞÅÒÅÄØ ÕÄÁÌÑÅÍ ×ÓÅ ÏÂØÅËÔÙ, ÚÁ×ÉÓÑÝÉÅ ÏÔ ÜÔÏÊ note + delete_by_mtag(&dn); + delete_from_notes(&dn); + } + tr->Commit(); +} + +// ÍÏÖÅÔ ÐÅÒÅÄÁ×ÁÔØ tr ÐÏ ÒÅËÕÒÓÉÉ ? +void faraon_session::delete_object_recursivly(sfinx_object_t *o) +{ + // delete depended objects + delete_by_mtag(o); + // delete object itself + switch (o->type) { + case SFINX_NOTE_OBJECT: + delete_from_notes(o); + break; + default: + break; + } } void faraon_session::update_files_module_conf(sfinx_pair_vector_t *conf) @@ -1523,11 +1572,17 @@ bool faraon_session::process_requests() } sfinx_t *el; string root; + sfinx_object_t o; + sfinx_string_t reply; while ((el = rx_elements.next())) { switch (el->tid()) { case SFINX_NOTES_MODULE_UNSORT: case SFINX_NOTES_MODULE_UNLINK: - note_unlink((sfinx_note_t *)el); + o.type = SFINX_NOTE_OBJECT; + o.id = ((sfinx_note_t *)el)->id; + delete_object_recursivly(&o); + reply.tid(el->tid()); + send(reply); break; case SFINX_NOTES_MODULE_EDIT: update_note((sfinx_note_t *)el); -- 2.11.4.GIT