Skip to content
This repository
Browse code

R client for Redis first draft

  • Loading branch information...
commit 090c8477e27bfd710a028526b0e7cc0c65d3ff44 0 parents
B. W. Lewis authored
191 COPYING
... ... @@ -0,0 +1,191 @@
  1 + Apache License
  2 + Version 2.0, January 2004
  3 + http://www.apache.org/licenses/
  4 +
  5 + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
  6 +
  7 + 1. Definitions.
  8 +
  9 + "License" shall mean the terms and conditions for use, reproduction,
  10 + and distribution as defined by Sections 1 through 9 of this document.
  11 +
  12 + "Licensor" shall mean the copyright owner or entity authorized by
  13 + the copyright owner that is granting the License.
  14 +
  15 + "Legal Entity" shall mean the union of the acting entity and all
  16 + other entities that control, are controlled by, or are under common
  17 + control with that entity. For the purposes of this definition,
  18 + "control" means (i) the power, direct or indirect, to cause the
  19 + direction or management of such entity, whether by contract or
  20 + otherwise, or (ii) ownership of fifty percent (50%) or more of the
  21 + outstanding shares, or (iii) beneficial ownership of such entity.
  22 +
  23 + "You" (or "Your") shall mean an individual or Legal Entity
  24 + exercising permissions granted by this License.
  25 +
  26 + "Source" form shall mean the preferred form for making modifications,
  27 + including but not limited to software source code, documentation
  28 + source, and configuration files.
  29 +
  30 + "Object" form shall mean any form resulting from mechanical
  31 + transformation or translation of a Source form, including but
  32 + not limited to compiled object code, generated documentation,
  33 + and conversions to other media types.
  34 +
  35 + "Work" shall mean the work of authorship, whether in Source or
  36 + Object form, made available under the License, as indicated by a
  37 + copyright notice that is included in or attached to the work
  38 + (an example is provided in the Appendix below).
  39 +
  40 + "Derivative Works" shall mean any work, whether in Source or Object
  41 + form, that is based on (or derived from) the Work and for which the
  42 + editorial revisions, annotations, elaborations, or other modifications
  43 + represent, as a whole, an original work of authorship. For the purposes
  44 + of this License, Derivative Works shall not include works that remain
  45 + separable from, or merely link (or bind by name) to the interfaces of,
  46 + the Work and Derivative Works thereof.
  47 +
  48 + "Contribution" shall mean any work of authorship, including
  49 + the original version of the Work and any modifications or additions
  50 + to that Work or Derivative Works thereof, that is intentionally
  51 + submitted to Licensor for inclusion in the Work by the copyright owner
  52 + or by an individual or Legal Entity authorized to submit on behalf of
  53 + the copyright owner. For the purposes of this definition, "submitted"
  54 + means any form of electronic, verbal, or written communication sent
  55 + to the Licensor or its representatives, including but not limited to
  56 + communication on electronic mailing lists, source code control systems,
  57 + and issue tracking systems that are managed by, or on behalf of, the
  58 + Licensor for the purpose of discussing and improving the Work, but
  59 + excluding communication that is conspicuously marked or otherwise
  60 + designated in writing by the copyright owner as "Not a Contribution."
  61 +
  62 + "Contributor" shall mean Licensor and any individual or Legal Entity
  63 + on behalf of whom a Contribution has been received by Licensor and
  64 + subsequently incorporated within the Work.
  65 +
  66 + 2. Grant of Copyright License. Subject to the terms and conditions of
  67 + this License, each Contributor hereby grants to You a perpetual,
  68 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable
  69 + copyright license to reproduce, prepare Derivative Works of,
  70 + publicly display, publicly perform, sublicense, and distribute the
  71 + Work and such Derivative Works in Source or Object form.
  72 +
  73 + 3. Grant of Patent License. Subject to the terms and conditions of
  74 + this License, each Contributor hereby grants to You a perpetual,
  75 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable
  76 + (except as stated in this section) patent license to make, have made,
  77 + use, offer to sell, sell, import, and otherwise transfer the Work,
  78 + where such license applies only to those patent claims licensable
  79 + by such Contributor that are necessarily infringed by their
  80 + Contribution(s) alone or by combination of their Contribution(s)
  81 + with the Work to which such Contribution(s) was submitted. If You
  82 + institute patent litigation against any entity (including a
  83 + cross-claim or counterclaim in a lawsuit) alleging that the Work
  84 + or a Contribution incorporated within the Work constitutes direct
  85 + or contributory patent infringement, then any patent licenses
  86 + granted to You under this License for that Work shall terminate
  87 + as of the date such litigation is filed.
  88 +
  89 + 4. Redistribution. You may reproduce and distribute copies of the
  90 + Work or Derivative Works thereof in any medium, with or without
  91 + modifications, and in Source or Object form, provided that You
  92 + meet the following conditions:
  93 +
  94 + (a) You must give any other recipients of the Work or
  95 + Derivative Works a copy of this License; and
  96 +
  97 + (b) You must cause any modified files to carry prominent notices
  98 + stating that You changed the files; and
  99 +
  100 + (c) You must retain, in the Source form of any Derivative Works
  101 + that You distribute, all copyright, patent, trademark, and
  102 + attribution notices from the Source form of the Work,
  103 + excluding those notices that do not pertain to any part of
  104 + the Derivative Works; and
  105 +
  106 + (d) If the Work includes a "NOTICE" text file as part of its
  107 + distribution, then any Derivative Works that You distribute must
  108 + include a readable copy of the attribution notices contained
  109 + within such NOTICE file, excluding those notices that do not
  110 + pertain to any part of the Derivative Works, in at least one
  111 + of the following places: within a NOTICE text file distributed
  112 + as part of the Derivative Works; within the Source form or
  113 + documentation, if provided along with the Derivative Works; or,
  114 + within a display generated by the Derivative Works, if and
  115 + wherever such third-party notices normally appear. The contents
  116 + of the NOTICE file are for informational purposes only and
  117 + do not modify the License. You may add Your own attribution
  118 + notices within Derivative Works that You distribute, alongside
  119 + or as an addendum to the NOTICE text from the Work, provided
  120 + that such additional attribution notices cannot be construed
  121 + as modifying the License.
  122 +
  123 + You may add Your own copyright statement to Your modifications and
  124 + may provide additional or different license terms and conditions
  125 + for use, reproduction, or distribution of Your modifications, or
  126 + for any such Derivative Works as a whole, provided Your use,
  127 + reproduction, and distribution of the Work otherwise complies with
  128 + the conditions stated in this License.
  129 +
  130 + 5. Submission of Contributions. Unless You explicitly state otherwise,
  131 + any Contribution intentionally submitted for inclusion in the Work
  132 + by You to the Licensor shall be under the terms and conditions of
  133 + this License, without any additional terms or conditions.
  134 + Notwithstanding the above, nothing herein shall supersede or modify
  135 + the terms of any separate license agreement you may have executed
  136 + with Licensor regarding such Contributions.
  137 +
  138 + 6. Trademarks. This License does not grant permission to use the trade
  139 + names, trademarks, service marks, or product names of the Licensor,
  140 + except as required for reasonable and customary use in describing the
  141 + origin of the Work and reproducing the content of the NOTICE file.
  142 +
  143 + 7. Disclaimer of Warranty. Unless required by applicable law or
  144 + agreed to in writing, Licensor provides the Work (and each
  145 + Contributor provides its Contributions) on an "AS IS" BASIS,
  146 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  147 + implied, including, without limitation, any warranties or conditions
  148 + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
  149 + PARTICULAR PURPOSE. You are solely responsible for determining the
  150 + appropriateness of using or redistributing the Work and assume any
  151 + risks associated with Your exercise of permissions under this License.
  152 +
  153 + 8. Limitation of Liability. In no event and under no legal theory,
  154 + whether in tort (including negligence), contract, or otherwise,
  155 + unless required by applicable law (such as deliberate and grossly
  156 + negligent acts) or agreed to in writing, shall any Contributor be
  157 + liable to You for damages, including any direct, indirect, special,
  158 + incidental, or consequential damages of any character arising as a
  159 + result of this License or out of the use or inability to use the
  160 + Work (including but not limited to damages for loss of goodwill,
  161 + work stoppage, computer failure or malfunction, or any and all
  162 + other commercial damages or losses), even if such Contributor
  163 + has been advised of the possibility of such damages.
  164 +
  165 + 9. Accepting Warranty or Additional Liability. While redistributing
  166 + the Work or Derivative Works thereof, You may choose to offer,
  167 + and charge a fee for, acceptance of support, warranty, indemnity,
  168 + or other liability obligations and/or rights consistent with this
  169 + License. However, in accepting such obligations, You may act only
  170 + on Your own behalf and on Your sole responsibility, not on behalf
  171 + of any other Contributor, and only if You agree to indemnify,
  172 + defend, and hold each Contributor harmless for any liability
  173 + incurred by, or claims asserted against, such Contributor by reason
  174 + of your accepting any such warranty or additional liability.
  175 +
  176 + END OF TERMS AND CONDITIONS
  177 +
  178 + Copyright 2010, B. W. Lewis
  179 +
  180 + Licensed under the Apache License, Version 2.0 (the "License");
  181 + you may not use this file except in compliance with the License.
  182 + You may obtain a copy of the License at
  183 +
  184 + http://www.apache.org/licenses/LICENSE-2.0
  185 +
  186 + Unless required by applicable law or agreed to in writing, software
  187 + distributed under the License is distributed on an "AS IS" BASIS,
  188 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  189 + See the License for the specific language governing permissions and
  190 + limitations under the License.
  191 +
