-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)
}