From o2on-svn @ lists.sourceforge.jp Thu Apr 3 23:40:13 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Thu, 03 Apr 2008 23:40:13 +0900 Subject: [o2on-svn] =?utf-8?b?WzcwXSAgRmlyZWJpcmTlr77lv5wgOg==?= Message-ID: <1207233613.645041.11319.nullmailer@users.sourceforge.jp> Revision: 70 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=70 Author: k-uehara Date: 2008-04-03 23:40:13 +0900 (Thu, 03 Apr 2008) Log Message: ----------- Firebird絲上?: free_xsqlda bind select, select_datcount, select_publishcount update remove Modified Paths: -------------- trunk/o2on/src.o2on/O2DatDB.cpp trunk/o2on/src.o2on/O2DatDB.h Modified: trunk/o2on/src.o2on/O2DatDB.cpp =================================================================== --- trunk/o2on/src.o2on/O2DatDB.cpp 2008-03-31 12:40:31 UTC (rev 69) +++ trunk/o2on/src.o2on/O2DatDB.cpp 2008-04-03 14:40:13 UTC (rev 70) @@ -123,7 +123,65 @@ #ifdef O2_DB_FIREBIRD +bool +O2DatDB:: +bind(XSQLDA *sqlda, int index, const uint64 num) +{ + XSQLVAR *var = sqlda->sqlvar; + if (sqlda->sqln > index && (var[index].sqltype & ~1) == SQL_INT64) { + var[index].sqltype = SQL_INT64; + *(ISC_INT64*)var[index].sqldata = num; + return true; + } else + return false; +} +bool +O2DatDB:: +bind(XSQLDA *sqlda, int index, const wchar_t *str) +{ + string tmpstr; + XSQLVAR *var = sqlda->sqlvar; + if (sqlda->sqln > index && (var[index].sqltype & ~1) == SQL_VARYING) { + FromUnicode(L"UTF-8", str, wcslen(str)*2, tmpstr); + var[index].sqltype = SQL_TEXT; + strcpy_s(var[index].sqldata, var[index].sqllen, tmpstr.c_str()); + //tmpstr.copy(var[index].sqldata, tmpstr.length(), 0); + var[index].sqllen = wcslen(str); + return true; + } else + return false; +} + +bool +O2DatDB:: +bind(XSQLDA *sqlda, int index, const wstring &str) +{ + string tmpstr; + XSQLVAR *var = sqlda->sqlvar; + if (sqlda->sqln > index && (var[index].sqltype & ~1 )== SQL_VARYING) { + FromUnicode(L"UTF-8", str, tmpstr); + var[index].sqltype = SQL_TEXT; + strcpy_s(var[index].sqldata, var[index].sqllen, tmpstr.c_str()); + //tmpstr.copy(var[index].sqldata, tmpstr.length(), 0); + var[index].sqllen = strlen(tmpstr.c_str()); + return true; + } else + return false; +} + +bool +O2DatDB:: +bind(XSQLDA *sqlda, int index, const hashT &hash) +{ + XSQLVAR *var = sqlda->sqlvar; + if (sqlda->sqln > index && var[index].sqllen == 20 && (var[index].sqltype & ~1)== SQL_TEXT) { + memcpy(var[index].sqldata, hash.data(), hash.size()); + return true; + } else + return false; +} + void O2DatDB:: get_columns(XSQLDA *sqlda, O2DatRec &rec) @@ -131,13 +189,13 @@ XSQLVAR *var = sqlda->sqlvar; rec.hash.assign((byte*)var->sqldata, HASHSIZE); var++; - ascii2unicode(var->sqldata+2, var->sqllen, rec.domain); var++; - ascii2unicode(var->sqldata+2, var->sqllen, rec.bbsname); var++; - ascii2unicode(var->sqldata+2, var->sqllen, rec.datname); var++; + ascii2unicode(var->sqldata+2, *(ISC_SHORT*)var->sqldata, rec.domain); var++; + ascii2unicode(var->sqldata+2, *(ISC_SHORT*)var->sqldata, rec.bbsname); var++; + ascii2unicode(var->sqldata+2, *(ISC_SHORT*)var->sqldata, rec.datname); var++; rec.size = *(long*)(var->sqldata); var++; rec.disksize = *(long*)var->sqldata; var++; - ascii2unicode(var->sqldata+2, var->sqllen, rec.url); var++; - ToUnicode(L"UTF8", var->sqldata+2, var->sqllen, rec.title); var++; + ascii2unicode(var->sqldata+2, *(ISC_SHORT*)var->sqldata, rec.url); var++; + ToUnicode(L"UTF-8", var->sqldata+2, *(ISC_SHORT*)var->sqldata, rec.title); var++; rec.res = 0; var++; // always 0 rec.lastupdate = *(long*)var->sqldata; var++; rec.lastpublish = *(long*)var->sqldata; @@ -145,69 +203,87 @@ void O2DatDB:: -get_columns(isc_stmt_handle stmt, XSQLDA* sqlda, wstrarray &cols) +get_columns(XSQLDA* sqlda, wstrarray &cols) { int i; - long fetch_stat; wstring tmpstr; wchar_t tmp[1024]; XSQLVAR *var; - ISC_STATUS_ARRAY status; - while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0) { - for (i = 0, var = sqlda->sqlvar; i < sqlda->sqld; i++, var++) { - switch (var->sqltype & ~1) { - case SQL_VARYING: - if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { - cols.push_back(L"error"); + for (i = 0, var = sqlda->sqlvar; i < sqlda->sqld; i++, var++) { + tmpstr.clear(); + switch (var->sqltype & ~1) { + case SQL_VARYING: + if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { + cols.push_back(L"[NULL]"); + } else { + if (var->sqlsubtype == SQL_CHAR_OCTETS){ + byte2whex((const byte *)var->sqldata+2, *(ISC_SHORT*)var->sqldata, tmpstr); + cols.push_back(tmpstr); } else { - if (var->sqltype == SQL_CHAR_OCTETS){ - byte2whex((const byte *)var->sqldata+2, var->sqllen, tmpstr); - cols.push_back(tmpstr); - } else { - ToUnicode(L"UTF8", var->sqldata+2, var->sqllen, tmpstr); - //ascii2unicode(var->sqldata+2, var->sqllen, tmpstr); - cols.push_back(tmpstr); - } - } - break; - case SQL_TEXT: - if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { - cols.push_back(L"error"); - } else { - ascii2unicode(var->sqldata, var->sqllen, tmpstr); + ToUnicode(L"UTF-8", var->sqldata+2, *(ISC_SHORT*)var->sqldata, tmpstr); + //ascii2unicode(var->sqldata+2, var->sqllen, tmpstr); cols.push_back(tmpstr); } - break; - case SQL_LONG: - if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { - cols.push_back(L"error"); - } else { - swprintf_s(tmp, 1024, L"%d", *(long*)var->sqldata); - cols.push_back(tmp); - } - break; - case SQL_SHORT: - if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { - cols.push_back(L"error"); - } else { - swprintf_s(tmp, 1024, L"%d", *(short*)var->sqldata); - } - break; - case SQL_FLOAT: - if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { - cols.push_back(L"error"); - } else { - swprintf_s(tmp, 1024, L"%f", *(float*)var->sqldata); - } - break; - case SQL_ARRAY: - case SQL_BLOB: - case SQL_DOUBLE: - default: - cols.push_back(L"error"); - break; } + break; + case SQL_TEXT: + if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { + cols.push_back(L"[NULL]"); + } else if (var->sqlsubtype == SQL_CHAR_OCTETS){ + byte2whex((const byte *)var->sqldata, var->sqllen, tmpstr); + cols.push_back(tmpstr); + } else { + ToUnicode(L"UTF-8", var->sqldata, var->sqllen, tmpstr); + //ascii2unicode(var->sqldata, *(ISC_SHORT*)var->sqldata, tmpstr); + cols.push_back(tmpstr); + } + break; + case SQL_LONG: + if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { + cols.push_back(L"[NULL]"); + } else { + swprintf_s(tmp, 1024, L"%d", *(ISC_LONG*)var->sqldata); + cols.push_back(tmp); + } + break; + case SQL_SHORT: + if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { + cols.push_back(L"[NULL]"); + } else { + swprintf_s(tmp, 1024, L"%d", *(ISC_SHORT*)var->sqldata); + cols.push_back(tmp); + } + break; + case SQL_FLOAT: + if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { + cols.push_back(L"[NULL]"); + } else { + swprintf_s(tmp, 1024, L"%lf", *(float*)var->sqldata); + cols.push_back(tmp); + } + break; + case SQL_DOUBLE: + if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { + cols.push_back(L"[NULL]"); + } else { + swprintf_s(tmp, 1024, L"%lf", *(double*)var->sqldata); + cols.push_back(tmp); + } + break; + case SQL_INT64: + if ((var->sqltype & 1) && (*(var->sqlind) == -1)) { + cols.push_back(L"[NULL]"); + } else { + swprintf_s(tmp, 1024, L"%I64d", *(ISC_INT64*)var->sqldata); + cols.push_back(tmp); + } + break; + case SQL_ARRAY: + case SQL_BLOB: + default: + cols.push_back(L"[unsupported data type]"); + break; } } } @@ -234,9 +310,9 @@ outda->version = SQLDA_VERSION1; outda->sqln = 1; if (bind) { - if (isc_dsql_describe_bind(status, &stmt, 1, outda)) goto error; + if (isc_dsql_describe_bind(status, &stmt, 3, outda)) goto error; } else { - if (isc_dsql_describe(status, &stmt, 1, outda)) goto error; + if (isc_dsql_describe(status, &stmt, 3, outda)) goto error; } if (outda->sqld > outda->sqln) { int n = outda->sqld; @@ -245,9 +321,9 @@ outda->version = SQLDA_VERSION1; outda->sqln = n; if (bind) - isc_dsql_describe_bind(status, &stmt, 1, outda); + isc_dsql_describe_bind(status, &stmt, 3, outda); else - isc_dsql_describe(status, &stmt, 1, outda); + isc_dsql_describe(status, &stmt, 3, outda); } int i; for (var = outda->sqlvar, i=0; i < outda->sqld; i++, var++) { @@ -259,7 +335,7 @@ var->sqldata = (char *)new char[var->sqllen]; break; } - if (var->sqltype & 1) { + if (!bind && (var->sqltype & 1)) { var->sqlind = (short *)new short; } } @@ -269,6 +345,28 @@ log(status); return NULL; } + +void +O2DatDB:: +free_xsqlda(XSQLDA* &sqlda) +{ + if (sqlda == NULL) + return; + XSQLVAR* var = sqlda->sqlvar; + for (int i=0; i < sqlda->sqln; i++,var++){ + if ((var->sqltype & ~1) != SQL_VARYING) { + if (var->sqldata) delete(var->sqldata); + } else { + delete(var->sqldata); + } + if (var->sqltype & 1) { + delete(var->sqlind); + } + } + delete(sqlda); + sqlda = NULL; + return; +} #else bool O2DatDB:: @@ -391,7 +489,7 @@ char create_db[512]; sprintf_s(create_db, 512, "CREATE DATABASE '%s' USER 'SYSDBA' PASSWORD 'masterkey';", dbfilenameA.c_str()); - if (!isc_dsql_execute_immediate(status, &db, &tr, 0, create_db, 1, NULL)) + if (!isc_dsql_execute_immediate(status, &db, &tr, 0, create_db, 3, NULL)) isc_detach_database(status, &db); if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) @@ -402,34 +500,34 @@ "if (not exists(select 1 from rdb$relations where rdb$relation_name = 'DAT')) then " "execute statement 'create table DAT (" " hash CHAR(20) CHARACTER SET OCTETS NOT NULL PRIMARY KEY,"//length is HASHSIZE in sha.h - " domainname VARCHAR(10) CHARACTER SET ASCII," - " bbsname VARCHAR(10) CHARACTER SET ASCII," - " datname VARCHAR(20) CHARACTER SET ASCII," - " filesize INTEGER," - " disksize INTEGER," - " url VARCHAR(128) CHARACTER SET ASCII," - " title VARCHAR(256) CHARACTER SET UTF8," - " res INTEGER," - " lastupdate INTEGER," - " lastpublish INTEGER" + " domainname VARCHAR(16) CHARACTER SET ASCII," + " bbsname VARCHAR(32) CHARACTER SET ASCII," + " datname VARCHAR(32) CHARACTER SET ASCII," + " filesize BIGINT," + " disksize BIGINT," + " url VARCHAR(256) CHARACTER SET ASCII," + " title VARCHAR(512) CHARACTER SET UTF8," + " res BIGINT," + " lastupdate BIGINT," + " lastpublish BIGINT" ");';" "END"; if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) goto error; - if (isc_dsql_execute_immediate(status, &db, &tr, 0, sql, 1, NULL)) + if (isc_dsql_execute_immediate(status, &db, &tr, 0, sql, 3, NULL)) goto error; if (isc_commit_transaction(status, &tr)) goto error; if (isc_detach_database(status, &db)) goto error; - return true; + return (true); error: log(status); if (tr) isc_rollback_transaction(status, &tr); if (db) isc_detach_database(status, &db); - return false; + return (false); #else sqlite3 *db = NULL; int err = sqlite3_open16(dbfilename.c_str(), &db); @@ -520,18 +618,90 @@ if (isc_detach_database(status, &db)) goto error; - return true; + return (true); error: log(status); if (tr) isc_rollback_transaction(status, &tr); if (db) isc_detach_database(status, &db); - return false; + return (false); } +size_t +O2DatDB:: +select(const wchar_t *sql, SQLResultList &out) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select"); +#endif + + isc_db_handle db = NULL; + isc_tr_handle tr = NULL; + ISC_STATUS_ARRAY status; + isc_stmt_handle stmt = NULL; + XSQLDA *outda = NULL; + string w_str, sqlstr; + wstrarray cols; + long fetch; + size_t ct = 0; + + if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) + goto error; + + FromUnicode(L"UTF-8", sql, sqlstr); + + if (isc_dsql_allocate_statement(status, &db, &stmt)) + goto error; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt, 0, sqlstr.c_str(), 3, NULL)) + goto error; + XSQLDA *sqlda = prepare_xsqlda(stmt, false); + + if (isc_dsql_execute(status, &tr, &stmt, 3, NULL)) + goto error; + if (isc_dsql_fetch(status, &stmt, 3, sqlda)) + goto error; + + if (out.empty()) { + //??? + cols.clear(); + get_column_names(sqlda, cols); + out.push_back(cols); + cols.clear(); + get_columns(sqlda, cols); + out.push_back(cols); + ct++; + } + while (fetch = isc_dsql_fetch(status, &stmt, 3, sqlda) == 0){ + //2???? + cols.clear(); + get_columns(sqlda, cols); + out.push_back(cols); + ct++; + } + + if (isc_commit_transaction(status, &tr)) + goto error; + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(sqlda); + return (ct); + +error: + log(status); + if (tr) isc_rollback_transaction(status, &tr); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(sqlda); + return (0); +} + + + bool O2DatDB:: select(O2DatRec &out) @@ -551,15 +721,16 @@ if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) goto error; - char sql[256]; - sprintf_s(sql, 256, "select first 1 %s from dat order by (lastpublish + %d)*4294967291-((filesize + %d)*4294967291/49157)*49157", - COLUMNSA, rand(), rand()); + char *sql = + "select first 1 " + COLUMNSA + " from dat order by rand();"; if (isc_dsql_allocate_statement(status, &db, &stmt)) goto error; if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) goto error; - if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 1, NULL)) + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, outda)) goto error; XSQLDA *sqlda = prepare_xsqlda(stmt, false); @@ -571,21 +742,23 @@ if (isc_commit_transaction(status, &tr)) goto error; - if (stmt) isc_dsql_free_statement(status, &stmt, 0); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); if (db) isc_detach_database(status, &db); - delete sqlda; - return true; + free_xsqlda(sqlda); + return (true); + error: log(status); if (tr) isc_rollback_transaction(status, &tr); - if (stmt) isc_dsql_free_statement(status, &stmt, 0); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); if (db) isc_detach_database(status, &db); - if (sqlda) delete sqlda; - return false; + free_xsqlda(sqlda); + return (false); } - - + + + bool O2DatDB:: select(O2DatRec &out, hashT hash) @@ -598,11 +771,7 @@ isc_tr_handle tr = NULL; ISC_STATUS_ARRAY status; isc_stmt_handle stmt = NULL; - O2DatRec rec; XSQLDA *outda = NULL, *inda = NULL; - string w_str; - int w_row = 0; - XSQLVAR *var; bool ret = false; if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) @@ -618,36 +787,37 @@ goto error; if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) goto error; - if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 1, outda)) + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) goto error; outda = prepare_xsqlda(stmt, false); inda = prepare_xsqlda(stmt, true); - inda->sqlvar->sqldata = (char*) hash.block; + //inda->sqlvar->sqldata = (char*) hash.block; + memcpy(inda->sqlvar->sqldata, hash.data(), hash.size()); - if (isc_dsql_execute2(status, &tr, &stmt, 1, inda, outda)) { - //error - } - if (isc_dsql_fetch(status,&stmt, 1, outda) == 0) { - get_columns(outda, rec); + long st = isc_dsql_execute2(status, &tr, &stmt, 3, inda, outda); + if (st == 0) { + get_columns(outda, out); ret = true; - } + } else if (isc_sqlcode(status) != 100L) + goto error; + if (isc_commit_transaction(status, &tr)) goto error; - if (stmt) isc_dsql_free_statement(status, &stmt, 0); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); if (db) isc_detach_database(status, &db); - if (inda) delete inda; - if (outda) delete outda; - return ret; + free_xsqlda(inda); + free_xsqlda(outda); + return (ret); error: log(status); if (tr) isc_rollback_transaction(status, &tr); - if (stmt) isc_dsql_free_statement(status, &stmt, 0); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); if (db) isc_detach_database(status, &db); - if (inda) delete inda; - if (outda) delete outda; - return false; + free_xsqlda(inda); + free_xsqlda(outda); + return (false); } @@ -684,10 +854,10 @@ goto error; if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) goto error; - if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 1, NULL)) + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) goto error; outda = prepare_xsqlda(stmt, false); - if (isc_dsql_execute(status, &tr, &stmt, 1, NULL)) + if (isc_dsql_execute(status, &tr, &stmt, 3, NULL)) goto error; while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, outda)) == 0) { @@ -697,28 +867,171 @@ if (isc_commit_transaction(status, &tr)) goto error; - - if (isc_dsql_free_statement(status, &stmt, 0)) + if (isc_dsql_free_statement(status, &stmt, DSQL_drop)) goto error; - stmt = NULL; if (isc_detach_database(status, &db)) goto error; - delete outda; + free_xsqlda(outda); return true; error: log(status); - if (outda) delete outda; if (tr) isc_rollback_transaction(status, &tr); - if (stmt) isc_dsql_free_statement(status, &stmt, 0); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); if (db) isc_detach_database(status, &db); + free_xsqlda(outda); return false; } +bool +O2DatDB:: +select(O2DatRecList &out, const wchar_t *domain, const wchar_t *bbsname) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select domain bbsname order by datname"); +#endif + + isc_db_handle db = NULL; + isc_tr_handle tr = NULL; + ISC_STATUS_ARRAY status; + isc_stmt_handle stmt = NULL; + XSQLDA *outda = NULL, *inda = NULL; + O2DatRec rec; + long fetch; + + if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) + goto error; + + char *sql = + "select" + COLUMNSA + " from dat" + " where domainname = ?" + " and bbsname = ?" + " order by datname;"; + + if (isc_dsql_allocate_statement(status, &db, &stmt)) + goto error; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) + goto error; + XSQLDA tmpda; + tmpda.version = SQLDA_VERSION1; + tmpda.sqln = 1; + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) + goto error; + outda = prepare_xsqlda(stmt, false); + inda = prepare_xsqlda(stmt, true); + + if (!bind(inda, 0, domain)) + goto error; + if (!bind(inda, 1, bbsname)) + goto error; + if (isc_dsql_execute(status, &tr, &stmt, 3, inda)) + goto error; + + while ((fetch = isc_dsql_fetch(status, &stmt, 3, outda)) == 0) { + get_columns(outda, rec); + out.push_back(rec); + } + if (fetch != 100L) + goto error; + + if (isc_commit_transaction(status, &tr)) + goto error; + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + free_xsqlda(outda); + return (true); + +error: + log(status); + if (tr) isc_rollback_transaction(status, &tr); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + free_xsqlda(outda); + return (false); +} + + + + +bool +O2DatDB:: +select(O2DatRecList &out, time_t publish_tt, size_t limit) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select lastpublish"); +#endif + isc_db_handle db = NULL; + isc_tr_handle tr = NULL; + ISC_STATUS_ARRAY status; + isc_stmt_handle stmt = NULL; + XSQLDA *outda = NULL, *inda = NULL; + O2DatRec rec; + bool ret = false; + + if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) + goto error; + + char *sql = + "select first ? " + COLUMNSA + " from dat" + " where lastpublish < ?" + " order by lastpublish" + ""; + + if (isc_dsql_allocate_statement(status, &db, &stmt)) + goto error; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) + goto error; + outda = prepare_xsqlda(stmt, false); + inda = prepare_xsqlda(stmt, true); + + if (!bind(inda, 0, limit)) + goto error; + if (!bind(inda, 1, time(NULL)-publish_tt)) + goto error; + + if (isc_dsql_execute(status, &tr, &stmt, 3, inda)) + goto error; + long st; + while ((st = isc_dsql_fetch(status, &stmt, 3, outda)) == 0) { + get_columns(outda, rec); + out.push_back(rec); + } + if (st != 100L) + goto error; + + if (isc_commit_transaction(status, &tr)) + goto error; + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + free_xsqlda(outda); + return (true); + +error: + log(status); + if (tr) isc_rollback_transaction(status, &tr); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + free_xsqlda(outda); + return (false); +} + + + + uint64 O2DatDB:: select_datcount(void) @@ -749,25 +1062,395 @@ goto error; if (isc_dsql_fetch(status, &stmt, 1, sqlda)) goto error; - uint64 count = 0; - count = *(long *)sqlda->sqlvar[0].sqldata + count; + uint64 count = *(long *)sqlda->sqlvar[0].sqldata; if (isc_commit_transaction(status, &tr)) goto error; - delete sqlda; - if (stmt) isc_dsql_free_statement(status, &stmt, 0); + free_xsqlda(sqlda); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); if (db) isc_detach_database(status, &db); return (count); error: log(status); - if (sqlda) delete sqlda; if (tr) isc_rollback_transaction(status, &tr); - if (stmt) isc_dsql_free_statement(status, &stmt, 0); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); if (db) isc_detach_database(status, &db); + free_xsqlda(sqlda); return (0); } + + + + +uint64 +O2DatDB:: +select_datcount(wstrnummap &out) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select datcount group by domain bbsname"); +#endif + + isc_db_handle db = NULL; + ISC_STATUS_ARRAY status; + isc_stmt_handle stmt = NULL; + isc_tr_handle tr = NULL; + wstring domain_bbsname, tmpstr; + uint64 total = 0; + long num; + long fetch; + + if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) + goto error; + + char *sql = + "select domainname, bbsname, count(*) from dat group by domainname, bbsname;"; + + if (isc_dsql_allocate_statement(status, &db, &stmt)) + goto error; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) + goto error; + XSQLDA *sqlda = prepare_xsqlda(stmt, false); + + if (isc_dsql_execute(status, &tr, &stmt, 3, NULL)) + goto error; + XSQLVAR *var; + while ((fetch = isc_dsql_fetch(status, &stmt, 3, sqlda)) == 0) { + var = sqlda->sqlvar; + ascii2unicode(var->sqldata+2, *(ISC_SHORT*)var->sqldata, tmpstr); + domain_bbsname = tmpstr; + domain_bbsname += L":"; + var++; + ascii2unicode(var->sqldata+2, *(ISC_SHORT*)var->sqldata, tmpstr); + domain_bbsname += tmpstr; + var++; + num = *(long*)var->sqldata; + + out.insert(wstrnummap::value_type(domain_bbsname, num)); + total += num; + + } + if (fetch != 100L) + goto error; + + if (isc_commit_transaction(status, &tr)) + goto error; + free_xsqlda(sqlda); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + return (total); + +error: + log(status); + if (tr) isc_rollback_transaction(status, &tr); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(sqlda); + return (0); +} + + + + +uint64 +O2DatDB:: +select_totaldisksize(void) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select totakdisksize"); +#endif + isc_db_handle db = NULL; + ISC_STATUS_ARRAY status; + isc_stmt_handle stmt = NULL; + isc_tr_handle tr = NULL; + + if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) + goto error; + + char *sql = "select sum(disksize) from dat;"; + + if (isc_dsql_allocate_statement(status, &db, &stmt)) + goto error; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) + goto error; + XSQLDA *sqlda = prepare_xsqlda(stmt, false); + + if (isc_dsql_execute(status, &tr, &stmt, 3, NULL)) + goto error; + if (isc_dsql_fetch(status, &stmt, 1, sqlda)) + goto error; + uint64 totalsize = *(uint64 *)sqlda->sqlvar[0].sqldata;//over flow? + + if (isc_commit_transaction(status, &tr)) + goto error; + free_xsqlda(sqlda); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + return (totalsize); + +error: + log(status); + if (tr) isc_rollback_transaction(status, &tr); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(sqlda); + return (0); +} + + + + +uint64 +O2DatDB:: +select_publishcount(time_t publish_tt) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select datcount by lastpublish"); +#endif + isc_db_handle db = NULL; + isc_tr_handle tr = NULL; + ISC_STATUS_ARRAY status; + isc_stmt_handle stmt = NULL; + XSQLDA *outda = NULL, *inda = NULL; + + if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) + goto error; + + char *sql = "select count(*) from dat where lastpublish > ?;"; + + if (isc_dsql_allocate_statement(status, &db, &stmt)) + goto error; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) + goto error; + outda = prepare_xsqlda(stmt, false); + inda = prepare_xsqlda(stmt, true); + + inda->sqlvar->sqltype = SQL_INT64; + *(ISC_INT64*)inda->sqlvar->sqldata = publish_tt; + + if (!isc_dsql_execute2(status, &tr, &stmt, 3, inda, outda)) + if (isc_sqlcode(status) == 100L) + goto error; + + uint64 ret = *(ISC_INT64*)outda->sqlvar->sqldata; + + if (isc_commit_transaction(status, &tr)) + goto error; + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + free_xsqlda(outda); + return (ret); + +error: + log(status); + if (tr) isc_rollback_transaction(status, &tr); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + free_xsqlda(outda); + return (0); +} + + + + +void +O2DatDB:: +update(O2DatRecList &in) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("update by reclist"); +#endif + isc_db_handle db = NULL; + isc_tr_handle tr = NULL; + ISC_STATUS_ARRAY status; + isc_stmt_handle stmt_insert = NULL; + isc_stmt_handle stmt_update = NULL; + isc_stmt_handle stmt_updatepublish = NULL; + XSQLDA *da_insert=NULL, *da_update=NULL, *da_updatepublish=NULL; + O2DatRec org; + + if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) + goto error; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) + goto error; + + char *sql_insert = + "insert into dat (" + COLUMNSA + ") values (" + "?,?,?,?,?,?,?,?,?,?,?" + ");"; + if (isc_dsql_allocate_statement(status, &db, &stmt_insert)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt_insert, 0, sql_insert, 3, NULL)) + goto error; + + char *sql_update = + "update dat" + " set filesize = ?" + " , disksize = ?" + " , url = ?" + " , res = ?" + " , lastupdate = ?" +// " , lastpublish = 0" + " where hash = ?;"; + if (isc_dsql_allocate_statement(status, &db, &stmt_update)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt_update, 0, sql_update, 3, NULL)) + goto error; + + char *sql_updatepublish = + "update dat" + " set lastpublish = ?" + " where hash = ?;"; + if (isc_dsql_allocate_statement(status, &db, &stmt_updatepublish)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt_updatepublish, 0, sql_updatepublish, 3, NULL)) + goto error; + + for (O2DatRecListIt it = in.begin(); it != in.end(); it++) { + if (!select(org, it->hash)) { + da_insert = prepare_xsqlda(stmt_insert, true); + if (!bind(da_insert, 0, it->hash)) + goto error; + if (!bind(da_insert, 1, it->domain)) + goto error; + if (!bind(da_insert, 2, it->bbsname)) + goto error; + if (!bind(da_insert, 3, it->datname)) + goto error; + if (!bind(da_insert, 4, it->size)) + goto error; + if (!bind(da_insert, 5, it->disksize)) + goto error; + if (!bind(da_insert, 6, it->url)) + goto error; + if (!bind(da_insert, 7, it->title)) + goto error; + if (!bind(da_insert, 8, it->res)) + goto error; + if (!bind(da_insert, 9, time(NULL))) + goto error; + if (!bind(da_insert, 10, (uint64)0)) + goto error; + if (isc_dsql_execute(status, &tr, &stmt_insert, 3, da_insert)) + goto error; + free_xsqlda(da_insert); + } else if (it->userdata = 0) { + da_update = prepare_xsqlda(stmt_update, true); + if (!bind(da_update, 0, it->size)) + goto error; + if (!bind(da_update, 1, it->disksize)) + goto error; + if (!bind(da_update, 2, (wcsstr(org.url.c_str(), L"xxx") == 0 ? it->url : org.url))) + goto error; + if (!bind(da_update, 3, it->res)) + goto error; + if (!bind(da_update, 4, time(NULL))) + goto error; + if (!bind(da_update, 5, it->hash)) + goto error; +// if (!bind(da_update, 5, (uint64)0)) +// goto error; + + if (isc_dsql_execute(status, &tr, &stmt_update, 3, da_update)) + goto error; + free_xsqlda(da_update); + } else { + da_updatepublish = prepare_xsqlda(stmt_updatepublish, true); + if (!bind(da_updatepublish, 0, time(NULL))) + goto error; + if (!bind(da_updatepublish, 1, it->hash)) + goto error; + if (isc_dsql_execute(status, &tr, &stmt_updatepublish, 3, da_updatepublish)) + goto error; + free_xsqlda(da_updatepublish); + } + } + + if (isc_commit_transaction(status, &tr)) + goto error; + if (stmt_insert) isc_dsql_free_statement(status, &stmt_insert, DSQL_drop); + if (stmt_update) isc_dsql_free_statement(status, &stmt_update, DSQL_drop); + if (stmt_updatepublish) isc_dsql_free_statement(status, &stmt_updatepublish, DSQL_drop); + if (db) isc_detach_database(status, &db); + return ; + +error: + log(status); + if (tr) isc_rollback_transaction(status, &tr); + if (stmt_insert) isc_dsql_free_statement(status, &stmt_insert, DSQL_drop); + if (stmt_update) isc_dsql_free_statement(status, &stmt_update, DSQL_drop); + if (stmt_updatepublish) isc_dsql_free_statement(status, &stmt_updatepublish, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(da_insert); + free_xsqlda(da_update); + free_xsqlda(da_updatepublish); + return; +} + + + +bool +O2DatDB:: +remove(const hashT &hash) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("remove"); +#endif + + isc_db_handle db = NULL; + isc_tr_handle tr = NULL; + ISC_STATUS_ARRAY status; + isc_stmt_handle stmt = NULL; + bool ret = false; + + if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) + goto error; + + char *sql = + "delete from dat where hash = ?;"; + + if (isc_dsql_allocate_statement(status, &db, &stmt)) + goto error; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) + goto error; + XSQLDA* inda = prepare_xsqlda(stmt, true); + + if (bind(inda, 0, hash)) + goto error; + + if (isc_dsql_execute(status, &tr, &stmt, 3, NULL)) { + ret = true; + } else + ret = false; + + if (isc_commit_transaction(status, &tr)) + goto error; + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + return (ret); + +error: + log(status); + if (tr) isc_rollback_transaction(status, &tr); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + return (false); +} #else bool Modified: trunk/o2on/src.o2on/O2DatDB.h =================================================================== --- trunk/o2on/src.o2on/O2DatDB.h 2008-03-31 12:40:31 UTC (rev 69) +++ trunk/o2on/src.o2on/O2DatDB.h 2008-04-03 14:40:13 UTC (rev 70) @@ -74,14 +74,15 @@ protected: #ifdef O2_DB_FIREBIRD void log(ISC_STATUS_ARRAY &status); - bool bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const uint64 num); - bool bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const wchar_t *str); - bool bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const wstring &str); - bool bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const hashT &hash); + bool bind(XSQLDA *sqlda, int index, const uint64 num); + bool bind(XSQLDA *sqlda, int index, const wchar_t *str); + bool bind(XSQLDA *sqlda, int index, const wstring &str); + bool bind(XSQLDA *sqlda, int index, const hashT &hash); void get_columns(XSQLDA *sqlda, O2DatRec &rec); - void get_columns(isc_stmt_handle stmt, XSQLDA *sqlda, wstrarray &cols); + void get_columns(XSQLDA *sqlda, wstrarray &cols); void get_column_names(XSQLDA *sqlda, wstrarray &cols); XSQLDA* prepare_xsqlda(isc_stmt_handle stmt, bool bind); + void free_xsqlda(XSQLDA* &sqlda); #else void log(sqlite3 *db); bool bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const uint64 num); @@ -101,24 +102,24 @@ bool create_table(void); bool reindex(const char *target); - //size_t select(const wchar_t *sql, SQLResultList &out); + size_t select(const wchar_t *sql, SQLResultList &out); bool select(O2DatRec &out); bool select(O2DatRec &out, const hashT hash); //bool select(O2DatRec &out, const wchar_t *domain, const wchar_t *bbsname); bool select(O2DatRecList &out); - //bool select(O2DatRecList &out, const wchar_t *domain, const wchar_t *bbsname); + bool select(O2DatRecList &out, const wchar_t *domain, const wchar_t *bbsname); //bool select(O2DatRec &out, const wchar_t *domain, const wchar_t *bbsname, const wchar_t *datname); - //bool select(O2DatRecList &out, time_t publish_tt, size_t limit); + bool select(O2DatRecList &out, time_t publish_tt, size_t limit); uint64 select_datcount(void); - //uint64 select_datcount(wstrnummap &out); - //uint64 select_totaldisksize(void); - //uint64 select_publishcount(time_t publish_tt); + uint64 select_datcount(wstrnummap &out); + uint64 select_totaldisksize(void); + uint64 select_publishcount(time_t publish_tt); // bool update(O2DatRec &in, bool is_origurl); - //void update(O2DatRecList &in); + void update(O2DatRecList &in); // bool update_lastpublish(const hashT &hash); - //bool remove(const hashT &hash); + bool remove(const hashT &hash); #else bool create_table(void); bool reindex(const char *target); From o2on-svn @ lists.sourceforge.jp Mon Apr 7 00:02:33 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Mon, 07 Apr 2008 00:02:33 +0900 Subject: [o2on-svn] =?utf-8?b?WzcxXSAgZkZpcmViaXJk5a++5b+cIDo=?= Message-ID: <1207494153.475587.2109.nullmailer@users.sourceforge.jp> Revision: 71 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=71 Author: k-uehara Date: 2008-04-07 00:02:33 +0900 (Mon, 07 Apr 2008) Log Message: ----------- fFirebird絲上?: select 菴遵? ??????????? Modified Paths: -------------- trunk/o2on/src.o2on/O2DatDB.cpp trunk/o2on/src.o2on/O2DatDB.h Modified: trunk/o2on/src.o2on/O2DatDB.cpp =================================================================== --- trunk/o2on/src.o2on/O2DatDB.cpp 2008-04-03 14:40:13 UTC (rev 70) +++ trunk/o2on/src.o2on/O2DatDB.cpp 2008-04-06 15:02:33 UTC (rev 71) @@ -108,7 +108,7 @@ errmsg += msg; errmsg += " "; } - Logger->AddLog(O2LT_ERROR, L"Firebird", 0, 0, "%s", errmsg); + Logger->AddLog(O2LT_ERROR, L"Firebird", 0, 0, "%s", errmsg.c_str()); } #else void @@ -324,6 +324,9 @@ isc_dsql_describe_bind(status, &stmt, 3, outda); else isc_dsql_describe(status, &stmt, 3, outda); + } else if (outda->sqld ==0) { + delete(outda); + return NULL; } int i; for (var = outda->sqlvar, i=0; i < outda->sqld; i++, var++) { @@ -354,11 +357,7 @@ return; XSQLVAR* var = sqlda->sqlvar; for (int i=0; i < sqlda->sqln; i++,var++){ - if ((var->sqltype & ~1) != SQL_VARYING) { - if (var->sqldata) delete(var->sqldata); - } else { - delete(var->sqldata); - } + delete(var->sqldata); if (var->sqltype & 1) { delete(var->sqlind); } @@ -495,7 +494,7 @@ if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) goto error; - char *sql = + char *sql0 = "EXECUTE BLOCK AS BEGIN " "if (not exists(select 1 from rdb$relations where rdb$relation_name = 'DAT')) then " "execute statement 'create table DAT (" @@ -513,10 +512,26 @@ ");';" "END"; + char *sql1 = + "EXECUTE BLOCK AS BEGIN " + "if (not exists(select 1 from RDB$INDICES where RDB$INDEX_NAME = 'IDX_DAT_LASTPUBLISH')) then " + "execute statement 'create index idx_dat_lastpublish on dat (lastpublish);';" + "END"; + + char *sql2 = + "EXECUTE BLOCK AS BEGIN " + "if (not exists(select 1 from RDB$INDICES where RDB$INDEX_NAME = 'IDX_DAT_DOMAIN_BBSNAME_DATNAME')) then " + "execute statement 'create index idx_dat_domain_bbsname_datname on dat (bbsname, domainname, datname);';" + "END"; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) goto error; - if (isc_dsql_execute_immediate(status, &db, &tr, 0, sql, 3, NULL)) + if (isc_dsql_execute_immediate(status, &db, &tr, 0, sql0, 3, NULL)) goto error; + if (isc_dsql_execute_immediate(status, &db, &tr, 0, sql1, 3, NULL)) + goto error; + if (isc_dsql_execute_immediate(status, &db, &tr, 0, sql2, 3, NULL)) + goto error; if (isc_commit_transaction(status, &tr)) goto error; if (isc_detach_database(status, &db)) @@ -659,44 +674,54 @@ goto error; if (isc_dsql_prepare(status, &tr, &stmt, 0, sqlstr.c_str(), 3, NULL)) goto error; - XSQLDA *sqlda = prepare_xsqlda(stmt, false); + outda = prepare_xsqlda(stmt, false); - if (isc_dsql_execute(status, &tr, &stmt, 3, NULL)) + //if (outda == NULL) { + // if(isc_dsql_execute(status, &tr, &stmt,3, NULL)) + // goto error; + // goto fin; + //} else if (isc_dsql_execute2(status, &tr, &stmt, 3, outda)) + // goto error; + fetch = isc_dsql_execute2(status, &tr, &stmt, 3, NULL, outda); + if(fetch !=0 &&isc_sqlcode(status) != 100L) goto error; - if (isc_dsql_fetch(status, &stmt, 3, sqlda)) - goto error; if (out.empty()) { //??? cols.clear(); - get_column_names(sqlda, cols); + get_column_names(outda, cols); out.push_back(cols); cols.clear(); - get_columns(sqlda, cols); + get_columns(outda, cols); out.push_back(cols); ct++; } - while (fetch = isc_dsql_fetch(status, &stmt, 3, sqlda) == 0){ + while (fetch = isc_dsql_fetch(status, &stmt, 3, outda) == 0){ //2???? cols.clear(); - get_columns(sqlda, cols); + get_columns(outda, cols); out.push_back(cols); ct++; } +fin: if (isc_commit_transaction(status, &tr)) goto error; if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); if (db) isc_detach_database(status, &db); - free_xsqlda(sqlda); + free_xsqlda(outda); return (ct); error: + out.clear(); + cols.clear(); + cols.push_back(L"SQL error"); + out.push_back(cols); log(status); if (tr) isc_rollback_transaction(status, &tr); if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); if (db) isc_detach_database(status, &db); - free_xsqlda(sqlda); + free_xsqlda(outda); return (0); } @@ -792,11 +817,10 @@ outda = prepare_xsqlda(stmt, false); inda = prepare_xsqlda(stmt, true); - //inda->sqlvar->sqldata = (char*) hash.block; - memcpy(inda->sqlvar->sqldata, hash.data(), hash.size()); + if(!bind(inda, 0, hash)) + goto error; - long st = isc_dsql_execute2(status, &tr, &stmt, 3, inda, outda); - if (st == 0) { + if (!isc_dsql_execute2(status, &tr, &stmt, 3, inda, outda)) { get_columns(outda, out); ret = true; } else if (isc_sqlcode(status) != 100L) @@ -820,12 +844,164 @@ return (false); } +bool +O2DatDB:: +select(O2DatRec &out, const wchar_t *domain, const wchar_t *bbsname) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select by domain bbsname"); +#endif + isc_db_handle db = NULL; + isc_tr_handle tr = NULL; + ISC_STATUS_ARRAY status; + isc_stmt_handle stmt = NULL; + XSQLDA *outda = NULL, *inda = NULL; + bool ret = false; + if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) + goto error; + char *sql = + "select first 1" + COLUMNSA + " from dat" + " where domainname = ?" + " and bbsname = ?" + " order by rand();"; + if (isc_dsql_allocate_statement(status, &db, &stmt)) + goto error; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) + goto error; + outda = prepare_xsqlda(stmt, false); + inda = prepare_xsqlda(stmt, true); + + if (!bind(inda, 0, domain)) + goto error; + if (!bind(inda, 1, bbsname)) + goto error; + + if (!isc_dsql_execute2(status, &tr, &stmt, 3, inda, outda)) { + get_columns(outda, out); + ret = true; + } else if (isc_sqlcode(status) != 100L) + goto error; + + if (isc_commit_transaction(status, &tr)) + goto error; + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + free_xsqlda(outda); + return (ret); + +error: + log(status); + if (tr) isc_rollback_transaction(status, &tr); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + free_xsqlda(outda); + return (false); +/* + + wchar_t *sql = + L"select" + COLUMNS + L" from dat" + L" where domain = ?" + L" and bbsname = ?" + L" order by random() limit 1;"; + +*/ +} + + + + bool O2DatDB:: +select(O2DatRec &out, const wchar_t *domain, const wchar_t *bbsname, const wchar_t *datname) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select by domain bbsname datname"); +#endif + + isc_db_handle db = NULL; + isc_tr_handle tr = NULL; + ISC_STATUS_ARRAY status; + isc_stmt_handle stmt = NULL; + XSQLDA *outda = NULL, *inda = NULL; + bool ret = false; + + if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) + goto error; + + char *sql = + "select" + COLUMNSA + " from dat" + " where domainname = ?" + " and bbsname = ?" + " and datname = ?;"; + if (isc_dsql_allocate_statement(status, &db, &stmt)) + goto error; + if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) + goto error; + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) + goto error; + outda = prepare_xsqlda(stmt, false); + inda = prepare_xsqlda(stmt, true); + + if (!bind(inda, 0, domain)) + goto error; + if (!bind(inda, 1, bbsname)) + goto error; + if (!bind(inda, 2, datname)) + goto error; + + if (!isc_dsql_execute2(status, &tr, &stmt, 3, inda, outda)) { + get_columns(outda, out); + ret = true; + } else if (isc_sqlcode(status) != 100L) + goto error; + + if (isc_commit_transaction(status, &tr)) + goto error; + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + free_xsqlda(outda); + return (ret); + +error: + log(status); + if (tr) isc_rollback_transaction(status, &tr); + if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); + if (db) isc_detach_database(status, &db); + free_xsqlda(inda); + free_xsqlda(outda); + return (false); +/* + + wchar_t *sql = + L"select" + COLUMNS + L" from dat" + L" where domain = ?" + L" and bbsname = ?" + L" and datname = ?;"; +*/ +} + + + + +bool +O2DatDB:: select(O2DatRecList &out) { #if TRACE_SQL_EXEC_TIME @@ -1044,6 +1220,7 @@ ISC_STATUS_ARRAY status; isc_stmt_handle stmt = NULL; isc_tr_handle tr = NULL; + XSQLDA *sqlda = NULL; if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) goto error; @@ -1054,9 +1231,9 @@ goto error; if (isc_start_transaction(status, &tr, 1, &db, 0, NULL)) goto error; - if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 1, NULL)) + if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) goto error; - XSQLDA *sqlda = prepare_xsqlda(stmt, false); + sqlda = prepare_xsqlda(stmt, false); if (isc_dsql_execute(status, &tr, &stmt, 1, NULL)) goto error; @@ -1066,9 +1243,9 @@ if (isc_commit_transaction(status, &tr)) goto error; - free_xsqlda(sqlda); if (stmt) isc_dsql_free_statement(status, &stmt, DSQL_drop); if (db) isc_detach_database(status, &db); + free_xsqlda(sqlda); return (count); @@ -1100,6 +1277,7 @@ uint64 total = 0; long num; long fetch; + XSQLDA *sqlda = NULL; if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) goto error; @@ -1113,7 +1291,7 @@ goto error; if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) goto error; - XSQLDA *sqlda = prepare_xsqlda(stmt, false); + sqlda = prepare_xsqlda(stmt, false); if (isc_dsql_execute(status, &tr, &stmt, 3, NULL)) goto error; @@ -1166,6 +1344,7 @@ ISC_STATUS_ARRAY status; isc_stmt_handle stmt = NULL; isc_tr_handle tr = NULL; + XSQLDA *sqlda = NULL; if (isc_attach_database(status, 0, dbfilenameA.c_str(), &db, dpblen, dpb_buff)) goto error; @@ -1178,13 +1357,13 @@ goto error; if (isc_dsql_prepare(status, &tr, &stmt, 0, sql, 3, NULL)) goto error; - XSQLDA *sqlda = prepare_xsqlda(stmt, false); + sqlda = prepare_xsqlda(stmt, false); if (isc_dsql_execute(status, &tr, &stmt, 3, NULL)) goto error; if (isc_dsql_fetch(status, &stmt, 1, sqlda)) goto error; - uint64 totalsize = *(uint64 *)sqlda->sqlvar[0].sqldata;//over flow? + uint64 totalsize = *(long *)sqlda->sqlvar[0].sqldata;//over flow? if (isc_commit_transaction(status, &tr)) goto error; @@ -1231,15 +1410,14 @@ goto error; outda = prepare_xsqlda(stmt, false); inda = prepare_xsqlda(stmt, true); + if (!bind(inda, 0, time(NULL)-publish_tt)) + goto error; - inda->sqlvar->sqltype = SQL_INT64; - *(ISC_INT64*)inda->sqlvar->sqldata = publish_tt; - if (!isc_dsql_execute2(status, &tr, &stmt, 3, inda, outda)) if (isc_sqlcode(status) == 100L) goto error; - uint64 ret = *(ISC_INT64*)outda->sqlvar->sqldata; + uint64 ret = *(long*)outda->sqlvar->sqldata; if (isc_commit_transaction(status, &tr)) goto error; @@ -1262,6 +1440,16 @@ +#if 0 +bool +O2DatDB:: +update(O2DatRec &in, bool is_origurl) +{ +} +#endif + + + void O2DatDB:: update(O2DatRecList &in) @@ -1343,7 +1531,7 @@ if (!bind(da_insert, 10, (uint64)0)) goto error; if (isc_dsql_execute(status, &tr, &stmt_insert, 3, da_insert)) - goto error; + ;//goto error; free_xsqlda(da_insert); } else if (it->userdata = 0) { da_update = prepare_xsqlda(stmt_update, true); @@ -1386,7 +1574,7 @@ return ; error: - log(status); + log(status); if (tr) isc_rollback_transaction(status, &tr); if (stmt_insert) isc_dsql_free_statement(status, &stmt_insert, DSQL_drop); if (stmt_update) isc_dsql_free_statement(status, &stmt_update, DSQL_drop); @@ -1400,8 +1588,21 @@ + +#if 0 bool O2DatDB:: +update_lastpublish(const hashT &hash) +{ + +} +#endif + + + + +bool +O2DatDB:: remove(const hashT &hash) { #if TRACE_SQL_EXEC_TIME Modified: trunk/o2on/src.o2on/O2DatDB.h =================================================================== --- trunk/o2on/src.o2on/O2DatDB.h 2008-04-03 14:40:13 UTC (rev 70) +++ trunk/o2on/src.o2on/O2DatDB.h 2008-04-06 15:02:33 UTC (rev 71) @@ -98,29 +98,7 @@ O2DatDB(O2Logger *lgr, const wchar_t *filename); ~O2DatDB(); -#ifdef O2_DB_FIREBIRD - bool create_table(void); - bool reindex(const char *target); - size_t select(const wchar_t *sql, SQLResultList &out); - bool select(O2DatRec &out); - bool select(O2DatRec &out, const hashT hash); - //bool select(O2DatRec &out, const wchar_t *domain, const wchar_t *bbsname); - bool select(O2DatRecList &out); - bool select(O2DatRecList &out, const wchar_t *domain, const wchar_t *bbsname); - //bool select(O2DatRec &out, const wchar_t *domain, const wchar_t *bbsname, const wchar_t *datname); - bool select(O2DatRecList &out, time_t publish_tt, size_t limit); - uint64 select_datcount(void); - uint64 select_datcount(wstrnummap &out); - uint64 select_totaldisksize(void); - uint64 select_publishcount(time_t publish_tt); - -// bool update(O2DatRec &in, bool is_origurl); - void update(O2DatRecList &in); -// bool update_lastpublish(const hashT &hash); - - bool remove(const hashT &hash); -#else bool create_table(void); bool reindex(const char *target); @@ -142,7 +120,6 @@ // bool update_lastpublish(const hashT &hash); bool remove(const hashT &hash); -#endif void AddUpdateQueue(O2DatRec &in); void AddUpdateQueue(const hashT &hash); From o2on-svn @ lists.sourceforge.jp Fri Apr 18 14:42:26 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Fri, 18 Apr 2008 14:42:26 +0900 Subject: [o2on-svn] =?utf-8?b?WzcyXSBGSVg6ICBFVUMtSlDjgapkYXTjgavmnKrlr74=?= =?utf-8?b?5b+c?= Message-ID: <1208497346.901570.31572.nullmailer@users.sourceforge.jp> Revision: 72 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=72 Author: electrolysis Date: 2008-04-18 14:42:26 +0900 (Fri, 18 Apr 2008) Log Message: ----------- FIX: EUC-JP??at???絲上? 荅括完: Be?帥???UC-JP??at???????????????篏帥???hift_JIS??UC-JP????ゅ??????????????????? Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h branches/BRANCH_0043/o2on/src.o2on/O2DatPath.h branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp branches/BRANCH_0043/o2on/src.o2on/dataconv.h branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-04-06 15:02:33 UTC (rev 71) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-04-18 05:42:26 UTC (rev 72) @@ -285,8 +285,15 @@ uint pos_title = pos_gt+1; string tmp(&p[pos_title], &p[pos_lf]); + + wstring encoding; + if (datpath.is_be()) + sjis_or_euc(tmp, encoding); + if (encoding.empty()) + encoding = L"shift_jis"; + wstring title; - ToUnicode(L"shift_jis", tmp, title); + ToUnicode(encoding.c_str(), tmp, title); //ASCII??????????????????????? //0x00 - 0x1f, 0x7f @@ -686,7 +693,7 @@ bool O2DatIO:: -Dat2HTML(const hashT &hash, string &out) +Dat2HTML(const hashT &hash, string &out, string &encoding) { char tmp[32]; @@ -695,6 +702,18 @@ if (!Load(hash, 0, dat, datpath)) return false; + if (datpath.is_be()) + sjis_or_euc(dat, encoding); + if (encoding.empty()) + encoding = "shift_jis"; + + string colon = "?"; + string broken = "?????"; + if (encoding == "euc-jp"){ + sjis2euc(colon); + sjis2euc(broken); + } + string url; datpath.geturl(url); @@ -713,7 +732,9 @@ if (!firstres && token.size() == 5) { out += "\r\n"; out += "\r\n"; - out += "\r\n"; + out += "\r\n"; out += ""; out += token[4]; out += "\r\n"; @@ -731,7 +752,7 @@ } out += "
"; - sprintf_s(tmp, 32, "%d ?", n); + sprintf_s(tmp, 32, "%d %s", n, colon.c_str()); out += tmp; if (token.size() >= 4) { @@ -747,7 +768,7 @@ out += token[0]; out += ""; } - out += "?"; + out += colon; out += token[2]; out += "
"; @@ -755,7 +776,7 @@ out += "