13 COPYRIGHT
... ... @@ -0,0 +1,13 @@
10 DESCRIPTION
... ... @@ -0,0 +1,10 @@
  1 +Package: redis
  2 +Type: Package
  3 +Title: Redis client for R
  4 +Version: 0.01
  5 +Date: 2010-01-26
  6 +Author: B. W. Lewis
  7 +Maintainer: B. W. Lewis <blewis@illposed.net>
  8 +Description: The 'redis' package provides a simple R client for the Redis persistent key-value database available from http://code.google.com/p/redis/.
  9 +License: Apache 2.0
  10 +LazyLoad: yes
1  NAMESPACE
... ... @@ -0,0 +1 @@
  1 +exportPattern("^[[:alpha:]]+")
26 R/redis-internal.R
... ... @@ -0,0 +1,26 @@
  1 +.redisEnv <- new.env()
  2 +
  3 +.redis <-
  4 +function()
  5 +{
  6 + tryCatch(get('con',envir=.redisEnv),error=function(e) stop('Not connected, try using redisConnect()'))
  7 +}
  8 +
  9 +.redisPP <-
  10 +function()
  11 +{
  12 +# Ping-pong
  13 + con <- .redis()
  14 + socketSelect(list(con),write=TRUE)
  15 + cat('PING\r\n',file=con)
  16 + socketSelect(list(con))
  17 + l <- readLines(con=con)
  18 + if(substr(l,1,5)!='+PONG') stop ('Ping/pong error')
  19 +}
  20 +
  21 +`.onLoad` <-
  22 +function(libname,pkgname)
  23 +{
  24 +}
  25 +
  26 +# XXX add .onUnload cleanup
