Changeset: 121efc794361 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=121efc794361
Removed Files:
clients/R/MonetDB.R/src/Makevars.win
clients/R/MonetDB.R/src/mapi.c
Modified Files:
clients/R/MonetDB.R/NEWS
clients/R/MonetDB.R/R/dbi.R
clients/R/MonetDB.R/R/mapi.R
clients/R/Tests/dbi.R
clients/R/Tests/dbi.stable.out
clients/R/Tests/dplyr.R
clients/R/Tests/survey.R
clients/Tests/MAL-signatures_all.stable.out
clients/Tests/MAL-signatures_fits_geom.stable.out
clients/Tests/MAL-signatures_geom.stable.out
clients/Tests/MAL-signatures_none.stable.out
clients/Tests/exports.stable.out
gdk/gdk_firstn.c
monetdb5/modules/kernel/bat5.mal
monetdb5/modules/mal/Tests/inspect05.stable.out
monetdb5/modules/mal/Tests/pqueue.stable.out
monetdb5/modules/mal/Tests/pqueue2.stable.out
monetdb5/modules/mal/mdb.c
monetdb5/modules/mal/mdb.h
monetdb5/optimizer/opt_mergetable.c
monetdb5/tests/gdkTests/Tests/firstn.stable.out
sql/backends/monet5/bam/bam_db_interface.h
sql/backends/monet5/sql_result.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_scenario.h
sql/backends/monet5/sql_statistics.c
sql/backends/monet5/vaults/fits.c
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
sql/test/testdb-upgrade/Tests/upgrade.stable.out
Branch: default
Log Message:
Merge with Oct2014 branch.
diffs (truncated from 1710 to 300 lines):
diff --git a/clients/R/MonetDB.R/NEWS b/clients/R/MonetDB.R/NEWS
--- a/clients/R/MonetDB.R/NEWS
+++ b/clients/R/MonetDB.R/NEWS
@@ -1,3 +1,7 @@
+0.9.6
+- Fixed non-ASCII character handling (thanks, Roman!)
+- Fully removed C-based socket code
+
0.9.5
- Removed package date (Thanks, Dimitar)
- Added sys. schema name to internal queries, so SET SCHEMA xx would not break
things (Thanks again, Dimitar)
diff --git a/clients/R/MonetDB.R/R/dbi.R b/clients/R/MonetDB.R/R/dbi.R
--- a/clients/R/MonetDB.R/R/dbi.R
+++ b/clients/R/MonetDB.R/R/dbi.R
@@ -1,12 +1,6 @@
+# C library that contains our MAPI string splitting state machine
C_LIBRARY <- "MonetDB.R"
-.onLoad <- function(lib, pkg) {
- if (getOption("monetdb.clib", FALSE)) {
- library.dynam( C_LIBRARY, pkg, lib )
- .Call("mapiInit", PACKAGE=C_LIBRARY)
- }
-}
-
# Make S4 aware of S3 classes
setOldClass(c("sockconn", "connection", "monetdb_mapi_conn"))
@@ -234,6 +228,8 @@ setMethod("dbSendQuery", signature(conn=
}
conn@connenv$exception <- list()
env <- NULL
+ # Auto-convert?
+ # statement <- enc2utf8(statement)
if (getOption("monetdb.debug.query", F)) message("QQ: '",
statement, "'")
resp <- .mapiParseResponse(.mapiRequest(conn, paste0("s",
statement, ";"), async=async))
@@ -539,8 +535,10 @@ setMethod("dbFetch", signature(res="Mone
col <- ct[[j]]
if (col == .CT_NUM)
df[[j]] <- as.numeric(parts[[j]])
- if (col == .CT_CHRR)
+ if (col == .CT_CHRR) {
df[[j]] <- parts[[j]]
+ Encoding(df[[j]]) <- "UTF-8"
+ }
if (col == .CT_BOOL)
df[[j]] <- parts[[j]]=="true"
if (col == .CT_CHR) {
diff --git a/clients/R/MonetDB.R/R/mapi.R b/clients/R/MonetDB.R/R/mapi.R
--- a/clients/R/MonetDB.R/R/mapi.R
+++ b/clients/R/MonetDB.R/R/mapi.R
@@ -86,20 +86,11 @@ REPLY_SIZE <- 100 # Apparently, -1 me
.mapiConnect <- function(host, port, timeout) {
- if (getOption("monetdb.clib", FALSE)) {
- return(.Call("mapiConnect", host, port, timeout, PACKAGE=C_LIBRARY))
- } else {
- return(socketConnection(host = host, port = port, blocking = TRUE,
open="r+b", timeout = timeout))
- }
+ socketConnection(host = host, port = port, blocking = TRUE, open="r+b",
timeout = timeout)
}
.mapiDisconnect <- function(socket) {
- if (getOption("monetdb.clib", FALSE)) {
- .Call("mapiDisconnect", socket, PACKAGE=C_LIBRARY)
- } else {
- # close, don't care about the errors...
- tryCatch(close(socket), error=function(e){}, warning=function(w){})
- }
+ tryCatch(close(socket), error=function(e){}, warning=function(w){})
}
.mapiCleanup <- function(conObj) {
@@ -110,69 +101,48 @@ REPLY_SIZE <- 100 # Apparently, -1 me
}
.mapiRead <- function(con) {
- if (getOption("monetdb.clib", FALSE)) {
- if (!identical(class(con)[[1]], "externalptr"))
- stop("I can only be called with a MonetDB connection object as
parameter.")
- respstr <- .Call("mapiRead", con, PACKAGE=C_LIBRARY)
- if (getOption("monetdb.debug.mapi", F)) {
- dstr <- respstr
- if (nchar(dstr) > 300) {
- dstr <- paste0(substring(dstr, 1, 200), "...", substring(dstr,
nchar(dstr)-100, nchar(dstr)))
- }
- message("RX: '", dstr, "'")
+ if (!identical(class(con)[[1]], "sockconn"))
+ stop("I can only be called with a MonetDB connection object as parameter.")
+ resp <- list()
+ repeat {
+ unpacked <- readBin(con, "integer", n=1, size=2, signed=FALSE,
endian="little")
+
+ if (length(unpacked) == 0) {
+ stop("Empty response from MonetDB server, probably a timeout. You can
increase the time to wait for responses with the 'timeout' parameter to
'dbConnect()'.")
}
- return(respstr)
- } else {
- # R implementation
- if (!identical(class(con)[[1]], "sockconn"))
- stop("I can only be called with a MonetDB connection object as
parameter.")
- resp <- list()
- repeat {
- unpacked <-
readBin(con,"integer",n=1,size=2,signed=FALSE,endian="little")
-
- if (length(unpacked) == 0) {
- stop("Empty response from MonetDB server, probably a timeout. You can
increase the time to wait for responses with the 'timeout' parameter to
'dbConnect()'.")
- }
-
- length <- bitwShiftR(unpacked,1)
- final <- bitwAnd(unpacked,1)
-
- if (length == 0) break
- resp <- c(resp,readChar(con, length, useBytes = TRUE))
- if (final == 1) break
- }
- if (getOption("monetdb.debug.mapi", F)) cat(paste("RX:
'",substring(paste0(resp,collapse=""),1,200),"'\n",sep=""))
- return(paste0("",resp,collapse=""))
+
+ length <- bitwShiftR(unpacked, 1)
+ final <- bitwAnd(unpacked, 1)
+
+ if (length == 0) break
+ # no raw handling here (see .mapiWrite), since server tells us the length
in bytes already
+ resp <- c(resp, readChar(con, length, useBytes = TRUE))
+ if (final == 1) break
}
+ if (getOption("monetdb.debug.mapi", F)) cat(paste("RX: '",
substring(paste0(resp, collapse=""), 1, 200), "'\n", sep=""))
+ return(paste0("", resp, collapse=""))
}
.mapiWrite <- function(con, msg) {
- if (getOption("monetdb.clib", FALSE)) {
- # C implementation
- if (!identical(class(con)[[1]], "externalptr"))
- stop("I can only be called with a MonetDB connection object as
parameter.")
-
- if (getOption("monetdb.debug.mapi", F)) message("TX: '", msg, "'")
- .Call("mapiWrite", con, msg, PACKAGE=C_LIBRARY)
-
- } else {
- # R implementation
- if (!identical(class(con)[[1]], "sockconn"))
- stop("I can only be called with a MonetDB connection object as
parameter.")
- final <- FALSE
- pos <- 0
- if (getOption("monetdb.debug.mapi", F)) message("TX: '",msg,"'\n",sep="")
- while (!final) {
- req <- substring(msg,pos+1,min(MAX_PACKET_SIZE, nchar(msg))+pos)
- bytes <- nchar(req)
- pos <- pos + bytes
- final <- max(nchar(msg) - pos,0) == 0
- header <- as.integer(bitwOr(bitwShiftL(bytes,1),as.numeric(final)))
- writeBin(header, con, 2,endian="little")
- writeChar(req,con,bytes,useBytes=TRUE,eos=NULL)
- }
- flush(con)
+ # R implementation
+ if (!identical(class(con)[[1]], "sockconn"))
+ stop("I can only be called with a MonetDB connection object as parameter.")
+ final <- FALSE
+ pos <- 0
+ if (getOption("monetdb.debug.mapi", F)) message("TX: '", msg, "'\n", sep="")
+ # convert to raw byte array, otherwise multibyte characters are 'difficult'
+ msgr <- charToRaw(msg)
+ msglen <- length(msgr)
+ while (!final) {
+ bytes <- min(MAX_PACKET_SIZE, msglen - pos)
+ reqr <- msgr[(pos + 1) : (pos + bytes)]
+ pos <- pos + bytes
+ final <- max(msglen - pos, 0) == 0
+ header <- as.integer(bitwOr(bitwShiftL(bytes, 1), as.numeric(final)))
+ writeBin(header, con, 2, endian="little")
+ writeBin(reqr, con, endian="little")
}
+ flush(con)
return(NULL)
}
diff --git a/clients/R/MonetDB.R/src/Makevars.win
b/clients/R/MonetDB.R/src/Makevars.win
deleted file mode 100644
--- a/clients/R/MonetDB.R/src/Makevars.win
+++ /dev/null
@@ -1,1 +0,0 @@
-PKG_LIBS= -lws2_32
\ No newline at end of file
diff --git a/clients/R/MonetDB.R/src/mapi.c b/clients/R/MonetDB.R/src/mapi.c
deleted file mode 100644
--- a/clients/R/MonetDB.R/src/mapi.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * The contents of this file are subject to the MonetDB Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.monetdb.org/Legal/MonetDBLicense
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
- * License for the specific language governing rights and limitations
- * under the License.
- *
- * The Original Code is the MonetDB Database System.
- *
- * The Initial Developer of the Original Code is CWI.
- * Portions created by CWI are Copyright (C) 1997-July 2008 CWI.
- * Copyright August 2008-2014 MonetDB B.V.
- * All Rights Reserved.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#ifdef __WIN32__
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#undef ERROR
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#endif
-#include <assert.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#ifndef SOCKET_ERROR
-#define INVALID_SOCKET -1
-#define SOCKET_ERROR -1
-#endif
-
-// R headers
-#include <R.h>
-#include <Rdefines.h>
-
-#define BLOCKSIZE 8190
-#define BUFSIZE BLOCKSIZE+1
-#define SOCKET int
-#define TRUE 1
-#define FALSE 0
-#define ALLOCSIZE 1048576 // 1 MB
-#define DEBUG FALSE
-
-// reference tricks taken from
http://homepage.stat.uiowa.edu/~luke/R/simpleref.html#NWarqU3-KrSQa-1
-static SEXP MAPI_type_tag;
-
-#define CHECK_MAPI_SOCK(s) do { \
- if (TYPEOF(s) != EXTPTRSXP || \
- R_ExternalPtrTag(s) != MAPI_type_tag || \
- EXTPTR_PTR(s) == NULL) \
- error("Socket was either not successfully connected or is already
closed. Either way, it cannot be used."); \
-} while (0)
-
-SEXP mapiInit(void) {
- MAPI_type_tag = install("MAPI_TYPE_TAG");
-#ifdef __WIN32__
- // I will not even TRY to understand why this is required
- WSADATA wsaData;
- int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
- if (iResult != 0) {
- error("WSAStartup failed: %d", iResult);
- }
-#endif
- return R_NilValue;
-}
-
-SEXP mapiDisconnect(SEXP conn) {
- if (TYPEOF(conn) != EXTPTRSXP || R_ExternalPtrTag(conn) !=
MAPI_type_tag) {
- warning("trying to disconnect from a non-socket.");
- return R_NilValue;
- }
- SOCKET *sock = R_ExternalPtrAddr(conn);
- if (sock != NULL) {
- shutdown(*sock, 2);
- R_ClearExternalPtr(conn);
- free(sock);
- }
- return R_NilValue;
-}
-
-SEXP mapiConnect(SEXP host, SEXP port, SEXP timeout) {
- // be a bit paranoid about the parameters
- assert(IS_CHARACTER(host));
- assert(GET_LENGTH(host) == 1);
- assert(IS_INTEGER(port));
- assert(GET_LENGTH(port) == 1);
- assert(IS_INTEGER(timeout));
- assert(GET_LENGTH(timeout) == 1);
-
- const char *hostval = CHAR(STRING_ELT(host, 0));
- const int portval = INTEGER_POINTER(AS_INTEGER(port))[0];
- const int timeoutval = INTEGER_POINTER(AS_INTEGER(port))[0];
-
- assert(strlen(hostval) > 0);
- assert(portval > 0 && portval < 65535);
- assert(timeoutval > 0);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list