\r\n"; } else { - out += "?????"; + out += broken; out += "
"; out += line; out += "

\r\n"; Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h 2008-04-06 15:02:33 UTC (rev 71) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h 2008-04-18 05:42:26 UTC (rev 72) @@ -71,7 +71,7 @@ uint64 Put(O2DatPath &datpath, const char *dat, uint64 len, uint64 startpos); bool ExportToXML(const wchar_t *domain, const wchar_t *bbsname, string &out); - bool Dat2HTML(const hashT &hash, string &out); + bool Dat2HTML(const hashT &hash, string &out, string &encoding); size_t GetLocalFileKeys(O2KeyList &keylist, time_t publish_tt, size_t limit); Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatPath.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatPath.h 2008-04-06 15:02:33 UTC (rev 71) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatPath.h 2008-04-18 05:42:26 UTC (rev 72) @@ -318,7 +318,12 @@ title = titleW; } + bool is_be(void) const + { + return bbsnameA == "be"; + } + private: bool check(const char *dom, const char *bbs, const char *dat) { Modified: branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h 2008-04-06 15:02:33 UTC (rev 71) +++ branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h 2008-04-18 05:42:26 UTC (rev 72) @@ -1114,12 +1114,13 @@ { hashT hash; string html; + string encoding; strmap::iterator it = hdr->queries.find("hash"); if (it != hdr->queries.end()) { hash.assign(it->second.c_str(), it->second.size()); - DatIO->Dat2HTML(hash, html); + DatIO->Dat2HTML(hash, html, encoding); } if (html.empty()) @@ -1129,7 +1130,7 @@ HTTPHeader header(HTTPHEADERTYPE_RESPONSE); header.status = 200; AddResponseHeaderFields(header, Profile); - AddContentFields(header, html.size(), "text/html", "shift_jis"); + AddContentFields(header, html.size(), "text/html", encoding.c_str()); ss->Lock(); header.Make(ss->sbuff); Modified: branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp 2008-04-06 15:02:33 UTC (rev 71) +++ branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp 2008-04-18 05:42:26 UTC (rev 72) @@ -20,6 +20,7 @@ #include #include #include +#include const char *hex = "0123456789abcdef"; const wchar_t *whex = L"0123456789abcdef"; @@ -770,6 +771,44 @@ } // --------------------------------------------------------------------------- +// sjis_or_euc +// sjis2euc +// --------------------------------------------------------------------------- + +bool sjis_or_euc(const string &in, string &encoding) +{ + babel::init_babel(); + switch (babel::analyze_base_encoding(in)) { + case babel::base_encoding::sjis: + encoding = "shift_jis"; + return true; + case babel::base_encoding::euc: + encoding = "euc-jp"; + return true; + } + return false; +} +bool sjis_or_euc(const string &in, wstring &encoding) +{ + babel::init_babel(); + switch (babel::analyze_base_encoding(in)) { + case babel::base_encoding::sjis: + encoding = L"shift_jis"; + return true; + case babel::base_encoding::euc: + encoding = L"euc-jp"; + return true; + } + return false; +} +void sjis2euc(string &inout) +{ + babel::init_babel(); + inout = babel::sjis_to_euc(inout); +} + + +// --------------------------------------------------------------------------- // convertGTLT // // --------------------------------------------------------------------------- Modified: branches/BRANCH_0043/o2on/src.o2on/dataconv.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/dataconv.h 2008-04-06 15:02:33 UTC (rev 71) +++ branches/BRANCH_0043/o2on/src.o2on/dataconv.h 2008-04-18 05:42:26 UTC (rev 72) @@ -72,6 +72,10 @@ void unicode2ascii(const wchar_t *w, size_t len, string &a); void unicode2ascii(const wstring &w, string &a); +extern bool sjis_or_euc(const string &in, string &encoding); +extern bool sjis_or_euc(const string &in, wstring &encoding); +extern void sjis2euc(string &inout); + void convertGTLT(const string &in, string &out); void convertGTLT(const wstring &in, wstring &out); Modified: branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj 2008-04-06 15:02:33 UTC (rev 71) +++ branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj 2008-04-18 05:42:26 UTC (rev 72) @@ -60,7 +60,7 @@ FavorSizeOrSpeed="1" OmitFramePointers="true" WholeProgramOptimization="true" - AdditionalIncludeDirectories="..\..\sqlite;..\..\zlib" + AdditionalIncludeDirectories="..\..\sqlite;..\..\zlib;..\..\babel" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;PROJ_SAX2;XML_LIBRARY" StringPooling="false" RuntimeLibrary="0" @@ -3427,6 +3427,14 @@ > + + + + From o2on-svn @ lists.sourceforge.jp Fri Apr 18 14:52:59 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Fri, 18 Apr 2008 14:52:59 +0900 Subject: [o2on-svn] =?utf-8?b?WzczXSAg44OQ44OZ44Or44KS6L+95Yqg?= Message-ID: <1208497979.761520.6439.nullmailer@users.sourceforge.jp> Revision: 73 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=73 Author: electrolysis Date: 2008-04-18 14:52:59 +0900 (Fri, 18 Apr 2008) Log Message: ----------- ??????菴遵? Modified Paths: -------------- branches/BRANCH_0043/o2on/doc/build.txt Modified: branches/BRANCH_0043/o2on/doc/build.txt =================================================================== --- branches/BRANCH_0043/o2on/doc/build.txt 2008-04-18 05:42:26 UTC (rev 72) +++ branches/BRANCH_0043/o2on/doc/build.txt 2008-04-18 05:52:59 UTC (rev 73) @@ -9,6 +9,7 @@ ?SQLite 3.5.6 ?UPX 3.02 ?MiniZip Ver0.02c +???? @@ -178,4 +179,20 @@ +-zlib +-sqlite +-upx.exe - +-mzp.exe \ No newline at end of file + +-mzp.exe + +------------------------------------------------------------------------------ + ??? +------------------------------------------------------------------------------ +http://www.trick-palace.net/cxx/ex/babel/ +babel.zip??????? + +??????????? +??????????babel?????o2on???????? + +-o2on + +-cryptopp + +-zlib + +-sqlite + +-upx.exe + +-mzp.exe + +-babel From o2on-svn @ lists.sourceforge.jp Sat Apr 19 15:24:47 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Sat, 19 Apr 2008 15:24:47 +0900 Subject: [o2on-svn] =?utf-8?b?Wzc0XSAg44OQ44OZ44Or6L+95Yqg5ryP44KM?= Message-ID: <1208586287.607851.23147.nullmailer@users.sourceforge.jp> Revision: 74 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=74 Author: electrolysis Date: 2008-04-19 15:24:47 +0900 (Sat, 19 Apr 2008) Log Message: ----------- バベル追加漏れ Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj Modified: branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj 2008-04-18 05:52:59 UTC (rev 73) +++ branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj 2008-04-19 06:24:47 UTC (rev 74) @@ -166,7 +166,7 @@ Revision: 75 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=75 Author: electrolysis Date: 2008-04-19 16:01:24 +0900 (Sat, 19 Apr 2008) Log Message: ----------- FIX: SQL文によっては不正なXMLが生成される Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp branches/BRANCH_0043/o2on/src.o2on/dataconv.h Modified: branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h 2008-04-19 06:24:47 UTC (rev 74) +++ branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h 2008-04-19 07:01:24 UTC (rev 75) @@ -1635,11 +1635,13 @@ void GET_xml_sql(O2SocketSession *ss) { wstring str; + wstring escaped; str += L""; str += L""; - str += L""+sql+L""; + escapeCDATA(sql, escaped); + str += L""; if (!sqlresult.empty()) { wchar_t tmp[16]; swprintf_s(tmp, 16, L"%u", sqlresult.size()-1); @@ -1650,10 +1652,11 @@ for (size_t i = 0; i < sqlresult.size(); i++) { str += L""; for (size_t j = 0; j < sqlresult[i].size(); j++) { + escapeCDATA(sqlresult[i][j], escaped); if (i == 0) - str += L"" + sqlresult[i][j] + L""; + str += L""; else - str += L"" + sqlresult[i][j] + L""; + str += L""; } str += L""; } Modified: branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp 2008-04-19 06:24:47 UTC (rev 74) +++ branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp 2008-04-19 07:01:24 UTC (rev 75) @@ -810,7 +810,7 @@ // --------------------------------------------------------------------------- // convertGTLT -// +// escapeCDATA // --------------------------------------------------------------------------- void convertGTLT(const string &in, string &out) { @@ -838,10 +838,30 @@ out = t.str(); } +void escapeCDATA(const string &in, string &out) +{ + out = string(in); + string from = "]]>"; + string to = "]]]]>"; + for (size_t pos = 0; (pos = out.find(from, pos)) != string::npos; pos += to.size()) + out.replace(pos, from.size(), to); +} +void escapeCDATA(const wstring &in, wstring &out) +{ + out = wstring(in); + wstring from = L"]]>"; + wstring to = L"]]]]>"; + for (size_t pos = 0; (pos = out.find(from, pos)) != string::npos; pos += to.size()) + out.replace(pos, from.size(), to); +} + + + + // --------------------------------------------------------------------------- // xml_AddElement // Modified: branches/BRANCH_0043/o2on/src.o2on/dataconv.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/dataconv.h 2008-04-19 06:24:47 UTC (rev 74) +++ branches/BRANCH_0043/o2on/src.o2on/dataconv.h 2008-04-19 07:01:24 UTC (rev 75) @@ -78,6 +78,8 @@ void convertGTLT(const string &in, string &out); void convertGTLT(const wstring &in, wstring &out); +extern void escapeCDATA(const string &in, string &out); +extern void escapeCDATA(const wstring &in, wstring &out); extern void xml_AddElement(wstring &xml, const wchar_t *tag, const wchar_t *attr, const wchar_t *val, bool escape = false); extern void xml_AddElement(wstring &xml, const wchar_t *tag, const wchar_t *attr, int val); From o2on-svn @ lists.sourceforge.jp Mon Apr 21 12:38:42 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Mon, 21 Apr 2008 12:38:42 +0900 Subject: [o2on-svn] =?utf-8?b?Wzc2XSBGSVg6ICAjMTIxMzAgU1FM57WQ5p6c5Lu25pWw?= =?utf-8?b?44Gu6Kqk6KGo56S6?= Message-ID: <1208749122.592293.23508.nullmailer@users.sourceforge.jp> Revision: 76 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=76 Author: electrolysis Date: 2008-04-21 12:38:42 +0900 (Mon, 21 Apr 2008) Log Message: ----------- FIX: #12130 SQL腟??篁倶????茵?ず Ticket Links: :----------- http://sourceforge.jp/projects/o2on/tracker/detail/12130 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-04-19 07:01:24 UTC (rev 75) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-04-21 03:38:42 UTC (rev 76) @@ -298,16 +298,11 @@ goto error; if (out.empty()) { - //??? cols.clear(); get_column_names(stmt, cols); out.push_back(cols); - cols.clear(); - get_columns(stmt, cols); - out.push_back(cols); } - while (sqlite3_step(stmt) == SQLITE_ROW) { - //2???? + for ( ; err == SQLITE_ROW; err = sqlite3_step(stmt)) { cols.clear(); get_columns(stmt, cols); out.push_back(cols); From o2on-svn @ lists.sourceforge.jp Mon Apr 21 22:31:04 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Mon, 21 Apr 2008 22:31:04 +0900 Subject: [o2on-svn] =?utf-8?b?Wzc3XSAgQ0xFQVJfV09SS1NFVCDjgpLnhKHlirnljJY=?= Message-ID: <1208784664.542679.28448.nullmailer@users.sourceforge.jp> Revision: 77 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=77 Author: k-uehara Date: 2008-04-21 22:31:04 +0900 (Mon, 21 Apr 2008) Log Message: ----------- CLEAR_WORKSET を無効化 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2Define.h Modified: branches/BRANCH_0043/o2on/src.o2on/O2Define.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Define.h 2008-04-21 03:38:42 UTC (rev 76) +++ branches/BRANCH_0043/o2on/src.o2on/O2Define.h 2008-04-21 13:31:04 UTC (rev 77) @@ -60,7 +60,7 @@ #endif /* */ -#if O2DEBUG +#if 1 //O2DEBUG #define CLEAR_WORKSET NULL #else #define CLEAR_WORKSET (SetProcessWorkingSetSize(GetCurrentProcess(), 0xffffffff, 0xffffffff)) From o2on-svn @ lists.sourceforge.jp Tue Apr 22 12:38:02 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Tue, 22 Apr 2008 12:38:02 +0900 Subject: [o2on-svn] =?utf-8?b?Wzc4XSBGSVg6ICDjgIzlj5blvpflpLHmlZfjgI3mmYI=?= =?utf-8?b?44Gr44Ko44Oz44Kz44O844OH44Kj44Oz44Kw44GM5pyq5oyH5a6a?= Message-ID: <1208835482.324358.5051.nullmailer@users.sourceforge.jp> Revision: 78 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=78 Author: electrolysis Date: 2008-04-22 12:38:02 +0900 (Tue, 22 Apr 2008) Log Message: ----------- FIX: 「取得失敗」時にエンコーディングが未指定 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-04-21 13:31:04 UTC (rev 77) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-04-22 03:38:02 UTC (rev 78) @@ -699,8 +699,10 @@ O2DatPath datpath; string dat; - if (!Load(hash, 0, dat, datpath)) + if (!Load(hash, 0, dat, datpath)) { + encoding = "shift_jis"; return false; + } if (datpath.is_be()) sjis_or_euc(dat, encoding); From o2on-svn @ lists.sourceforge.jp Wed Apr 23 11:36:37 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Wed, 23 Apr 2008 11:36:37 +0900 Subject: [o2on-svn] =?utf-8?b?Wzc5XSBGSVg6ICBFVUMtSlDjgapkYXTjgavmnKrlr74=?= =?utf-8?b?5b+c?= Message-ID: <1208918197.851512.14903.nullmailer@users.sourceforge.jp> Revision: 79 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=79 Author: electrolysis Date: 2008-04-23 11:36:37 +0900 (Wed, 23 Apr 2008) Log Message: ----------- FIX: EUC-JP??at???絲上? Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-04-22 03:38:02 UTC (rev 78) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-04-23 02:36:37 UTC (rev 79) @@ -154,12 +154,12 @@ if (p == NULL) return false; - return (KakoHantei(p, mf.size())); + return (KakoHantei(p, mf.size(), datpath.is_be())); } bool O2DatIO:: -KakoHantei(const char *dat, uint64 len) +KakoHantei(const char *dat, uint64 len, bool is_be) { int lf = 0; const char *p[2] = {NULL}; @@ -175,25 +175,40 @@ p[1]++; size_t linelen = p[0] - p[1]; + string encoding; + if (is_be) + sjis_or_euc(string(dat), encoding); + if (encoding.empty()) + encoding = "shift_jis"; + + string over1000 = "????<><>Over 1000 Thread"; + string stop = "<>??????"; + string rula = "<>??"; + if (encoding == "euc-jp"){ + sjis2euc(over1000); + sjis2euc(stop); + sjis2euc(rula); + } + // ----------------------------------------------------------------------- // 1000: ?????Over 1000 Thread? // ex) ????<><>Over 1000 Thread<>??????????????????
????????A???????????????????? <> // ----------------------------------------------------------------------- - if (linelen >= 28 && strncmp(p[1], "????<><>Over 1000 Thread", 28) == 0) + if (linelen >= 28 && strncmp(p[1], over1000.c_str(), 28) == 0) return true; // ----------------------------------------------------------------------- // ????: ????<>??????? // ex) ?????????<>??<>??<>??????????????(???)瀞惆<>?????? // ----------------------------------------------------------------------- - if (linelen >= 14 && strncmp(p[0]-14, "<>??????", 14) == 0) + if (linelen >= 14 && strncmp(p[0]-14, stop.c_str(), 14) == 0) return true; // ----------------------------------------------------------------------- // ???: ????<>??? // ex) ?????? ?<>sage<>?????<>
?????? ? ??????????(???)瀞惆

