Use new create/deleteLockFile functions
[filehash.git] / R / queue.R
blob46945dd2667c355706cf2f82d29d118b7eb77f43
1 setClass("queue",
2          representation(queue = "filehashDB1",
3                         name = "character")
4          )
6 setMethod("show", "queue",
7           function(object) {
8                   cat(gettextf("<queue: %s>\n", object@name))
9                   invisible(object)
10           })
12 createQ <- function(filename) {
13         dbCreate(filename, "DB1")
14         queue <- dbInit(filename, "DB1")
15         dbInsert(queue, "head", NULL)
16         dbInsert(queue, "tail", NULL)
18         new("queue", queue = queue, name = filename)
21 initQ <- function(filename) {
22         new("queue",
23             queue = dbInit(filename, "DB1"),
24             name = filename)
27 setGeneric("lockFile", function(db, ...) standardGeneric("lockFile"))
29 ## Public
30 setGeneric("pop", function(db, ...) standardGeneric("pop"))
31 setGeneric("push", function(db, val, ...) standardGeneric("push"))
32 setGeneric("isEmpty", function(db, ...) standardGeneric("isEmpty"))
33 setGeneric("top", function(db, ...) standardGeneric("top"))
36 ################################################################################
37 ## Methods
39 setMethod("lockFile", "queue",
40           function(db, ...) {
41                   paste(db@name, "qlock", sep = ".")
42           })
44 setMethod("push", c("queue", "ANY"), function(db, val, ...) {
45         ## Create a new tail node
46         node <- list(value = val,
47                      nextkey = NULL)
48         key <- sha1(node)
50         createLockFile(lockFile(db))
51         on.exit(deleteLockFile(lockFile(db)))
53         if(isEmpty(db))
54                 dbInsert(db@queue, "head", key)
55         else {
56                 ## Convert tail node to regular node
57                 tailkey <- dbFetch(db@queue, "tail")
58                 oldtail <- dbFetch(db@queue, tailkey)
59                 dbInsert(db@queue, tl,
60                          list(value = oldtail$value, nextkey = key))
61         }
62         ## Insert new node and point tail to new node
63         dbInsert(db@queue, key, node)
64         dbInsert(db@queue, "tail", key)
67 setMethod("isEmpty", "queue", function(db) {
68         is.null(dbFetch(db@queue, "head"))
71 setMethod("top", "queue", function(db, ...) {
72         createLockFile(lockFile(db))
73         on.exit(deleteLockFile(lockFile(db)))
75         if(isEmpty(db))
76                 stop("queue is empty")
77         h <- dbFetch(db@queue, "head")
78         node <- dbFetch(db@queue, h)
79         node$value
82 setMethod("pop", "queue", function(db, ...) {
83         createLockFile(lockFile(db))
84         on.exit(deleteLockFile(lockFile(db)))
86         if(isEmpty(db))
87                 stop("queue is empty")
88         h <- dbFetch(db@queue, "head")
89         node <- dbFetch(db@queue, h)
90         dbInsert(db@queue, "head", node$nextkey)
91         dbDelete(db@queue, h)
92         node$value