2014-10-24 6 views
3

opencpu와 SQLite는 데이터베이스에서 결과를 얻을 수 없습니다 그러나내가 SQLite는 데이터베이스에서 일부 데이터를 추출하는 비교적 간단한 기능을 가지고

> db.select(vars = c("gc_content"), rows=c(1:5)) 
    gc_content 
1  44.30 
2  41.22 
3  48.51 
4  60.83 
5  45.21 

, 나는 opencpu를 통해이 기능을 사용하여 데이터를 검색하는 데 전혀 성공하지 않은 :

$ curl http://localhost/ocpu/user/bertjan/library/RParcoords/R/db.select/json -H "Content-Type: application/json" -d '{"vars":["gc_content"]}' 
RS-DBI driver: (could not connect to dbname: 
unable to open database file 
) 

In call: 
sqliteNewConnection(drv, ...) 

나는 파일이 존재하는지 두 번 확인하고, 권한을 확인하고, 모두에 대해 읽기/쓰기 권한을 설정했지만 운이 전혀 없다. 모든 입력을 부탁드립니다.

편집 1 : @Jeroen에서 제안한 변경 사항을 apparmor 구성으로 사용하지 않으려 고 시도했습니다. 그러나

/full/path/to/db rw, 

, 그것은 단지 내가 지금 오류 얻을 SOFAR 도움 :

RS-DBI 드라이버 : 문 (오류를 조금하지만 사용자 정의 파일에 다음 줄을 추가 한 도움이 무슨 짓을했는지 : 데이터베이스 통화에서

) 잠겨 :이 오류가 발생하지 않는 이상하다

내가 정확히 실행할 때) ... sqliteExecStatement (CONN, 문, 동일한 데이터베이스 파일과 동일한 코드 (RStudio에서. 나는 (R 스튜디오에서 작동하는 동일한 동작을 얻을로, 아무 소용이,

db.select <- function(table="mydata", vars, rows=c()) { 
    vars <- paste(unlist(vars), collapse=", ") 
    q <- paste("SELECT ", vars, " FROM ", table, sep="") 

    if (length(rows) > 0) { 
    rows <- paste(as.character(rows), collapse=", ") 
    q <- paste(q, " WHERE row in (", rows, ")", sep="") 
    } 

    con <- DBI::dbConnect(RSQLite::SQLite(), "/home/bertjan/cstr.db") 
    data <- DBI::dbGetQuery(con, q) 
    DBI::dbDisconnect(con) 
    data 
} 

을 정지 :

편집 2 : 해들리 위컴 (https://twitter.com/hadleywickham/status/526739851974955008)에 의해 제안 된 바와 같이 나는 dbGetQuery를 사용하여 기능을 단순화 curl 명령을 발행 할 때 데이터베이스 잠김 메시지를 제공합니다).

편집 3 : 실제로는 여전히 AppArmor 문제인 것으로 보입니다. 내가 얻을 :

Oct 27 15:50:52 Stef kernel: [899068.612784] type=1400 audit(1414421452.965:232): apparmor="DENIED" operation="file_lock" profile="opencpu-exec" name="/path/to/db" pid=9708 comm="apache2" requested_mask="k" denied_mask="k" fsuid=33 ouid=1000 

솔루션 :가 마지막으로 발견했다. 결국 AppArmor의 순수한 문제인 것처럼 보였습니다.

/full/path/to/db rw, 

/full/path/to/db rwk, 

(k 개의 주)

에 파일 잠금을 허용하기 위해 : 나는 변경했다.

답변

1

아마도 보안상의 제한 사항 일 수 있습니다. this post on the mailing list을 참조하십시오. 의 3.5 절을 참조하십시오. 디버그하려면 애플리케이션을 사용하려고 시도 할 때 다음을 확인하십시오.

tail -f /var/log/kern.log 

.나는 추가한다고 생각한다.

#include <abstractions/mysql> 

/etc/apparmor.d/opencpu/custom 프로필로 문제를 해결해야한다.

+0

작은 메모 : 의도 한 파일은 아마도 /etc/apparmor.d/opencpu/custom입니다. 포함 라인은 "#include "이라고 명시해야합니다. 그렇지 않으면 apparmor가 파일을 찾을 수 없다는 불평을합니다. –

+0

감사합니다. 내 전화에서 SO 질문에 대답해서는 안됩니다 :) 이것이 당신의 문제를 해결 했습니까? – Jeroen

+0

아니,하지만 그것은 올바른 방향으로 나를 가리켰다. 마지막 편집에서 언급했듯이, sqlite는 하나의 파일로 구성된 데이터베이스이므로 mysql 프로필은별로 도움이되지 않습니다. 필요한 것은 데이터베이스 파일에 대한 읽기 및 쓰기 * 및 * 잠금 액세스입니다. –