]> git.donarmstrong.com Git - cran2deb.git/blob - trunk/R/db.R
default values in blacklist table
[cran2deb.git] / trunk / R / db.R
1
2 db_start <- function() {
3     drv <- dbDriver('SQLite')
4     con <- dbConnect(drv, dbname=file.path(cache_root,'cran2deb.db'))
5     if (!dbExistsTable(con,'sysreq_override')) {
6         dbGetQuery(con,paste('CREATE TABLE sysreq_override ('
7                   ,' depend_alias TEXT NOT NULL'
8                   ,',r_pattern TEXT PRIMARY KEY NOT NULL'
9                   ,')'))
10     }
11     if (!dbExistsTable(con,'debian_dependency')) {
12         dbGetQuery(con,paste('CREATE TABLE debian_dependency ('
13                   ,' id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL'
14                   ,',alias TEXT NOT NULL'
15                   ,',build INTEGER NOT NULL'
16                   ,',debian_pkg TEXT NOT NULL'
17                   ,',UNIQUE (alias,build,debian_pkg)'
18                   ,')'))
19     }
20     if (!dbExistsTable(con,'forced_depends')) {
21         dbGetQuery(con,paste('CREATE TABLE forced_depends ('
22                   ,' r_name TEXT NOT NULL'
23                   ,',depend_alias TEXT NOT NULL'
24                   ,',PRIMARY KEY (r_name,depend_alias)'
25                   ,')'))
26     }
27     if (!dbExistsTable(con,'license_override')) {
28         dbGetQuery(con,paste('CREATE TABLE license_override ('
29                   ,' name TEXT PRIMARY KEY NOT NULL'
30                   ,',accept INT NOT NULL'
31                   ,')'))
32     }
33     if (!dbExistsTable(con,'license_hashes')) {
34         dbGetQuery(con,paste('CREATE TABLE license_hashes ('
35                   ,' name TEXT NOT NULL'
36                   ,',sha1 TEXT PRIMARY KEY NOT NULL'
37                   ,')'))
38     }
39     if (!dbExistsTable(con,'database_versions')) {
40         dbGetQuery(con,paste('CREATE TABLE database_versions ('
41                   ,' version INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL'
42                   ,',version_date INTEGER NOT NULL'
43                   ,',base_epoch INTEGER NOT NULL'
44                   ,')'))
45         db_add_version(con,1,0)
46     }
47     if (!dbExistsTable(con,'packages')) {
48         dbGetQuery(con,paste('CREATE TABLE packages ('
49                   ,' package TEXT PRIMARY KEY NOT NULL'
50                   ,',latest_r_version TEXT'
51                   ,')'))
52     }
53     if (!dbExistsTable(con,'builds')) {
54         dbGetQuery(con,paste('CREATE TABLE builds ('
55                   ,' id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL'
56                   ,',system TEXT NOT NULL'
57                   ,',package TEXT NOT NULL'
58                   ,',r_version TEXT NOT NULL'
59                   ,',deb_epoch INTEGER NOT NULL'
60                   ,',deb_revision INTEGER NOT NULL'
61                   ,',db_version INTEGER NOT NULL'
62                   ,',date_stamp TEXT NOT NULL'
63                   ,',time_stamp TEXT NOT NULL'
64                   ,',scm_revision TEXT NOT NULL'
65                   ,',success INTEGER NOT NULL'
66                   ,',log TEXT'
67                   ,',UNIQUE(package,system,r_version,deb_epoch,deb_revision,db_version)'
68                   ,')'))
69     }
70     if (!dbExistsTable(con,'blacklist_packages')) {
71         dbGetQuery(con,paste('CREATE TABLE blacklist_packages ('
72                   ,' package TEXT PRIMARY KEY NOT NULL '
73                   ,',nonfree INTEGER NOT NULL DEFAULT 0'
74                   ,',obsolete INTEGER NOT NULL DEFAULT 0'
75                   ,',broken_dependency INTEGER NOT NULL DEFAULT 0'
76                   ,',unsatisfied_dependency INTEGER NOT NULL DEFAULT 0'
77                   ,',breaks_cran2deb INTEGER NOT NULL DEFAULT 0'
78                   ,',explanation TEXT NOT NULL '
79                   ,')'))
80     }
81     return(con)
82 }
83
84 db_stop <- function(con,bump=F) {
85     if (bump) {
86         db_bump(con)
87     }
88     dbDisconnect(con)
89 }
90
91 db_quote <- function(text) {
92     return(paste('\'', gsub('([\'"])','\\1\\1',text),'\'',sep=''))
93 }
94
95 db_now <- function() {
96     return(as.integer(gsub('-','',Sys.Date())))
97 }
98
99 db_cur_version <- function(con) {
100     return(as.integer(dbGetQuery(con, 'SELECT max(version) FROM database_versions')[[1]]))
101 }
102
103 db_base_epoch <- function(con) {
104     return(as.integer(dbGetQuery(con,
105         paste('SELECT max(base_epoch) FROM database_versions'
106              ,'WHERE version IN (SELECT max(version) FROM database_versions)'))[[1]]))
107 }
108
109 db_get_base_epoch <- function() {
110     con <- db_start()
111     v <- db_base_epoch(con)
112     db_stop(con)
113     return(v)
114 }
115
116 db_get_version <- function() {
117     con <- db_start()
118     v <- db_cur_version(con)
119     db_stop(con)
120     return(v)
121 }
122
123 db_add_version <- function(con, version, epoch) {
124     dbGetQuery(con,paste('INSERT INTO database_versions (version,version_date,base_epoch)'
125               ,'VALUES (',as.integer(version),',',db_now(),',',as.integer(epoch),')'))
126 }
127
128 db_bump <- function(con) {
129     db_add_version(con,db_cur_version(con)+1, db_base_epoch(con))
130 }
131
132 db_bump_epoch <- function(con) {
133     db_add_version(con,db_cur_version(con)+1, db_base_epoch(con)+1)
134 }
135
136 db_sysreq_override <- function(sysreq_text) {
137     con <- db_start()
138     results <- dbGetQuery(con,paste(
139                     'SELECT DISTINCT depend_alias FROM sysreq_override WHERE'
140                             ,db_quote(tolower(sysreq_text)),'LIKE r_pattern'))
141     db_stop(con)
142     if (length(results) == 0) {
143         return(NULL)
144     }
145     return(results$depend_alias)
146 }
147
148 db_add_sysreq_override <- function(pattern,depend_alias) {
149     con <- db_start()
150     results <- dbGetQuery(con,paste(
151                      'INSERT OR REPLACE INTO sysreq_override'
152                     ,'(depend_alias, r_pattern) VALUES ('
153                     ,' ',db_quote(tolower(depend_alias))
154                     ,',',db_quote(tolower(pattern))
155                     ,')'))
156     db_stop(con)
157 }
158
159 db_sysreq_overrides <- function() {
160     con <- db_start()
161     overrides <- dbGetQuery(con,paste('SELECT * FROM sysreq_override'))
162     db_stop(con)
163     return(overrides)
164 }
165
166 db_get_depends <- function(depend_alias,build=F) {
167     con <- db_start()
168     results <- dbGetQuery(con,paste(
169                     'SELECT DISTINCT debian_pkg FROM debian_dependency WHERE'
170                     ,db_quote(tolower(depend_alias)),'= alias'
171                     ,'AND',as.integer(build),'= build'))
172     db_stop(con)
173     return(results$debian_pkg)
174 }
175
176 db_add_depends <- function(depend_alias,debian_pkg,build=F) {
177     con <- db_start()
178     results <- dbGetQuery(con,paste(
179                      'INSERT OR REPLACE INTO debian_dependency'
180                     ,'(alias, build, debian_pkg) VALUES ('
181                     ,' ',db_quote(tolower(depend_alias))
182                     ,',',as.integer(build)
183                     ,',',db_quote(tolower(debian_pkg))
184                     ,')'))
185     db_stop(con)
186 }
187
188 db_depends <- function() {
189     con <- db_start()
190     depends <- dbGetQuery(con,paste('SELECT * FROM debian_dependency'))
191     db_stop(con)
192     return(depends)
193 }
194
195 db_get_forced_depends <- function(r_name) {
196     con <- db_start()
197     forced_depends <- dbGetQuery(con,
198                 paste('SELECT depend_alias FROM forced_depends WHERE'
199                      ,db_quote(r_name),'= r_name'))
200     db_stop(con)
201     return(forced_depends$depend_alias)
202 }
203
204 db_add_forced_depends <- function(r_name, depend_alias) {
205     if (!length(db_get_depends(depend_alias,build=F)) &&
206         !length(db_get_depends(depend_alias,build=T))) {
207         fail('Debian dependency alias',depend_alias,'is not know,'
208                   ,'yet trying to force a dependency on it?')
209     }
210     con <- db_start()
211     dbGetQuery(con,
212             paste('INSERT OR REPLACE INTO forced_depends (r_name, depend_alias)'
213                  ,'VALUES (',db_quote(r_name),',',db_quote(depend_alias),')'))
214     db_stop(con)
215 }
216
217 db_forced_depends <- function() {
218     con <- db_start()
219     depends <- dbGetQuery(con,paste('SELECT * FROM forced_depends'))
220     db_stop(con)
221     return(depends)
222 }
223
224 db_license_override_name <- function(name) {
225     con <- db_start()
226     results <- dbGetQuery(con,paste(
227                     'SELECT DISTINCT accept FROM license_override WHERE'
228                             ,db_quote(tolower(name)),'= name'))
229     db_stop(con)
230     if (length(results) == 0) {
231         return(NULL)
232     }
233     return(as.logical(results$accept))
234 }
235
236 db_add_license_override <- function(name,accept) {
237     notice('adding',name,'accept?',accept)
238     if (accept != TRUE && accept != FALSE) {
239         fail('accept must be TRUE or FALSE')
240     }
241     con <- db_start()
242     results <- dbGetQuery(con,paste(
243                      'INSERT OR REPLACE INTO license_override'
244                     ,'(name, accept) VALUES ('
245                     ,' ',db_quote(tolower(name))
246                     ,',',as.integer(accept)
247                     ,')'))
248     db_stop(con)
249 }
250
251 db_license_override_hash <- function(license_sha1) {
252     con <- db_start()
253     results <- dbGetQuery(con,paste(
254                      'SELECT DISTINCT accept FROM license_override'
255                     ,'INNER JOIN license_hashes'
256                     ,'ON license_hashes.name = license_override.name WHERE'
257                     ,db_quote(tolower(license_sha1)),'= license_hashes.sha1'))
258     db_stop(con)
259     if (length(results) == 0) {
260         return(NULL)
261     }
262     return(as.logical(results$accept))
263 }
264
265 db_license_overrides <- function() {
266     con <- db_start()
267     overrides <- dbGetQuery(con,paste('SELECT * FROM license_override'))
268     hashes    <- dbGetQuery(con,paste('SELECT * FROM license_hashes'))
269     db_stop(con)
270     return(list(overrides=overrides,hashes=hashes))
271 }
272
273 db_add_license_hash <- function(name,license_sha1) {
274     if (is.null(db_license_override_name(name))) {
275         fail('license',name,'is not know, yet trying to add a hash for it?')
276     }
277     notice('adding hash',license_sha1,'for',name)
278     con <- db_start()
279     dbGetQuery(con,paste(
280          'INSERT OR REPLACE INTO license_hashes'
281         ,'(name, sha1) VALUES ('
282         ,' ',db_quote(tolower(name))
283         ,',',db_quote(tolower(license_sha1))
284         ,')'))
285     db_stop(con)
286 }
287
288
289 db_update_package_versions <- function() {
290     # seems like the quickest way of doing this:
291     con <- db_start()
292     dbGetQuery(con, 'DROP TABLE packages')
293     db_stop(con)
294     # db_start re-makes all tables
295     con <- db_start()
296     for (package in available[,'Package']) {
297         dbGetQuery(con, paste('INSERT OR REPLACE INTO packages (package,latest_r_version)'
298                              ,'VALUES (',db_quote(package)
299                              ,',',db_quote(available[package,'Version']),')'))
300     }
301     dbGetQuery(con,'DELETE FROM builds WHERE builds.package NOT IN (SELECT package FROM packages)')
302     db_stop(con)
303 }
304
305 db_date_format <- '%Y-%m-%d'
306 db_time_format <- '%H:%M:%OS %Z'
307
308 db_record_build <- function(package, deb_version, log, success=F) {
309     con <- db_start()
310     o<-options(digits.secs = 6)
311     dbGetQuery(con,paste('INSERT OR REPLACE INTO builds'
312                         ,'(package,system,r_version,deb_epoch,deb_revision,db_version,success,date_stamp,time_stamp,scm_revision,log)'
313                         ,'VALUES'
314                         ,'(',db_quote(package)
315                         ,',',db_quote(which_system)
316                         ,',',db_quote(version_upstream(deb_version))
317                         ,',',db_quote(version_epoch(deb_version))
318                         ,',',db_quote(version_revision(deb_version))
319                         ,',',db_cur_version(con)
320                         ,',',as.integer(success)
321                         ,',',db_quote(format(Sys.time(), db_date_format))
322                         ,',',db_quote(format(Sys.time(), db_time_format))
323                         ,',',db_quote(scm_revision)
324                         ,',',db_quote(paste(log, collapse='\n'))
325                         ,')'))
326     options(o)
327     db_stop(con)
328 }
329
330 db_builds <- function(pkgname) {
331     # returns all successful builds
332     con <- db_start()
333     build <- dbGetQuery(con, paste('SELECT * FROM builds'
334                        ,'WHERE success = 1'
335                        ,'AND system =',db_quote(which_system)
336                        ,'AND package =',db_quote(pkgname)))
337     db_stop(con)
338     if (length(build) == 0) {
339         return(NULL)
340     }
341     return(db_cleanup_builds(build))
342 }
343
344 db_cleanup_builds <- function(build) {
345     build$success <- as.logical(build$success)
346     #o <-options(digits.secs = 6)
347     dt <- as.POSIXct(strptime(paste(as.character(build[,"date_stamp"]), as.character(build[,"time_stamp"])),
348                               paste(db_date_format, db_time_format)))
349     build$time_stamp <- NULL
350     build$date_stamp <- NULL
351     newdf <- data.frame(build, date_stamp=dt)
352     #print(newdf[, -grep("log", colnames(newdf))])
353     #options(o)
354     #print(newdf[, -grep("log", colnames(newdf))])
355     return(newdf)
356 }
357
358 db_latest_build <- function(pkgname) {
359     con <- db_start()
360     build <- dbGetQuery(con, paste('SELECT * FROM builds'
361                        ,'NATURAL JOIN (SELECT package,max(id) AS max_id FROM builds'
362                        ,              'WHERE system =',db_quote(which_system)
363                        ,              'GROUP BY package) AS last'
364                        ,'WHERE id = max_id'
365                        ,'AND builds.package =',db_quote(pkgname)))
366     db_stop(con)
367     if (length(build) == 0) {
368         return(NULL)
369     }
370     return(db_cleanup_builds(build))
371 }
372
373 db_latest_build_version <- function(pkgname) {
374     build <- db_latest_build(pkgname)
375     if (is.null(build)) {
376         return(NULL)
377     }
378     return(version_new(build$r_version, build$deb_revision, build$deb_epoch))
379 }
380
381 db_latest_build_status <- function(pkgname) {
382     build <- db_latest_build(pkgname)
383     if (is.null(build)) {
384         return(NULL)
385     }
386     return(list(build$success,build$log))
387 }
388
389 db_outdated_packages <- function() {
390     con <- db_start()
391     packages <- dbGetQuery(con,paste('SELECT packages.package FROM packages'
392                ,'LEFT OUTER JOIN ('
393                # extract the latest attempt at building each package
394                ,      'SELECT * FROM builds'
395                ,      'NATURAL JOIN (SELECT package,max(id) AS max_id FROM builds'
396                ,                    'WHERE system =',db_quote(which_system)
397                ,                    'GROUP BY package) AS last'
398                ,      'WHERE id = max_id) AS build'
399                ,'ON build.package = packages.package'
400                # outdated iff:
401                # - there is no latest build
402                ,'WHERE build.package IS NULL'
403                # - the database has changed since last build
404                ,'OR build.db_version < (SELECT max(version) FROM database_versions)'
405                # - the debian epoch has been bumped up
406                ,'OR build.deb_epoch < (SELECT max(base_epoch) FROM database_versions'
407                ,                        'WHERE version IN ('
408                ,                            'SELECT max(version) FROM database_versions))'
409                # - the latest build is not of the latest R version
410                ,'OR build.r_version != packages.latest_r_version'
411                ))$package
412     db_stop(con)
413     return(packages)
414 }
415
416 db_blacklist_packages <- function() {
417     con <- db_start()
418     packages <- dbGetQuery(con,'SELECT package from blacklist_packages')$package
419     db_stop(con)
420     return(packages)
421 }