From d3eadcdc784f308fbc1628f3fc833b1cae97a793 Mon Sep 17 00:00:00 2001 From: hrbrmstr Date: Mon, 21 Jan 2019 16:36:36 -0500 Subject: [PATCH] started work on query response pretty printer --- NAMESPACE | 1 + R/aaa.R | 6 +++++- R/resolver.R | 40 +++++++++++++++++++++++++++++++++++++++- man/print.gdns_response.Rd | 17 +++++++++++++++++ src/resolver.cpp | 14 ++++++++++---- 5 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 man/print.gdns_response.Rd diff --git a/NAMESPACE b/NAMESPACE index c70a794..ca1db06 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,6 +1,7 @@ # Generated by roxygen2: do not edit by hand S3method(print,gctx) +S3method(print,gdns_response) export("%>%") export(gdns_get_address) export(gdns_lib_version) diff --git a/R/aaa.R b/R/aaa.R index 0bcc93a..bb2a6c8 100644 --- a/R/aaa.R +++ b/R/aaa.R @@ -1,3 +1,5 @@ +set_names <- function (object = nm, nm) { names(object) <- nm ; object } + rr_types <- c( a = 1, ns = 2, @@ -85,4 +87,6 @@ avc = 258, doa = 259, ta = 32768, dlv = 32769 -) \ No newline at end of file +) + +rr_types_rev <- set_names(names(rr_types), as.character(rr_types)) \ No newline at end of file diff --git a/R/resolver.R b/R/resolver.R index d2c13c9..3046126 100644 --- a/R/resolver.R +++ b/R/resolver.R @@ -123,9 +123,47 @@ gdns_query <- function(gctx, name, rr_type = "txt") { res <- int_gdns_query(gctx, name, unname(as.integer(rr_types[rr_type]))) if (length(res)) { out <- jsonlite::fromJSON(res) + class(out) <- c("gdns_response", "list") out } else { NULL } -} \ No newline at end of file +} + +list(`1` = "ipv4_address", `2` = "nsdname", `6` = c("expire", +"minimum", "mname", "refresh", "retry", "rname", "serial"), `16` = "txt_strings", + `28` = "ipv6_address", `43` = c("algorithm", "digest", "digest_type", + "key_tag"), `46` = c("algorithm", "key_tag", "labels", "original_ttl", + "signature", "signature_expiration", "signature_inception", + "signers_name", "type_covered"), `47` = c("next_domain_name", + "type_bit_maps"), `48` = c("algorithm", "flags", "protocol", + "public_key")) -> rr_fields + +#' Printer for gdns_response objects +#' +#' @param x a `gdns_response` object +#' @param ... ignored +#' @keywords internal +#' @export +print.gdns_response <- function(x, ...) { + + cat( + "Query: ", + x$replies_tree$question$qname[1], " ", + toupper(rr_types_rev[x$replies_tree$question$qtype[1]]), + "\n", sep="" + ) + + print(str( + x$replies_tree$answer[[1]]$rdata[ + rr_fields[[as.character(unique(x$replies_tree$answer[[1]]$type))]] + ], 1 + )) + +} + + + + + diff --git a/man/print.gdns_response.Rd b/man/print.gdns_response.Rd new file mode 100644 index 0000000..b93e6b3 --- /dev/null +++ b/man/print.gdns_response.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/resolver.R +\name{print.gdns_response} +\alias{print.gdns_response} +\title{Printer for gdns_response objects} +\usage{ +\method{print}{gdns_response}(x, ...) +} +\arguments{ +\item{x}{a \code{gdns_response} object} + +\item{...}{ignored} +} +\description{ +Printer for gdns_response objects +} +\keyword{internal} diff --git a/src/resolver.cpp b/src/resolver.cpp index 755a573..1c00e27 100644 --- a/src/resolver.cpp +++ b/src/resolver.cpp @@ -22,7 +22,8 @@ void check_is_xptr(SEXP s) { // [[Rcpp::export]] SEXP is_null_xptr_(SEXP s) { check_is_xptr(s); - return Rf_ScalarLogical(R_ExternalPtrAddr(s) == NULL); + void *r = (void *)R_ExternalPtrAddr(s); + return wrap(r == NULL); } static void gctx_finalizer(SEXP ptr) { @@ -92,6 +93,8 @@ CharacterVector gdns_get_address(SEXP gctx, std::string host) { std::vector< std::string > out; bool ok = false; + check_is_xptr(gctx); + getdns_context *ctxt = (getdns_context *)R_ExternalPtrAddr(gctx); if (gctx == NULL) return(CharacterVector()); @@ -145,6 +148,8 @@ CharacterVector int_get_resolvers(SEXP gctx) { getdns_list *addrs; std::vector< std::string > out; + check_is_xptr(gctx); + getdns_context *ctxt = (getdns_context *)R_ExternalPtrAddr(gctx); if (gctx == NULL) return(CharacterVector()); @@ -193,15 +198,16 @@ CharacterVector int_get_resolvers(SEXP gctx) { CharacterVector int_gdns_query(SEXP gctx, std::string name, uint16_t rr) { uint32_t err; - size_t sz; + // size_t sz; getdns_return_t r; getdns_dict *resp = NULL; - getdns_list *results; + // getdns_list *results; std::string out; bool ok = false; - getdns_context *ctxt = (getdns_context *)R_ExternalPtrAddr(gctx); + check_is_xptr(gctx); + getdns_context *ctxt = (getdns_context *)R_ExternalPtrAddr(gctx); if (gctx == NULL) return(CharacterVector()); if ((r = getdns_general_sync(ctxt, name.c_str(), rr, NULL, &resp))) {