분류 전체보기
-
sqlite3 문자열을 숫자로 변환하여 비교하기sqlite3 2013. 12. 30. 12:14
sqlite> pragma table_info(delivery);0|key|varchar(65)|0||11|nick_src|varchar(65)|0||02|nick_tgt|varchar(65)|0||03|date_send|varchar(33)|0||04|date_recv|varchar(33)|0||05|item|varchar(33)|0||06|msg|varchar(81)|0||0 delivery.date_send 는 "20131201.1230" 형태의 문자열로 저장되어 있는 컬럼이다. 이것을 비교하여 쿼리하기 위해서는 CAST함수를 이용한다. sqlite> delete from delivery where CAST(date_send as integer) date_send(..
-
sqlite3 파일 사이즈 줄이기sqlite3 2013. 12. 30. 12:10
delete from [table] 로 레코드를 엄청나게 줄였음에도, 물리적 파일 사이즈는 줄어들지 않는다. 디스크 공간을 재사용하기 위해서인데, 이 경우 vacuum 명령어로 실제 파일 사이즈를 줄일수 있다. sqlite> vacuum;sqlite> .quit [biscuit@*****]$ ls -al sogon.db*-rw-rw-rw- 1 biscuit users 92,228,608 12월 30 12:05 sogon.db-rw-r--r-- 1 biscuit users 18,917,376 12월 30 12:05 sogon.db.test 필요없는 레코드들을 지우고나서도 92메가 정도였는데, vacuum 명령어 실행후 확 줄어들었다.
-
string을 sprintf, printf 형식으로 사용하기c++ 2013. 7. 4. 11:41
C++표준 string (basic_string)을 printf 형식으로 사용하는 편한 방법이 없을까? 인터넷 찾아보면 여러가지 방법들이 나오긴하는데, static 변수를 이용하여 편하고/간결하고/오버헤드 없이 구현해 보았다. void strFormat(string &strResult, const char *pFormat, ... ){ static char sprintf_buffer[8192]; va_list va = NULL;va_start(va, pFormat);vsprintf(sprintf_buffer, pFormat, va);strResult = sprintf_buffer; va_end(va);} void strReplace(string& subject, const string& search, c..
-
알람 시그널을 이용하여 의도하지 않은 무한루프 디버깅c++ 2013. 7. 3. 21:46
개발환경 : C++/STL/Linux/gcc프로그램을 짜다 보면 잘 못 짜서 어디선가 무한루프에 빠져서 헤어나질 못하는 경우가 종종 있는데, 이럴때 SIGALRM을 이용하여 이 녀석이 대체 무슨 짓을 하고 있었는지 자세하게 확인할 수 있다.// signal handlerstatic void SigAlarm(int signo){ ... closing_routine(); ....abort(); // exit with core_dump} int main(){// 핸들러 설정if(signal(SIGALRM, SigAlarm) == SIG_ERR) ERROR("signal ALARM error");... // main loopwhile(1){alarm(5); // 알람설정 5초...do_something();....
-
디버깅, call stack back tracec++ 2013. 7. 3. 21:37
누가 이 함수를 호출하였을까? 개발환경 : C++/STL/Linux/gcc디버깅을 하다보면, 대체 어디서 이 함수를 호출했을까 궁금해질때가 있다. 이럴때 호출한 함수들을 역순으로 알아낼 수 있는 함수 루틴. #include void call_stack_dump() {void * array[50];char ** messages;int size, i; size = backtrace(array, 50);messages = backtrace_symbols(array, size); // skip first stack frame (points here)for (i = 0; i < size; ++i){fprintf(stderr, "[bt]: (%d) %s\n", i, messages[i]);} free(message..
-
[sqlite3] transaction 이용한 퍼포먼스 향상sqlite3 2013. 6. 11. 16:57
그냥 보통 방법으로 INSERT와 DELETE등의 쿼리를 반복적으로 수행할때에 sqlite3의 성능은 형편없이 떨어지는데, 이럴때에는 Transaction을 이용해야 한다. 100개의 INSERT에 5초이상 걸리기도 하니 Transaction은 필수적이다. int TSqlite::ExecuteMulti(const list &queries){// beginsqlite3_exec(this->m_db, "BEGIN TRANSACTION;", 0, 0, 0); list::const_iterator ils = queries.begin();while(ils != queries.end()){sqlite3_exec(this->m_db, ils->c_str(), 0, 0, 0);ils++;} // endsqlite3_e..
-
[sqlite3] wrapper class in c++ and STL on linuxsqlite3 2013. 5. 24. 20:55
sqlite3에 대한 C++ wrapper class 를 만들어 보았다. 간단하게 INSERT와 SELECT 정도만 편하게 했으면 좋겠다 싶은데, sqlite라는게 그리 간단하지가 않다. (gdbm 정도의 편리함을 기대했다면 오산이다). db를 open하고 close하는 사이에 prepare하고 free, finalize 하는게 생각보다 까다롭다. 그래서 요것만 후다닥 구현. class TSqlite{protected :bool m_isError;sqlite3 *m_db; private :bool Send(const char *strQuery); public:TSqlite(const char *strFileName){m_isError = (sqlite3_open(strFileName, &m_db) == ..