CGI with c // sqlite DB // 웹 연동 질문 입니다.
웹(IE)에서
busybox(1.5.0) httpd 를 이용한
인베디드 웹 서버로 접속했구요
c로 구현한 CGI 를 이용해서 DB내용을 수정해야 합니다.
이미 pc 아파치 웹서버를 이용해서 실험해서 성공했기 때문에 코드에는
문제가 없다고 생각 되어 집니다. (임의 생각) 같은 코드로
여찌됐든 크로스컴파일을해서 cgi를 임베디드에 올린 후에
DB파일을 www dir로 가져와서(dir 권한 문제때문에) 실행했구요
문제는 splite 에서 제공하는 c API 중 DB를 오픈하는 함수인
int sqlite3_open(DB)
함수가 머가 문제 인지 실행이 안되고 종료가 됩니다.
(리턴값도 없는 에러 강종인듯하네요)
그전까지의 결과만이
출력 html에 결과가 표시 됩니다.
============================================
sqlite3 *db;
int rc;
(중략)
printf("Before DB open\n");
rc = sqlite3_open(dbname, &db);
printf("rc = %d\n", rc);
(이하 생략)
============================================
출력 html에 open함수 실행직전까지만 출력 되네요..
libsqlite3.so.0.8.6 사용한 sqlite 라이브러리입니다.
부족하신 정보 말씀해주시면 다시 알려드릴께요
조언 부탁드립니다.
printf("Before DB open :
printf("Before DB open : %s\n", dbname);
해서, dbname이 정상적이 찍히고 있는지 먼저 확인하고,
실제 cgi에서 dbname에 있는 파일을 엑세스 가능한지를 확인해봐야 할 듯 하네요.
FILE *fp = fopen (dbname, "a"); 등등으로.. 그 db파일을 수동(?)으로
열어보시는 테스트를 먼저 해보세요.. ( fp가 정상적인지.. )
거기에 문제의 원인이 있지 않을까.. 해서요.
넵 결과입니다.
=============================================
FILE *fp;
if ((fp = fopen(dbname, "rb")) == NULL)
{
printf("Error opening file.\n");
}
fclose(fp);
=============================================
위 코드 추가 해서 실행 해보니 에러코드 출력이 안된거 보니 정상인거 같아요.
실행 결과 html 출력은 dbname은 이미 계속 출력 하게끔해논거라서..
잘 나오는듯 하네요
dbname = iptdb
현재...
음.. 지금은 sqlite3를 debug모드로 complie 해서 결과를 보려고 하고 있는데
컴파일은 한거 같은데 메세지가 나오는건지 안나오는건지.. 잘모르겠네요.. 후
제 경험상, sqlite3
제 경험상,
sqlite3 라이브러리에 문제일 가능성은 극히 적습니다.
물론, sqlite3를 -g 옵션을 넣어 컴파일 후, gdb로 볼 수 있다면이야..
뭐, 훨씬 쉽게 문제를 해결할 수 있겠지만요.. ㅎㅎ
뭐 같은 얘기지만, 에러코드가 출력이 안되어서 정상이라 판단하기 보다,
SQLite 용 DB파일이 만들어질 곳에, 파일을 "쓰기"모드로 열어서
실제 Write가 되는지, 먼저 확인해 보시는게 좋지않을까요..
해결책은 못드리고, 자꾸 쓸데없는 일만 시키는 것 같은데... ㅎㅎ
제 생각에는.. sqlite3를 새로 컴파일해서 하는 것 보다,
이 일을 먼저해보는게 시간을 벌 수 있을듯해서요. :-)
음...
다른 파일 오픈 확인 해 보았구요
아 참 제게 cgi 처음 테스트 할때
파일 오픈해서 읽고 결과를 write하며 누적하는
설문조사 통계프로그램을 돌려봤기 때문에
검증은 이미 된걸로 생각됩니다.
지금 생각해 둔게 하나 있는데..
제 글 내용만 보고 그걸 유추하기는 어렵네요
음 그리고 글에 적은 내용의 문제는
sqlite3의 open 함수 실행시 실행완료가 안되고 종료입니다.
완료가 안되기 때문에
아랫분 말씀의 리턴값 확인은 자체가 안되고 있습니다.
제가 open을 하기 전에 이미 system 자체에서 계속 open을 하고 있었다..
일까나;; 이럴 경우와 그게 문제가 되는지 확인중입니다.
이런 문제가 쉽게
이런 문제가 쉽게 해결되지 않는 이유는
리턴값에 대한 검사, 그리고 리턴값이 0보다 작거나 NULL인 경우 에러값 확인
이런 절차가 갖춰져 있지 않기 때문입니다.
여기서 rc가 0이면 open까지는 문제가 아니니
그 다음 문장이 제대로 실행되었는지 확인해보시기 바랍니다.
글 내용에
출력 확인은 이미 제 글 내용에 있습니다.
"open 함수 다음 내용이 실행 되지 않고 그전 결과 까지의 출력만 확인이 되었다"
open함수의 리턴값 확인이 안되기 때문에
open함수 실행중 종료라고 생각됩니다.
환경변수혹은권한등
환경변수혹은권한등의 문제일수 있습니다.
http 계정으로 로그인해서 수동으로 수행해보세요.
이경우를 생각해서..
db 파일을 www dir에 놓고 하는 중이고 dir // file 권한을 766으로 주었구요
웹에서 접속할때 / 권한 계정으로 하고 있습니다.
=============================
busybox httpd.conf 내용중 포함
=============================
/:admin:1111
=============================
댓글 달기