8 R/redisClose.R
... ... @@ -0,0 +1,8 @@
  1 +redisClose <-
  2 +function()
  3 +{
  4 + con <- .redis()
  5 + close(con)
  6 + remove(list='con',envir=.redisEnv)
  7 +}
  8 +
13 R/redisConnect.R
... ... @@ -0,0 +1,13 @@
  1 +redisConnect <-
  2 +function(host='localhost', port=6379)
  3 +{
  4 + con <- socketConnection(host, port,open='a+b')
  5 + assign('con',con,envir=.redisEnv)
  6 + socketSelect(list(con),write=TRUE)
  7 + cat('PING\r\n',file=con)
  8 + socketSelect(list(con))
  9 + l <- readLines(con=con)
  10 +# XXX check error
  11 + invisible()
  12 +}
  13 +
27 R/redisGet.R
... ... @@ -0,0 +1,27 @@
  1 +redisGet <-
  2 +function(key)
  3 +{
  4 + msg <- paste('GET ',key,'\r\n',sep='')
  5 + con <- .redis()
  6 + socketSelect(list(con),write=TRUE)
  7 + cat(msg, file=con)
  8 + socketSelect(list(con))
  9 + l <- readLines(con,n=1)
  10 + if(substr(l,1,1)!='$') {
  11 +# XXX ping/pong here to stabilize the connection
  12 + return(NULL)
  13 + }
  14 + substr(l,1,1) <- ' '
  15 + l <- as.numeric(l)
  16 + if(l<0) {
  17 +# XXX ping/pong here to stabilize the connection
  18 + return(NULL)
  19 + }
  20 + socketSelect(list(con))
  21 + x <- readBin(con,'raw',n=l)
  22 + socketSelect(list(con))
  23 + l <- readLines(con,n=1)
  24 +# Try retrieving an R object, otherwise default to character:
  25 + tryCatch(unserialize(x),error=function(e) rawToChar(x))
  26 +}
  27 +
