| 22 |
* |
* |
| 23 |
* $Revision$ |
* $Revision$ |
| 24 |
* $Log$ |
* $Log$ |
| 25 |
|
* Revision 1.118.2.4 2006/06/30 02:46:02 aga4096 |
| 26 |
|
* ・MySQL5.0.22では certify.php で常に No items found. になる場合があるのを修正. |
| 27 |
|
* |
| 28 |
|
* Revision 1.118.2.3 2006/04/12 09:20:12 aga4096 |
| 29 |
|
* ・insert_index で item_type_id が0になる場合があるのを修正. |
| 30 |
|
* |
| 31 |
|
* Revision 1.118.2.2 2006/02/28 04:49:17 aga4096 |
| 32 |
|
* ・NIJC code, guestのon/offを書き換えたときに item_status をリセットする. |
| 33 |
|
* |
| 34 |
|
* Revision 1.118.2.1 2006/02/14 05:13:17 aga4096 |
| 35 |
|
* ・アイテムが private/index_a と public/index_b に登録された状態で、 private/index_aを削除するとおかしくなるのを修正. |
| 36 |
|
* |
| 37 |
* Revision 1.118 2006/01/10 10:56:30 tani |
* Revision 1.118 2006/01/10 10:56:30 tani |
| 38 |
* selectiveHarvesting:stat.item_idでorder by(asc) |
* selectiveHarvesting:stat.item_idでorder by(asc) |
| 39 |
* |
* |
| 1924 |
if ( ret == RES_OK ){ |
if ( ret == RES_OK ){ |
| 1925 |
// private index作成 |
// private index作成 |
| 1926 |
index_t index; |
index_t index; |
|
index.setItemTypeID(item::ITID_INDEX); |
|
|
index.setContributorUID(*uid); |
|
| 1927 |
index.setParentIndexID(item::IID_ROOT); |
index.setParentIndexID(item::IID_ROOT); |
| 1928 |
index.setOwnerUID(*uid); |
index.setOwnerUID(*uid); |
| 1929 |
index.setOpenLevel(index::OL_PRIVATE); |
index.setOpenLevel(index::OL_PRIVATE); |
| 3003 |
userid_t uid; |
userid_t uid; |
| 3004 |
ret = sessionID2UID( sid, &uid ); |
ret = sessionID2UID( sid, &uid ); |
| 3005 |
if ( ret == RES_OK ){ |
if ( ret == RES_OK ){ |
|
index.setItemTypeID(item::ITID_INDEX); |
|
|
index.setContributorUID(uid); |
|
| 3006 |
index.setParentIndexID(item::IID_ROOT); |
index.setParentIndexID(item::IID_ROOT); |
| 3007 |
index.setOwnerGID(*gid); |
index.setOwnerGID(*gid); |
| 3008 |
index.setOpenLevel(index::OL_GROUP_ONLY); |
index.setOpenLevel(index::OL_GROUP_ONLY); |
| 5789 |
} |
} |
| 5790 |
|
|
| 5791 |
/** インデックスを作成する。引数のチェックは行わない。 |
/** インデックスを作成する。引数のチェックは行わない。 |
| 5792 |
|
* item_type_id, contributor_uid を上書きする。 |
| 5793 |
*/ |
*/ |
| 5794 |
static result_t insertIndexInternal( sessionid_t sid, index_t *index, indexid_t *xid ){ |
static result_t insertIndexInternal( sessionid_t sid, index_t *index, indexid_t *xid ){ |
| 5795 |
itemid_t iid; |
itemid_t iid; |
| 5796 |
|
|
| 5797 |
|
index->setItemTypeID(item::ITID_INDEX); |
| 5798 |
|
index->setContributorUID(0); |
| 5799 |
result_t result = insertItem( sid, index, &iid ); |
result_t result = insertItem( sid, index, &iid ); |
| 5800 |
if ( result == RES_OK ){ |
if ( result == RES_OK ){ |
| 5801 |
string nullString("NULL"); |
string nullString("NULL"); |
| 6462 |
for ( int i = descXIDLen-1; i >= 0; i-- ){ // 逆方向にして、途中で失敗した場合の惨事を防ぐ。descXIDは幅優先探索順に並んでいるので。 |
for ( int i = descXIDLen-1; i >= 0; i-- ){ // 逆方向にして、途中で失敗した場合の惨事を防ぐ。descXIDは幅優先探索順に並んでいるので。 |
| 6463 |
string strXID = unsignedIntToString(descXID[i]); |
string strXID = unsignedIntToString(descXID[i]); |
| 6464 |
string linkTable = dbprefix + "_xoonips_index_item_link"; |
string linkTable = dbprefix + "_xoonips_index_item_link"; |
| 6465 |
|
string indexTable = dbprefix + "_xoonips_index"; |
| 6466 |
|
|
| 6467 |
// descXID[i] のアイテムの中で、被参照数が1のものを列挙 → 迷子にならないように移動 |
|
| 6468 |
// 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を迷子にならないように親に移動 |
| 6469 |
// しかしsum内に<predicate>を書いてもいいのだろうか? 代わりにnullifとcoalesceならsqliteは通るが・・・ |
if ( index->getOpenLevel() == index::OL_PRIVATE ){ |
| 6470 |
// → 互換性の高い方法がよくわからないので、とりあえず自己joinにする。 |
string sql( "SELECT t1.index_item_link_id, t1.item_id, count(*) " |
| 6471 |
string sql( "SELECT t1.index_item_link_id " |
" FROM " + linkTable + " AS t1 " |
| 6472 |
" FROM " + linkTable + " AS t1 " |
" LEFT JOIN " + linkTable + " AS t2 ON t1.item_id = t2.item_id " |
| 6473 |
" 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 " |
| 6474 |
" WHERE t1.index_id=" + strXID + " and t2.item_id is NULL" ); |
" WHERE t1.index_id=" + strXID + |
| 6475 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
" and tx2.open_level = " + unsignedIntToString(index::OL_PRIVATE) + |
| 6476 |
SQLUINTEGER sLinkID = 0; |
" group by t1.item_id " ); |
| 6477 |
SQLLEN len = 0; |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 6478 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &sLinkID, 0, &len ); |
SQLUINTEGER sLinkID = 0, sItemID = 0, sCount = 0; |
| 6479 |
while ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
SQLLEN len1 = 0, len2 = 0, len3 = 0; |
| 6480 |
string sql2( "UPDATE " + linkTable + " set index_id= " + strParentXID + " where index_item_link_id = " + unsignedIntToString(sLinkID) ); |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &sLinkID, 0, &len1 ); |
| 6481 |
result = querySimple( "deleteIndex", sql2 ); |
SQLBindCol( hstmt, 2, SQL_C_ULONG, &sItemID, 0, &len2 ); |
| 6482 |
if( result != RES_OK ) |
SQLBindCol( hstmt, 3, SQL_C_ULONG, &sCount , 0, &len3 ); |
| 6483 |
|
while ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 6484 |
|
if ( sCount == 1 ){ |
| 6485 |
|
string sql2( "UPDATE " + linkTable + " set index_id= " + strParentXID + " where index_item_link_id = " + unsignedIntToString(sLinkID) ); |
| 6486 |
|
result = querySimple( "deleteIndex", sql2 ); |
| 6487 |
|
if( result != RES_OK ) |
| 6488 |
|
break; |
| 6489 |
|
} |
| 6490 |
|
} |
| 6491 |
|
if ( result != RES_OK ) |
| 6492 |
break; |
break; |
| 6493 |
|
}else{ |
| 6494 |
|
string s( "SQLExecDirect in deleteIndex" ); |
| 6495 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 6496 |
|
s += "sql="; |
| 6497 |
|
s += string( sql ); |
| 6498 |
|
setLastErrorString( s.c_str( ) ); |
| 6499 |
|
result = RES_DB_QUERY_ERROR; |
| 6500 |
} |
} |
|
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; |
|
| 6501 |
} |
} |
| 6502 |
|
|
| 6503 |
// descXID[i] のアイテムを全て削除 |
// descXID[i] のアイテムを全て削除 |
| 6504 |
sql = "DELETE from " + linkTable + " where index_id=" + strXID; |
string sql = "DELETE from " + linkTable + " where index_id=" + strXID; |
| 6505 |
result = querySimple( functionName, sql ); |
result = querySimple( functionName, sql ); |
| 6506 |
if ( result == RES_OK ){ |
if ( result == RES_OK ){ |
| 6507 |
// descXID[i] を削除 |
// descXID[i] を削除 |
| 6522 |
for ( int i = 0; i < affectedIIDsLen; i++ ){ |
for ( int i = 0; i < affectedIIDsLen; i++ ){ |
| 6523 |
insertMetadataEventAuto( affectedIIDs[i] ); |
insertMetadataEventAuto( affectedIIDs[i] ); |
| 6524 |
} |
} |
|
|
|
| 6525 |
}else{ |
}else{ |
| 6526 |
string s( "SQLAllocHandle in deleteIndex" ); |
string s( "SQLAllocHandle in deleteIndex" ); |
| 6527 |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 6648 |
SQLLEN cbKey = SQL_NTS, cbValue = SQL_NTS; |
SQLLEN cbKey = SQL_NTS, cbValue = SQL_NTS; |
| 6649 |
result_t ret = RES_ERROR; |
result_t ret = RES_ERROR; |
| 6650 |
|
|
| 6651 |
|
// nijc_code か guestのON/OFF を書き換えたときは、item_statusをリセットする. |
| 6652 |
|
bool isNijcOrGuest = ( strcmp( key, XNP_CONFIG_REPOSITORY_NIJC_CODE ) == 0 || strcmp( key, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY ) == 0 ); |
| 6653 |
|
char *oldValue = 0; |
| 6654 |
|
if ( isNijcOrGuest ) |
| 6655 |
|
getConfigValue( key, &oldValue ); |
| 6656 |
|
|
| 6657 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 6658 |
string sql( "UPDATE " + dbprefix + "_xoonips_config SET value=? WHERE name=?"); |
string sql( "UPDATE " + dbprefix + "_xoonips_config SET value=? WHERE name=?"); |
| 6659 |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 6724 |
setLastErrorString( s.c_str( ) ); |
setLastErrorString( s.c_str( ) ); |
| 6725 |
ret = RES_ERROR; |
ret = RES_ERROR; |
| 6726 |
} |
} |
| 6727 |
|
|
| 6728 |
|
// nijc_code か guestのON/OFF を書き換えたときは、item_statusをリセットする. |
| 6729 |
|
if ( ret == RES_OK && isNijcOrGuest && ( oldValue == 0 || strcmp( value, oldValue ) != 0 ) ) |
| 6730 |
|
refreshItemStatus(); |
| 6731 |
|
if ( oldValue ) |
| 6732 |
|
freeString( oldValue ); |
| 6733 |
|
|
| 6734 |
return ret; |
return ret; |
| 6735 |
} |
} |
| 6736 |
|
|
| 7572 |
SQLRETURN sqlcode; |
SQLRETURN sqlcode; |
| 7573 |
SQLLEN count = 0; |
SQLLEN count = 0; |
| 7574 |
userid_t sess_uid; |
userid_t sess_uid; |
| 7575 |
|
|
| 7576 |
|
bool is_moderator = false; |
| 7577 |
|
|
| 7578 |
if( ( ret = sessionID2UID( sid, &sess_uid ) ) != RES_OK ) return ret; |
if( ( ret = sessionID2UID( sid, &sess_uid ) ) != RES_OK ) return ret; |
| 7579 |
|
|
| 7580 |
sql = "SELECT DISTINCT tlink.index_id, tlink.item_id"; |
sql = "SELECT DISTINCT tlink.index_id, tlink.item_id"; |
| 7581 |
sql += " FROM " + dbprefix + "_xoonips_index_item_link AS tlink"; |
sql += " FROM " + dbprefix + "_xoonips_index_item_link AS tlink"; |
| 7582 |
sql += " LEFT JOIN " + dbprefix + "_xoonips_index AS tx ON tlink.index_id = tx.index_id"; |
sql += " LEFT JOIN " + dbprefix + "_xoonips_index AS tx ON tlink.index_id = tx.index_id"; |
| 7583 |
sql += " LEFT JOIN " + dbprefix + "_xoonips_item_basic AS ti ON tlink.item_id = ti.item_id"; |
sql += " LEFT JOIN " + dbprefix + "_xoonips_item_basic AS ti ON tlink.item_id = ti.item_id"; |
| 7584 |
sql += " LEFT JOIN " + dbprefix + "_xoonips_groups_users_link AS tgulink ON tgulink.gid = tx.gid"; |
|
| 7585 |
sql += " WHERE open_level<=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
is_moderator = isModerator( sid, sess_uid ); |
| 7586 |
|
if( ! is_moderator ) { |
| 7587 |
|
sql += " LEFT JOIN " + dbprefix + "_xoonips_groups_users_link AS tgulink ON tgulink.gid = tx.gid"; |
| 7588 |
|
} |
| 7589 |
|
sql += " WHERE open_level<=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
| 7590 |
sql += " AND certify_state=" + unsignedIntToString( index::CERTIFY_REQUIRED ); |
sql += " AND certify_state=" + unsignedIntToString( index::CERTIFY_REQUIRED ); |
| 7591 |
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
| 7592 |
sql += " AND ( is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
|
| 7593 |
sql += string( isModerator( sid, sess_uid ) ? " OR 1)" : " OR 0)" ); //モデレータならOR 1,それ以外は OR 0 |
if( ! is_moderator ) { |
| 7594 |
|
sql += " AND is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
| 7595 |
|
} |
| 7596 |
|
|
| 7597 |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 7598 |
|
|
| 7599 |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |