]> granicus.if.org Git - pdns/commitdiff
Implementation for oracle backend
authorAki Tuomi <cmouse@desteem.org>
Sat, 8 Feb 2014 20:56:41 +0000 (22:56 +0200)
committerAki Tuomi <cmouse@desteem.org>
Sat, 8 Feb 2014 21:02:14 +0000 (23:02 +0200)
modules/oraclebackend/oraclebackend.cc
modules/oraclebackend/oraclebackend.hh

index f07eecc0b067d76414c0a33107d34075972acb5c..a6663992c4a1dc395ee03af141de56337313459d 100644 (file)
@@ -186,6 +186,13 @@ static const char *prevNextHashQueryDefaultSQL =
   "  get_hashed_prev_next(:zoneid, :hash, :unhashed, :prev, :next);\n"
   "END;";
 
+static const char *getAllZoneMetadataQueryKey = "PDNS_Get_All_Zone_Metadata";
+static const char *getAllZoneMetadataQueryDefaultSQL =
+  "SELECT md.meta_key, md.meta_content "
+  "FROM Zones z JOIN ZoneMetadata md ON z.id = md.zone_id "
+  "WHERE z.name = lower(:name)"
+  "ORDER BY md.meta_ind";
+
 static const char *getZoneMetadataQueryKey = "PDNS_Get_Zone_Metadata";
 static const char *getZoneMetadataQueryDefaultSQL =
   "SELECT md.meta_content "
@@ -1240,6 +1247,45 @@ OracleBackend::createSlaveDomain(const string &ip, const string &domain,
   return true;
 }
 
+bool
+OracleBackend::getAllDomainMetadata (const string& name, std::map<string, vector<string> >& meta)
+{
+  if(!d_dnssecQueries)
+    return -1;
+
+  DomainInfo di;
+  if (getDomainInfo(name, di) == false) return false;
+
+  sword rc;
+  OCIStmt *stmt;
+
+  stmt = prepare_query(pooledSvcCtx, getAllZoneMetadataQuerySQL, getAllZoneMetadataQueryKey);
+  bind_str_failokay(stmt, ":nsname", myServerName, sizeof(myServerName));
+  bind_str(stmt, ":name", mQueryName, sizeof(mQueryName));
+  define_output_str(stmt, 1, &mResultContentInd, mResultContent, sizeof(mResultContent));
+
+  string_to_cbuf(mQueryName, name, sizeof(mQueryName));
+
+  rc = OCIStmtExecute(pooledSvcCtx, stmt, oraerr, 1, 0, NULL, NULL, OCI_DEFAULT);
+
+  while (rc != OCI_NO_DATA) {
+    if (rc == OCI_ERROR) {
+      throw OracleException("Oracle getAllDomainMetadata", oraerr);
+    }
+    check_indicator(mResultKindInd, true);
+    check_indicator(mResultContentInd, true);
+
+    string kind = mResultKind;
+    string content = mResultContent;
+    meta[kind].push_back(content);
+
+    rc = OCIStmtFetch2(stmt, oraerr, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
+  }
+
+  release_query(stmt, getAllZoneMetadataQueryKey);
+  return true;
+}
+
 bool
 OracleBackend::getDomainMetadata (const string& name, const string& kind,
                                   vector<string>& meta)
index 8b7f80241f5be8aefdf0bf3287cca10097566516..61db736aea3b661f5e3c001d9234c00fb05cec09 100644 (file)
@@ -79,6 +79,7 @@ public:
   bool createSlaveDomain(const string &ip, const string &domain,
                          const string &nameserver, const string &account);
 
+  bool getAllDomainMetadata(const string& name, std::map<std::string, std::vector<std::string> >& meta); 
   bool getDomainMetadata(const string& name, const std::string& kind, std::vector<std::string>& meta);
   bool setDomainMetadata(const string& name, const std::string& kind, const std::vector<std::string>& meta);
 
@@ -127,6 +128,7 @@ private:
   string prevNextNameQuerySQL;
   string prevNextHashQuerySQL;
 
+  string getAllZoneMetadataQuerySQL;
   string getZoneMetadataQuerySQL;
   string delZoneMetadataQuerySQL;
   string setZoneMetadataQuerySQL;
@@ -161,6 +163,8 @@ private:
   sb2       mResultTTLInd;
   char      mResultType[64];
   sb2       mResultTypeInd;
+  char      mResultKind[64];
+  sb2       mResultKindInd;
   char      mResultContent[4001];
   sb2       mResultContentInd;
   int       mResultZoneId;