HTTP POST submits of patches to the central database

Kari Pahula kaol at iki.fi
Fri Mar 31 09:34:21 UTC 2006


Hello.

Here's my mostly functional patch to add code to send in patches to
the central debtags database with HTTP POST instead of mailing them.

I took the liberty of refactoring most of update-tags.pl to
UpdateTags.pm.  At the same time I moved config.pl to it's own Cfg.pm.
IMHO it would be a good idea to make proper modules from commonly used
code, even if it was never submitted to CPAN.  I didn't patch the rest
of those "require '../config.pl';" calls to "use
CentralDatabase::Cfg;" yet.  Feel free to put my code to use a require
too if you want.

I failed to get the $entity =
$parser->parse_data($q->param('POSTDATA')); call to parse the query
correctly in patch-submit.cgi.  I'm going to have to ask someone else
to sort that one out.  $entity->dump_skeleton just shows:

Content-type: multipart/mixed
Effective-type: multipart/mixed
Body-file: NONE
Num-parts: 1
--
    Content-type: text/plain
    Effective-type: text/plain
    Body-file: NONE
    --

AFAIK Body-file should contain the debtags diff, not be NONE.

Other than this, I've patched debtags-editor to show in a menu an
option to submit patches via HTTP POST and to show the results in a
Gtk::Dialog.  Unlike email, this way of submitting patches is
synchronous and the program's showing the result of the submission
right away.

The patch to debtags-edit requires patching libapt-front too, whose
patch I sent to its mailing list.  See
http://lists.alioth.debian.org/pipermail/libapt-front-devel/2006-March/000786.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: central-database.tar.gz
Type: application/octet-stream
Size: 3868 bytes
Desc: not available
Url : http://lists.alioth.debian.org/pipermail/debtags-devel/attachments/20060331/f0be5e44/central-database.tar.obj
-------------- next part --------------
--- debtags/debtags-edit/trunk/src/DebtagsDocument.cc	2006-02-26 00:34:52.016957000 +0200
+++ debtags-edit/trunk/src/DebtagsDocument.cc	2006-03-29 15:33:54.941584554 +0300
@@ -359,6 +359,11 @@
 	debtags().sendPatch();
 }
 
+void DebtagsDocument::sendHTTP(FILE* reply) throw (FileException)
+{
+	debtags().sendPatchHTTP(reply);
+}
+
 /*
 template<class T>
 OpSet<T> DebtagsDocument<T>::handlesToItems(const OpSet<int>& handles) const throw ()
--- debtags/debtags-edit/trunk/src/DebtagsDocument.h	2006-02-26 00:34:52.020957000 +0200
+++ debtags-edit/trunk/src/DebtagsDocument.h	2006-03-29 15:43:13.467361388 +0300
@@ -166,6 +166,7 @@
 	//void load() throw (FileException, ParserException);
 	void save() throw (Tagcoll::FileException);
 	void send() throw (Tagcoll::FileException);
+	void sendHTTP(FILE*) throw (Tagcoll::FileException);
 
 	//void output(TagcollConsumer<T>& consumer) throw ();
 	//void output(TagcollConsumer<int>& consumer) throw ();
--- debtags/debtags-edit/trunk/src/DebtagsEditor.cc	2006-02-26 00:34:52.020957000 +0200
+++ debtags-edit/trunk/src/DebtagsEditor.cc	2006-03-31 02:48:40.758248843 +0300
@@ -144,6 +144,9 @@
 	
 	fileMenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_Mail changes to central database",
 				sigc::mem_fun(*this, &DebtagsEditor::on_send)));
+
+	fileMenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_Submit changes to central database with HTTP POST",
+				sigc::mem_fun(*this, &DebtagsEditor::on_send_http)));
 	
 	/*
 	saveMenuItem = &(fileMenu.items().back());
@@ -363,6 +366,35 @@
 	}
 }
 
+template<class DOC>
+void DebtagsEditor<DOC>::on_send_http()
+{
+	try {
+		FILE* reply = tmpfile();
+		doc.sendHTTP(reply);
+		rewind(reply);
+		Glib::RefPtr<Gtk::TextBuffer> reply_buf = Gtk::TextBuffer::create();
+		char buf[1024];
+		size_t bytes_read;
+		do {
+			bytes_read = fread(buf, 1, 1024, reply);
+			printf("read %i bytes\n", bytes_read);
+			reply_buf->insert(reply_buf->end(), buf, buf+bytes_read);
+		} while (bytes_read == 1024);
+		Gtk::TextView reply_view(reply_buf);
+		reply_view.set_editable(false);
+		Gtk::Dialog oki("Server reply", true);
+		oki.add_button(Gtk::Stock::OK, 0);
+		oki.get_vbox()->pack_end(reply_view);
+		oki.get_vbox()->show_all();
+		oki.run();
+	} catch (Exception& e) {
+		Gtk::MessageDialog err(string("Send failed: ") + e.desc() + " (" + e.type() + ")",
+				false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true);
+		err.run();
+	}
+}
+
 /*
 template<class DOC>
 void DebtagsEditor<DOC>::on_save_as()
--- debtags/debtags-edit/trunk/src/DebtagsEditor.h	2006-02-26 00:34:52.020957000 +0200
+++ debtags-edit/trunk/src/DebtagsEditor.h	2006-03-29 01:59:03.622656346 +0300
@@ -127,6 +127,7 @@
 	//void on_open_debtags();
 	void on_save();
 	void on_send();
+	void on_send_http();
 	//void on_save_as();
 	void on_quit();
 	void on_compute_intensive_data();


More information about the Debtags-devel mailing list