19 R/redisSet.R
... ... @@ -0,0 +1,19 @@
  1 +redisSet <-
  2 +function(key, value)
  3 +{
  4 + con <- .redis()
  5 + if(!is.raw(value)) value <- serialize(value,ascii=FALSE,connection=NULL)
  6 + msg <- paste('SET ',key,' ',length(value),'\r\n',sep='')
  7 + socketSelect(list(con),write=TRUE)
  8 + cat(msg, file=con)
  9 + socketSelect(list(con),write=TRUE)
  10 + writeBin(value,con)
  11 + socketSelect(list(con),write=TRUE)
  12 + cat('\r\n', file=con)
  13 + socketSelect(list(con))
  14 + l <- readLines(con,n=1)
  15 +# XXX check for '+OK' reply
  16 + socketSelect(list(con),write=TRUE)
  17 + cat('\r\n', file=con)
  18 +}
  19 +
1  README
... ... @@ -0,0 +1 @@
  1 +rredis: An easy to use R client package for Redis
41 man/redis-package.Rd
... ... @@ -0,0 +1,41 @@
  1 +\name{redis-package}
  2 +\alias{redis-package}
  3 +\alias{redis}
  4 +\docType{package}
  5 +\title{An R client for Redis}
  6 +\description{
  7 +Redis is a high-performance networked
  8 +persistent key/value structured data store.
  9 +The redis package for R provides an easy to use native R language interface
  10 +to Redis. The R client can store and read arbitrary serializable R objects
  11 +as well as access raw objects like strings from other clients. The redis
  12 +package presently supports only a useful subset of the many available Redis
  13 +features. A more full-featured client implementation is in process.
  14 +}
  15 +\details{
  16 +\tabular{ll}{
  17 +Package: \tab redis\cr
  18 +Type: \tab Package\cr
  19 +Version: \tab 0.01\cr
  20 +Date: \tab 2010-01-26\cr
  21 +License: \tab Apache\cr
  22 +LazyLoad: \tab yes\cr
  23 +}
  24 +}
  25 +\author{
  26 +B. W. Lewis
  27 +
  28 +Maintainer: B. W. Lewis <blewis@illposed.net>
  29 +}
  30 +\references{
  31 +\link{http://code.google.com/p/redis/}
  32 +}
  33 +\keyword{ package }
  34 +\examples{
  35 +\dontrun{
  36 +redisConnect()
  37 +redisSet('x',runif(5))
  38 +redisGet('x')
  39 +redisClose()
  40 +}
  41 +}
35 man/redisClose.Rd
... ... @@ -0,0 +1,35 @@
  1 +\name{redisClose}
  2 +\alias{redisClose}
  3 +\title{Close an open connection to a Redis server.}
  4 +\description{The redisClose function closes any open connection to a Redis
  5 +server.}
  6 +\usage{
  7 +redisClose()
  8 +}
  9 +\arguments{
  10 +}
  11 +\details{A running instance of a Redis server is required. See
  12 +http://code.google.com/p/redis/ for details.}
  13 +\value{Nothing is returned. Errors are displayed if the function fails to
  14 +close the connection to the Redis server, or if the connection is invalid.
  15 +}
  16 +\references{
  17 +http://code.google.com/p/redis/ for details.
  18 +}
  19 +\author{
  20 +B. W. Lewis
  21 +}
  22 +
  23 +%% ~Make other sections like Warning with \section{Warning }{....} ~
  24 +
  25 +\seealso{
  26 +\code{\link{redisConnect}}
  27 +}
  28 +\examples{
  29 +\dontrun{
  30 +redisConnect()
  31 +redisSet('x',runif(5))
  32 +redisGet('x')
  33 +redisClose()
  34 +}
  35 +}
37 man/redisConnect.Rd
... ... @@ -0,0 +1,37 @@
  1 +\name{redisConnect}
  2 +\alias{redisConnect}
  3 +\title{Connect to a Redis server.}
  4 +\description{Connect to an available Redis server on the specified port.}
  5 +\usage{
  6 +redisConnect(host = "localhost", port = 6379)
  7 +}
  8 +\arguments{
  9 + \item{host}{The Redis server host name or inet address (optional, character)}
  10 + \item{port}{The Redis port number (optional, numeric or integer)}
  11 +}
  12 +\details{A running instance of a Redis server is required. See
  13 +http://code.google.com/p/redis/ for details.}
  14 +\value{Nothing is returned. Errors are displayed if the function fails to
  15 +connect to the specified Redis server. Disconnect from a connected server
  16 +with redisClose.
  17 +}
  18 +\references{
  19 +http://code.google.com/p/redis/ for details.
  20 +}
  21 +\author{
  22 +B. W. Lewis
  23 +}
  24 +
  25 +%% ~Make other sections like Warning with \section{Warning }{....} ~
  26 +
  27 +\seealso{
  28 +\code{\link{redisClose}}
  29 +}
  30 +\examples{
  31 +\dontrun{
  32 +redisConnect()
  33 +redisSet('x',runif(5))
  34 +redisGet('x')
  35 +redisClose()
  36 +}
  37 +}
36 man/redisGet.Rd
... ... @@ -0,0 +1,36 @@
  1 +\name{redisGet}
  2 +\alias{redisGet}
  3 +\title{Retrieve a value from Redis.}
  4 +\description{Retrieve a value identified by a key
  5 +from the Redis database.
  6 +}
  7 +\usage{
  8 +redisGet(key)
  9 +}
  10 +\arguments{
  11 + \item{key}{
  12 +The (required) character identifier for the value to be looked up.
  13 +}
  14 +}
  15 +\details{
  16 +The key must not contain spaces or newline characters (otherwise an error will be thrown).
  17 +}
  18 +\value{
  19 +The retrieved value is returned, or NULL if no matching key was found.
  20 +}
  21 +\references{
  22 +{\link{http://code.google.com/p/redis/}}
  23 +}
  24 +\author{
  25 +B. W. Lewis
  26 +}
  27 +
  28 +\seealso{
  29 +\code{\link{redisSet}}
  30 +}
  31 +\examples{
  32 +\dontrun{
  33 +redisStore('x',runif(5))
  34 +redisGet('x')
  35 +}
  36 +}
56 man/redisSet.Rd
... ... @@ -0,0 +1,56 @@
  1 +\name{redisSet}
  2 +\alias{redisSet}
  3 +\title{Store a value in Redis.}
  4 +\description{Store a value identified by a character key name
  5 +in the Redis database. Any existing value with the same key will be replaced
  6 +by the new value.
  7 +}
  8 +\usage{
  9 +redisSet(key, value)
  10 +}
  11 +\arguments{
  12 + \item{key}{
  13 +The (required) character identifier for the value to be stored.
  14 +}
  15 + \item{value}{
  16 +The (required) object to associate with the key.
  17 +}
  18 +}
  19 +\details{
  20 +The key must not contain spaces or newline characters (otherwise an error will be thrown).
  21 +
  22 +The value object is copied to the Redis server.
  23 +The value to be stored may can be any
  24 +serializable R object up to the Redis maximum object size
  25 +(excluding, for example, external pointer references).
  26 +References to other R objects or environments inside the value are not
  27 +guaranteed to be preserved.
  28 +
  29 +In order to store strings that can easily be read by other clients, first
  30 +convert the character object using the
  31 +\code{\link{charToRaw}} function as shown in the
  32 +examples.
  33 +}
  34 +\value{
  35 +Nothing is returned. Errors are displayed if something goes wrong.
  36 +}
  37 +\references{
  38 +{\link{http://code.google.com/p/redis/}}
  39 +}
  40 +\author{
  41 +B. W. Lewis
  42 +}
  43 +
  44 +\seealso{
  45 +\code{\link{redisGet}}
  46 +}
  47 +\examples{
  48 +\dontrun{
  49 +# Store an R object with the key 'x':
  50 +redisSet('x',runif(5))
  51 +}
  52 +\dontrun{
  53 +# Store a string that can be easily read by other clients:
  54 +redisSet('x',charToRaw('Hello Redis clients'))
  55 +}
  56 +}

0 comments on commit 090c847

Please sign in to comment.
Something went wrong with that request. Please try again.