| 22 |
* |
* |
| 23 |
* $Revision$ |
* $Revision$ |
| 24 |
* $Log$ |
* $Log$ |
| 25 |
|
* Revision 1.118.2.2 2006/02/28 04:49:17 aga4096 |
| 26 |
|
* ・NIJC code, guestのon/offを書き換えたときに item_status をリセットする. |
| 27 |
|
* |
| 28 |
|
* Revision 1.118.2.1 2006/02/14 05:13:17 aga4096 |
| 29 |
|
* ・アイテムが private/index_a と public/index_b に登録された状態で、 private/index_aを削除するとおかしくなるのを修正. |
| 30 |
|
* |
| 31 |
* Revision 1.118 2006/01/10 10:56:30 tani |
* Revision 1.118 2006/01/10 10:56:30 tani |
| 32 |
* selectiveHarvesting:stat.item_idでorder by(asc) |
* selectiveHarvesting:stat.item_idでorder by(asc) |
| 33 |
* |
* |
| 6457 |
for ( int i = descXIDLen-1; i >= 0; i-- ){ // 逆方向にして、途中で失敗した場合の惨事を防ぐ。descXIDは幅優先探索順に並んでいるので。 |
for ( int i = descXIDLen-1; i >= 0; i-- ){ // 逆方向にして、途中で失敗した場合の惨事を防ぐ。descXIDは幅優先探索順に並んでいるので。 |
| 6458 |
string strXID = unsignedIntToString(descXID[i]); |
string strXID = unsignedIntToString(descXID[i]); |
| 6459 |
string linkTable = dbprefix + "_xoonips_index_item_link"; |
string linkTable = dbprefix + "_xoonips_index_item_link"; |
| 6460 |
|
string indexTable = dbprefix + "_xoonips_index"; |
| 6461 |
|
|
| 6462 |
// descXID[i] のアイテムの中で、被参照数が1のものを列挙 → 迷子にならないように移動 |
|
| 6463 |
// HAVINGを使うべき? "select item_id, count(*) as v1, sum(index_id=$index_id) as v2 from $link_table having v1=1 and v2=1" |
// descXID[i]がPrivate以下 && descXID[i]内のアイテムIを参照するPrivateなindexが1個しかない → Iを迷子にならないように親に移動 |
| 6464 |
// しかしsum内に<predicate>を書いてもいいのだろうか? 代わりにnullifとcoalesceならsqliteは通るが・・・ |
if ( index->getOpenLevel() == index::OL_PRIVATE ){ |
| 6465 |
// → 互換性の高い方法がよくわからないので、とりあえず自己joinにする。 |
string sql( "SELECT t1.index_item_link_id, t1.item_id, count(*) " |
| 6466 |
string sql( "SELECT t1.index_item_link_id " |
" FROM " + linkTable + " AS t1 " |
| 6467 |
" FROM " + linkTable + " AS t1 " |
" LEFT JOIN " + linkTable + " AS t2 ON t1.item_id = t2.item_id " |
| 6468 |
" LEFT JOIN " + linkTable + " AS t2 ON t1.item_id = t2.item_id and t2.index_id <> t1.index_id " |
" LEFT JOIN " + indexTable + " AS tx2 on t2.index_id = tx2.index_id " |
| 6469 |
" WHERE t1.index_id=" + strXID + " and t2.item_id is NULL" ); |
" WHERE t1.index_id=" + strXID + |
| 6470 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
" and tx2.open_level = " + unsignedIntToString(index::OL_PRIVATE) + |
| 6471 |
SQLUINTEGER sLinkID = 0; |
" group by t1.item_id " ); |
| 6472 |
SQLLEN len = 0; |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 6473 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &sLinkID, 0, &len ); |
SQLUINTEGER sLinkID = 0, sItemID = 0, sCount = 0; |
| 6474 |
while ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
SQLLEN len1 = 0, len2 = 0, len3 = 0; |
| 6475 |
string sql2( "UPDATE " + linkTable + " set index_id= " + strParentXID + " where index_item_link_id = " + unsignedIntToString(sLinkID) ); |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &sLinkID, 0, &len1 ); |
| 6476 |
result = querySimple( "deleteIndex", sql2 ); |
SQLBindCol( hstmt, 2, SQL_C_ULONG, &sItemID, 0, &len2 ); |
| 6477 |
if( result != RES_OK ) |
SQLBindCol( hstmt, 3, SQL_C_ULONG, &sCount , 0, &len3 ); |
| 6478 |
|
while ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 6479 |
|
if ( sCount == 1 ){ |
| 6480 |
|
string sql2( "UPDATE " + linkTable + " set index_id= " + strParentXID + " where index_item_link_id = " + unsignedIntToString(sLinkID) ); |
| 6481 |
|
result = querySimple( "deleteIndex", sql2 ); |
| 6482 |
|
if( result != RES_OK ) |
| 6483 |
|
break; |
| 6484 |
|
} |
| 6485 |
|
} |
| 6486 |
|
if ( result != RES_OK ) |
| 6487 |
break; |
break; |
| 6488 |
|
}else{ |
| 6489 |
|
string s( "SQLExecDirect in deleteIndex" ); |
| 6490 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 6491 |
|
s += "sql="; |
| 6492 |
|
s += string( sql ); |
| 6493 |
|
setLastErrorString( s.c_str( ) ); |
| 6494 |
|
result = RES_DB_QUERY_ERROR; |
| 6495 |
} |
} |
|
if ( result != RES_OK ) |
|
|
break; |
|
|
}else{ |
|
|
string s( "SQLExecDirect in deleteIndex" ); |
|
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
|
|
s += "sql="; |
|
|
s += string( sql ); |
|
|
setLastErrorString( s.c_str( ) ); |
|
|
result = RES_DB_QUERY_ERROR; |
|
|
break; |
|
| 6496 |
} |
} |
| 6497 |
|
|
| 6498 |
// descXID[i] のアイテムを全て削除 |
// descXID[i] のアイテムを全て削除 |
| 6499 |
sql = "DELETE from " + linkTable + " where index_id=" + strXID; |
string sql = "DELETE from " + linkTable + " where index_id=" + strXID; |
| 6500 |
result = querySimple( functionName, sql ); |
result = querySimple( functionName, sql ); |
| 6501 |
if ( result == RES_OK ){ |
if ( result == RES_OK ){ |
| 6502 |
// descXID[i] を削除 |
// descXID[i] を削除 |
| 6517 |
for ( int i = 0; i < affectedIIDsLen; i++ ){ |
for ( int i = 0; i < affectedIIDsLen; i++ ){ |
| 6518 |
insertMetadataEventAuto( affectedIIDs[i] ); |
insertMetadataEventAuto( affectedIIDs[i] ); |
| 6519 |
} |
} |
|
|
|
| 6520 |
}else{ |
}else{ |
| 6521 |
string s( "SQLAllocHandle in deleteIndex" ); |
string s( "SQLAllocHandle in deleteIndex" ); |
| 6522 |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 6643 |
SQLLEN cbKey = SQL_NTS, cbValue = SQL_NTS; |
SQLLEN cbKey = SQL_NTS, cbValue = SQL_NTS; |
| 6644 |
result_t ret = RES_ERROR; |
result_t ret = RES_ERROR; |
| 6645 |
|
|
| 6646 |
|
// nijc_code か guestのON/OFF を書き換えたときは、item_statusをリセットする. |
| 6647 |
|
bool isNijcOrGuest = ( strcmp( key, XNP_CONFIG_REPOSITORY_NIJC_CODE ) == 0 || strcmp( key, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY ) == 0 ); |
| 6648 |
|
char *oldValue = 0; |
| 6649 |
|
if ( isNijcOrGuest ) |
| 6650 |
|
getConfigValue( key, &oldValue ); |
| 6651 |
|
|
| 6652 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 6653 |
string sql( "UPDATE " + dbprefix + "_xoonips_config SET value=? WHERE name=?"); |
string sql( "UPDATE " + dbprefix + "_xoonips_config SET value=? WHERE name=?"); |
| 6654 |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 6719 |
setLastErrorString( s.c_str( ) ); |
setLastErrorString( s.c_str( ) ); |
| 6720 |
ret = RES_ERROR; |
ret = RES_ERROR; |
| 6721 |
} |
} |
| 6722 |
|
|
| 6723 |
|
// nijc_code か guestのON/OFF を書き換えたときは、item_statusをリセットする. |
| 6724 |
|
if ( ret == RES_OK && isNijcOrGuest && ( oldValue == 0 || strcmp( value, oldValue ) != 0 ) ) |
| 6725 |
|
refreshItemStatus(); |
| 6726 |
|
if ( oldValue ) |
| 6727 |
|
freeString( oldValue ); |
| 6728 |
|
|
| 6729 |
return ret; |
return ret; |
| 6730 |
} |
} |
| 6731 |
|
|