| 2 |
* |
* |
| 3 |
* $Revision$ |
* $Revision$ |
| 4 |
* $Log$ |
* $Log$ |
| 5 |
|
* Revision 1.50 2005/01/24 01:54:38 youi |
| 6 |
|
* 引数の型修飾を変更. |
| 7 |
|
* dumpItemID, getItemIDByBinderID, getItemIDByIndexID |
| 8 |
|
* 関数追加 |
| 9 |
|
* getPrivateItemID, getUncertifiedLink |
| 10 |
|
* |
| 11 |
* Revision 1.49 2005/01/22 09:30:58 youi |
* Revision 1.49 2005/01/22 09:30:58 youi |
| 12 |
* setLastErrorStringの宣言を追加した. |
* setLastErrorStringの宣言を追加した. |
| 13 |
* |
* |
| 3362 |
* @return RES_DB_QUERY_ERROR |
* @return RES_DB_QUERY_ERROR |
| 3363 |
* |
* |
| 3364 |
*/ |
*/ |
| 3365 |
result_t dumpItemID(sessionid_t sid, criteria_t* c, itemid_t** iids, int* iidsLen ) |
result_t dumpItemID(sessionid_t sid, criteria_t* c, const itemid_t** iids, int* iidsLen ) |
| 3366 |
{ |
{ |
| 3367 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 3368 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 3669 |
* @return RES_ERROR |
* @return RES_ERROR |
| 3670 |
* |
* |
| 3671 |
*/ |
*/ |
| 3672 |
/* |
result_t getPrivateItemID( sessionid_t sid, userid_t uid, const itemid_t** iids, int* iidsLen ) |
|
result_t getPrivateItemID( sessionid_t sid, userid_t uid, itemid_t** iids, int* iidsLen ) |
|
| 3673 |
{ |
{ |
| 3674 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 3675 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 3676 |
|
|
| 3677 |
|
int i = 0; |
| 3678 |
|
SQLHANDLE hstmt = NULL, hstmt2 = NULL; |
| 3679 |
result_t ret = RES_ERROR; |
result_t ret = RES_ERROR; |
| 3680 |
itemid_t* dst = 0; |
itemid_t* dst = 0; |
| 3681 |
string sql; |
string sql; |
| 3684 |
userid_t sess_uid; |
userid_t sess_uid; |
| 3685 |
|
|
| 3686 |
if( ( ret = sessionID2UID( sid, &sess_uid ) ) != RES_OK ) return ret; |
if( ( ret = sessionID2UID( sid, &sess_uid ) ) != RES_OK ) return ret; |
|
if( !isModeratorBySession( sid ) && uid != sess_uid ) return RES_NO_READ_ACCESS_RIGHT; |
|
| 3687 |
|
|
| 3688 |
sql = "SELECT DISTINCT ti.item_id"; |
//SELECT 自アイテム NOT IN ( 公開承認されたアイテム ) |
| 3689 |
|
sql = "SELECT DISTINCT tlink.item_id"; |
| 3690 |
sql += " FROM " + dbprefix + "_xnpaccount_index_item_link AS tlink"; |
sql += " FROM " + dbprefix + "_xnpaccount_index_item_link AS tlink"; |
| 3691 |
sql += " LEFT JOIN " + dbprefix + "_xnpaccount_index AS tx ON tlink.index_id = tx.index_id"; |
sql += " LEFT JOIN " + dbprefix + "_xnpaccount_index AS tx ON tlink.index_id=tx.index_id"; |
| 3692 |
sql += " LEFT JOIN " + dbprefix + "_xnpaccount_item_basic AS ti ON tlink.item_id = ti.item_id"; |
sql += " LEFT JOIN " + dbprefix + "_xnpaccount_item_basic AS ti ON tlink.item_id=ti.item_id"; |
| 3693 |
sql += " WHERE ( open_level <= " + unsignedIntToString( index::OL_GROUP_ONLY ); |
sql += " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link AS tgulink ON tgulink.gid = tx.gid AND tx.open_level=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
| 3694 |
sql += " AND certify_state < " + unsignedIntToString( index::CERTIFIED ); |
sql += " WHERE open_level<=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
| 3695 |
sql += " OR open_level=" + unsignedIntToString( index::OL_PRIVATE ) + " ) "; |
sql += " AND certify_state=" + unsignedIntToString( index::CERTIFIED ); |
| 3696 |
sql += " AND ti.uid=" + unsignedIntToString( uid ); |
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
| 3697 |
fprintf( stderr, "\nsql at %d=%s", __LINE__, sql.c_str() ); |
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_BINDER ); |
| 3698 |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
sql += " AND ( ti.uid=" + unsignedIntToString( sess_uid ); |
| 3699 |
dst = new itemid_t[ count ]; |
sql += " OR is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
| 3700 |
*iids = dst; |
sql += ")"; |
| 3701 |
}else{ |
//fprintf( stderr, "\nsql at %d=%s", __LINE__, sql.c_str() ); |
|
return RES_ERROR; |
|
|
} |
|
|
|
|
| 3702 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 3703 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 3704 |
itemid_t iid; |
itemid_t iid = 0; |
| 3705 |
SQLINTEGER len = 0; |
SQLINTEGER cbIid = 0; |
| 3706 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &iid, 0, &len ); |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &iid, 0, &cbIid ); |
| 3707 |
*iidsLen = 0; |
|
| 3708 |
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < count ; i++ ){ |
string notin; |
| 3709 |
dst[ i ] = iid; |
sql = "SELECT item_id FROM " + dbprefix + "_xnpaccount_item_basic"; |
| 3710 |
(*iidsLen)++; |
sql += " WHERE item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
| 3711 |
|
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_BINDER ); |
| 3712 |
|
sql += " AND uid=" + unsignedIntToString( sess_uid ); |
| 3713 |
|
for( i = 0 ; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ; i++ ){ |
| 3714 |
|
if( i > 0 ) notin += ", "; |
| 3715 |
|
notin += unsignedIntToString( iid ); |
| 3716 |
} |
} |
| 3717 |
ret = RES_OK; |
if( i > 0 ) sql += " AND item_id NOT IN ( " + notin + " )"; |
| 3718 |
}else{ |
/* |
| 3719 |
string s( "SQLExecDirect in getPrivateItemID " ); |
else{ |
| 3720 |
|
dst = new itemid_t[ 0 ]; |
| 3721 |
|
*iids = dst; |
| 3722 |
|
*iidsLen = 0; |
| 3723 |
|
return RES_OK; |
| 3724 |
|
} |
| 3725 |
|
*/ |
| 3726 |
|
//fprintf( stderr, "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 3727 |
|
|
| 3728 |
|
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
| 3729 |
|
dst = new itemid_t[ count ]; |
| 3730 |
|
*iids = dst; |
| 3731 |
|
}else{ |
| 3732 |
|
return RES_ERROR; |
| 3733 |
|
} |
| 3734 |
|
|
| 3735 |
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) { |
| 3736 |
|
if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 3737 |
|
itemid_t iid; |
| 3738 |
|
SQLINTEGER len = 0; |
| 3739 |
|
SQLBindCol( hstmt2, 1, SQL_C_ULONG, &iid, 0, &len ); |
| 3740 |
|
*iidsLen = 0; |
| 3741 |
|
for( int i = 0; ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS && i < count ; i++ ){ |
| 3742 |
|
dst[ i ] = iid; |
| 3743 |
|
(*iidsLen)++; |
| 3744 |
|
} |
| 3745 |
|
ret = RES_OK; |
| 3746 |
|
}else{ |
| 3747 |
|
string s( "SQLExecDirect in getUncertifiedItemID " ); |
| 3748 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt2, sqlcode ); |
| 3749 |
|
s += "sql="; |
| 3750 |
|
s += string( sql ); |
| 3751 |
|
setLastErrorString( s.c_str( ) ); |
| 3752 |
|
ret = RES_DB_QUERY_ERROR; |
| 3753 |
|
} |
| 3754 |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 ); |
| 3755 |
|
}else{ |
| 3756 |
|
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getUncertifiedItemID" ); |
| 3757 |
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 3758 |
|
setLastErrorString( s.c_str( ) ); |
| 3759 |
|
ret = RES_ERROR; |
| 3760 |
|
} |
| 3761 |
|
}else { |
| 3762 |
|
string s( "SQLExecDirect in getUncertifiedItemID " ); |
| 3763 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 3764 |
s += "sql="; |
s += ", sql="; |
| 3765 |
s += string( sql ); |
s += string( sql ); |
| 3766 |
setLastErrorString( s.c_str( ) ); |
setLastErrorString( s.c_str( ) ); |
| 3767 |
ret = RES_DB_QUERY_ERROR; |
ret = RES_DB_QUERY_ERROR; |
| 3768 |
} |
} |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
|
| 3769 |
}else{ |
}else{ |
| 3770 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getPrivateItemID" ); |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getUncertifiedItemID" ); |
| 3771 |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 3772 |
setLastErrorString( s.c_str( ) ); |
setLastErrorString( s.c_str( ) ); |
| 3773 |
ret = RES_ERROR; |
ret = RES_ERROR; |
| 3774 |
} |
} |
| 3775 |
|
|
| 3776 |
return ret; |
return ret; |
| 3777 |
} |
} |
|
*/ |
|
| 3778 |
|
|
| 3779 |
/** |
/** |
| 3780 |
* |
* |
| 3794 |
* @return RES_ERROR |
* @return RES_ERROR |
| 3795 |
* |
* |
| 3796 |
*/ |
*/ |
| 3797 |
result_t getItemIDByIndexID( sessionid_t sid, indexid_t xid, criteria_t* cri, itemid_t** iids, int* iidsLen ) |
result_t getItemIDByIndexID( sessionid_t sid, indexid_t xid, criteria_t* cri, const itemid_t** iids, int* iidsLen ) |
| 3798 |
{ |
{ |
| 3799 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 3800 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 3880 |
* @return RES_ERROR |
* @return RES_ERROR |
| 3881 |
* |
* |
| 3882 |
*/ |
*/ |
| 3883 |
result_t getItemIDByBinderID( sessionid_t sid, itemid_t binderid, criteria_t* cri, itemid_t** iids, int* iidsLen ) |
result_t getItemIDByBinderID( sessionid_t sid, itemid_t binderid, criteria_t* cri, const itemid_t** iids, int* iidsLen ) |
| 3884 |
{ |
{ |
| 3885 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 3886 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 6133 |
|
|
| 6134 |
/** |
/** |
| 6135 |
* |
* |
| 6136 |
* 承認待ち状態のアイテムのうち,承認権限のあるアイテムのIDを取得します |
* 承認待ち状態のアイテムのうち,承認権限のあるアイテムのIDと登録先インデックスのIDをペアで取得します. |
| 6137 |
|
* アイテムiids[i]が現在xids[i]への登録の承認待ち状態にあることを返します. |
| 6138 |
* |
* |
| 6139 |
* @param sid セッションID |
* @param sid セッションID |
| 6140 |
* @param uid 対象ユーザのID |
* @param xids 承認待ちアイテムを登録するインデックスIDを受け取る引数 |
| 6141 |
* @param iids 登録されたアイテムIDを受け取る引数 |
* @param iids 承認待ちアイテムIDを受け取る引数 |
| 6142 |
* @param iidsLen iidsに格納された個数を受け取る引数 |
* @param len iids,xidsに格納された個数を受け取る引数 |
| 6143 |
* @return RES_OK |
* @return RES_OK |
| 6144 |
* @return RES_DB_NOT_INITIALIZED |
* @return RES_DB_NOT_INITIALIZED |
| 6145 |
* @return RES_NO_SUCH_SESSION |
* @return RES_NO_SUCH_SESSION |
| 6147 |
* @return RES_ERROR |
* @return RES_ERROR |
| 6148 |
* |
* |
| 6149 |
*/ |
*/ |
| 6150 |
/* |
result_t getUncertifiedLink( sessionid_t sid, const itemid_t** xids, const itemid_t** iids, int* len ) |
| 6151 |
result_t getPrivateItemID( sessionid_t sid, userid_t uid, itemid_t** iids, int* iidsLen ) |
{ |
| 6152 |
SELECT * |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 6153 |
FROM xtest_xnpaccount_index_item_link AS tlink |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 6154 |
LEFT JOIN xtest_xnpaccount_index AS tx ON tlink.index_id = tx.index_id AND tx.open_level<=2 AND tlink.certify_state=1 |
|
| 6155 |
LEFT JOIN xtest_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid AND ( tx.open_level=2 AND tgulink.is_admin=1 AND tgulink.uid=190 OR 0 ) |
int i = 0; |
| 6156 |
WHERE tx.index_id IS NOT NULL AND ( is_admin=1 AND tlink.certify_state=1 OR tlink.certify_state=1 AND 0 ) |
SQLHANDLE hstmt = NULL, hstmt2 = NULL; |
| 6157 |
*/ |
result_t ret = RES_ERROR; |
| 6158 |
|
itemid_t* dst_iids = 0; |
| 6159 |
|
indexid_t* dst_xids = 0; |
| 6160 |
|
string sql; |
| 6161 |
|
SQLRETURN sqlcode; |
| 6162 |
|
SQLINTEGER count = 0; |
| 6163 |
|
userid_t sess_uid; |
| 6164 |
|
|
| 6165 |
|
if( ( ret = sessionID2UID( sid, &sess_uid ) ) != RES_OK ) return ret; |
| 6166 |
|
|
| 6167 |
|
sql = "SELECT DISTINCT tlink.index_id, tlink.item_id"; |
| 6168 |
|
sql += " FROM " + dbprefix + "_xnpaccount_index_item_link AS tlink"; |
| 6169 |
|
sql += " LEFT JOIN " + dbprefix + "_xnpaccount_index AS tx ON tlink.index_id = tx.index_id"; |
| 6170 |
|
sql += " LEFT JOIN " + dbprefix + "_xnpaccount_item_basic AS ti ON tlink.item_id = ti.item_id"; |
| 6171 |
|
sql += " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link AS tgulink ON tgulink.gid = tx.gid AND tx.open_level =" + unsignedIntToString( index::OL_GROUP_ONLY );; |
| 6172 |
|
sql += " WHERE open_level<=" + unsignedIntToString( index::OL_GROUP_ONLY ); |
| 6173 |
|
sql += " AND certify_state=" + unsignedIntToString( index::CERTIFY_REQUIRED ); |
| 6174 |
|
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_INDEX ); |
| 6175 |
|
sql += " AND item_type_id !=" + unsignedIntToString( item::ITID_BINDER ); |
| 6176 |
|
sql += " AND ( is_admin=1 AND tgulink.uid=" + unsignedIntToString( sess_uid ); |
| 6177 |
|
sql += string( isModerator( sid, sess_uid ) ? " OR 1)" : " OR 0)" ); //モデレータならOR 1,それ以外は OR 0 |
| 6178 |
|
//fprintf( stderr, "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 6179 |
|
|
| 6180 |
|
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
| 6181 |
|
dst_xids = new indexid_t[ count ]; |
| 6182 |
|
*xids = dst_xids; |
| 6183 |
|
dst_iids = new itemid_t[ count ]; |
| 6184 |
|
*iids = dst_iids; |
| 6185 |
|
}else{ |
| 6186 |
|
return RES_ERROR; |
| 6187 |
|
} |
| 6188 |
|
|
| 6189 |
|
*len = 0; |
| 6190 |
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 6191 |
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 6192 |
|
indexid_t xid = 0; |
| 6193 |
|
SQLINTEGER cbXid = 0; |
| 6194 |
|
itemid_t iid = 0; |
| 6195 |
|
SQLINTEGER cbIid = 0; |
| 6196 |
|
SQLBindCol( hstmt, 1, SQL_C_ULONG, &xid, 0, &cbXid ); |
| 6197 |
|
SQLBindCol( hstmt, 2, SQL_C_ULONG, &iid, 0, &cbIid ); |
| 6198 |
|
for( i = 0 ; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ; i++ ){ |
| 6199 |
|
//fprintf( stderr, "\nxid=%d, iid=%d", xid, iid ); |
| 6200 |
|
dst_xids[ i ] = xid; |
| 6201 |
|
dst_iids[ i ] = iid; |
| 6202 |
|
( *len )++; |
| 6203 |
|
} |
| 6204 |
|
ret = RES_OK; |
| 6205 |
|
}else { |
| 6206 |
|
string s( "SQLExecDirect in getUncertifiedItemID " ); |
| 6207 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 6208 |
|
s += ", sql="; |
| 6209 |
|
s += string( sql ); |
| 6210 |
|
setLastErrorString( s.c_str( ) ); |
| 6211 |
|
ret = RES_DB_QUERY_ERROR; |
| 6212 |
|
} |
| 6213 |
|
}else{ |
| 6214 |
|
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getUncertifiedItemID" ); |
| 6215 |
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 6216 |
|
setLastErrorString( s.c_str( ) ); |
| 6217 |
|
ret = RES_ERROR; |
| 6218 |
|
} |
| 6219 |
|
return ret; |
| 6220 |
|
} |
| 6221 |
|
|