| 22 |
* |
* |
| 23 |
* $Revision$ |
* $Revision$ |
| 24 |
* $Log$ |
* $Log$ |
| 25 |
|
* Revision 1.93 2005/06/14 01:02:20 aga4096 |
| 26 |
|
* ・個人Binder向け修正. xnp_extract_public_item_id, xnp_extract_nonbinder_item_id の追加. |
| 27 |
|
* |
| 28 |
* Revision 1.92 2005/06/08 04:27:08 tani |
* Revision 1.92 2005/06/08 04:27:08 tani |
| 29 |
* defaultグループの存在を秘匿した. |
* defaultグループの存在を秘匿した. |
| 30 |
* |
* |
| 3587 |
sql = "SELECT LAST_INSERT_ROWID()"; |
sql = "SELECT LAST_INSERT_ROWID()"; |
| 3588 |
} |
} |
| 3589 |
if( ( ret = queryGetUnsignedInt( "insertItem", sql, (unsigned int*)itemid ) ) == RES_OK ){ |
if( ( ret = queryGetUnsignedInt( "insertItem", sql, (unsigned int*)itemid ) ) == RES_OK ){ |
| 3590 |
if( item -> getItemTypeID( ) == item::ITID_BINDER ){ |
if( item -> getItemTypeID( ) == item::ITID_INDEX ){ |
|
//insert into binder index |
|
|
if( ( ret = registerItem( sid, item::IID_BINDERS, *itemid ) ) == RES_OK ){ |
|
|
ret = setCertifyState( sid, item::IID_BINDERS, *itemid, index::CERTIFIED ); |
|
|
} |
|
|
}else if( item -> getItemTypeID( ) == item::ITID_INDEX ){ |
|
| 3591 |
;// 何もしない |
;// 何もしない |
| 3592 |
}else{ |
}else{ |
| 3593 |
//insert into private index |
//insert into private index |
| 4062 |
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 "; |
| 4063 |
sql += " WHERE (tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ); |
sql += " WHERE (tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ); |
| 4064 |
sql += " OR tx.open_level=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
sql += " OR tx.open_level=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
| 4065 |
sql += ") AND ti.item_type_id!=" + unsignedIntToString( item::ITID_BINDER ); |
sql += ") AND tlink.item_id=" + unsignedIntToString( item_id ); |
|
sql += " AND tlink.item_id=" + unsignedIntToString( item_id ); |
|
| 4066 |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 4067 |
if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 4068 |
SQLLEN len = 0; |
SQLLEN len = 0; |
| 4208 |
} |
} |
| 4209 |
|
|
| 4210 |
//2. delete item from binders |
//2. delete item from binders |
| 4211 |
|
// ここでunregisterBinderItemを使うことはできない.なぜならunregisterBinderItemはBinderのlast_update_dateを書き換えてしまうから. |
| 4212 |
sql = "DELETE FROM " + dbprefix + "_xoonips_binder_item_link "; |
sql = "DELETE FROM " + dbprefix + "_xoonips_binder_item_link "; |
| 4213 |
sql += "WHERE item_id = " + string( unsignedIntToString( itemid ) ); |
sql += "WHERE item_id = " + string( unsignedIntToString( itemid ) ); |
| 4214 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 4316 |
sql += " WHERE open_level<=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
sql += " WHERE open_level<=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
| 4317 |
sql += " AND certify_state=" + unsignedIntToString( index::CERTIFIED ); |
sql += " AND certify_state=" + unsignedIntToString( index::CERTIFIED ); |
| 4318 |
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
|
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_BINDER ); |
|
| 4319 |
sql += " AND ( ti.uid=" + unsignedIntToString( sess_uid ); |
sql += " AND ( ti.uid=" + unsignedIntToString( sess_uid ); |
| 4320 |
sql += " OR is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
sql += " OR is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
| 4321 |
sql += ")"; |
sql += ")"; |
| 4330 |
string notin; |
string notin; |
| 4331 |
sql = "SELECT item_id FROM " + dbprefix + "_xoonips_item_basic"; |
sql = "SELECT item_id FROM " + dbprefix + "_xoonips_item_basic"; |
| 4332 |
sql += " WHERE item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
sql += " WHERE item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
|
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_BINDER ); |
|
| 4333 |
sql += " AND uid=" + unsignedIntToString( sess_uid ); |
sql += " AND uid=" + unsignedIntToString( sess_uid ); |
| 4334 |
for( i = 0 ; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ; i++ ){ |
for( i = 0 ; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ; i++ ){ |
| 4335 |
if( i > 0 ) notin += ", "; |
if( i > 0 ) notin += ", "; |
| 4481 |
* 未承認で読めないものも結果に含みません. |
* 未承認で読めないものも結果に含みません. |
| 4482 |
* |
* |
| 4483 |
* @param sid セッションID |
* @param sid セッションID |
| 4484 |
* @param binderid 対象インデックスのID |
* @param xid 対象インデックスのID |
| 4485 |
* @param cri 結果の範囲指定,ソート条件指定 |
* @param cri 結果の範囲指定,ソート条件指定 |
| 4486 |
* @param iids 登録されたアイテムIDを受け取る引数 |
* @param iids 登録されたアイテムIDを受け取る引数 |
| 4487 |
* @param iidsLen iidsに格納された個数を受け取る引数 |
* @param iidsLen iidsに格納された個数を受け取る引数 |
| 4731 |
sql += " AND ti.item_id=" + unsignedIntToString( iid ); |
sql += " AND ti.item_id=" + unsignedIntToString( iid ); |
| 4732 |
sql += " AND tx.index_id=" + unsignedIntToString( xid ); |
sql += " AND tx.index_id=" + unsignedIntToString( xid ); |
| 4733 |
sql += " AND ( is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
sql += " AND ( is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
|
sql += " OR item_type_id=" + unsignedIntToString( item::ITID_BINDER ); //すべてのバインダーを承認 |
|
| 4734 |
if( state == index_t::NOT_CERTIFIED ) |
if( state == index_t::NOT_CERTIFIED ) |
| 4735 |
sql += " OR ti.uid=" + unsignedIntToString( sess_uid ); |
sql += " OR ti.uid=" + unsignedIntToString( sess_uid ); |
| 4736 |
sql += string( isModerator( sid, sess_uid ) ? " OR 1)" : " OR 0)" ); //モデレータならOR 1,それ以外は OR 0 |
sql += string( isModerator( sid, sess_uid ) ? " OR 1)" : " OR 0)" ); //モデレータならOR 1,それ以外は OR 0 |
| 4824 |
return ret; |
return ret; |
| 4825 |
} |
} |
| 4826 |
|
|
| 4827 |
|
/** Binderのlast_update_dateを更新する.Binderが公開されていたら、承認待ちにする. |
| 4828 |
|
*/ |
| 4829 |
|
result_t touchBinder( const char *functionName, itemid_t binderid ){ |
| 4830 |
|
// update binder's last update date |
| 4831 |
|
string sql = "UPDATE " + dbprefix + "_xoonips_item_basic SET last_update_date=" |
| 4832 |
|
+ unsignedIntToString( time( NULL ) ) + " WHERE item_id=" |
| 4833 |
|
+ unsignedIntToString( binderid ); |
| 4834 |
|
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 4835 |
|
result_t ret = querySimple( functionName, sql ); |
| 4836 |
|
|
| 4837 |
|
if ( ret == RES_OK ){ |
| 4838 |
|
// Binderが既に承認済みでかつ自動承認がOFFなら、Binderを承認待ち状態にする |
| 4839 |
|
certify_t certify_state = getInitialCertifyStateFromConfig(); |
| 4840 |
|
if ( certify_state == index::CERTIFY_REQUIRED ){ |
| 4841 |
|
string sql = "update " + dbprefix + "_xoonips_index_item_link " |
| 4842 |
|
" set certify_state=" + unsignedIntToString(certify_state) + |
| 4843 |
|
" where index_id=" + unsignedIntToString(item::IID_BINDERS) + |
| 4844 |
|
" and item_id=" + unsignedIntToString(binderid) + |
| 4845 |
|
" and certify_state=" + unsignedIntToString(index::CERTIFIED); |
| 4846 |
|
ret = querySimple( functionName, sql ); |
| 4847 |
|
} |
| 4848 |
|
} |
| 4849 |
|
return ret; |
| 4850 |
|
} |
| 4851 |
|
|
| 4852 |
|
|
| 4853 |
|
|
| 4854 |
/** |
/** |
| 4855 |
* |
* |
| 4856 |
* バインダーにアイテムを追加する |
* バインダーにアイテムを追加する |
| 4881 |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 4882 |
ret = querySimple( "registerBinderItem", sql ); |
ret = querySimple( "registerBinderItem", sql ); |
| 4883 |
if( ret == RES_OK ){ |
if( ret == RES_OK ){ |
| 4884 |
// update binder's last update date |
ret = touchBinder("registerBinderItem", binderid); |
|
sql = "UPDATE " + dbprefix + "_xoonips_item_basic SET last_update_date=" |
|
|
+ unsignedIntToString( time( NULL ) ) + " WHERE item_id=" |
|
|
+ unsignedIntToString( binderid ); |
|
|
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
|
|
ret = querySimple( "registerBinderItem", sql ); |
|
| 4885 |
} |
} |
| 4886 |
return ret; |
return ret; |
| 4887 |
} |
} |
| 4916 |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 4917 |
ret = querySimple( "unregisterBinderItem", sql ); |
ret = querySimple( "unregisterBinderItem", sql ); |
| 4918 |
if( ret == RES_OK ){ |
if( ret == RES_OK ){ |
| 4919 |
// update binder's last update date |
ret = touchBinder("unregisterBinderItem", binderid); |
|
sql = "UPDATE " + dbprefix + "_xoonips_item_basic SET last_update_date=" |
|
|
+ unsignedIntToString( time( NULL ) ) + " WHERE item_id=" |
|
|
+ unsignedIntToString( binderid ); |
|
|
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
|
|
ret = querySimple( "unregisterBinderItem", sql ); |
|
| 4920 |
} |
} |
| 4921 |
return ret; |
return ret; |
| 4922 |
} |
} |
| 5577 |
} |
} |
| 5578 |
else { |
else { |
| 5579 |
// 同名の子インデックスがあれば、蹴る |
// 同名の子インデックスがあれば、蹴る |
|
bool conflict = false; |
|
| 5580 |
/* titleの衝突を許可するよう修正。20050516メールより。警告はPHP側で出す。 |
/* titleの衝突を許可するよう修正。20050516メールより。警告はPHP側で出す。 |
| 5581 |
|
bool conflict = false; |
| 5582 |
result = checkTitleConflict( sid, index->getParentIndexID(), index->getTitle(), &conflict ); |
result = checkTitleConflict( sid, index->getParentIndexID(), index->getTitle(), &conflict ); |
| 5583 |
if ( result != RES_OK ){ |
if ( result != RES_OK ){ |
| 5584 |
; |
; |
| 5831 |
} |
} |
| 5832 |
else if ( newIndex->getParentIndexID() == item::IID_BINDERS ){ |
else if ( newIndex->getParentIndexID() == item::IID_BINDERS ){ |
| 5833 |
setLastErrorString( "in updateIndex: parent_index_id must not be BINDERS" ); |
setLastErrorString( "in updateIndex: parent_index_id must not be BINDERS" ); |
| 5834 |
return RES_ERROR; // 親をBinderにすることはできない。 |
return RES_ERROR; // 親をBindersにすることはできない。 |
| 5835 |
} |
} |
| 5836 |
else if ( newIndex->getParentIndexID() == item::IID_ROOT ){ |
else if ( newIndex->getParentIndexID() == item::IID_ROOT ){ |
| 5837 |
setLastErrorString( "in updateIndex: cannot change parent_index_id to ROOT" ); |
setLastErrorString( "in updateIndex: cannot change parent_index_id to ROOT" ); |
| 6954 |
return ret; |
return ret; |
| 6955 |
} |
} |
| 6956 |
|
|
| 6957 |
|
/** Binderが非公開アイテムを含むならtrueを返す. 注意: binder_idがバインダでない場合の動作は保証しない |
| 6958 |
|
* |
| 6959 |
|
*/ |
| 6960 |
|
bool isBinderContainsNonpublicItem( sessionid_t sid, itemid_t binder_id ){ |
| 6961 |
|
SQLRETURN sqlcode; |
| 6962 |
|
SQLHANDLE hstmt = NULL; |
| 6963 |
|
SQLLEN len = 0; |
| 6964 |
|
|
| 6965 |
|
bool ret = false; |
| 6966 |
|
string sql = |
| 6967 |
|
" select tbil.item_id, count(tx.index_id) " |
| 6968 |
|
" from " + dbprefix + "_xoonips_binder_item_link as tbil " |
| 6969 |
|
" left join " + dbprefix + "_xoonips_index_item_link as txil on tbil.item_id=txil.item_id and txil.certify_state = " + unsignedIntToString(index::CERTIFIED ) + |
| 6970 |
|
" left join " + dbprefix + "_xoonips_index as tx on txil.index_id=tx.index_id and tx.open_level = " + unsignedIntToString(index::OL_PUBLIC) + |
| 6971 |
|
" where " |
| 6972 |
|
" tbil.binder_id = " + unsignedIntToString(binder_id) + |
| 6973 |
|
" group by tbil.item_id "; |
| 6974 |
|
setLastErrorString( sql.c_str( ) ); |
| 6975 |
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 6976 |
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 6977 |
|
SQLUINTEGER item_id = 0; |
| 6978 |
|
SQLUINTEGER ct = 0; |
| 6979 |
|
SQLBindCol( hstmt, 1, SQL_C_ULONG, &item_id, 0, &len ); |
| 6980 |
|
SQLBindCol( hstmt, 2, SQL_C_ULONG, &ct, 0, &len ); |
| 6981 |
|
while( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 6982 |
|
syslog_printf( "\nitem_id=%d, ct=%d", item_id, ct ); |
| 6983 |
|
if ( ct == 0 ){ |
| 6984 |
|
ret = true; |
| 6985 |
|
break; |
| 6986 |
|
} |
| 6987 |
|
} |
| 6988 |
|
}else{ |
| 6989 |
|
string s( "SQLExecDirect in isBinderContainsNonpublicItem "); |
| 6990 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 6991 |
|
s += string( ", sql=" ) + string( sql ); |
| 6992 |
|
setLastErrorString( s.c_str( ) ); |
| 6993 |
|
} |
| 6994 |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 6995 |
|
}else { |
| 6996 |
|
string s( "SQLAllocHandle in isBinderContainsNonpublicItem "); |
| 6997 |
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 6998 |
|
setLastErrorString( s.c_str( ) ); |
| 6999 |
|
} |
| 7000 |
|
return ret; |
| 7001 |
|
} |
| 7002 |
|
|
| 7003 |
|
/** |
| 7004 |
|
* iidsの中から公開アイテムのIDを抽出する. |
| 7005 |
|
* |
| 7006 |
|
* @see freeItemID |
| 7007 |
|
* @param sid セッションID |
| 7008 |
|
* @param iids item_idの配列 |
| 7009 |
|
* @param iidssLen iidsの要素数 |
| 7010 |
|
* @param publicIids 取得結果の配列のポインタを書き込む引数 |
| 7011 |
|
* @param publicIidsLen 検索結果の数 |
| 7012 |
|
* @return RES_OK |
| 7013 |
|
* @return RES_DB_NOT_INITIALIZED |
| 7014 |
|
* @return RES_NO_SUCH_SESSION |
| 7015 |
|
* @return RES_DB_QUERY_ERROR |
| 7016 |
|
* |
| 7017 |
|
*/ |
| 7018 |
|
// 逆に公開アイテム以外のIDを抽出することは難しい.存在しないitem_idを検出することは難しいので. |
| 7019 |
|
result_t extractPublicItemId(sessionid_t sid, const itemid_t* iids, int iidsLen, itemid_t **publicIids, int* publicIidsLen ) |
| 7020 |
|
{ |
| 7021 |
|
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 7022 |
|
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 7023 |
|
|
| 7024 |
|
result_t ret = RES_ERROR; |
| 7025 |
|
SQLRETURN sqlcode; |
| 7026 |
|
SQLHANDLE hstmt = NULL; |
| 7027 |
|
userid_t uid; |
| 7028 |
|
|
| 7029 |
|
ret = sessionID2UID( sid, &uid ); |
| 7030 |
|
if( ret != RES_OK ) return ret; |
| 7031 |
|
|
| 7032 |
|
// 文字列 ',' . implode( ',', iids ) を作成 |
| 7033 |
|
char *buf = new char[(sizeof(int)*3+1)*iidsLen+1]; |
| 7034 |
|
buf[0] = '\0'; |
| 7035 |
|
char *p = buf; |
| 7036 |
|
for ( int i = 0; i < iidsLen; i++ ){ |
| 7037 |
|
int len = sprintf( p, ",%u", iids[i] ); |
| 7038 |
|
p += len; |
| 7039 |
|
} |
| 7040 |
|
string iids_str(buf); |
| 7041 |
|
delete[] buf; |
| 7042 |
|
|
| 7043 |
|
|
| 7044 |
|
string sql = |
| 7045 |
|
" select ti.item_id, count(tx.index_id) " |
| 7046 |
|
" from " + dbprefix + "_xoonips_item_basic as ti " |
| 7047 |
|
" left join " + dbprefix + "_xoonips_index_item_link as txil on ti.item_id=txil.item_id and txil.certify_state = " + unsignedIntToString(index::CERTIFIED ) + |
| 7048 |
|
" left join " + dbprefix + "_xoonips_index as tx on txil.index_id=tx.index_id and tx.open_level = " + unsignedIntToString(index::OL_PUBLIC) + |
| 7049 |
|
" where " |
| 7050 |
|
" ti.item_id in ( 0 " + iids_str + ")" |
| 7051 |
|
" group by ti.item_id "; |
| 7052 |
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 7053 |
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 7054 |
|
SQLLEN len = 0; |
| 7055 |
|
SQLUINTEGER itemid = 0; |
| 7056 |
|
SQLUINTEGER ct = 0; |
| 7057 |
|
SQLBindCol( hstmt, 1, SQL_C_ULONG, &itemid, 0, &len ); |
| 7058 |
|
SQLBindCol( hstmt, 2, SQL_C_ULONG, &ct, 0, &len ); |
| 7059 |
|
|
| 7060 |
|
*publicIids = new itemid_t[ iidsLen ]; |
| 7061 |
|
*publicIidsLen = 0; |
| 7062 |
|
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS; i++ ){ |
| 7063 |
|
if ( ct != 0 ) |
| 7064 |
|
(*publicIids)[ (*publicIidsLen)++ ] = itemid; |
| 7065 |
|
} |
| 7066 |
|
ret = RES_OK; |
| 7067 |
|
}else{ |
| 7068 |
|
string s( "SQLExecDirect in extractPublicItemId" ); |
| 7069 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 7070 |
|
s += string( ", sql=" ) + string( sql ); |
| 7071 |
|
setLastErrorString( s.c_str( ) ); |
| 7072 |
|
ret = RES_DB_QUERY_ERROR; |
| 7073 |
|
} |
| 7074 |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 7075 |
|
}else{ |
| 7076 |
|
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in extractPublicItemId" ); |
| 7077 |
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 7078 |
|
setLastErrorString( s.c_str( ) ); |
| 7079 |
|
ret = RES_ERROR; |
| 7080 |
|
} |
| 7081 |
|
return ret; |
| 7082 |
|
} |
| 7083 |
|
|
| 7084 |
|
/** |
| 7085 |
|
* iidsの中からBinder以外のIDを抽出する. |
| 7086 |
|
* |
| 7087 |
|
* @see freeItemID |
| 7088 |
|
* @param sid セッションID |
| 7089 |
|
* @param iids item_idの配列 |
| 7090 |
|
* @param iidssLen iidsの要素数 |
| 7091 |
|
* @param nonbinderIids 取得結果の配列のポインタを書き込む引数 |
| 7092 |
|
* @param nonbinderIidssLen 検索結果の数 |
| 7093 |
|
* @return RES_OK |
| 7094 |
|
* @return RES_DB_NOT_INITIALIZED |
| 7095 |
|
* @return RES_NO_SUCH_SESSION |
| 7096 |
|
* @return RES_DB_QUERY_ERROR |
| 7097 |
|
* |
| 7098 |
|
*/ |
| 7099 |
|
result_t extractNonbinderItemId(sessionid_t sid, const itemid_t* iids, int iidsLen, itemid_t **nonbinderIids, int* nonbinderIidsLen ) |
| 7100 |
|
{ |
| 7101 |
|
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 7102 |
|
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 7103 |
|
|
| 7104 |
|
result_t ret = RES_ERROR; |
| 7105 |
|
SQLRETURN sqlcode; |
| 7106 |
|
SQLHANDLE hstmt = NULL; |
| 7107 |
|
userid_t uid; |
| 7108 |
|
|
| 7109 |
|
ret = sessionID2UID( sid, &uid ); |
| 7110 |
|
if( ret != RES_OK ) return ret; |
| 7111 |
|
|
| 7112 |
|
// 文字列 ',' . implode( ',', iids ) を作成 |
| 7113 |
|
char *buf = new char[(sizeof(int)*3+1)*iidsLen+1]; |
| 7114 |
|
buf[0] = '\0'; |
| 7115 |
|
char *p = buf; |
| 7116 |
|
for ( int i = 0; i < iidsLen; i++ ){ |
| 7117 |
|
int len = sprintf( p, ",%u", iids[i] ); |
| 7118 |
|
p += len; |
| 7119 |
|
} |
| 7120 |
|
string iids_str(buf); |
| 7121 |
|
delete[] buf; |
| 7122 |
|
|
| 7123 |
|
|
| 7124 |
|
string sql = |
| 7125 |
|
" select ti.item_id " |
| 7126 |
|
" from " + dbprefix + "_xoonips_item_basic as ti " |
| 7127 |
|
" where " |
| 7128 |
|
" ti.item_id in ( 0 " + iids_str + ") and ti.item_type_id <> " + unsignedIntToString(item::ITID_BINDER); |
| 7129 |
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 7130 |
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 7131 |
|
SQLLEN len = 0; |
| 7132 |
|
SQLUINTEGER itemid = 0; |
| 7133 |
|
SQLBindCol( hstmt, 1, SQL_C_ULONG, &itemid, 0, &len ); |
| 7134 |
|
|
| 7135 |
|
*nonbinderIids = new itemid_t[ iidsLen ]; |
| 7136 |
|
*nonbinderIidsLen = 0; |
| 7137 |
|
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS; i++ ){ |
| 7138 |
|
(*nonbinderIids)[ (*nonbinderIidsLen)++ ] = itemid; |
| 7139 |
|
} |
| 7140 |
|
ret = RES_OK; |
| 7141 |
|
}else{ |
| 7142 |
|
string s( "SQLExecDirect in extractNonbinderItemId" ); |
| 7143 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 7144 |
|
s += string( ", sql=" ) + string( sql ); |
| 7145 |
|
setLastErrorString( s.c_str( ) ); |
| 7146 |
|
ret = RES_DB_QUERY_ERROR; |
| 7147 |
|
} |
| 7148 |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 7149 |
|
}else{ |
| 7150 |
|
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in extractNonbinderItemId" ); |
| 7151 |
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 7152 |
|
setLastErrorString( s.c_str( ) ); |
| 7153 |
|
ret = RES_ERROR; |
| 7154 |
|
} |
| 7155 |
|
return ret; |
| 7156 |
|
} |
| 7157 |
|
|
| 7158 |
|
|
| 7159 |
|
|
| 7160 |
|
|
| 7161 |
/** |
/** |
| 7162 |
* |
* |
| 7163 |
* 承認待ち状態のアイテムのうち,承認権限のあるアイテムのIDと登録先インデックスのIDをペアで取得します. |
* 承認待ち状態のアイテムのうち,承認権限のあるアイテムのIDと登録先インデックスのIDをペアで取得します. |
| 7199 |
sql += " WHERE open_level<=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
sql += " WHERE open_level<=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
| 7200 |
sql += " AND certify_state=" + unsignedIntToString( index::CERTIFY_REQUIRED ); |
sql += " AND certify_state=" + unsignedIntToString( index::CERTIFY_REQUIRED ); |
| 7201 |
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
|
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_BINDER ); |
|
| 7202 |
sql += " AND ( is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
sql += " AND ( is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
| 7203 |
sql += string( isModerator( sid, sess_uid ) ? " OR 1)" : " OR 0)" ); //モデレータならOR 1,それ以外は OR 0 |
sql += string( isModerator( sid, sess_uid ) ? " OR 1)" : " OR 0)" ); //モデレータならOR 1,それ以外は OR 0 |
| 7204 |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 7223 |
SQLBindCol( hstmt, 2, SQL_C_ULONG, &iid, 0, &cbIid ); |
SQLBindCol( hstmt, 2, SQL_C_ULONG, &iid, 0, &cbIid ); |
| 7224 |
for( i = 0 ; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ; i++ ){ |
for( i = 0 ; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ; i++ ){ |
| 7225 |
syslog_printf( "\nxid=%d, iid=%d", xid, iid ); |
syslog_printf( "\nxid=%d, iid=%d", xid, iid ); |
| 7226 |
dst_xids[ i ] = xid; |
if ( xid == item::IID_BINDERS ){ |
| 7227 |
dst_iids[ i ] = iid; |
// ここでBinderが非公開アイテムを含むなら,スキップする. |
| 7228 |
|
if ( isBinderContainsNonpublicItem( sid, iid ) ) |
| 7229 |
|
continue; |
| 7230 |
|
} |
| 7231 |
|
|
| 7232 |
|
dst_xids[ *len ] = xid; |
| 7233 |
|
dst_iids[ *len ] = iid; |
| 7234 |
( *len )++; |
( *len )++; |
| 7235 |
} |
} |
| 7236 |
ret = RES_OK; |
ret = RES_OK; |
| 7400 |
sql += " WHERE open_level=" + unsignedIntToString( index::OL_PUBLIC ); |
sql += " WHERE open_level=" + unsignedIntToString( index::OL_PUBLIC ); |
| 7401 |
sql += " AND certify_state=" + unsignedIntToString( index::CERTIFIED ); |
sql += " AND certify_state=" + unsignedIntToString( index::CERTIFIED ); |
| 7402 |
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
|
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_BINDER ); |
|
| 7403 |
sql += " AND ( ti.uid=" + unsignedIntToString( sess_uid ); |
sql += " AND ( ti.uid=" + unsignedIntToString( sess_uid ); |
| 7404 |
sql += " OR is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
sql += " OR is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
| 7405 |
sql += ")"; |
sql += ")"; |
| 7540 |
return ret; |
return ret; |
| 7541 |
} |
} |
| 7542 |
|
|
|
|
|
| 7543 |
extern "C" {int zip_main(int, char**);} |
extern "C" {int zip_main(int, char**);} |
| 7544 |
/** |
/** |
| 7545 |
* |
* |