BE ???? = 4780 ?? 20 ??????B
<>?? // ----------------------------------------------------------------------- - if (linelen >= 6 && strncmp(p[0]-6, "<>??", 6) == 0) + if (linelen >= 6 && strncmp(p[0]-6, rula.c_str(), 6) == 0) return true; return false; Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h 2008-04-22 03:38:02 UTC (rev 78) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h 2008-04-23 02:36:37 UTC (rev 79) @@ -58,7 +58,7 @@ void SetEmergencyHaltCallbackMsg(HWND hwnd, UINT msg); bool KakoHantei(const O2DatPath &datpath); - bool KakoHantei(const char *dat, uint64 len); + bool KakoHantei(const char *dat, uint64 len, bool is_be); bool CheckDat(const char *in, uint64 inlen); bool GetTitle(O2DatPath &datpath); uint64 GetSize(const O2DatPath &datpath); From o2on-svn @ lists.sourceforge.jp Wed Apr 23 12:10:57 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Wed, 23 Apr 2008 12:10:57 +0900 Subject: [o2on-svn] =?utf-8?b?WzgwXSBGSVg6ICDoo5zlrozmmYLjga7jg5Djg6vjg7w=?= =?utf-8?b?44Oz44KST0ZG44Gr44GX44Gm44KC44OQ44Or44O844Oz44GM6KGo56S644GV?= =?utf-8?b?44KM44KL?= Message-ID: <1208920257.561518.8517.nullmailer@users.sourceforge.jp> Revision: 80 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=80 Author: electrolysis Date: 2008-04-23 12:10:57 +0900 (Wed, 23 Apr 2008) Log Message: ----------- FIX: 茖?????????若???FF??????????若???;腓冴???? Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2Job_DatCollector.h branches/BRANCH_0043/o2on/src.o2on/O2Job_QueryDat.h branches/BRANCH_0043/o2on/src.o2on/O2Protocol_Dat.h branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_P2P.h Modified: branches/BRANCH_0043/o2on/src.o2on/O2Job_DatCollector.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Job_DatCollector.h 2008-04-23 02:36:37 UTC (rev 79) +++ branches/BRANCH_0043/o2on/src.o2on/O2Job_DatCollector.h 2008-04-23 03:10:57 UTC (rev 80) @@ -112,7 +112,7 @@ // ???dat???? const char *rawdata = &ss.rbuff[header->length]; uint64 datsize = ss.rbuff.size() - header->length; - imported = ImportDat(DatIO, Boards, *header, rawdata, datsize, + imported = ImportDat(DatIO, Profile, Boards, *header, rawdata, datsize, Logger, ss.ip, ss.port, QueryDB, hwndBaloonCallback, msgBaloonCallback); //1????????? } Modified: branches/BRANCH_0043/o2on/src.o2on/O2Job_QueryDat.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Job_QueryDat.h 2008-04-23 02:36:37 UTC (rev 79) +++ branches/BRANCH_0043/o2on/src.o2on/O2Job_QueryDat.h 2008-04-23 03:10:57 UTC (rev 80) @@ -130,7 +130,7 @@ const char *rawdata = &ss.rbuff[header->length]; uint64 datsize = ss.rbuff.size() - header->length; - ImportDat(DatIO, NULL, *header, rawdata, datsize, + ImportDat(DatIO, Profile, NULL, *header, rawdata, datsize, Logger, ss.ip, ss.port, QueryDB, hwndBaloonCallback, msgBaloonCallback); } Modified: branches/BRANCH_0043/o2on/src.o2on/O2Protocol_Dat.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Protocol_Dat.h 2008-04-23 02:36:37 UTC (rev 79) +++ branches/BRANCH_0043/o2on/src.o2on/O2Protocol_Dat.h 2008-04-23 03:10:57 UTC (rev 80) @@ -160,6 +160,7 @@ // ImportDat // ----------------------------------------------------------------------- bool ImportDat(O2DatIO *datio + , const O2Profile *profile , O2Boards *boards , const HTTPHeader &header , const char *rawdata @@ -230,7 +231,7 @@ datpath.gethash(hash); wstring title; datpath.gettitle(title); - if (QueryDB->SetNote(hash, title.c_str(), size)) { + if (QueryDB->SetNote(hash, title.c_str(), size) && hwndBaloonCallback && profile->IsBaloon_Hokan()) { wchar_t msg[256]; swprintf_s(msg, 256, L"%s\n????????", title.c_str()); SendMessage( Modified: branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_P2P.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_P2P.h 2008-04-23 02:36:37 UTC (rev 79) +++ branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_P2P.h 2008-04-23 03:10:57 UTC (rev 80) @@ -337,7 +337,7 @@ if (hdr->contentlength) { dat = &ss->rbuff[hdr->length]; datsize = ss->rbuff.size() - hdr->length; - bool imported = ImportDat(DatIO, Boards, *hdr, dat, datsize, + bool imported = ImportDat(DatIO, Profile, Boards, *hdr, dat, datsize, Logger, node.ip, node.port, QueryDB, hwndBaloonCallback, msgBaloonCallback); if (!imported) { ss->Lock(); From o2on-svn @ lists.sourceforge.jp Sun Apr 27 23:36:55 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Sun, 27 Apr 2008 23:36:55 +0900 Subject: [o2on-svn] =?utf-8?b?WzgxXSBNRVJHRTogIHRydW5r44KI44KKIHJldjQ4ICwg?= =?utf-8?q?rev61?= Message-ID: <1209307015.234468.2737.nullmailer@users.sourceforge.jp> Revision: 81 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=81 Author: k-uehara Date: 2008-04-27 23:36:55 +0900 (Sun, 27 Apr 2008) Log Message: ----------- MERGE: trunkより rev48, rev61 Revision Links: -------------- http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=48 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=61 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/main.cpp branches/BRANCH_0043/o2on/src.o2on/upnp_description.h Modified: branches/BRANCH_0043/o2on/src.o2on/main.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/main.cpp 2008-04-23 03:10:57 UTC (rev 80) +++ branches/BRANCH_0043/o2on/src.o2on/main.cpp 2008-04-27 14:36:55 UTC (rev 81) @@ -254,7 +254,7 @@ //bench(); //return (0); - if (FindWindow(_T(CLASS_NAME), NULL)) + if (!O2DEBUG && FindWindow(_T(CLASS_NAME), NULL)) return (0); instance = inst; Modified: branches/BRANCH_0043/o2on/src.o2on/upnp_description.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/upnp_description.h 2008-04-23 03:10:57 UTC (rev 80) +++ branches/BRANCH_0043/o2on/src.o2on/upnp_description.h 2008-04-27 14:36:55 UTC (rev 81) @@ -684,6 +684,12 @@ if (cur_argument && cur_argument->direction != "out") cur_argument = NULL; } + else if(wcsncmp(qname, L"NewExternalIPAddress",20) == 0){ + cur_action = service->getAction("GetExternalIPAddress"); + if(cur_action) + cur_argument = cur_action->getArgument("NewExternalIPAddress"); + cur_action = NULL; + } } void endElement(const XMLCh* const uri From o2on-svn @ lists.sourceforge.jp Thu May 1 14:33:57 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Thu, 01 May 2008 14:33:57 +0900 Subject: [o2on-svn] =?utf-8?b?WzgyXSBGSVg6ICDjg5bjg63jg7zjg4njgq3jg6Pjgrk=?= =?utf-8?b?44OI44Oh44OD44K744O844K444Gu44Or44O844OX44Gu5pqr5a6a5L+u5q2j?= =?utf-8?b?44Gr44KI44KLSU3jgbjjga7lia/kvZznlKg=?= Message-ID: <1209620037.866098.15076.nullmailer@users.sourceforge.jp> Revision: 82 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=82 Author: electrolysis Date: 2008-05-01 14:33:57 +0900 (Thu, 01 May 2008) Log Message: ----------- FIX: ????若?????鴻??<??祉??吾??????????篆???????M?吾?????? Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2IMDB.h branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_P2P.h Modified: branches/BRANCH_0043/o2on/src.o2on/O2IMDB.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2IMDB.h 2008-04-27 14:36:55 UTC (rev 81) +++ branches/BRANCH_0043/o2on/src.o2on/O2IMDB.h 2008-05-01 05:33:57 UTC (rev 82) @@ -36,28 +36,26 @@ hashT key; bool mine; hashListT paths; + bool broadcast; O2IMessage(void) : ip(0) , port(0) , date(0) , mine(false) + , broadcast(false) { } bool operator==(const O2IMessage &src) { - //???????????????- //return (key == src.key ? true : false); - - //note:???????????????????? - // ??????IMDB??????????? - // ???????b?????????????? - // ???????(IP/PORT/?????)?????????????? - if(ip == src.ip && port == src.port && msg == src.msg) - return true; - else - return false; + if (broadcast == src.broadcast) { + if (broadcast) + return (ip == src.ip && port == src.port && msg == src.msg ? true : false); + else + return (key == src.key ? true : false); + } + return false; } }; typedef std::list O2IMessages; Modified: branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h 2008-04-27 14:36:55 UTC (rev 81) +++ branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_Admin.h 2008-05-01 05:33:57 UTC (rev 82) @@ -1333,6 +1333,7 @@ im.date = time(NULL); im.key.random(); im.mine = true; + im.broadcast = true; if (Job_Broadcast->Add(im)) BroadcastDB->AddMessage(im); } Modified: branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_P2P.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_P2P.h 2008-04-27 14:36:55 UTC (rev 81) +++ branches/BRANCH_0043/o2on/src.o2on/O2Server_HTTP_P2P.h 2008-05-01 05:33:57 UTC (rev 82) @@ -423,6 +423,7 @@ tmpdb.GetMessages(msg); for (O2IMessagesIt it = msg.begin(); it != msg.end(); it++) { + it->broadcast = true; if (Job_Broadcast->Add(*it)) { it->paths.clear(); BroadcastDB->AddMessage(*it); From o2on-svn @ lists.sourceforge.jp Mon May 12 12:02:08 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Mon, 12 May 2008 12:02:08 +0900 Subject: [o2on-svn] =?utf-8?b?WzgzXSBGSVg6ICBJTeOCkuWFqOS7tuWJiumZpOOBmQ==?= =?utf-8?b?44KL44GoSU0gLiB4bWzjgavlj43mmKDjgZXjgozjgarjgYQ=?= Message-ID: <1210561328.241578.24588.nullmailer@users.sourceforge.jp> Revision: 83 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=83 Author: electrolysis Date: 2008-05-12 12:02:07 +0900 (Mon, 12 May 2008) Log Message: ----------- FIX: IMを全件削除するとIM.xmlに反映されない Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2IMDB.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/O2IMDB.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2IMDB.cpp 2008-05-01 05:33:57 UTC (rev 82) +++ branches/BRANCH_0043/o2on/src.o2on/O2IMDB.cpp 2008-05-12 03:02:07 UTC (rev 83) @@ -366,9 +366,6 @@ O2IMDB:: Save(const wchar_t *filename, bool clear) { - if (Messages.empty()) - return false; - O2IMSelectCondition cond(IM_XMLELM_ALL); string out; ExportToXML(cond, out); From o2on-svn @ lists.sourceforge.jp Mon May 12 12:24:18 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Mon, 12 May 2008 12:24:18 +0900 Subject: [o2on-svn] =?utf-8?b?Wzg0XSAg44Ko44Oz44Kz44O844OH44Kj44Oz44Kw5Yik?= =?utf-8?b?5a6a44Gu57K+5bqm44KS5ZCR5LiK?= Message-ID: <1210562658.494503.7427.nullmailer@users.sourceforge.jp> Revision: 84 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=84 Author: electrolysis Date: 2008-05-12 12:24:18 +0900 (Mon, 12 May 2008) Log Message: ----------- エンコーディング判定の精度を向上 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-05-12 03:02:07 UTC (rev 83) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-05-12 03:24:18 UTC (rev 84) @@ -303,7 +303,7 @@ wstring encoding; if (datpath.is_be()) - sjis_or_euc(tmp, encoding); + sjis_or_euc(string(p, end), encoding); if (encoding.empty()) encoding = L"shift_jis"; From o2on-svn @ lists.sourceforge.jp Sat May 17 21:09:23 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Sat, 17 May 2008 21:09:23 +0900 Subject: [o2on-svn] =?utf-8?b?Wzg1XSAgRkZpcmViaXJk5a++5b+cIDogIOOCs+ODvA==?= =?utf-8?b?44OJ5pW055CG?= Message-ID: <1211026163.712542.13940.nullmailer@users.sourceforge.jp> Revision: 85 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=85 Author: k-uehara Date: 2008-05-17 21:09:23 +0900 (Sat, 17 May 2008) Log Message: ----------- FFirebird絲上?: ?潟?????? Modified Paths: -------------- trunk/o2on/src.o2on/O2DatDB.cpp Modified: trunk/o2on/src.o2on/O2DatDB.cpp =================================================================== --- trunk/o2on/src.o2on/O2DatDB.cpp 2008-05-12 03:24:18 UTC (rev 84) +++ trunk/o2on/src.o2on/O2DatDB.cpp 2008-05-17 12:09:23 UTC (rev 85) @@ -24,18 +24,6 @@ #define TRACE_SQL_EXEC_TIME 0 #endif -#define COLUMNSA " hash" \ - ", domainname" \ - ", bbsname" \ - ", datname" \ - ", filesize" \ - ", disksize" \ - ", url" \ - ", title" \ - ", res" \ - ", lastupdate" \ - ", lastpublish" \ - " " #define COLUMNS L" hash" \ L", domain" \ L", bbsname" \ @@ -48,6 +36,7 @@ L", lastupdate" \ L", lastpublish" \ L" " + #ifdef O2_DB_FIREBIRD #define SQL_CHAR_NONE 0 #define SQL_CHAR_OCTETS 1 @@ -56,6 +45,19 @@ #define SQL_CHAR_UTF8 4 #define SQL_CHAR_SJIS 5 #define SQL_CHAR_EUCJ 6 + +#define COLUMNSA " hash" \ + ", domainname" \ + ", bbsname" \ + ", datname" \ + ", filesize" \ + ", disksize" \ + ", url" \ + ", title" \ + ", res" \ + ", lastupdate" \ + ", lastpublish" \ + " " #endif @@ -96,9 +98,1229 @@ } -#ifdef O2_DB_FIREBIRD + +#ifndef O2_DB_FIREBIRD void O2DatDB:: +log(sqlite3 *db) +{ + Logger->AddLog(O2LT_ERROR, L"SQLite", 0, 0, sqlite3_errmsg(db)); +} + + + + +bool +O2DatDB:: +bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const uint64 num) +{ + int err = sqlite3_bind_int64(stmt, index, num); + return (err == SQLITE_OK ? true : false); +} + +bool +O2DatDB:: +bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const wchar_t *str) +{ + int err = sqlite3_bind_text16( + stmt, index, str, wcslen(str)*sizeof(wchar_t), SQLITE_STATIC); + return (err == SQLITE_OK ? true : false); +} + +bool +O2DatDB:: +bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const wstring &str) +{ + int err = sqlite3_bind_text16( + stmt, index, str.c_str(), str.size()*sizeof(wchar_t), SQLITE_STATIC); + return (err == SQLITE_OK ? true : false); +} + +bool +O2DatDB:: +bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const hashT &hash) +{ + int err = sqlite3_bind_blob( + stmt, index, hash.data(), hash.size(), SQLITE_STATIC); + return (err == SQLITE_OK ? true : false); +} + +void +O2DatDB:: +get_columns(sqlite3_stmt* stmt, O2DatRec &rec) +{ + rec.hash.assign((byte*)sqlite3_column_blob(stmt, 0), HASHSIZE); + rec.domain = (wchar_t*)sqlite3_column_text16(stmt, 1); + rec.bbsname = (wchar_t*)sqlite3_column_text16(stmt, 2); + rec.datname = (wchar_t*)sqlite3_column_text16(stmt, 3); + rec.size = sqlite3_column_int64 (stmt, 4); + rec.disksize = sqlite3_column_int64 (stmt, 5); + rec.url = (wchar_t*)sqlite3_column_text16(stmt, 6); + rec.title = (wchar_t*)sqlite3_column_text16(stmt, 7); + rec.res = sqlite3_column_int64 (stmt, 8); + rec.lastupdate = sqlite3_column_int64 (stmt, 9); + rec.lastpublish = sqlite3_column_int64 (stmt, 10); +} + +void +O2DatDB:: +get_columns(sqlite3_stmt* stmt, wstrarray &cols) +{ + __int64 t_int; + double t_float; + wstring t_text; + byte *t_byte; + int size; + wchar_t tmp[1024]; + + int column_count = sqlite3_column_count(stmt); + for (int i = 0; i < column_count; i++) { + switch (sqlite3_column_type(stmt, i)) { + case SQLITE_INTEGER: + t_int = sqlite3_column_int64 (stmt, i); + swprintf_s(tmp, 1024, L"%I64u", t_int); + cols.push_back(tmp); + break; + case SQLITE_FLOAT: + t_float = sqlite3_column_double(stmt, i); + swprintf_s(tmp, 1024, L"%lf", t_float); + cols.push_back(tmp); + break; + case SQLITE_TEXT: + t_text = (wchar_t*)sqlite3_column_text16(stmt, i); + cols.push_back(t_text); + break; + case SQLITE_BLOB: + size = sqlite3_column_bytes(stmt, i); + t_byte = new byte[size]; + memcpy(t_byte, (byte*)sqlite3_column_blob(stmt, i), size); + byte2whex(t_byte, size, t_text); + cols.push_back(t_text); + delete [] t_byte; + break; + } + } +} + +void +O2DatDB:: +get_column_names(sqlite3_stmt* stmt, wstrarray &cols) +{ + int column_count = sqlite3_column_count(stmt); + for (int i = 0; i < column_count; i++) { + cols.push_back((wchar_t*)sqlite3_column_name16(stmt, i)); + } +} + + + + +bool +O2DatDB:: +create_table(void) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("create table/index and analyze"); +#endif + + sqlite3 *db = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + + char *sql = + "create table if not exists dat (" + " hash BLOB," + " domain TEXT," + " bbsname TEXT," + " datname TEXT," + " size INTEGER," + " disksize INTEGER," + " url TEXT," + " title TEXT," + " res INTEGER," + " lastupdate INTEGER," + " lastpublish INTEGER," +// " flags INTEGER," +// " matchbytes INTEGER," +// " matchbytes1 INTEGER," +// " matchbytes2 INTEGER," + " PRIMARY KEY (hash)" + ");" + "drop index if exists idx_dat_domain;" + "drop index if exists idx_dat_bbsname;" + "drop index if exists idx_dat_datname;" + "create index if not exists idx_dat_domain_bbsname_datname on dat (domain, bbsname, datname);" + "create index if not exists idx_dat_lastpublish on dat (lastpublish);" + "analyze;"; + err = sqlite3_exec(db, sql, NULL, 0, 0); + if (err != SQLITE_OK) + goto error; +/* + sql = + "alter table dat add column flags INTEGER;" + "alter table dat add column matchbytes INTEGER;" + "alter table dat add column matchbytes1 INTEGER;" + "alter table dat add column matchbytes2 INTEGER;"; + err = sqlite3_exec(db, sql, NULL, 0, 0); + //if (err != SQLITE_OK) + // goto error; +*/ + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + return true; + +error: + log(db); + if (db) sqlite3_close(db); + return false; +} + + + + +bool +O2DatDB:: +reindex(const char *target) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("reindex"); +#endif + + sqlite3 *db = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + + char sql[64]; + sprintf_s(sql, 64, "reindex %s;", target); + + err = sqlite3_exec(db, sql, NULL, 0, 0); + if (err != SQLITE_OK) + goto error; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + return true; + +error: + log(db); + if (db) sqlite3_close(db); + return false; +} + + + + +size_t +O2DatDB:: +select(const wchar_t *sql, SQLResultList &out) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select"); +#endif + wstrarray cols; + + sqlite3 *db = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + sqlite3_stmt *stmt = NULL; + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + sqlite3_reset(stmt); + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + + if (out.empty()) { + //??? + cols.clear(); + get_column_names(stmt, cols); + out.push_back(cols); + cols.clear(); + get_columns(stmt, cols); + out.push_back(cols); + } + while (sqlite3_step(stmt) == SQLITE_ROW) { + //2???? + cols.clear(); + get_columns(stmt, cols); + out.push_back(cols); + } + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return (out.size()); + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return (0); +} + + + +bool +O2DatDB:: +select(O2DatRec &out) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select random 1"); +#endif + + bool ret = true; + sqlite3 *db = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = + L"select" + COLUMNS + L" from dat" + L" order by random() limit 1;"; + + sqlite3_stmt *stmt = NULL; + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + sqlite3_reset(stmt); + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + + if (err == SQLITE_DONE) + ret = false; + if (err == SQLITE_ROW) + get_columns(stmt, out); + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return (ret); + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} + + + +bool +O2DatDB:: +select(O2DatRec &out, hashT hash) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select by hash"); +#endif + + bool ret = true; + sqlite3 *db = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = + L"select" + COLUMNS + L" from dat" + L" where hash = ?;"; + + sqlite3_stmt *stmt = NULL; + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + if (!bind(db, stmt, 1, hash)) + goto error; + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + if (err == SQLITE_DONE) + ret = false; + if (err == SQLITE_ROW) + get_columns(stmt, out); + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return (ret); + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} + +bool +O2DatDB:: +select(O2DatRec &out, const wchar_t *domain, const wchar_t *bbsname) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select by domain bbsname"); +#endif + + bool ret = true; + sqlite3 *db = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = + L"select" + COLUMNS + L" from dat" + L" where domain = ?" + L" and bbsname = ?" + L" order by random() limit 1;"; + + sqlite3_stmt *stmt = NULL; + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + if (!bind(db, stmt, 1, domain)) + goto error; + if (!bind(db, stmt, 2, bbsname)) + goto error; + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + + if (err == SQLITE_DONE) + ret = false; + if (err == SQLITE_ROW) + get_columns(stmt, out); + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return (ret); + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} + + + + +bool +O2DatDB:: +select(O2DatRec &out, const wchar_t *domain, const wchar_t *bbsname, const wchar_t *datname) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select by domain bbsname datname"); +#endif + + bool ret = true; + sqlite3 *db = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = + L"select" + COLUMNS + L" from dat" + L" where domain = ?" + L" and bbsname = ?" + L" and datname = ?;"; + + sqlite3_stmt *stmt = NULL; + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + if (!bind(db, stmt, 1, domain)) + goto error; + if (!bind(db, stmt, 2, bbsname)) + goto error; + if (!bind(db, stmt, 3, datname)) + goto error; + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + + if (err == SQLITE_DONE) + ret = false; + if (err == SQLITE_ROW) + get_columns(stmt, out); + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return (ret); + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} + + + + +bool +O2DatDB:: +select(O2DatRecList &out) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select all"); +#endif + + sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + O2DatRec rec; + + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = + L"select" + COLUMNS + L" from dat;"; + + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + while (sqlite3_step(stmt) == SQLITE_ROW) { + get_columns(stmt, rec); + out.push_back(rec); + } + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + return true; + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} + + + + +bool +O2DatDB:: +select(O2DatRecList &out, const wchar_t *domain, const wchar_t *bbsname) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select domain bbsname order by datname"); +#endif + + sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + O2DatRec rec; + + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = + L"select" + COLUMNS + L" from dat" + L" where domain = ?" + L" and bbsname = ?" + L" order by datname;"; + + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + if (!bind(db, stmt, 1, domain)) + goto error; + if (!bind(db, stmt, 2, bbsname)) + goto error; + + while (sqlite3_step(stmt) == SQLITE_ROW) { + get_columns(stmt, rec); + out.push_back(rec); + } + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + return true; + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} + + + + +bool +O2DatDB:: +select(O2DatRecList &out, time_t publish_tt, size_t limit) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select lastpublish"); +#endif + + sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + O2DatRec rec; + + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = + L"select" + COLUMNS + L" from dat" + L" where lastpublish < ?" + L" order by lastpublish" + L" limit ?;"; + + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + if (!bind(db, stmt, 1, time(NULL)-publish_tt)) + goto error; + if (!bind(db, stmt, 2, limit)) + goto error; + + while (sqlite3_step(stmt) == SQLITE_ROW) { + get_columns(stmt, rec); + out.push_back(rec); + } + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return true; + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} + + + + +uint64 +O2DatDB:: +select_datcount(void) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select datcount"); +#endif + + sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = L"select count(*) from dat;"; + + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + + uint64 count = sqlite3_column_int64(stmt,0); + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return (count); + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return (0); +} + + + + +uint64 +O2DatDB:: +select_datcount(wstrnummap &out) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select datcount group by domain bbsname"); +#endif + + sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + wstring domain_bbsname; + uint64 total = 0; + uint64 num; + + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = + L"select domain, bbsname, count(*) from dat group by domain, bbsname;"; + + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + while (sqlite3_step(stmt) == SQLITE_ROW) { + domain_bbsname = (wchar_t*)sqlite3_column_text16(stmt, 0); + domain_bbsname += L":"; + domain_bbsname += (wchar_t*)sqlite3_column_text16(stmt, 1); + num = sqlite3_column_int64(stmt, 2); + + out.insert(wstrnummap::value_type(domain_bbsname, num)); + total += num; + } + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + return (total); + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} + + + + +uint64 +O2DatDB:: +select_totaldisksize(void) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select totakdisksize"); +#endif + + sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = L"select sum(disksize) from dat;"; + + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + + uint64 totalsize = sqlite3_column_int64(stmt,0); + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return (totalsize); + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return (0); +} + + + + +uint64 +O2DatDB:: +select_publishcount(time_t publish_tt) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("select datcount by lastpublish"); +#endif + + sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = L"select count(*) from dat where lastpublish > ?;"; + + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + if (!bind(db, stmt, 1, time(NULL)-publish_tt)) + goto error; + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + + uint64 count = sqlite3_column_int64(stmt,0); + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return (count); + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return (0); +} + + + + +#if 0 +bool +O2DatDB:: +update(O2DatRec &in, bool is_origurl) +{ + sqlite3 *db = NULL; + sqlite3_stmt* stmt; + O2DatRec org; + + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + if (select(org, in.hash)) { + wchar_t *sql = + L"update or replace dat" + L" set size = ?" + L" , disksize = ?" + L" , url = ?" + L" , res = ?" + L" , lastupdate = ?" + L" , lastpublish = 0" + L" where hash = ?;"; + + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + if (!is_origurl) + in.url = org.url; + if (!bind(db, stmt, 1, in.size)) + goto error; + if (!bind(db, stmt, 2, in.disksize)) + goto error; + if (!bind(db, stmt, 3, in.url)) + goto error; + if (!bind(db, stmt, 4, in.res)) + goto error; + if (!bind(db, stmt, 5, time(NULL))) + goto error; + if (!bind(db, stmt, 6, in.hash)) + goto error; + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + sqlite3_finalize(stmt); + stmt = NULL; + } + else { + wchar_t *sql = + L"insert or replace into dat (" + COLUMNS + L") values (" + L"?,?,?,?,?,?,?,?,?,?,?" + L");"; + + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + if (!bind(db, stmt, 1, in.hash)) + goto error; + if (!bind(db, stmt, 2, in.domain)) + goto error; + if (!bind(db, stmt, 3, in.bbsname)) + goto error; + if (!bind(db, stmt, 4, in.datname)) + goto error; + if (!bind(db, stmt, 5, in.size)) + goto error; + if (!bind(db, stmt, 6, in.disksize)) + goto error; + if (!bind(db, stmt, 7, in.url)) + goto error; + if (!bind(db, stmt, 8, in.title)) + goto error; + if (!bind(db, stmt, 9, in.res)) + goto error; + if (!bind(db, stmt, 10, time(NULL))) + goto error; + if (!bind(db, stmt, 11, (uint64)0)) + goto error; + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + sqlite3_finalize(stmt); + stmt = NULL; + } + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return true; + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} +#endif + + + +void +O2DatDB:: +update(O2DatRecList &in) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("update by reclist"); +#endif + + sqlite3 *db = NULL; + sqlite3_stmt *stmt_insert = NULL; + sqlite3_stmt *stmt_update = NULL; + sqlite3_stmt *stmt_updatepublish = NULL; + O2DatRec org; + + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql_insert = + L"insert or replace into dat (" + COLUMNS + L") values (" + L"?,?,?,?,?,?,?,?,?,?,?" + L");"; + err = sqlite3_prepare16_v2(db, sql_insert, wcslen(sql_insert)*2, &stmt_insert, NULL); + if (err != SQLITE_OK) + goto error; + + wchar_t *sql_update = + L"update or replace dat" + L" set size = ?" + L" , disksize = ?" + L" , url = ?" + L" , res = ?" + L" , lastupdate = ?" +// L" , lastpublish = 0" + L" where hash = ?;"; + + err = sqlite3_prepare16_v2(db, sql_update, wcslen(sql_update)*2, &stmt_update, NULL); + if (err != SQLITE_OK) + goto error; + + wchar_t *sql_updatepublish = + L"update or replace dat" + L" set lastpublish = ?" + L" where hash = ?;"; + + err = sqlite3_prepare16_v2(db, sql_updatepublish, wcslen(sql_updatepublish)*2, &stmt_updatepublish, NULL); + if (err != SQLITE_OK) + goto error; + + // + // Loop + // + sqlite3_exec(db, "begin;", NULL, NULL, NULL); + for (O2DatRecListIt it = in.begin(); it != in.end(); it++) { + if (!select(org, it->hash)) { + sqlite3_reset(stmt_insert); + if (!bind(db, stmt_insert, 1, it->hash)) + goto error; + if (!bind(db, stmt_insert, 2, it->domain)) + goto error; + if (!bind(db, stmt_insert, 3, it->bbsname)) + goto error; + if (!bind(db, stmt_insert, 4, it->datname)) + goto error; + if (!bind(db, stmt_insert, 5, it->size)) + goto error; + if (!bind(db, stmt_insert, 6, it->disksize)) + goto error; + if (!bind(db, stmt_insert, 7, it->url)) + goto error; + if (!bind(db, stmt_insert, 8, it->title)) + goto error; + if (!bind(db, stmt_insert, 9, it->res)) + goto error; + if (!bind(db, stmt_insert, 10, time(NULL))) + goto error; + if (!bind(db, stmt_insert, 11, (uint64)0)) + goto error; + + err = sqlite3_step(stmt_insert); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + } + else if (it->userdata == 0) { + sqlite3_reset(stmt_update); + if (!bind(db, stmt_update, 1, it->size)) + goto error; + if (!bind(db, stmt_update, 2, it->disksize)) + goto error; + if (!bind(db, stmt_update, 3, (wcsstr(org.url.c_str(), L"xxx") == 0 ? it->url : org.url))) + goto error; + if (!bind(db, stmt_update, 4, it->res)) + goto error; + if (!bind(db, stmt_update, 5, time(NULL))) + goto error; +// if (!bind(db, stmt_update, 6, (uint64)0)) +// goto error; + + err = sqlite3_step(stmt_update); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + } + else { + sqlite3_reset(stmt_updatepublish); + if (!bind(db, stmt_updatepublish, 1, time(NULL))) + goto error; + if (!bind(db, stmt_updatepublish, 2, it->hash)) + goto error; + + err = sqlite3_step(stmt_updatepublish); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + } + Sleep(1); + } + sqlite3_exec(db, "commit;", NULL, NULL, NULL); + + sqlite3_finalize(stmt_insert); + sqlite3_finalize(stmt_update); + sqlite3_finalize(stmt_updatepublish); + stmt_insert = NULL; + stmt_update = NULL; + stmt_updatepublish = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return; + +error: + log(db); + if (stmt_insert) sqlite3_finalize(stmt_insert); + if (stmt_update) sqlite3_finalize(stmt_update); + if (stmt_updatepublish) sqlite3_finalize(stmt_updatepublish); + if (db) sqlite3_close(db); + return; +} + + + + +#if 0 +bool +O2DatDB:: +update_lastpublish(const hashT &hash) +{ + sqlite3 *db = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = + L"update or replace dat" + L" set lastpublish = ?" + L" where hash = ?;"; + + sqlite3_stmt *stmt = NULL; + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + if (!bind(db, stmt, 1, time(NULL))) + goto error; + if (!bind(db, stmt, 2, hash)) + goto error; + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return true; + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} +#endif + + + + +bool +O2DatDB:: +remove(const hashT &hash) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("remove"); +#endif + + sqlite3 *db = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + sqlite3_busy_timeout(db, 5000); + + wchar_t *sql = + L"delete from dat where hash = ?;"; + + sqlite3_stmt *stmt = NULL; + err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); + if (err != SQLITE_OK) + goto error; + + if (!bind(db, stmt, 1, hash)) + goto error; + + err = sqlite3_step(stmt); + if (err != SQLITE_ROW && err != SQLITE_DONE) + goto error; + + sqlite3_finalize(stmt); + stmt = NULL; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + + return true; + +error: + log(db); + if (stmt) sqlite3_finalize(stmt); + if (db) sqlite3_close(db); + return false; +} + + + + +#else +void +O2DatDB:: log(ISC_STATUS_ARRAY &status) { string errmsg; @@ -110,19 +1332,11 @@ } Logger->AddLog(O2LT_ERROR, L"Firebird", 0, 0, "%s", errmsg.c_str()); } -#else -void -O2DatDB:: -log(sqlite3 *db) -{ - Logger->AddLog(O2LT_ERROR, L"SQLite", 0, 0, sqlite3_errmsg(db)); -} -#endif -#ifdef O2_DB_FIREBIRD + bool O2DatDB:: bind(XSQLDA *sqlda, int index, const uint64 num) @@ -366,121 +1580,17 @@ sqlda = NULL; return; } -#else -bool -O2DatDB:: -bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const uint64 num) -{ - int err = sqlite3_bind_int64(stmt, index, num); - return (err == SQLITE_OK ? true : false); -} -bool -O2DatDB:: -bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const wchar_t *str) -{ - int err = sqlite3_bind_text16( - stmt, index, str, wcslen(str)*sizeof(wchar_t), SQLITE_STATIC); - return (err == SQLITE_OK ? true : false); -} -bool -O2DatDB:: -bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const wstring &str) -{ - int err = sqlite3_bind_text16( - stmt, index, str.c_str(), str.size()*sizeof(wchar_t), SQLITE_STATIC); - return (err == SQLITE_OK ? true : false); -} bool O2DatDB:: -bind(sqlite3 *db, sqlite3_stmt* stmt, int index, const hashT &hash) -{ - int err = sqlite3_bind_blob( - stmt, index, hash.data(), hash.size(), SQLITE_STATIC); - return (err == SQLITE_OK ? true : false); -} - -void -O2DatDB:: -get_columns(sqlite3_stmt* stmt, O2DatRec &rec) -{ - rec.hash.assign((byte*)sqlite3_column_blob(stmt, 0), HASHSIZE); - rec.domain = (wchar_t*)sqlite3_column_text16(stmt, 1); - rec.bbsname = (wchar_t*)sqlite3_column_text16(stmt, 2); - rec.datname = (wchar_t*)sqlite3_column_text16(stmt, 3); - rec.size = sqlite3_column_int64 (stmt, 4); - rec.disksize = sqlite3_column_int64 (stmt, 5); - rec.url = (wchar_t*)sqlite3_column_text16(stmt, 6); - rec.title = (wchar_t*)sqlite3_column_text16(stmt, 7); - rec.res = sqlite3_column_int64 (stmt, 8); - rec.lastupdate = sqlite3_column_int64 (stmt, 9); - rec.lastpublish = sqlite3_column_int64 (stmt, 10); -} - -void -O2DatDB:: -get_columns(sqlite3_stmt* stmt, wstrarray &cols) -{ - __int64 t_int; - double t_float; - wstring t_text; - byte *t_byte; - int size; - wchar_t tmp[1024]; - - int column_count = sqlite3_column_count(stmt); - for (int i = 0; i < column_count; i++) { - switch (sqlite3_column_type(stmt, i)) { - case SQLITE_INTEGER: - t_int = sqlite3_column_int64 (stmt, i); - swprintf_s(tmp, 1024, L"%I64u", t_int); - cols.push_back(tmp); - break; - case SQLITE_FLOAT: - t_float = sqlite3_column_double(stmt, i); - swprintf_s(tmp, 1024, L"%lf", t_float); - cols.push_back(tmp); - break; - case SQLITE_TEXT: - t_text = (wchar_t*)sqlite3_column_text16(stmt, i); - cols.push_back(t_text); - break; - case SQLITE_BLOB: - size = sqlite3_column_bytes(stmt, i); - t_byte = new byte[size]; - memcpy(t_byte, (byte*)sqlite3_column_blob(stmt, i), size); - byte2whex(t_byte, size, t_text); - cols.push_back(t_text); - delete [] t_byte; - break; - } - } -} - -void -O2DatDB:: -get_column_names(sqlite3_stmt* stmt, wstrarray &cols) -{ - int column_count = sqlite3_column_count(stmt); - for (int i = 0; i < column_count; i++) { - cols.push_back((wchar_t*)sqlite3_column_name16(stmt, i)); - } -} -#endif - - - - -bool -O2DatDB:: create_table(void) { #if TRACE_SQL_EXEC_TIME stopwatch sw("create table/index and analyze"); #endif -#ifdef O2_DB_FIREBIRD + isc_db_handle db = NULL; isc_tr_handle tr = NULL; isc_stmt_handle stmt = NULL; @@ -543,66 +1653,8 @@ if (tr) isc_rollback_transaction(status, &tr); if (db) isc_detach_database(status, &db); return (false); -#else - sqlite3 *db = NULL; - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - - char *sql = - "create table if not exists dat (" - " hash BLOB," - " domain TEXT," - " bbsname TEXT," - " datname TEXT," - " size INTEGER," - " disksize INTEGER," - " url TEXT," - " title TEXT," - " res INTEGER," - " lastupdate INTEGER," - " lastpublish INTEGER," -// " flags INTEGER," -// " matchbytes INTEGER," -// " matchbytes1 INTEGER," -// " matchbytes2 INTEGER," - " PRIMARY KEY (hash)" - ");" - "drop index if exists idx_dat_domain;" - "drop index if exists idx_dat_bbsname;" - "drop index if exists idx_dat_datname;" - "create index if not exists idx_dat_domain_bbsname_datname on dat (domain, bbsname, datname);" - "create index if not exists idx_dat_lastpublish on dat (lastpublish);" - "analyze;"; - err = sqlite3_exec(db, sql, NULL, 0, 0); - if (err != SQLITE_OK) - goto error; -/* - sql = - "alter table dat add column flags INTEGER;" - "alter table dat add column matchbytes INTEGER;" - "alter table dat add column matchbytes1 INTEGER;" - "alter table dat add column matchbytes2 INTEGER;"; - err = sqlite3_exec(db, sql, NULL, 0, 0); - //if (err != SQLITE_OK) - // goto error; -*/ - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - return true; - -error: - log(db); - if (db) sqlite3_close(db); - return false; -#endif } - - - -#ifdef O2_DB_FIREBIRD bool O2DatDB:: reindex(const char *target) @@ -1652,1049 +2704,14 @@ free_xsqlda(inda); return (false); } -#else -bool -O2DatDB:: -reindex(const char *target) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("reindex"); #endif - sqlite3 *db = NULL; - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - char sql[64]; - sprintf_s(sql, 64, "reindex %s;", target); - err = sqlite3_exec(db, sql, NULL, 0, 0); - if (err != SQLITE_OK) - goto error; - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - return true; - -error: - log(db); - if (db) sqlite3_close(db); - return false; -} - - - - -size_t -O2DatDB:: -select(const wchar_t *sql, SQLResultList &out) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select"); -#endif - wstrarray cols; - - sqlite3 *db = NULL; - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - sqlite3_stmt *stmt = NULL; - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - sqlite3_reset(stmt); - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - - if (out.empty()) { - //??? - cols.clear(); - get_column_names(stmt, cols); - out.push_back(cols); - cols.clear(); - get_columns(stmt, cols); - out.push_back(cols); - } - while (sqlite3_step(stmt) == SQLITE_ROW) { - //2???? - cols.clear(); - get_columns(stmt, cols); - out.push_back(cols); - } - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return (out.size()); - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return (0); -} - - - -bool -O2DatDB:: -select(O2DatRec &out) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select random 1"); -#endif - - bool ret = true; - sqlite3 *db = NULL; - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = - L"select" - COLUMNS - L" from dat" - L" order by random() limit 1;"; - - sqlite3_stmt *stmt = NULL; - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - sqlite3_reset(stmt); - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - - if (err == SQLITE_DONE) - ret = false; - if (err == SQLITE_ROW) - get_columns(stmt, out); - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return (ret); - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} - - - -bool -O2DatDB:: -select(O2DatRec &out, hashT hash) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select by hash"); -#endif - - bool ret = true; - sqlite3 *db = NULL; - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = - L"select" - COLUMNS - L" from dat" - L" where hash = ?;"; - - sqlite3_stmt *stmt = NULL; - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - if (!bind(db, stmt, 1, hash)) - goto error; - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - if (err == SQLITE_DONE) - ret = false; - if (err == SQLITE_ROW) - get_columns(stmt, out); - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return (ret); - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} - -bool -O2DatDB:: -select(O2DatRec &out, const wchar_t *domain, const wchar_t *bbsname) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select by domain bbsname"); -#endif - - bool ret = true; - sqlite3 *db = NULL; - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = - L"select" - COLUMNS - L" from dat" - L" where domain = ?" - L" and bbsname = ?" - L" order by random() limit 1;"; - - sqlite3_stmt *stmt = NULL; - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - if (!bind(db, stmt, 1, domain)) - goto error; - if (!bind(db, stmt, 2, bbsname)) - goto error; - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - - if (err == SQLITE_DONE) - ret = false; - if (err == SQLITE_ROW) - get_columns(stmt, out); - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return (ret); - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} - - - - -bool -O2DatDB:: -select(O2DatRec &out, const wchar_t *domain, const wchar_t *bbsname, const wchar_t *datname) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select by domain bbsname datname"); -#endif - - bool ret = true; - sqlite3 *db = NULL; - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = - L"select" - COLUMNS - L" from dat" - L" where domain = ?" - L" and bbsname = ?" - L" and datname = ?;"; - - sqlite3_stmt *stmt = NULL; - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - if (!bind(db, stmt, 1, domain)) - goto error; - if (!bind(db, stmt, 2, bbsname)) - goto error; - if (!bind(db, stmt, 3, datname)) - goto error; - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - - if (err == SQLITE_DONE) - ret = false; - if (err == SQLITE_ROW) - get_columns(stmt, out); - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return (ret); - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} - - - - -bool -O2DatDB:: -select(O2DatRecList &out) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select all"); -#endif - - sqlite3 *db = NULL; - sqlite3_stmt *stmt = NULL; - O2DatRec rec; - - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = - L"select" - COLUMNS - L" from dat;"; - - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - while (sqlite3_step(stmt) == SQLITE_ROW) { - get_columns(stmt, rec); - out.push_back(rec); - } - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - return true; - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} - - - - -bool -O2DatDB:: -select(O2DatRecList &out, const wchar_t *domain, const wchar_t *bbsname) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select domain bbsname order by datname"); -#endif - - sqlite3 *db = NULL; - sqlite3_stmt *stmt = NULL; - O2DatRec rec; - - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = - L"select" - COLUMNS - L" from dat" - L" where domain = ?" - L" and bbsname = ?" - L" order by datname;"; - - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - if (!bind(db, stmt, 1, domain)) - goto error; - if (!bind(db, stmt, 2, bbsname)) - goto error; - - while (sqlite3_step(stmt) == SQLITE_ROW) { - get_columns(stmt, rec); - out.push_back(rec); - } - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - return true; - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} - - - - -bool -O2DatDB:: -select(O2DatRecList &out, time_t publish_tt, size_t limit) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select lastpublish"); -#endif - - sqlite3 *db = NULL; - sqlite3_stmt *stmt = NULL; - O2DatRec rec; - - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = - L"select" - COLUMNS - L" from dat" - L" where lastpublish < ?" - L" order by lastpublish" - L" limit ?;"; - - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - if (!bind(db, stmt, 1, time(NULL)-publish_tt)) - goto error; - if (!bind(db, stmt, 2, limit)) - goto error; - - while (sqlite3_step(stmt) == SQLITE_ROW) { - get_columns(stmt, rec); - out.push_back(rec); - } - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return true; - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} - - - - -uint64 -O2DatDB:: -select_datcount(void) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select datcount"); -#endif - - sqlite3 *db = NULL; - sqlite3_stmt *stmt = NULL; - - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = L"select count(*) from dat;"; - - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - - uint64 count = sqlite3_column_int64(stmt,0); - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return (count); - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return (0); -} - - - - -uint64 -O2DatDB:: -select_datcount(wstrnummap &out) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select datcount group by domain bbsname"); -#endif - - sqlite3 *db = NULL; - sqlite3_stmt *stmt = NULL; - wstring domain_bbsname; - uint64 total = 0; - uint64 num; - - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = - L"select domain, bbsname, count(*) from dat group by domain, bbsname;"; - - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - while (sqlite3_step(stmt) == SQLITE_ROW) { - domain_bbsname = (wchar_t*)sqlite3_column_text16(stmt, 0); - domain_bbsname += L":"; - domain_bbsname += (wchar_t*)sqlite3_column_text16(stmt, 1); - num = sqlite3_column_int64(stmt, 2); - - out.insert(wstrnummap::value_type(domain_bbsname, num)); - total += num; - } - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - return (total); - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} - - - - -uint64 -O2DatDB:: -select_totaldisksize(void) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select totakdisksize"); -#endif - - sqlite3 *db = NULL; - sqlite3_stmt *stmt = NULL; - - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = L"select sum(disksize) from dat;"; - - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - - uint64 totalsize = sqlite3_column_int64(stmt,0); - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return (totalsize); - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return (0); -} - - - - -uint64 -O2DatDB:: -select_publishcount(time_t publish_tt) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("select datcount by lastpublish"); -#endif - - sqlite3 *db = NULL; - sqlite3_stmt *stmt = NULL; - - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = L"select count(*) from dat where lastpublish > ?;"; - - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - if (!bind(db, stmt, 1, time(NULL)-publish_tt)) - goto error; - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - - uint64 count = sqlite3_column_int64(stmt,0); - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return (count); - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return (0); -} - - - - -#if 0 -bool -O2DatDB:: -update(O2DatRec &in, bool is_origurl) -{ - sqlite3 *db = NULL; - sqlite3_stmt* stmt; - O2DatRec org; - - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - if (select(org, in.hash)) { - wchar_t *sql = - L"update or replace dat" - L" set size = ?" - L" , disksize = ?" - L" , url = ?" - L" , res = ?" - L" , lastupdate = ?" - L" , lastpublish = 0" - L" where hash = ?;"; - - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - if (!is_origurl) - in.url = org.url; - if (!bind(db, stmt, 1, in.size)) - goto error; - if (!bind(db, stmt, 2, in.disksize)) - goto error; - if (!bind(db, stmt, 3, in.url)) - goto error; - if (!bind(db, stmt, 4, in.res)) - goto error; - if (!bind(db, stmt, 5, time(NULL))) - goto error; - if (!bind(db, stmt, 6, in.hash)) - goto error; - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - sqlite3_finalize(stmt); - stmt = NULL; - } - else { - wchar_t *sql = - L"insert or replace into dat (" - COLUMNS - L") values (" - L"?,?,?,?,?,?,?,?,?,?,?" - L");"; - - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - if (!bind(db, stmt, 1, in.hash)) - goto error; - if (!bind(db, stmt, 2, in.domain)) - goto error; - if (!bind(db, stmt, 3, in.bbsname)) - goto error; - if (!bind(db, stmt, 4, in.datname)) - goto error; - if (!bind(db, stmt, 5, in.size)) - goto error; - if (!bind(db, stmt, 6, in.disksize)) - goto error; - if (!bind(db, stmt, 7, in.url)) - goto error; - if (!bind(db, stmt, 8, in.title)) - goto error; - if (!bind(db, stmt, 9, in.res)) - goto error; - if (!bind(db, stmt, 10, time(NULL))) - goto error; - if (!bind(db, stmt, 11, (uint64)0)) - goto error; - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - sqlite3_finalize(stmt); - stmt = NULL; - } - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return true; - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} -#endif - - - void O2DatDB:: -update(O2DatRecList &in) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("update by reclist"); -#endif - - sqlite3 *db = NULL; - sqlite3_stmt *stmt_insert = NULL; - sqlite3_stmt *stmt_update = NULL; - sqlite3_stmt *stmt_updatepublish = NULL; - O2DatRec org; - - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql_insert = - L"insert or replace into dat (" - COLUMNS - L") values (" - L"?,?,?,?,?,?,?,?,?,?,?" - L");"; - err = sqlite3_prepare16_v2(db, sql_insert, wcslen(sql_insert)*2, &stmt_insert, NULL); - if (err != SQLITE_OK) - goto error; - - wchar_t *sql_update = - L"update or replace dat" - L" set size = ?" - L" , disksize = ?" - L" , url = ?" - L" , res = ?" - L" , lastupdate = ?" -// L" , lastpublish = 0" - L" where hash = ?;"; - - err = sqlite3_prepare16_v2(db, sql_update, wcslen(sql_update)*2, &stmt_update, NULL); - if (err != SQLITE_OK) - goto error; - - wchar_t *sql_updatepublish = - L"update or replace dat" - L" set lastpublish = ?" - L" where hash = ?;"; - - err = sqlite3_prepare16_v2(db, sql_updatepublish, wcslen(sql_updatepublish)*2, &stmt_updatepublish, NULL); - if (err != SQLITE_OK) - goto error; - - // - // Loop - // - sqlite3_exec(db, "begin;", NULL, NULL, NULL); - for (O2DatRecListIt it = in.begin(); it != in.end(); it++) { - if (!select(org, it->hash)) { - sqlite3_reset(stmt_insert); - if (!bind(db, stmt_insert, 1, it->hash)) - goto error; - if (!bind(db, stmt_insert, 2, it->domain)) - goto error; - if (!bind(db, stmt_insert, 3, it->bbsname)) - goto error; - if (!bind(db, stmt_insert, 4, it->datname)) - goto error; - if (!bind(db, stmt_insert, 5, it->size)) - goto error; - if (!bind(db, stmt_insert, 6, it->disksize)) - goto error; - if (!bind(db, stmt_insert, 7, it->url)) - goto error; - if (!bind(db, stmt_insert, 8, it->title)) - goto error; - if (!bind(db, stmt_insert, 9, it->res)) - goto error; - if (!bind(db, stmt_insert, 10, time(NULL))) - goto error; - if (!bind(db, stmt_insert, 11, (uint64)0)) - goto error; - - err = sqlite3_step(stmt_insert); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - } - else if (it->userdata == 0) { - sqlite3_reset(stmt_update); - if (!bind(db, stmt_update, 1, it->size)) - goto error; - if (!bind(db, stmt_update, 2, it->disksize)) - goto error; - if (!bind(db, stmt_update, 3, (wcsstr(org.url.c_str(), L"xxx") == 0 ? it->url : org.url))) - goto error; - if (!bind(db, stmt_update, 4, it->res)) - goto error; - if (!bind(db, stmt_update, 5, time(NULL))) - goto error; -// if (!bind(db, stmt_update, 6, (uint64)0)) -// goto error; - - err = sqlite3_step(stmt_update); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - } - else { - sqlite3_reset(stmt_updatepublish); - if (!bind(db, stmt_updatepublish, 1, time(NULL))) - goto error; - if (!bind(db, stmt_updatepublish, 2, it->hash)) - goto error; - - err = sqlite3_step(stmt_updatepublish); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - } - Sleep(1); - } - sqlite3_exec(db, "commit;", NULL, NULL, NULL); - - sqlite3_finalize(stmt_insert); - sqlite3_finalize(stmt_update); - sqlite3_finalize(stmt_updatepublish); - stmt_insert = NULL; - stmt_update = NULL; - stmt_updatepublish = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return; - -error: - log(db); - if (stmt_insert) sqlite3_finalize(stmt_insert); - if (stmt_update) sqlite3_finalize(stmt_update); - if (stmt_updatepublish) sqlite3_finalize(stmt_updatepublish); - if (db) sqlite3_close(db); - return; -} - - - - -#if 0 -bool -O2DatDB:: -update_lastpublish(const hashT &hash) -{ - sqlite3 *db = NULL; - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = - L"update or replace dat" - L" set lastpublish = ?" - L" where hash = ?;"; - - sqlite3_stmt *stmt = NULL; - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - if (!bind(db, stmt, 1, time(NULL))) - goto error; - if (!bind(db, stmt, 2, hash)) - goto error; - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return true; - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} -#endif - - - - -bool -O2DatDB:: -remove(const hashT &hash) -{ -#if TRACE_SQL_EXEC_TIME - stopwatch sw("remove"); -#endif - - sqlite3 *db = NULL; - int err = sqlite3_open16(dbfilename.c_str(), &db); - if (err != SQLITE_OK) - goto error; - sqlite3_busy_timeout(db, 5000); - - wchar_t *sql = - L"delete from dat where hash = ?;"; - - sqlite3_stmt *stmt = NULL; - err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); - if (err != SQLITE_OK) - goto error; - - if (!bind(db, stmt, 1, hash)) - goto error; - - err = sqlite3_step(stmt); - if (err != SQLITE_ROW && err != SQLITE_DONE) - goto error; - - sqlite3_finalize(stmt); - stmt = NULL; - - err = sqlite3_close(db); - if (err != SQLITE_OK) - goto error; - - return true; - -error: - log(db); - if (stmt) sqlite3_finalize(stmt); - if (db) sqlite3_close(db); - return false; -} -#endif - - - - -void -O2DatDB:: AddUpdateQueue(O2DatRec &in) { UpdateQueueLock.Lock(); From o2on-svn @ lists.sourceforge.jp Wed May 21 19:42:52 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Wed, 21 May 2008 19:42:52 +0900 Subject: [o2on-svn] =?utf-8?b?Wzg2XSAgZGF0bmFtZeOBruOCpOODs+ODh+ODg+OCrw==?= =?utf-8?b?44K544KS5L2c5oiQ?= Message-ID: <1211366572.176212.16232.nullmailer@users.sourceforge.jp> Revision: 86 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=86 Author: k-uehara Date: 2008-05-21 19:42:51 +0900 (Wed, 21 May 2008) Log Message: ----------- datnameのインデックスを作成 dat一覧画面でのパフォーマンスアップ Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-05-17 12:09:23 UTC (rev 85) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-05-21 10:42:51 UTC (rev 86) @@ -207,9 +207,10 @@ ");" "drop index if exists idx_dat_domain;" "drop index if exists idx_dat_bbsname;" - "drop index if exists idx_dat_datname;" +// "drop index if exists idx_dat_datname;" "create index if not exists idx_dat_domain_bbsname_datname on dat (domain, bbsname, datname);" "create index if not exists idx_dat_lastpublish on dat (lastpublish);" + "create index if not exists idx_dat_datname on dat (datname);"; "analyze;"; err = sqlite3_exec(db, sql, NULL, 0, 0); if (err != SQLITE_OK) From o2on-svn @ lists.sourceforge.jp Wed May 21 20:01:56 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Wed, 21 May 2008 20:01:56 +0900 Subject: [o2on-svn] =?utf-8?b?Wzg3XSBGSVg6IGRhdG5hbWXjga7jgqTjg7Pjg4fjg4M=?= =?utf-8?b?44Kv44K544KS5L2c5oiQIOS4gOmDqOabtOaWsOW/mOOCjA==?= Message-ID: <1211367716.776402.31172.nullmailer@users.sourceforge.jp> Revision: 87 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=87 Author: k-uehara Date: 2008-05-21 20:01:56 +0900 (Wed, 21 May 2008) Log Message: ----------- FIX:datnameのインデックスを作成 一部更新忘れ Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-05-21 10:42:51 UTC (rev 86) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-05-21 11:01:56 UTC (rev 87) @@ -1120,15 +1120,15 @@ O2DatIO:: StaticReindexThread(void *data) { - static char *targets[] = {"dat","idx_dat_domain_bbsname_datname","idx_dat_lastpublish"}; + static char *targets[] = {"dat","idx_dat_domain_bbsname_datname","idx_dat_lastpublish","idx_dat_datname"}; O2DatIO *me = (O2DatIO*)data; me->ProgressInfo->Reset(true, false); me->ProgressInfo->SetMessage(L"reindex..."); - me->ProgressInfo->AddMax(3); + me->ProgressInfo->AddMax(4); - for (size_t i = 0; i < 3; i++) { + for (size_t i = 0; i < 4; i++) { wstring tmp; ascii2unicode(targets[i], strlen(targets[i]), tmp); tmp.insert(0, L"reindex "); From o2on-svn @ lists.sourceforge.jp Wed May 21 23:22:30 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Wed, 21 May 2008 23:22:30 +0900 Subject: [o2on-svn] =?utf-8?b?Wzg4XSBGSVg6ICBSZWluZGV444Gn44Gu44Ko44Op44O8?= =?utf-8?b?5pmC44Gr6JC944Gh44KL44OQ44Kw5L+u5q2j?= Message-ID: <1211379750.542414.20216.nullmailer@users.sourceforge.jp> Revision: 88 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=88 Author: k-uehara Date: 2008-05-21 23:22:30 +0900 (Wed, 21 May 2008) Log Message: ----------- FIX: Reindexでのエラー時に落ちるバグ修正 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-05-21 11:01:56 UTC (rev 87) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-05-21 14:22:30 UTC (rev 88) @@ -1124,6 +1124,7 @@ O2DatIO *me = (O2DatIO*)data; + CoInitialize(NULL); me->ProgressInfo->Reset(true, false); me->ProgressInfo->SetMessage(L"reindex..."); me->ProgressInfo->AddMax(4); @@ -1139,6 +1140,7 @@ } me->ProgressInfo->Reset(false, false); + CoUninitialize(); CloseHandle(me->ReindexThreadHandle); me->ReindexThreadHandle = NULL; From o2on-svn @ lists.sourceforge.jp Fri May 23 20:04:08 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Fri, 23 May 2008 20:04:08 +0900 Subject: [o2on-svn] =?utf-8?b?Wzg5XSBGSVg6ICAjMTIyODkg44K344Oj44OD44OI44OA?= =?utf-8?b?44Km44Oz5pmC44Gu5YSq5YWI5bqm44KS5aSJ5pu0?= Message-ID: <1211540648.557286.14736.nullmailer@users.sourceforge.jp> Revision: 89 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=89 Author: k-uehara Date: 2008-05-23 20:04:08 +0900 (Fri, 23 May 2008) Log Message: ----------- FIX: #12289 シャットダウン時の優先度を変更 Ticket Links: :----------- http://sourceforge.jp/projects/o2on/tracker/detail/12289 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/main.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/main.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/main.cpp 2008-05-21 14:22:30 UTC (rev 88) +++ branches/BRANCH_0043/o2on/src.o2on/main.cpp 2008-05-23 11:04:08 UTC (rev 89) @@ -281,6 +281,8 @@ static bool InitializeApp(TCHAR *cmdline, int cmdshow) { + SetProcessShutdownParameters(0x3FF, 0); + wchar_t msg[1024]; INITCOMMONCONTROLSEX icex; From o2on-svn @ lists.sourceforge.jp Sat May 24 12:14:36 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Sat, 24 May 2008 12:14:36 +0900 Subject: [o2on-svn] =?utf-8?b?WzkwXSBGSVg6ICBEQuOCquODvOODl+ODs+WkseaVlw==?= =?utf-8?b?5pmC44Gr6JC944Gh44KL5ZWP6aGM?= Message-ID: <1211598876.428764.2346.nullmailer@users.sourceforge.jp> Revision: 90 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=90 Author: k-uehara Date: 2008-05-24 12:14:36 +0900 (Sat, 24 May 2008) Log Message: ----------- FIX: DBオープン失敗時に落ちる問題 stmtの初期化を最初に行うように変更 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-05-23 11:04:08 UTC (rev 89) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-05-24 03:14:36 UTC (rev 90) @@ -281,14 +281,14 @@ stopwatch sw("select"); #endif wstrarray cols; + sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; - sqlite3 *db = NULL; int err = sqlite3_open16(dbfilename.c_str(), &db); if (err != SQLITE_OK) goto error; sqlite3_busy_timeout(db, 5000); - sqlite3_stmt *stmt = NULL; err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); if (err != SQLITE_OK) goto error; @@ -337,6 +337,8 @@ bool ret = true; sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); if (err != SQLITE_OK) goto error; @@ -348,7 +350,6 @@ L" from dat" L" order by random() limit 1;"; - sqlite3_stmt *stmt = NULL; err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); if (err != SQLITE_OK) goto error; @@ -391,6 +392,8 @@ bool ret = true; sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); if (err != SQLITE_OK) goto error; @@ -402,7 +405,6 @@ L" from dat" L" where hash = ?;"; - sqlite3_stmt *stmt = NULL; err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); if (err != SQLITE_OK) goto error; @@ -444,6 +446,8 @@ bool ret = true; sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); if (err != SQLITE_OK) goto error; @@ -457,7 +461,6 @@ L" and bbsname = ?" L" order by random() limit 1;"; - sqlite3_stmt *stmt = NULL; err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); if (err != SQLITE_OK) goto error; @@ -505,6 +508,8 @@ bool ret = true; sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); if (err != SQLITE_OK) goto error; @@ -518,7 +523,6 @@ L" and bbsname = ?" L" and datname = ?;"; - sqlite3_stmt *stmt = NULL; err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); if (err != SQLITE_OK) goto error; @@ -1233,6 +1237,8 @@ #endif sqlite3 *db = NULL; + sqlite3_stmt *stmt = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); if (err != SQLITE_OK) goto error; @@ -1241,7 +1247,6 @@ wchar_t *sql = L"delete from dat where hash = ?;"; - sqlite3_stmt *stmt = NULL; err = sqlite3_prepare16_v2(db, sql, wcslen(sql)*2, &stmt, NULL); if (err != SQLITE_OK) goto error; From o2on-svn @ lists.sourceforge.jp Sat May 24 19:39:43 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Sat, 24 May 2008 19:39:43 +0900 Subject: [o2on-svn] =?utf-8?b?WzkxXSBGSVg6ICDjgrnjg6znlarlj7fjgYzplbfjgZk=?= =?utf-8?b?44GO44KL44Go6JC944Gh44KL?= Message-ID: <1211625583.660812.17969.nullmailer@users.sourceforge.jp> Revision: 91 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=91 Author: k-uehara Date: 2008-05-24 19:39:43 +0900 (Sat, 24 May 2008) Log Message: ----------- FIX: スレ番号が長すぎると落ちる http://pc11.2ch.net/test/read.cgi/tech/1180440415/856 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatPath.h Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatPath.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatPath.h 2008-05-24 03:14:36 UTC (rev 90) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatPath.h 2008-05-24 10:39:43 UTC (rev 91) @@ -336,7 +336,7 @@ bool checkdatname(const char *dat) { - if (strlen(dat) < 13) + if (strlen(dat) < 13 || strlen(dat) > 15) return false; char *endptr; From o2on-svn @ lists.sourceforge.jp Sat May 24 22:51:45 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Sat, 24 May 2008 22:51:45 +0900 Subject: [o2on-svn] [92] ADD: O2DatDB::analyze() Message-ID: <1211637105.458446.1001.nullmailer@users.sourceforge.jp> Revision: 92 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=92 Author: k-uehara Date: 2008-05-24 22:51:45 +0900 (Sat, 24 May 2008) Log Message: ----------- ADD: O2DatDB::analyze() Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-05-24 10:39:43 UTC (rev 91) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-05-24 13:51:45 UTC (rev 92) @@ -273,6 +273,39 @@ +bool +O2DatDB:: +analyze(void) +{ +#if TRACE_SQL_EXEC_TIME + stopwatch sw("analyze/vacuum"); +#endif + + sqlite3 *db = NULL; + int err = sqlite3_open16(dbfilename.c_str(), &db); + if (err != SQLITE_OK) + goto error; + + char sql[] = "analyze; vacuum dat;"; + + err = sqlite3_exec(db, sql, NULL, 0, 0); + if (err != SQLITE_OK) + goto error; + + err = sqlite3_close(db); + if (err != SQLITE_OK) + goto error; + return true; + +error: + log(db); + if (db) sqlite3_close(db); + return false; +} + + + + size_t O2DatDB:: select(const wchar_t *sql, SQLResultList &out) Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h 2008-05-24 10:39:43 UTC (rev 91) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h 2008-05-24 13:51:45 UTC (rev 92) @@ -79,6 +79,7 @@ bool create_table(void); bool reindex(const char *target); + bool analyze(void); size_t select(const wchar_t *sql, SQLResultList &out); bool select(O2DatRec &out); From o2on-svn @ lists.sourceforge.jp Tue May 27 21:48:10 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Tue, 27 May 2008 21:48:10 +0900 Subject: [o2on-svn] =?utf-8?b?WzkzXSAgSU11bHRpTGFuZ3VhZ2Uy44Gr5aSJ5pu0?= Message-ID: <1211892490.881786.32224.nullmailer@users.sourceforge.jp> Revision: 93 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=93 Author: k-uehara Date: 2008-05-27 21:48:10 +0900 (Tue, 27 May 2008) Log Message: ----------- IMultiLanguage2????? Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp 2008-05-24 13:51:45 UTC (rev 92) +++ branches/BRANCH_0043/o2on/src.o2on/dataconv.cpp 2008-05-27 12:48:10 UTC (rev 93) @@ -644,9 +644,9 @@ bool ToUnicode(const wchar_t *charset, const char *in, const uint len, wstring &out) { //IMultiLanguage?? - IMultiLanguage *lang = NULL; + IMultiLanguage2 *lang = NULL; HRESULT hr = CoCreateInstance(CLSID_CMultiLanguage, NULL, - CLSCTX_ALL, IID_IMultiLanguage, (LPVOID*)&lang); + CLSCTX_ALL, IID_IMultiLanguage2, (LPVOID*)&lang); assert(SUCCEEDED(hr)); //Charset????@@ -684,9 +684,9 @@ bool FromUnicode(const wchar_t *charset, const wchar_t *in, uint len, string &out) { //IMultiLanguage?? - IMultiLanguage *lang = NULL; + IMultiLanguage2 *lang = NULL; HRESULT hr = CoCreateInstance(CLSID_CMultiLanguage, NULL, - CLSCTX_ALL, IID_IMultiLanguage, (LPVOID*)&lang); + CLSCTX_ALL, IID_IMultiLanguage2, (LPVOID*)&lang); assert(SUCCEEDED(hr)); //Charset???? From o2on-svn @ lists.sourceforge.jp Tue May 27 22:28:54 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Tue, 27 May 2008 22:28:54 +0900 Subject: [o2on-svn] =?utf-8?b?Wzk0XSBBREQ6ICDjg6Hjg4vjg6Xjg7zjgYvjgonjga5h?= =?utf-8?q?nalyze?= Message-ID: <1211894934.588878.31767.nullmailer@users.sourceforge.jp> Revision: 94 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=94 Author: k-uehara Date: 2008-05-27 22:28:54 +0900 (Tue, 27 May 2008) Log Message: ----------- ADD: ?<??ャ??????nalyze Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h branches/BRANCH_0043/o2on/src.o2on/main.cpp branches/BRANCH_0043/o2on/src.o2on/resource.h branches/BRANCH_0043/o2on/src.o2on/resource.rc Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-05-27 12:48:10 UTC (rev 93) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatIO.cpp 2008-05-27 13:28:54 UTC (rev 94) @@ -44,6 +44,7 @@ , ReindexThreadHandle(NULL) , LoopRebuildDB(false) , EnumDatThreadNum(0) + , AnalyzeThreadHandle(0) { DWORD BytesPerSector; @@ -878,6 +879,7 @@ CoInitialize(NULL); me->RebuildDBThread(me->Profile->GetCacheRootW(), 0); + me->DatDB->analyze(); CoUninitialize(); CloseHandle(me->RebuildDBThreadHandle); @@ -1148,3 +1150,34 @@ //_endthreadex(0); return (0); } + +void +O2DatIO:: +Analyze(void) +{ + if (AnalyzeThreadHandle) + return; + AnalyzeThreadHandle = (HANDLE)_beginthreadex( + NULL, 0, StaticAnalyzeThread, (void*)this, 0, NULL); +} + +uint WINAPI +O2DatIO:: +StaticAnalyzeThread(void *data) +{ + O2DatIO *me = (O2DatIO*)data; + + CoInitialize(NULL); + me->ProgressInfo->Reset(true, false); + me->ProgressInfo->SetMessage(L"analyze..."); + me->ProgressInfo->AddMax(2); + me->ProgressInfo->pos = 1; + me->DatDB->analyze(); + me->ProgressInfo->Reset(false, false); + CoUninitialize(); + + CloseHandle(me->AnalyzeThreadHandle); + me->AnalyzeThreadHandle = NULL; + + return (0); +} \ No newline at end of file Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h 2008-05-27 12:48:10 UTC (rev 93) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatIO.h 2008-05-27 13:28:54 UTC (rev 94) @@ -36,6 +36,7 @@ HANDLE RebuildDBThreadHandle; HANDLE ReindexThreadHandle; + HANDLE AnalyzeThreadHandle; bool LoopRebuildDB; uint EnumDatThreadNum; Mutex EnumDatThreadNumLock; @@ -83,4 +84,6 @@ void Reindex(void); static uint WINAPI StaticReindexThread(void *data); + void Analyze(void); + static uint WINAPI StaticAnalyzeThread(void *data); }; Modified: branches/BRANCH_0043/o2on/src.o2on/main.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/main.cpp 2008-05-27 12:48:10 UTC (rev 93) +++ branches/BRANCH_0043/o2on/src.o2on/main.cpp 2008-05-27 13:28:54 UTC (rev 94) @@ -1070,6 +1070,12 @@ DatIO->Reindex(); } break; + case ID_ANALYZE: + if (!Active && !hwndProgressDlg) { + CreateProgressDialog(_T("analyze...")); + DatIO->Analyze(); + } + break; case ID_OPENWEBADMIN: { wstring type = Profile->GetAdminBrowserType(); wstring path = Profile->GetAdminBrowserPath(); Modified: branches/BRANCH_0043/o2on/src.o2on/resource.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/resource.h 2008-05-27 12:48:10 UTC (rev 93) +++ branches/BRANCH_0043/o2on/src.o2on/resource.h 2008-05-27 13:28:54 UTC (rev 94) @@ -79,6 +79,7 @@ #define ID_REBUILDDB 40010 #define ID_DB40013 40013 #define ID_REINDEX 40014 +#define ID_ANALYZE 40016 // Next default values for new objects // Modified: branches/BRANCH_0043/o2on/src.o2on/resource.rc =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/resource.rc 2008-05-27 12:48:10 UTC (rev 93) +++ branches/BRANCH_0043/o2on/src.o2on/resource.rc 2008-05-27 13:28:54 UTC (rev 94) @@ -66,6 +66,7 @@ BEGIN MENUITEM "???(&B)", ID_REBUILDDB MENUITEM "reindex(&I)", ID_REINDEX + MENUITEM "analyze(&L)", ID_ANALYZE END MENUITEM SEPARATOR MENUITEM "???????&A)...", ID_ABOUT From o2on-svn @ lists.sourceforge.jp Wed May 28 19:01:18 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Wed, 28 May 2008 19:01:18 +0900 Subject: [o2on-svn] =?utf-8?b?Wzk1XSAg5Yid5pyf44OO44O844OJ6L+95Yqg5omL6aCG?= =?utf-8?b?44Gu5aSJ5pu0?= Message-ID: <1211968878.448127.9737.nullmailer@users.sourceforge.jp> Revision: 95 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=95 Author: k-uehara Date: 2008-05-28 19:01:18 +0900 (Wed, 28 May 2008) Log Message: ----------- 初期ノード追加手順の変更 Modified Paths: -------------- branches/BRANCH_0043/o2on/doc/readme.txt Modified: branches/BRANCH_0043/o2on/doc/readme.txt =================================================================== --- branches/BRANCH_0043/o2on/doc/readme.txt 2008-05-27 13:28:54 UTC (rev 94) +++ branches/BRANCH_0043/o2on/doc/readme.txt 2008-05-28 10:01:18 UTC (rev 95) @@ -27,8 +27,8 @@ 4. トレイアイコンから「P2P起動」 5. トレイアイコンから「管理画面」 -6. ノード画面の「初期ノード追加」を押す -7. 初期ノード文字列をコピペして「OK」 +6. ノード画面の「URLから追加」を押す +7. そのまま「OK」 5. 専ブラ起動 6. 専ブラの読み込みプロキシを「127.0.0.1:プロキシポート番号(デフォルト8000)」に設定 From o2on-svn @ lists.sourceforge.jp Thu May 29 12:38:14 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Thu, 29 May 2008 12:38:14 +0900 Subject: [o2on-svn] =?utf-8?b?Wzk2XSBGSVg6ICBEQuWGjeani+evieOBpyAiIGRhdGFi?= =?utf-8?b?YXNlIGlzIGxvY2tlZCIg44Ko44Op44O844GM6aC755m644GZ44KL44GT44Go?= =?utf-8?b?44GM44GC44KL?= Message-ID: <1212032294.928718.18795.nullmailer@users.sourceforge.jp> Revision: 96 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=96 Author: electrolysis Date: 2008-05-29 12:38:14 +0900 (Thu, 29 May 2008) Log Message: ----------- FIX: DB再構築で"database is locked"エラーが頻発することがある 詳細: 一回のトランザクションで処理する件数を最大で1000に制限して小分けし、個々のトランザクションに要する時間を短縮する Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-05-28 10:01:18 UTC (rev 95) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-05-29 03:38:14 UTC (rev 96) @@ -17,6 +17,7 @@ #include #define UPDATE_THREAD_INTERVAL_S 15 +#define MAX_UPDATE_QUEUE_SIZE 1000 #if defined(_DEBUG) #define TRACE_SQL_EXEC_TIME 1 @@ -1261,6 +1262,31 @@ +void +O2DatDB:: +divide_update(O2DatRecList &in) +{ + if (in.size() > MAX_UPDATE_QUEUE_SIZE) { + O2DatRecListIt begin = in.begin(); + O2DatRecListIt end = in.begin(); + while (end != in.end()) { + begin = end; + if (std::distance(end, in.end()) < MAX_UPDATE_QUEUE_SIZE) + end = in.end(); + else + std::advance(end, MAX_UPDATE_QUEUE_SIZE); + + O2DatRecList tmp(begin, end); + update(tmp); + } + } + else + update(in); +} + + + + bool O2DatDB:: remove(const hashT &hash) @@ -1364,7 +1390,7 @@ UpdateQueueLock.Lock(); if (!UpdateQueue.empty()) { - update(UpdateQueue); + divide_update(UpdateQueue); UpdateQueue.clear(); } UpdateQueueLock.Unlock(); @@ -1398,7 +1424,7 @@ UpdateQueueLock.Unlock(); if (!reclist.empty()) - update(reclist); + divide_update(reclist); t = time(NULL); CLEAR_WORKSET; //TRACEA("+++++ UPDATE +++++\n"); Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h 2008-05-28 10:01:18 UTC (rev 95) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h 2008-05-29 03:38:14 UTC (rev 96) @@ -97,6 +97,7 @@ // bool update(O2DatRec &in, bool is_origurl); void update(O2DatRecList &in); // bool update_lastpublish(const hashT &hash); + void divide_update(O2DatRecList &in); bool remove(const hashT &hash); From o2on-svn @ lists.sourceforge.jp Thu May 29 13:52:17 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Thu, 29 May 2008 13:52:17 +0900 Subject: [o2on-svn] =?utf-8?b?Wzk3XSBGSVg6ICAjMTI1NTMgVVBuUOOBjOOBhuOBvg==?= =?utf-8?b?44GP5YuV44GL44Gq44GE44Or44O844K/44GM44GC44KL?= Message-ID: <1212036737.859830.12936.nullmailer@users.sourceforge.jp> Revision: 97 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=97 Author: electrolysis Date: 2008-05-29 13:52:17 +0900 (Thu, 29 May 2008) Log Message: ----------- FIX: #12553 UPnPがうまく動かないルータがある 詳細: 1. URLBaseがあれば使用する 2. Hostヘッダにポート番号を付ける(デフォルトポート除く) Ticket Links: :----------- http://sourceforge.jp/projects/o2on/tracker/detail/12553 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2Protocol.h branches/BRANCH_0043/o2on/src.o2on/simplehttpsocket.h branches/BRANCH_0043/o2on/src.o2on/upnp_description.h Modified: branches/BRANCH_0043/o2on/src.o2on/O2Protocol.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Protocol.h 2008-05-29 03:38:14 UTC (rev 96) +++ branches/BRANCH_0043/o2on/src.o2on/O2Protocol.h 2008-05-29 04:52:17 UTC (rev 97) @@ -92,7 +92,7 @@ profile->GetFlags(flags); header.AddFieldString("Connection", "close"); - header.AddFieldString("Host", header.hostname.c_str()); + header.AddFieldString("Host", header.host.c_str()); header.AddFieldString("User-Agent", profile->GetUserAgentA()); header.AddFieldString(X_O2_NODE_ID, hashstr.c_str()); header.AddFieldString(X_O2_RSAPUBLICKEY, pubkey.c_str()); Modified: branches/BRANCH_0043/o2on/src.o2on/simplehttpsocket.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/simplehttpsocket.h 2008-05-29 03:38:14 UTC (rev 96) +++ branches/BRANCH_0043/o2on/src.o2on/simplehttpsocket.h 2008-05-29 04:52:17 UTC (rev 97) @@ -71,7 +71,7 @@ hdr.method = "GET"; hdr.url = url; hdr.AddFieldString("Connection", "close"); - hdr.AddFieldString("Host", hdr.hostname.c_str()); + hdr.AddFieldString("Host", hdr.host.c_str()); if (!useragent.empty()) hdr.AddFieldString("User-Agent", useragent.c_str()); if (body && bodylen) @@ -101,7 +101,7 @@ hdr.url = url; hdr.AddFieldString("Connection", "close", false); - hdr.AddFieldString("Host", hdr.hostname.c_str(), false); + hdr.AddFieldString("Host", hdr.host.c_str(), false); if (!useragent.empty()) hdr.AddFieldString("User-Agent", useragent.c_str(), false); if (body && bodylen) Modified: branches/BRANCH_0043/o2on/src.o2on/upnp_description.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/upnp_description.h 2008-05-29 03:38:14 UTC (rev 96) +++ branches/BRANCH_0043/o2on/src.o2on/upnp_description.h 2008-05-29 04:52:17 UTC (rev 97) @@ -334,7 +334,12 @@ string str; unicode2ascii(chars, length, str); - if (wcsstr(cur_element.c_str(), L"URL")) { + if (wcsstr(cur_element.c_str(), L"URLBase")) { + if (str[str.size()-1] == '/') + str.erase(str.size()-1); + base_url = str; + } + else if (wcsstr(cur_element.c_str(), L"URL")) { if (strncmp(str.c_str(), "http://", 7) != 0) str = base_url + (str[0] == '/' ? "" : "/") + str; } From o2on-svn @ lists.sourceforge.jp Sat May 31 13:44:57 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Sat, 31 May 2008 13:44:57 +0900 Subject: [o2on-svn] =?utf-8?b?Wzk4XSBvMm9uLiBleGXjga5VUFjlnKfnuK7jgpLlu4M=?= =?utf-8?b?5q2i?= Message-ID: <1212209097.226617.9069.nullmailer@users.sourceforge.jp> Revision: 98 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=98 Author: k-uehara Date: 2008-05-31 13:44:57 +0900 (Sat, 31 May 2008) Log Message: ----------- o2on.exe??PX?х軒???罩? Modified Paths: -------------- branches/BRANCH_0043/o2on/doc/build.txt branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj Modified: branches/BRANCH_0043/o2on/doc/build.txt =================================================================== --- branches/BRANCH_0043/o2on/doc/build.txt 2008-05-29 04:52:17 UTC (rev 97) +++ branches/BRANCH_0043/o2on/doc/build.txt 2008-05-31 04:44:57 UTC (rev 98) @@ -7,7 +7,7 @@ ?zlib 1.2.3 ?Xerces-C++ 2.8.0 ?SQLite 3.5.6 -?UPX 3.02 +?UPX 3.03 ?MiniZip Ver0.02c ???? @@ -155,12 +155,13 @@ +-sqlite ------------------------------------------------------------------------------ - UPX 3.02 + UPX 3.03 ------------------------------------------------------------------------------ +?: UPX???g????????? http://upx.sourceforge.net/#download -upx302w.zip???????? +upx303w.zip???????? -?upx302w.zip??upx.exe?o2on???????? +?upx303w.zip??upx.exe?o2on???????? +-o2on +-cryptopp +-zlib Modified: branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj 2008-05-29 04:52:17 UTC (rev 97) +++ branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj 2008-05-31 04:44:57 UTC (rev 98) @@ -33,7 +33,7 @@ /> From o2on-svn @ lists.sourceforge.jp Sat May 31 14:37:00 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Sat, 31 May 2008 14:37:00 +0900 Subject: [o2on-svn] =?utf-8?b?Wzk5XSAgYnVpbGQgMDA0NCDjg6rjg6rjg7zjgrk=?= Message-ID: <1212212220.137923.13179.nullmailer@users.sourceforge.jp> Revision: 99 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=99 Author: k-uehara Date: 2008-05-31 14:37:00 +0900 (Sat, 31 May 2008) Log Message: ----------- build 0044 ????若? Modified Paths: -------------- branches/BRANCH_0043/o2on/doc/history.txt branches/BRANCH_0043/o2on/src.o2on/O2Version.h Modified: branches/BRANCH_0043/o2on/doc/history.txt =================================================================== --- branches/BRANCH_0043/o2on/doc/history.txt 2008-05-31 04:44:57 UTC (rev 98) +++ branches/BRANCH_0043/o2on/doc/history.txt 2008-05-31 05:37:00 UTC (rev 99) @@ -1,3 +1,22 @@ +v0.02? (build 0044) 2008/05/31 +?analyze??????????? +?datname?????????? +??????Z?2???) +????????????? +?UPnP???? +???????????????? +???????IMultiLanguage2??? +?UPX???? +* ??????? +?DB????ク?????? +?DB????"database is locked"????????????? +?Reindex?????????? +?????????????? +?SQL???????(2?) +?IM??(2?) +????????OFF??????????? +?EUC-JP?dat??? + v0.02? (build 0043) 2008/03/17 ??????????I???????? ???????????????? Modified: branches/BRANCH_0043/o2on/src.o2on/O2Version.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2Version.h 2008-05-31 04:44:57 UTC (rev 98) +++ branches/BRANCH_0043/o2on/src.o2on/O2Version.h 2008-05-31 05:37:00 UTC (rev 99) @@ -4,7 +4,7 @@ #define APP_NAME "o2on" #define APP_VER_MAJOR 0 #define APP_VER_MINOR 2 -#define APP_BUILDNO 43 +#define APP_BUILDNO 44 #define APP_VER_PREFIX "alpha" #define APP_VER_FORMAT "%s %1d.%02d %s (build %04d)" #define USERAGENT_FORMAT "%s/%.1f (%s/%1d.%02d.%04d; %s)" \ No newline at end of file From o2on-svn @ lists.sourceforge.jp Sat May 31 15:51:40 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Sat, 31 May 2008 15:51:40 +0900 Subject: [o2on-svn] =?utf-8?b?WzEwMF0gIOODu2FuYWx5emXjgpLmiYvli5XjgafooYw=?= =?utf-8?b?44GG44KI44GG44Gr44GX44Gf?= Message-ID: <1212216700.149521.663.nullmailer@users.sourceforge.jp> Revision: 100 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=100 Author: k-uehara Date: 2008-05-31 15:51:40 +0900 (Sat, 31 May 2008) Log Message: ----------- ・analyzeを手動で行うようにした ・datnameのインデックスを作成 ・終了時間の短縮(2秒程度) ・強制スワップアウトを廃止 ・UPnP対応強化 ・シャットダウン時の優先度を変更 ・コード変換をIMultiLanguage2に変更 ・UPXをやめた * バグフィックス ・DBオープン失敗時に落ちる ・DB再構築で"database is locked"エラーが頻発することがある ・Reindexでのエラー時に落ちる ・スレ番号が長すぎると落ちる ・SQL発行画面のバグ(2件) ・IM関係(2件) ・補完時バルーンOFFの設定が動作していない ・EUC-JPのdatに対応 Added Paths: ----------- tags/build0044/ Copied: tags/build0044 (from rev 99, branches/BRANCH_0043) From o2on-svn @ lists.sourceforge.jp Wed Jun 18 00:11:07 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Wed, 18 Jun 2008 00:11:07 +0900 Subject: [o2on-svn] =?utf-8?b?WzEwMV0gIOODqeOCpOODluODqeODquOCouODg+ODlw==?= =?utf-8?b?44OH44O844OIIDogQm9vc3QgMS4zNS4wIC8gIFNRTGl0ZSAzLjUuOQ==?= Message-ID: <1213715467.054926.17036.nullmailer@users.sourceforge.jp> Revision: 101 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=101 Author: k-uehara Date: 2008-06-18 00:11:06 +0900 (Wed, 18 Jun 2008) Log Message: ----------- ????????????????? Boost 1.35.0 / SQLite 3.5.9 ????ャ??潟??贋?: x64???菴違???? Modified Paths: -------------- branches/BRANCH_0043/o2on/doc/build.txt branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj Modified: branches/BRANCH_0043/o2on/doc/build.txt =================================================================== --- branches/BRANCH_0043/o2on/doc/build.txt 2008-05-31 06:51:40 UTC (rev 100) +++ branches/BRANCH_0043/o2on/doc/build.txt 2008-06-17 15:11:06 UTC (rev 101) @@ -2,24 +2,25 @@ ?Visual C++ 2005 ?Platform SDK 2003 Server R2 -?Boost 1.34.1 +?Boost 1.35.0 ?Crypto++ Library 5.5.2 -?zlib 1.2.3 ?Xerces-C++ 2.8.0 -?SQLite 3.5.6 -?UPX 3.03 -?MiniZip Ver0.02c +?zlib 1.2.3 +?SQLite 3.5.9 ???? +?MiniZip Ver0.02c +?UPX 3.03 + ??????F ------------------------------------------------------------------------------ Visual C++ 2005 Express Edition ------------------------------------------------------------------------------ Visual Studio 2005????????????????Express???????? -???Expres????????????????Win32 Release???????????? +???Express????????????????Win32 Release???????????? http://www.microsoft.com/japan/msdn/vstudio/express/past/2005/ http://www.microsoft.com/japan/msdn/vstudio/express/maninstall/ (ISO????) @@ -53,31 +54,43 @@ ------------------------------------------------------------------------------ - Boost 1.34.1 + Boost 1.35.0 ------------------------------------------------------------------------------ http://sourceforge.net/project/showfiles.php?group_id=7586 -boost_1_34_1?boost-jam-3.1.16-1-ntx86.zip??????? +boost_1_35_0?boost-jam-3.1.16-1-ntx86.zip??????? -?boost_1_34_1?????????i??D:\project\boost_1_34_1? -?boost-jam-3.1.16-1-ntx86.zip??bjam.exe?boost_1_34_1??????? +?boost_1_35_0?????????i??D:\project\boost_1_35_0? +?boost-jam-3.1.16-1-ntx86.zip??bjam.exe?boost_1_35_0??????? ?bjam???? + Platform SDK????????????Set Windows XP 32-bit Build Environment (Retail)? + > C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat > D: - > cd D:\project\boost_1_34_1 - > bjam "-sTOOLS=vc-8_0" stage + > cd D:\project\boost_1_35_0 + > bjam --toolset=msvc link=static runtime-link=static threading=multi release debug stage ?Visual Studio???????????? - D:\project\boost_1_34_1 ? ????????????? - D:\project\boost_1_34_1\stage\lib ? ???????????? + D:\project\boost_1_35_0 ? ????????????? + D:\project\boost_1_35_0\stage\lib ? ???????????? -[x64] - ????????????????????????? - > D: - > cd D:\project\boost_1_34_1_x64 - > bjam "-sTOOLS=vc-8_0-amd64" stage - D:\project\boost_1_34_1_x64 ? x64?????????????? - D:\project\boost_1_34_1_x64\stage\lib ? x64????????????? +------------------------------------------------------------------------------ + Xerces-C++ 2.8.0 +------------------------------------------------------------------------------ +http://xerces.apache.org/xerces-c/download.cgi +xerces-c-src_2_8_0.zip +?xerces-c-src2_8_0\Projects\Win32\VC8\xerces-all\xerces-all.sln ??? + +???????????????????????????? + XercesLib Static Debug Win32 Static Debug|Win32 + XercesLib Static Release Win32 Static Release|Win32 + +?Visual Studio???????????? + xerces-c-src_2_8_0\src ? ????????????? + xerces-c-src_2_8_0\Build\Win32\VC8\StaticDebug ? ???????????? + xerces-c-src_2_8_0\Build\Win32\VC8\StaticRelease ? ???????????? + + ------------------------------------------------------------------------------ Crypto++ Library 5.5.2 ------------------------------------------------------------------------------ @@ -89,15 +102,10 @@ ?cryptest.sln??? ????????????????????????? - [x86] cryptlib Debug Win32 Debug|Win32 cryptlib Release Win32 Release|Win32 - [x64] - cryptlib Debug Win32 Debug|x64 - cryptlib Release Win32 Release|x64 - ------------------------------------------------------------------------------ zlib 1.2.3 ------------------------------------------------------------------------------ @@ -111,63 +119,32 @@ ------------------------------------------------------------------------------ - Xerces-C++ 2.8.0 + SQLite 3.5.9 ------------------------------------------------------------------------------ -http://xml.apache.org/xerces-c/download.cgi -xerces-c-src_2_8_0.zip - -?xerces-c-src2_8_0\Projects\Win32\VC8\xerces-all\xerces-all.sln ??? - -???????????????????????????? - XercesLib Static Debug Win32 Static Debug|Win32 - XercesLib Static Release Win32 Static Release|Win32 - -?Visual Studio???????????? - xerces-c-src_2_8_0\src ? ????????????? - xerces-c-src_2_8_0\Build\Win32\VC8\StaticDebug ? ???????????? - xerces-c-src_2_8_0\Build\Win32\VC8\StaticRelease ? ???????????? - -[x64] - ???????????????????? - ??????? ??????? ????????????????...? - ?????????????x64???OK - ???????? ????????XercesLib??????????????? - ??????????x64?????????? - ????Static Debug??Static Release??????????????Win32? - ?????????64??????B???????????XERCES_NO_ASM???? - ???????????????????????????? - XercesLib Static Debug x64 Static Debug|x64 - XercesLib Static Release x64 Static Release|x64 - ?Visual Studio???????????? - xerces-c-src_2_8_0\src ? ????????????? - xerces-c-src_2_8_0\Build\x64\VC8\StaticDebug ? ???????????? - xerces-c-src_2_8_0\Build\x64\VC8\StaticRelease ? ???????????? - ------------------------------------------------------------------------------- - SQLite 3.5.6 ------------------------------------------------------------------------------- -http://www.sqlite.org/index.html -?sqlite-3_5_6.zip ???????????? +http://www.sqlite.org/ +?sqlite-3_5_9.zip ???????????? ??????????sqlite?????o2on???????? +-o2on +-cryptopp +-zlib +-sqlite + ------------------------------------------------------------------------------ - UPX 3.03 + ??? ------------------------------------------------------------------------------ -?: UPX???g????????? -http://upx.sourceforge.net/#download -upx303w.zip???????? +http://www.trick-palace.net/cxx/ex/babel/ +babel.zip??????? -?upx303w.zip??upx.exe?o2on???????? +??????????? +??????????babel?????o2on???????? +-o2on +-cryptopp +-zlib +-sqlite - +-upx.exe + +-babel + ------------------------------------------------------------------------------ MiniZip Ver0.02c ------------------------------------------------------------------------------ @@ -179,21 +156,21 @@ +-cryptopp +-zlib +-sqlite - +-upx.exe + +-babel +-mzp.exe + ------------------------------------------------------------------------------ - ??? + UPX 3.03 ------------------------------------------------------------------------------ -http://www.trick-palace.net/cxx/ex/babel/ -babel.zip??????? +?: UPX???g????????? +http://upx.sourceforge.net/#download +upx303w.zip???????? -??????????? -??????????babel?????o2on???????? +?upx303w.zip??upx.exe?o2on???????? +-o2on +-cryptopp +-zlib +-sqlite - +-upx.exe +-mzp.exe - +-babel + +-upx.exe Modified: branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj 2008-05-31 06:51:40 UTC (rev 100) +++ branches/BRANCH_0043/o2on/src.o2on/o2on.vcproj 2008-06-17 15:11:06 UTC (rev 101) @@ -1731,6 +1731,26 @@ + + + + + + + + + + + + + + + + Revision: 102 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=102 Author: k-uehara Date: 2008-06-25 17:54:46 +0900 (Wed, 25 Jun 2008) Log Message: ----------- FIX: コンパイラの警告が出ないようにキャスト Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2IPFilter.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/O2IPFilter.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2IPFilter.cpp 2008-06-17 15:11:06 UTC (rev 101) +++ branches/BRANCH_0043/o2on/src.o2on/O2IPFilter.cpp 2008-06-25 08:54:46 UTC (rev 102) @@ -61,7 +61,7 @@ O2IPFilter:: getdefault(void) { - return (DefaultFlag); + return ((bool)DefaultFlag); } From o2on-svn @ lists.sourceforge.jp Thu Jun 26 20:53:50 2008 From: o2on-svn @ lists.sourceforge.jp (o2on svn commit) Date: Thu, 26 Jun 2008 20:53:50 +0900 Subject: [o2on-svn] [103] FIX: for rev102 Message-ID: <1214481230.187416.13445.nullmailer@users.sourceforge.jp> Revision: 103 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=103 Author: k-uehara Date: 2008-06-26 20:53:50 +0900 (Thu, 26 Jun 2008) Log Message: ----------- FIX: for rev102 キャストでは不十分だったのできちんと対応 Revision Links: -------------- http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=102 Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2IPFilter.cpp Modified: branches/BRANCH_0043/o2on/src.o2on/O2IPFilter.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2IPFilter.cpp 2008-06-25 08:54:46 UTC (rev 102) +++ branches/BRANCH_0043/o2on/src.o2on/O2IPFilter.cpp 2008-06-26 11:53:50 UTC (rev 103) @@ -61,7 +61,7 @@ O2IPFilter:: getdefault(void) { - return ((bool)DefaultFlag); + return (DefaultFlag != 0); }