[svn] commit: r2867 - in /branches/trac232/src/lib/datasrc: python/libdata_source_python.cc python/tests/data_source_python_test.py sqlite3_datasrc.cc
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Sep 8 15:51:55 UTC 2010
Author: jelte
Date: Wed Sep 8 15:51:54 2010
New Revision: 2867
Log:
add_rrset and del_rrset
Modified:
branches/trac232/src/lib/datasrc/python/libdata_source_python.cc
branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py
branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
Modified: branches/trac232/src/lib/datasrc/python/libdata_source_python.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/python/libdata_source_python.cc (original)
+++ branches/trac232/src/lib/datasrc/python/libdata_source_python.cc Wed Sep 8 15:51:54 2010
@@ -83,6 +83,8 @@
static PyObject* DataSrc_startTransaction(s_DataSrc* self, PyObject* args);
static PyObject* DataSrc_commitTransaction(s_DataSrc* self, PyObject* args);
static PyObject* DataSrc_rollbackTransaction(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_addRRset(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_delRRset(s_DataSrc* self, PyObject* args);
static PyMethodDef DataSrc_methods[] = {
{ "get_class", reinterpret_cast<PyCFunction>(DataSrc_getClass), METH_NOARGS,
@@ -110,6 +112,10 @@
"Commit a transaction" },
{ "rollback_transaction", reinterpret_cast<PyCFunction>(DataSrc_rollbackTransaction), METH_VARARGS,
"Roll back a transaction" },
+ { "add_rrset", reinterpret_cast<PyCFunction>(DataSrc_addRRset), METH_VARARGS,
+ "Add an RRset" },
+ { "del_rrset", reinterpret_cast<PyCFunction>(DataSrc_delRRset), METH_VARARGS,
+ "Delete an RRset" },
{ NULL, NULL, 0, NULL }
};
@@ -276,6 +282,7 @@
{
PyObject* name_obj_str = PyObject_CallMethod(name_obj, "to_text", NULL);
const char* name_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(name_obj_str));
+ Py_DECREF(name_obj_str);
return isc::dns::Name(name_str);
}
@@ -309,6 +316,7 @@
{
PyObject* rrclass_obj_str = PyObject_CallMethod(rrclass_obj, "to_text", NULL);
const char* rrclass_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(rrclass_obj_str));
+ Py_DECREF(rrclass_obj_str);
return isc::dns::RRClass(rrclass_str);
}
@@ -347,6 +355,7 @@
{
PyObject* rrtype_obj_str = PyObject_CallMethod(rrtype_obj, "to_text", NULL);
const char* rrtype_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(rrtype_obj_str));
+ Py_DECREF(rrtype_obj_str);
return isc::dns::RRType(rrtype_str);
}
@@ -370,9 +379,11 @@
{
PyObject* rrttl_obj_str = PyObject_CallMethod(rrttl_obj, "to_text", NULL);
const char* rrttl_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(rrttl_obj_str));
+ Py_DECREF(rrttl_obj_str);
return isc::dns::RRTTL(rrttl_str);
}
+// for Rdata we have no getClass and getType, so we need to provide these
PyObject*
pyRdata_createRdata(const isc::dns::RRType& rrtype, const isc::dns::RRClass& rrclass, const isc::dns::rdata::Rdata& rdata) {
PyObject* rdata_class = PyObject_GetAttrString(po_DNS_module, "Rdata");
@@ -389,6 +400,16 @@
return rdata_obj;
}
+// for Rdata we have no getClass and getType, so we need to provide these
+isc::dns::rdata::ConstRdataPtr
+PyRdata_AsRdataPtr(const isc::dns::RRType& rrtype, const isc::dns::RRClass& rrclass, PyObject* rdata_obj)
+{
+ PyObject* rdata_obj_str = PyObject_CallMethod(rdata_obj, "to_text", NULL);
+ const char* rdata_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(rdata_obj_str));
+ Py_DECREF(rdata_obj_str);
+ return isc::dns::rdata::createRdata(rrtype, rrclass, rdata_str);
+}
+
PyObject*
pyRRset_FromRRset(const isc::dns::RRset& rrset)
{
@@ -418,6 +439,33 @@
Py_DECREF(rdata_obj);
}
return rrset_obj;
+}
+
+isc::dns::ConstRRsetPtr
+pyRRset_AsRRsetPtr(PyObject* rrset_obj)
+{
+ PyObject* name_obj = PyObject_CallMethod(rrset_obj, "get_name", NULL);
+ isc::dns::Name name = pyName_AsName(name_obj);
+ PyObject* rrclass_obj = PyObject_CallMethod(rrset_obj, "get_class", NULL);
+ isc::dns::RRClass rrclass = pyRRClass_AsRRClass(rrclass_obj);
+ PyObject* rrtype_obj = PyObject_CallMethod(rrset_obj, "get_type", NULL);
+ isc::dns::RRType rrtype = pyRRType_AsRRType(rrtype_obj);
+ PyObject* rrttl_obj = PyObject_CallMethod(rrset_obj, "get_ttl", NULL);
+ isc::dns::RRTTL rrttl = pyRRTTL_AsRRTTL(rrttl_obj);
+
+ isc::dns::RRsetPtr rrset_ptr = isc::dns::RRsetPtr(new
+ isc::dns::RRset(name, rrclass, rrtype, rrttl));
+ PyObject* rdata_list_obj = PyObject_CallMethod(rrset_obj, "get_rdata", NULL);
+ for (int i = 0; i < PyList_Size(rdata_list_obj); ++i) {
+ isc::dns::rdata::ConstRdataPtr rdata = PyRdata_AsRdataPtr(rrtype, rrclass, PyList_GET_ITEM(rdata_list_obj, i));
+ rrset_ptr->addRdata(*rdata);
+ }
+ Py_DECREF(name_obj);
+ Py_DECREF(rrclass_obj);
+ Py_DECREF(rrtype_obj);
+ Py_DECREF(rrttl_obj);
+
+ return rrset_ptr;
}
/* end of conversion functions */
@@ -494,10 +542,12 @@
self->datasrc->findRRset(n, c, t, result_list,
flags, &zone_name);
- BOOST_FOREACH(isc::dns::RRsetPtr rrs, result_list) {
- PyObject *rrset_obj = pyRRset_FromRRset(*rrs);
- PyList_Append(result_list_obj, rrset_obj);
- Py_DECREF(rrset_obj);
+ if (result == isc::datasrc::DataSrc::SUCCESS) {
+ BOOST_FOREACH(isc::dns::RRsetPtr rrs, result_list) {
+ PyObject *rrset_obj = pyRRset_FromRRset(*rrs);
+ PyList_Append(result_list_obj, rrset_obj);
+ Py_DECREF(rrset_obj);
+ }
}
return Py_BuildValue("I", result);
} else {
@@ -756,6 +806,46 @@
return (NULL);
}
+static PyObject*
+DataSrc_addRRset(s_DataSrc* self, PyObject* args) {
+ s_DataSrcTransaction *transaction;
+ PyObject* rrset_obj;
+
+ if (PyArg_ParseTuple(args, "O!O",
+ &datasrc_transaction_type, &transaction,
+ &rrset_obj)) {
+ isc::dns::ConstRRsetPtr rrset_ptr = pyRRset_AsRRsetPtr(rrset_obj);
+
+ PyObject* result = Py_BuildValue("I",
+ self->datasrc->addRRset(
+ *(transaction->datasrc_transaction),
+ rrset_ptr));
+ return result;
+ }
+ return (NULL);
+
+}
+
+static PyObject*
+DataSrc_delRRset(s_DataSrc* self, PyObject* args) {
+ s_DataSrcTransaction *transaction;
+ PyObject* rrset_obj;
+
+ if (PyArg_ParseTuple(args, "O!O",
+ &datasrc_transaction_type, &transaction,
+ &rrset_obj)) {
+ isc::dns::ConstRRsetPtr rrset_ptr = pyRRset_AsRRsetPtr(rrset_obj);
+
+ PyObject* result = Py_BuildValue("I",
+ self->datasrc->delRRset(
+ *(transaction->datasrc_transaction),
+ rrset_ptr));
+ return result;
+ }
+ return (NULL);
+
+}
+
//
// Transaction objects
//
Modified: branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py
==============================================================================
--- branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py (original)
+++ branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py Wed Sep 8 15:51:54 2010
@@ -192,8 +192,8 @@
self.assertEqual(DataSrc.T_NO_SUCH_ZONE, result)
self.assertEqual(DataSrcTransaction.INIT, transaction.get_state())
- def test_add_rrset(self):
- rrset = RRset(Name("pythontest.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+ def test_add_rrset_rollback(self):
+ rrset = RRset(Name("added.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
self.assertEqual(DataSrcTransaction.INIT, transaction.get_state())
@@ -201,10 +201,122 @@
result = self.ds.start_transaction(transaction)
self.assertEqual(DataSrc.T_SUCCESS, result)
- #result = self.ds.add_rrset(transaction, rrset)
+ # empty rrset, should fail on add
+ result = self.ds.add_rrset(transaction, rrset)
+ self.assertEqual(DataSrc.T_ERROR, result)
+
+ # check if rrset does not exist, then add it but roll back
+ # check for nonexistence again, then add it and commit
+ # finally check if exists
+ result = []
+ n = self.ds.find_addrs(Name("added.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
+
+ rrset.add_rdata(Rdata(rrset.get_type(), rrset.get_class(), "192.0.2.1"))
+ result = self.ds.add_rrset(transaction, rrset)
self.assertEqual(DataSrc.T_SUCCESS, result)
self.ds.rollback_transaction(transaction)
+
+ result = []
+ n = self.ds.find_addrs(Name("added.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
+
+ def test_add_rrset_commit(self):
+ rrset = RRset(Name("added.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+ rrset.add_rdata(Rdata(rrset.get_type(), rrset.get_class(), "192.0.2.1"))
+
+ result = []
+ n = self.ds.find_addrs(Name("added.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
+
+ transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+ result = self.ds.start_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+ result = self.ds.add_rrset(transaction, rrset)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+ result = self.ds.commit_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
+ result = []
+ n = self.ds.find_addrs(Name("added.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(1, len(result))
+ self.assertEqual("added.example.com. 3600 IN A 192.0.2.1\n", str(result[0]))
+
+ def test_del_rrset_rollback(self):
+ rrset = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+ rrset.add_rdata(Rdata(rrset.get_type(), rrset.get_class(), "192.0.2.1"))
+
+ transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+ self.assertEqual(DataSrcTransaction.INIT, transaction.get_state())
+
+ result = self.ds.start_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
+ result = []
+ n = self.ds.find_addrs(Name("www.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(1, len(result))
+
+ result = self.ds.del_rrset(transaction, rrset)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
+ self.ds.rollback_transaction(transaction)
+
+ result = []
+ n = self.ds.find_addrs(Name("www.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(1, len(result))
+
+ def test_del_rrset_commit(self):
+ rrset = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+ rrset.add_rdata(Rdata(rrset.get_type(), rrset.get_class(), "192.0.2.1"))
+
+ result = []
+ n = self.ds.find_addrs(Name("www.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(1, len(result))
+
+ transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+ result = self.ds.start_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+ result = self.ds.del_rrset(transaction, rrset)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+ result = self.ds.commit_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
+ result = []
+ n = self.ds.find_addrs(Name("www.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ # there's still other data, so we should get a list of 1 empty
+ # rrset
+ self.assertEqual(1, len(result))
+ self.assertEqual(0, result[0].get_rdata_count())
+
+ def test_del_rrset_name(self):
+ rrset = RRset(Name("www.example.com"), RRClass.IN(), RRType.ANY(), RRTTL(3600))
+
+ result = []
+ n = self.ds.find_rrset(Name("www.example.com"), RRClass.IN(), RRType.A(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(1, len(result))
+
+ transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+ result = self.ds.start_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+ result = self.ds.del_rrset(transaction, rrset)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+ result = self.ds.commit_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
+ result = []
+ n = self.ds.find_rrset(Name("www.example.com"), RRClass.IN(), RRType.A(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
# helper functions for tests taken from c++ unittests
Modified: branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc (original)
+++ branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc Wed Sep 8 15:51:54 2010
@@ -913,14 +913,13 @@
if (transaction.getState() != DataSrcTransaction::RUNNING) {
return DataSrc::T_ERROR;
}
- std::cout << "[XX] addRR at sqlite3" << std::endl;
+ if (rrset->getRdataCount() == 0) {
+ return DataSrc::T_ERROR;
+ }
int zone_id = transaction.getData()->get("zone_id")->intValue();
- std::cout << "[XX] zone id: " << zone_id << std::endl;
-
RdataIteratorPtr rdp = rrset->getRdataIterator();
rdp->first();
- std::cout << "[XX] RDATA: " << rdp->getCurrent().toText() << std::endl;
- std::cout << "[XX] RDATA: " << rdp->getCurrent().toText().c_str() << std::endl;
+
DataSrc::TransactionResult result = DataSrc::T_SUCCESS;
do {
result = addRR(zone_id, rrset->getName(), rrset->getType(), rrset->getTTL(), rdp->getCurrent());
More information about the bind10-changes
mailing list