]> git.donarmstrong.com Git - cran2deb.git/blobdiff - pkg/trunk/R/db.R
db: version the database.
[cran2deb.git] / pkg / trunk / R / db.R
index 8238a3db152c37e81584d4831b5b73f61be49073..63722c3f645f943f9f767f1239e09732fee2c2e4 100644 (file)
 
-db.start <- function() {
+db_start <- function() {
     drv <- dbDriver('SQLite')
-    con <- dbConnect(drv, dbname=file.path(root,'data/cran2deb.db'))
+    con <- dbConnect(drv, dbname=file.path(cache_root,'cran2deb.db'))
     tables <- dbListTables(con)
     if (!dbExistsTable(con,'sysreq_override')) {
         dbGetQuery(con,paste('CREATE TABLE sysreq_override ('
-                  ,' debian_name TEXT NOT NULL'
+                  ,' depend_alias TEXT NOT NULL'
                   ,',r_pattern TEXT PRIMARY KEY NOT NULL'
                   ,')'))
     }
+    if (!dbExistsTable(con,'debian_dependency')) {
+        dbGetQuery(con,paste('CREATE TABLE debian_dependency ('
+                  ,' id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL'
+                  ,',alias TEXT NOT NULL'
+                  ,',build INTEGER NOT NULL'
+                  ,',debian_pkg TEXT NOT NULL'
+                  ,',UNIQUE (alias,build,debian_pkg)'
+                  ,')'))
+    }
+    if (!dbExistsTable(con,'forced_depends')) {
+        dbGetQuery(con,paste('CREATE TABLE forced_depends ('
+                  ,' r_name TEXT NOT NULL'
+                  ,',depend_alias TEXT NOT NULL'
+                  ,',PRIMARY KEY (r_name,depend_alias)'
+                  ,')'))
+    }
     if (!dbExistsTable(con,'license_override')) {
         dbGetQuery(con,paste('CREATE TABLE license_override ('
                   ,' name TEXT PRIMARY KEY NOT NULL'
                   ,',accept INT NOT NULL'
                   ,')'))
     }
-    if (!dbExistsTable(con,'license_files')) {
-        dbGetQuery(con,paste('CREATE TABLE license_files ('
+    if (!dbExistsTable(con,'license_hashes')) {
+        dbGetQuery(con,paste('CREATE TABLE license_hashes ('
                   ,' name TEXT NOT NULL'
-                  ,',file_sha1 TEXT PRIMARY KEY NOT NULL'
+                  ,',sha1 TEXT PRIMARY KEY NOT NULL'
+                  ,')'))
+    }
+    if (!dbExistsTable(con,'database_versions')) {
+        dbGetQuery(con,paste('CREATE TABLE database_versions ('
+                  ,' version INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL'
+                  ,',version_date INTEGER NOT NULL'
                   ,')'))
+        db_add_version(con,1)
     }
     return(con)
 }
 
-db.stop <- function(con) {
+db_stop <- function(con,bump=F) {
+    if (bump) {
+        db_bump()
+    }
     dbDisconnect(con)
 }
 
-db.quote <- function(text) {
-    return(paste('"',gsub('([^][[:alnum:]*?. ()<>:/=-])','\\\\\\1',text),'"',sep=''))
+db_quote <- function(text) {
+    return(paste('"',gsub('([^][[:alnum:]*?. ()<>:/=+%-])','\\\\\\1',text),'"',sep=''))
 }
 
-db.sysreq.override <- function(sysreq_text) {
-    sysreq_text <- tolower(sysreq_text)
-    con <- db.start()
+db_now <- function() {
+    return(as.integer(gsub('-','',Sys.Date())))
+}
+
+db_cur_version <- function(con) {
+    return(as.integer(dbGetQuery(con, 'SELECT max(version) FROM database_versions')[[1]]))
+}
+
+db_add_version <- function(con, version) {
+    dbGetQuery(con,paste('INSERT INTO database_versions (version,version_date)'
+              ,'VALUES (',as.integer(version),',',db_now(),')'))
+}
+
+db_bump <- function(con) {
+    db_add_version(con,db_cur_version(con)+1)
+}
+
+db_sysreq_override <- function(sysreq_text) {
+    con <- db_start()
     results <- dbGetQuery(con,paste(
-                    'SELECT debian_name FROM sysreq_override WHERE'
-                            ,db.quote(sysreq_text),'GLOB r_pattern'))
-    db.stop(con)
-    return(results$debian_name)
+                    'SELECT DISTINCT depend_alias FROM sysreq_override WHERE'
+                            ,db_quote(tolower(sysreq_text)),'LIKE r_pattern'))
+    db_stop(con)
+    if (length(results) == 0) {
+        return(NA)
+    }
+    return(results$depend_alias)
 }
 
-db.add.sysreq.override <- function(pattern,debian_name) {
-    pattern <- tolower(pattern)
-    debian_name <- tolower(debian_name)
-    con <- db.start()
+db_add_sysreq_override <- function(pattern,depend_alias) {
+    con <- db_start()
     results <- dbGetQuery(con,paste(
                      'INSERT OR REPLACE INTO sysreq_override'
-                    ,'(debian_name, r_pattern) VALUES ('
-                    ,' ',db.quote(debian_name)
-                    ,',',db.quote(pattern)
+                    ,'(depend_alias, r_pattern) VALUES ('
+                    ,' ',db_quote(tolower(depend_alias))
+                    ,',',db_quote(tolower(pattern))
                     ,')'))
-    db.stop(con)
+    db_stop(con,TRUE)
 }
 
-db.sysreq.overrides <- function() {
-    con <- db.start()
+db_sysreq_overrides <- function() {
+    con <- db_start()
     overrides <- dbGetQuery(con,paste('SELECT * FROM sysreq_override'))
-    db.stop(con)
+    db_stop(con)
     return(overrides)
 }
 
+db_get_depends <- function(depend_alias,build=F) {
+    con <- db_start()
+    results <- dbGetQuery(con,paste(
+                    'SELECT DISTINCT debian_pkg FROM debian_dependency WHERE'
+                    ,db_quote(tolower(depend_alias)),'= alias'
+                    ,'AND',as.integer(build),'= build'))
+    db_stop(con)
+    return(results$debian_pkg)
+}
+
+db_add_depends <- function(depend_alias,debian_pkg,build=F) {
+    con <- db_start()
+    results <- dbGetQuery(con,paste(
+                     'INSERT OR REPLACE INTO debian_dependency'
+                    ,'(alias, build, debian_pkg) VALUES ('
+                    ,' ',db_quote(tolower(depend_alias))
+                    ,',',as.integer(build)
+                    ,',',db_quote(tolower(debian_pkg))
+                    ,')'))
+    db_stop(con,TRUE)
+}
+
+db_depends <- function() {
+    con <- db_start()
+    depends <- dbGetQuery(con,paste('SELECT * FROM debian_dependency'))
+    db_stop(con)
+    return(depends)
+}
+
+db_get_forced_depends <- function(r_name) {
+    con <- db_start()
+    forced_depends <- dbGetQuery(con,
+                paste('SELECT depend_alias FROM forced_depends WHERE'
+                     ,db_quote(r_name),'= r_name'))
+    db_stop(con)
+    return(forced_depends$depend_alias)
+}
 
-db.license.override.name <- function(name) {
-    name <- tolower(name)
-    con <- db.start()
+db_add_forced_depends <- function(r_name, depend_alias) {
+    if (!length(db_get_depends(depend_alias,build=F)) &&
+        !length(db_get_depends(depend_alias,build=T))) {
+        stop(paste('Debian dependency alias',depend_alias,'is not know,'
+                  ,'yet trying to force a dependency on it?'))
+    }
+    con <- db_start()
+    dbGetQuery(con,
+            paste('INSERT OR REPLACE INTO forced_depends (r_name, depend_alias)'
+                 ,'VALUES (',db_quote(r_name),',',db_quote(depend_alias),')'))
+    db_stop(con,TRUE)
+}
+
+db_forced_depends <- function() {
+    con <- db_start()
+    depends <- dbGetQuery(con,paste('SELECT * FROM forced_depends'))
+    db_stop(con)
+    return(depends)
+}
+
+db_license_override_name <- function(name) {
+    con <- db_start()
     results <- dbGetQuery(con,paste(
-                    'SELECT accept FROM license_override WHERE'
-                            ,db.quote(name),'= name'))
-    db.stop(con)
+                    'SELECT DISTINCT accept FROM license_override WHERE'
+                            ,db_quote(tolower(name)),'= name'))
+    db_stop(con)
     if (length(results) == 0) {
-        return(FALSE)
+        return(NA)
     }
     return(as.logical(results$accept))
 }
 
-db.add.license.override <- function(name,accept) {
-    name <- tolower(name)
+db_add_license_override <- function(name,accept) {
     message(paste('adding',name,'accept?',accept))
     if (accept != TRUE && accept != FALSE) {
         stop('accept must be TRUE or FALSE')
     }
-    con <- db.start()
+    con <- db_start()
     results <- dbGetQuery(con,paste(
                      'INSERT OR REPLACE INTO license_override'
                     ,'(name, accept) VALUES ('
-                    ,' ',db.quote(name)
+                    ,' ',db_quote(tolower(name))
                     ,',',as.integer(accept)
                     ,')'))
-    db.stop(con)
+    db_stop(con,TRUE)
 }
 
-db.license.override.file <- function(file_sha1) {
-    file_sha1 <- tolower(file_sha1)
-    con <- db.start()
+db_license_override_hash <- function(license_sha1) {
+    con <- db_start()
     results <- dbGetQuery(con,paste(
-                     'SELECT name,accept FROM license_override'
-                    ,'INNER JOIN license_files'
-                    ,'ON license_files.name = license_override.name WHERE'
-                    ,db.quote(file_sha1),'= license_files.file_sha1'))
-    db.stop(con)
-    # TODO: change accept from 0,1 into FALSE,TRUE
-    # TODO: NULL -> FALSE
-    return(results)
-}
-
-db.license.overrides <- function() {
-    con <- db.start()
+                     'SELECT DISTINCT accept FROM license_override'
+                    ,'INNER JOIN license_hashes'
+                    ,'ON license_hashes.name = license_override.name WHERE'
+                    ,db_quote(tolower(license_sha1)),'= license_hashes.sha1'))
+    db_stop(con)
+    if (length(results) == 0) {
+        return(NA)
+    }
+    return(as.logical(results$accept))
+}
+
+db_license_overrides <- function() {
+    con <- db_start()
     overrides <- dbGetQuery(con,paste('SELECT * FROM license_override'))
-    files     <- dbGetQuery(con,paste('SELECT * FROM license_files'))
-    db.stop(con)
-    # TODO: change accept from 0,1 into FALSE,TRUE
-    return(list(overrides=overrides,files=files))
+    hashes    <- dbGetQuery(con,paste('SELECT * FROM license_hashes'))
+    db_stop(con)
+    return(list(overrides=overrides,hashes=hashes))
 }
 
-db.add.license.file <- function(name,file_sha1) {
-    name <- tolower(name)
-    file_sha1 <- tolower(file_sha1)
-    message(paste('adding file',file_sha1,'for',name))
-    con <- db.start()
+db_add_license_hash <- function(name,license_sha1) {
+    if (is.na(db_license_override_name(name))) {
+        stop(paste('license',name,'is not know, yet trying to add a hash for it?'))
+    }
+    message(paste('adding hash',license_sha1,'for',name))
+    con <- db_start()
     dbGetQuery(con,paste(
-         'INSERT OR REPLACE INTO license_files'
-        ,'(name, file_sha1) VALUES ('
-        ,' ',db.quote(name)
-        ,',',db.quote(file_sha1)
+         'INSERT OR REPLACE INTO license_hashes'
+        ,'(name, sha1) VALUES ('
+        ,' ',db_quote(tolower(name))
+        ,',',db_quote(tolower(license_sha1))
         ,')'))
-    db.stop(con)
+    db_stop(con,TRUE)
 }