| 22 |
* |
* |
| 23 |
* $Revision$ |
* $Revision$ |
| 24 |
* $Log$ |
* $Log$ |
| 25 |
|
* Revision 1.120 2006/04/11 10:31:27 tani |
| 26 |
|
* merge to main trunk (from REL20060213 to merge_to_20060411) |
| 27 |
|
* REL20060213からmerge_to_20060411までのSTABLE_2の差分をCURRENTにマージ. |
| 28 |
|
* |
| 29 |
|
* Revision 1.118.2.2 2006/02/28 04:49:17 aga4096 |
| 30 |
|
* ・NIJC code, guestのon/offを書き換えたときに item_status をリセットする. |
| 31 |
|
* |
| 32 |
|
* Revision 1.118.2.1 2006/02/14 05:13:17 aga4096 |
| 33 |
|
* ・アイテムが private/index_a と public/index_b に登録された状態で、 private/index_aを削除するとおかしくなるのを修正. |
| 34 |
|
* |
| 35 |
* Revision 1.119 2006/04/07 08:19:51 tani |
* Revision 1.119 2006/04/07 08:19:51 tani |
| 36 |
* doiをDBから取得する時の型指定をBLOBにあわせて修正. |
* doiをDBから取得する時の型指定をBLOBにあわせて修正. |
| 37 |
* |
* |
| 6468 |
for ( int i = descXIDLen-1; i >= 0; i-- ){ // 逆方向にして、途中で失敗した場合の惨事を防ぐ。descXIDは幅優先探索順に並んでいるので。 |
for ( int i = descXIDLen-1; i >= 0; i-- ){ // 逆方向にして、途中で失敗した場合の惨事を防ぐ。descXIDは幅優先探索順に並んでいるので。 |
| 6469 |
string strXID = unsignedIntToString(descXID[i]); |
string strXID = unsignedIntToString(descXID[i]); |
| 6470 |
string linkTable = dbprefix + "_xoonips_index_item_link"; |
string linkTable = dbprefix + "_xoonips_index_item_link"; |
| 6471 |
|
string indexTable = dbprefix + "_xoonips_index"; |
| 6472 |
|
|
| 6473 |
// descXID[i] のアイテムの中で、被参照数が1のものを列挙 → 迷子にならないように移動 |
|
| 6474 |
// 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を迷子にならないように親に移動 |
| 6475 |
// しかしsum内に<predicate>を書いてもいいのだろうか? 代わりにnullifとcoalesceならsqliteは通るが・・・ |
if ( index->getOpenLevel() == index::OL_PRIVATE ){ |
| 6476 |
// → 互換性の高い方法がよくわからないので、とりあえず自己joinにする。 |
string sql( "SELECT t1.index_item_link_id, t1.item_id, count(*) " |
| 6477 |
string sql( "SELECT t1.index_item_link_id " |
" FROM " + linkTable + " AS t1 " |
| 6478 |
" FROM " + linkTable + " AS t1 " |
" LEFT JOIN " + linkTable + " AS t2 ON t1.item_id = t2.item_id " |
| 6479 |
" 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 " |
| 6480 |
" WHERE t1.index_id=" + strXID + " and t2.item_id is NULL" ); |
" WHERE t1.index_id=" + strXID + |
| 6481 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
" and tx2.open_level = " + unsignedIntToString(index::OL_PRIVATE) + |
| 6482 |
SQLUINTEGER sLinkID = 0; |
" group by t1.item_id " ); |
| 6483 |
SQLLEN len = 0; |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 6484 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &sLinkID, 0, &len ); |
SQLUINTEGER sLinkID = 0, sItemID = 0, sCount = 0; |
| 6485 |
while ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
SQLLEN len1 = 0, len2 = 0, len3 = 0; |
| 6486 |
string sql2( "UPDATE " + linkTable + " set index_id= " + strParentXID + " where index_item_link_id = " + unsignedIntToString(sLinkID) ); |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &sLinkID, 0, &len1 ); |
| 6487 |
result = querySimple( "deleteIndex", sql2 ); |
SQLBindCol( hstmt, 2, SQL_C_ULONG, &sItemID, 0, &len2 ); |
| 6488 |
if( result != RES_OK ) |
SQLBindCol( hstmt, 3, SQL_C_ULONG, &sCount , 0, &len3 ); |
| 6489 |
|
while ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 6490 |
|
if ( sCount == 1 ){ |
| 6491 |
|
string sql2( "UPDATE " + linkTable + " set index_id= " + strParentXID + " where index_item_link_id = " + unsignedIntToString(sLinkID) ); |
| 6492 |
|
result = querySimple( "deleteIndex", sql2 ); |
| 6493 |
|
if( result != RES_OK ) |
| 6494 |
|
break; |
| 6495 |
|
} |
| 6496 |
|
} |
| 6497 |
|
if ( result != RES_OK ) |
| 6498 |
break; |
break; |
| 6499 |
|
}else{ |
| 6500 |
|
string s( "SQLExecDirect in deleteIndex" ); |
| 6501 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 6502 |
|
s += "sql="; |
| 6503 |
|
s += string( sql ); |
| 6504 |
|
setLastErrorString( s.c_str( ) ); |
| 6505 |
|
result = RES_DB_QUERY_ERROR; |
| 6506 |
} |
} |
|
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; |
|
| 6507 |
} |
} |
| 6508 |
|
|
| 6509 |
// descXID[i] のアイテムを全て削除 |
// descXID[i] のアイテムを全て削除 |
| 6510 |
sql = "DELETE from " + linkTable + " where index_id=" + strXID; |
string sql = "DELETE from " + linkTable + " where index_id=" + strXID; |
| 6511 |
result = querySimple( functionName, sql ); |
result = querySimple( functionName, sql ); |
| 6512 |
if ( result == RES_OK ){ |
if ( result == RES_OK ){ |
| 6513 |
// descXID[i] を削除 |
// descXID[i] を削除 |
| 6528 |
for ( int i = 0; i < affectedIIDsLen; i++ ){ |
for ( int i = 0; i < affectedIIDsLen; i++ ){ |
| 6529 |
insertMetadataEventAuto( affectedIIDs[i] ); |
insertMetadataEventAuto( affectedIIDs[i] ); |
| 6530 |
} |
} |
|
|
|
| 6531 |
}else{ |
}else{ |
| 6532 |
string s( "SQLAllocHandle in deleteIndex" ); |
string s( "SQLAllocHandle in deleteIndex" ); |
| 6533 |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 6654 |
SQLLEN cbKey = SQL_NTS, cbValue = SQL_NTS; |
SQLLEN cbKey = SQL_NTS, cbValue = SQL_NTS; |
| 6655 |
result_t ret = RES_ERROR; |
result_t ret = RES_ERROR; |
| 6656 |
|
|
| 6657 |
|
// nijc_code か guestのON/OFF を書き換えたときは、item_statusをリセットする. |
| 6658 |
|
bool isNijcOrGuest = ( strcmp( key, XNP_CONFIG_REPOSITORY_NIJC_CODE ) == 0 || strcmp( key, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY ) == 0 ); |
| 6659 |
|
char *oldValue = 0; |
| 6660 |
|
if ( isNijcOrGuest ) |
| 6661 |
|
getConfigValue( key, &oldValue ); |
| 6662 |
|
|
| 6663 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 6664 |
string sql( "UPDATE " + dbprefix + "_xoonips_config SET value=? WHERE name=?"); |
string sql( "UPDATE " + dbprefix + "_xoonips_config SET value=? WHERE name=?"); |
| 6665 |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 6730 |
setLastErrorString( s.c_str( ) ); |
setLastErrorString( s.c_str( ) ); |
| 6731 |
ret = RES_ERROR; |
ret = RES_ERROR; |
| 6732 |
} |
} |
| 6733 |
|
|
| 6734 |
|
// nijc_code か guestのON/OFF を書き換えたときは、item_statusをリセットする. |
| 6735 |
|
if ( ret == RES_OK && isNijcOrGuest && ( oldValue == 0 || strcmp( value, oldValue ) != 0 ) ) |
| 6736 |
|
refreshItemStatus(); |
| 6737 |
|
if ( oldValue ) |
| 6738 |
|
freeString( oldValue ); |
| 6739 |
|
|
| 6740 |
return ret; |
return ret; |
| 6741 |
} |
} |
| 6742 |
|
|