| 22 |
* |
* |
| 23 |
* $Revision$ |
* $Revision$ |
| 24 |
* $Log$ |
* $Log$ |
| 25 |
|
* Revision 1.118.2.1 2006/02/14 05:13:17 aga4096 |
| 26 |
|
* ・アイテムが private/index_a と public/index_b に登録された状態で、 private/index_aを削除するとおかしくなるのを修正. |
| 27 |
|
* |
| 28 |
* Revision 1.118 2006/01/10 10:56:30 tani |
* Revision 1.118 2006/01/10 10:56:30 tani |
| 29 |
* selectiveHarvesting:stat.item_idでorder by(asc) |
* selectiveHarvesting:stat.item_idでorder by(asc) |
| 30 |
* |
* |
| 6454 |
for ( int i = descXIDLen-1; i >= 0; i-- ){ // 逆方向にして、途中で失敗した場合の惨事を防ぐ。descXIDは幅優先探索順に並んでいるので。 |
for ( int i = descXIDLen-1; i >= 0; i-- ){ // 逆方向にして、途中で失敗した場合の惨事を防ぐ。descXIDは幅優先探索順に並んでいるので。 |
| 6455 |
string strXID = unsignedIntToString(descXID[i]); |
string strXID = unsignedIntToString(descXID[i]); |
| 6456 |
string linkTable = dbprefix + "_xoonips_index_item_link"; |
string linkTable = dbprefix + "_xoonips_index_item_link"; |
| 6457 |
|
string indexTable = dbprefix + "_xoonips_index"; |
| 6458 |
|
|
| 6459 |
// descXID[i] のアイテムの中で、被参照数が1のものを列挙 → 迷子にならないように移動 |
|
| 6460 |
// 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を迷子にならないように親に移動 |
| 6461 |
// しかしsum内に<predicate>を書いてもいいのだろうか? 代わりにnullifとcoalesceならsqliteは通るが・・・ |
if ( index->getOpenLevel() == index::OL_PRIVATE ){ |
| 6462 |
// → 互換性の高い方法がよくわからないので、とりあえず自己joinにする。 |
string sql( "SELECT t1.index_item_link_id, t1.item_id, count(*) " |
| 6463 |
string sql( "SELECT t1.index_item_link_id " |
" FROM " + linkTable + " AS t1 " |
| 6464 |
" FROM " + linkTable + " AS t1 " |
" LEFT JOIN " + linkTable + " AS t2 ON t1.item_id = t2.item_id " |
| 6465 |
" 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 " |
| 6466 |
" WHERE t1.index_id=" + strXID + " and t2.item_id is NULL" ); |
" WHERE t1.index_id=" + strXID + |
| 6467 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
" and tx2.open_level = " + unsignedIntToString(index::OL_PRIVATE) + |
| 6468 |
SQLUINTEGER sLinkID = 0; |
" group by t1.item_id " ); |
| 6469 |
SQLLEN len = 0; |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 6470 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &sLinkID, 0, &len ); |
SQLUINTEGER sLinkID = 0, sItemID = 0, sCount = 0; |
| 6471 |
while ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
SQLLEN len1 = 0, len2 = 0, len3 = 0; |
| 6472 |
string sql2( "UPDATE " + linkTable + " set index_id= " + strParentXID + " where index_item_link_id = " + unsignedIntToString(sLinkID) ); |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &sLinkID, 0, &len1 ); |
| 6473 |
result = querySimple( "deleteIndex", sql2 ); |
SQLBindCol( hstmt, 2, SQL_C_ULONG, &sItemID, 0, &len2 ); |
| 6474 |
if( result != RES_OK ) |
SQLBindCol( hstmt, 3, SQL_C_ULONG, &sCount , 0, &len3 ); |
| 6475 |
|
while ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 6476 |
|
if ( sCount == 1 ){ |
| 6477 |
|
string sql2( "UPDATE " + linkTable + " set index_id= " + strParentXID + " where index_item_link_id = " + unsignedIntToString(sLinkID) ); |
| 6478 |
|
result = querySimple( "deleteIndex", sql2 ); |
| 6479 |
|
if( result != RES_OK ) |
| 6480 |
|
break; |
| 6481 |
|
} |
| 6482 |
|
} |
| 6483 |
|
if ( result != RES_OK ) |
| 6484 |
break; |
break; |
| 6485 |
|
}else{ |
| 6486 |
|
string s( "SQLExecDirect in deleteIndex" ); |
| 6487 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 6488 |
|
s += "sql="; |
| 6489 |
|
s += string( sql ); |
| 6490 |
|
setLastErrorString( s.c_str( ) ); |
| 6491 |
|
result = RES_DB_QUERY_ERROR; |
| 6492 |
} |
} |
|
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; |
|
| 6493 |
} |
} |
| 6494 |
|
|
| 6495 |
// descXID[i] のアイテムを全て削除 |
// descXID[i] のアイテムを全て削除 |
| 6496 |
sql = "DELETE from " + linkTable + " where index_id=" + strXID; |
string sql = "DELETE from " + linkTable + " where index_id=" + strXID; |
| 6497 |
result = querySimple( functionName, sql ); |
result = querySimple( functionName, sql ); |
| 6498 |
if ( result == RES_OK ){ |
if ( result == RES_OK ){ |
| 6499 |
// descXID[i] を削除 |
// descXID[i] を削除 |
| 6514 |
for ( int i = 0; i < affectedIIDsLen; i++ ){ |
for ( int i = 0; i < affectedIIDsLen; i++ ){ |
| 6515 |
insertMetadataEventAuto( affectedIIDs[i] ); |
insertMetadataEventAuto( affectedIIDs[i] ); |
| 6516 |
} |
} |
|
|
|
| 6517 |
}else{ |
}else{ |
| 6518 |
string s( "SQLAllocHandle in deleteIndex" ); |
string s( "SQLAllocHandle in deleteIndex" ); |
| 6519 |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |