Develop and Download Open Source Software

Browse CVS Repository

Diff of /xoonips/AL/commonal.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.38 by aga, Sat Jan 15 00:39:16 2005 UTC revision 1.39 by youi, Sat Jan 15 05:38:10 2005 UTC
# Line 2  Line 2 
2   *   *
3   * $Revision$   * $Revision$
4   * $Log$   * $Log$
5     * Revision 1.39  2005/01/15 05:38:10  youi
6     * insertAccount: 文字列バッファのサイズ調整など.
7     * updateAccount: 文字列バッファのサイズ調整など.
8     * アイテム管理関数を定義した.
9     *     insertItem, getItem, getItems, dumpItemID, updateItem, deleteItemなど.
10     * freeGID, freeUID: 引数の型を修正.
11     *
12   * Revision 1.38  2005/01/15 00:39:16  aga   * Revision 1.38  2005/01/15 00:39:16  aga
13   * ・x_xnpaccount_item_basicの構造を変更.   * ・x_xnpaccount_item_basicの構造を変更.
14   *   *
# Line 177  using namespace std; Line 184  using namespace std;
184  #include "account.h"  #include "account.h"
185  #include "group.h"  #include "group.h"
186  #include "session.h"  #include "session.h"
187    #include "item.h"
188    #include "itemtype.h"
189  #include "criteria.h"  #include "criteria.h"
190  #include "commonal.h"  #include "commonal.h"
191  #include "item.h"  #include "item.h"
# Line 216  static result_t countResultRows( const c Line 225  static result_t countResultRows( const c
225      return ret;      return ret;
226  }  }
227    
228    /**
229     *
230     * セッションに対応付けられたユーザIDを得る
231     *
232     * @param sid セッションID
233     * @param uid ユーザIDを受け取るポインタ引数
234     * @return RES_OK
235     * @return RES_ERROR
236     *
237     */
238    static result_t getUIDFromSession( sessionid_t sid, userid_t* uid )
239    {
240        const session_t* session;
241        if( getSession( sid, &session ) == RES_OK ){
242            *uid = session ->  getUID( );
243            freeSession( session );
244            return RES_OK;
245        }
246        return RES_ERROR;
247    }
248    
249    /**
250     *
251     * セッションに対応付けられたユーザが,PlatformユーザとしてActivateさ
252     * れているかを返す
253     *
254     * @param sid セッションID
255     * @return true Activateされている
256     * @return false Activateされている,またはエラー
257     *
258     */
259    static bool isActivatedBySession( sessionid_t sid )
260    {
261        const session_t* session;
262        if( getSession( sid, &session ) == RES_OK ){
263            userid_t sess_uid = session ->  getUID( );
264            freeSession( session );
265            return isActivated( sid, sess_uid );
266        }
267        return false;
268    }
269    
270    /**
271     *
272     * セッションに対応付けられたユーザが,モデレータであるか?
273     *
274     *
275     * @param sid セッションID
276     * @return true モデレータ
277     * @return false モデレータでない,またはエラー
278     *
279     */
280    static bool isModeratorBySession( sessionid_t sid )
281    {
282        const session_t* session;
283        if( getSession( sid, &session ) == RES_OK ){
284            userid_t sess_uid = session ->  getUID( );
285            freeSession( session );
286            return isModerator( sid, sess_uid );
287        }
288        return false;
289    }
290    
291  /** SQLを実行する。結果は捨てる。  /** SQLを実行する。結果は捨てる。
292    * @param sql sql    * @param sql sql
293    * @return result_t    * @return result_t
# Line 1068  result_t insertAccount( sessionid_t sid, Line 1140  result_t insertAccount( sessionid_t sid,
1140       */       */
1141            
1142      //1.xoopsのユーザテーブルに書き込む      //1.xoopsのユーザテーブルに書き込む
1143      SQLCHAR uname[ACCOUNT_UNAME_LEN], name[ACCOUNT_NAME_LEN], email[ACCOUNT_EMAIL_LEN], url[ACCOUNT_URL_LEN], user_avatar[ACCOUNT_USER_AVATAR_LEN], user_icq[ACCOUNT_USER_ICQ_LEN], user_from[ACCOUNT_USER_FROM_LEN], user_sig[ACCOUNT_USER_SIG_LEN], actkey[ACCOUNT_ACTKEY_LEN], user_aim[ACCOUNT_USER_AIM_LEN], user_yim[ACCOUNT_USER_YIM_LEN], user_msnm[ACCOUNT_USER_MSNM_LEN], pass[ACCOUNT_PASS_LEN], theme[ACCOUNT_THEME_LEN], umode[ACCOUNT_UMODE_LEN], user_occ[ACCOUNT_USER_OCC_LEN], bio[ACCOUNT_BIO_LEN], user_intrest[ACCOUNT_USER_INTREST_LEN];      SQLCHAR uname[ACCOUNT_UNAME_LEN+1], name[ACCOUNT_NAME_LEN+1], email[ACCOUNT_EMAIL_LEN+1], url[ACCOUNT_URL_LEN+1], user_avatar[ACCOUNT_USER_AVATAR_LEN+1], user_icq[ACCOUNT_USER_ICQ_LEN+1], user_from[ACCOUNT_USER_FROM_LEN+1], user_sig[ACCOUNT_USER_SIG_LEN+1], actkey[ACCOUNT_ACTKEY_LEN+1], user_aim[ACCOUNT_USER_AIM_LEN+1], user_yim[ACCOUNT_USER_YIM_LEN+1], user_msnm[ACCOUNT_USER_MSNM_LEN+1], pass[ACCOUNT_PASS_LEN+1], theme[ACCOUNT_THEME_LEN+1], umode[ACCOUNT_UMODE_LEN+1], user_occ[ACCOUNT_USER_OCC_LEN+1], bio[ACCOUNT_BIO_LEN+1], user_intrest[ACCOUNT_USER_INTREST_LEN+1];
1144      SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;      SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1145      SQLDOUBLE timezone_offset;      SQLDOUBLE timezone_offset;
1146            
# Line 1246  result_t insertAccount( sessionid_t sid, Line 1318  result_t insertAccount( sessionid_t sid,
1318                          ret = RES_OK;                          ret = RES_OK;
1319                          if( ret == RES_OK ){                          if( ret == RES_OK ){
1320                              //3.add new user to default group(not a group admin)                              //3.add new user to default group(not a group admin)
1321                              ret = insertMember( sid, DEFAULT_PLATFORM_GROUP_ID, *uid, false );                              ret = insertMember( sid, group_t::GID_DEFAULT, *uid, false );
1322                          }else{                          }else{
1323                              //xoops_usersへinsertしたレコードを削除する                              //xoops_usersへinsertしたレコードを削除する
1324                              sql = "DELETE FROM " + dbprefix + "_users where uid=";                              sql = "DELETE FROM " + dbprefix + "_users where uid=";
# Line 1347  result_t updateAccount( sessionid_t sid, Line 1419  result_t updateAccount( sessionid_t sid,
1419      if( account == NULL ) return RES_ERROR;      if( account == NULL ) return RES_ERROR;
1420      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1421      if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;      if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;
1422    
1423      SQLRETURN sqlcode;      SQLRETURN sqlcode;
1424      result_t ret = RES_ERROR;      result_t ret = RES_ERROR;
1425        SQLHANDLE hstmt = NULL;
1426            
1427      //xoopsのユーザテーブルに書き込む      //xoopsのユーザテーブルに書き込む
1428      SQLCHAR uname[ACCOUNT_UNAME_LEN], name[ACCOUNT_NAME_LEN], email[ACCOUNT_EMAIL_LEN], url[ACCOUNT_URL_LEN], user_avatar[ACCOUNT_USER_AVATAR_LEN], user_icq[ACCOUNT_USER_ICQ_LEN], user_from[ACCOUNT_USER_FROM_LEN], user_sig[ACCOUNT_USER_SIG_LEN], actkey[ACCOUNT_ACTKEY_LEN], user_aim[ACCOUNT_USER_AIM_LEN], user_yim[ACCOUNT_USER_YIM_LEN], user_msnm[ACCOUNT_USER_MSNM_LEN], pass[ACCOUNT_PASS_LEN], theme[ACCOUNT_THEME_LEN], umode[ACCOUNT_UMODE_LEN], user_occ[ACCOUNT_USER_OCC_LEN], bio[ACCOUNT_BIO_LEN], user_intrest[ACCOUNT_USER_INTREST_LEN];      SQLCHAR uname[ACCOUNT_UNAME_LEN+1], name[ACCOUNT_NAME_LEN+1], email[ACCOUNT_EMAIL_LEN+1], url[ACCOUNT_URL_LEN+1], user_avatar[ACCOUNT_USER_AVATAR_LEN+1], user_icq[ACCOUNT_USER_ICQ_LEN+1], user_from[ACCOUNT_USER_FROM_LEN+1], user_sig[ACCOUNT_USER_SIG_LEN+1], actkey[ACCOUNT_ACTKEY_LEN+1], user_aim[ACCOUNT_USER_AIM_LEN+1], user_yim[ACCOUNT_USER_YIM_LEN+1], user_msnm[ACCOUNT_USER_MSNM_LEN+1], pass[ACCOUNT_PASS_LEN+1], theme[ACCOUNT_THEME_LEN+1], umode[ACCOUNT_UMODE_LEN+1], user_occ[ACCOUNT_USER_OCC_LEN+1], bio[ACCOUNT_BIO_LEN+1], user_intrest[ACCOUNT_USER_INTREST_LEN+1];
1429      SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;      SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1430      SQLDOUBLE timezone_offset;      SQLDOUBLE timezone_offset;
1431            
1432      SQLINTEGER cbUname = SQL_NTS, cbName = SQL_NTS, cbEmail = SQL_NTS, cbUrl = SQL_NTS, cbUser_avatar = SQL_NTS, cbUser_icq = SQL_NTS, cbUser_from = SQL_NTS, cbUser_sig = SQL_NTS, cbActkey = SQL_NTS, cbUser_aim = SQL_NTS, cbUser_yim = SQL_NTS, cbUser_msnm = SQL_NTS, cbPass = SQL_NTS, cbTheme = SQL_NTS, cbUmode = SQL_NTS, cbUser_occ = SQL_NTS, cbBio = SQL_NTS, cbUser_intrest = SQL_NTS;      SQLINTEGER cbUname = SQL_NTS, cbName = SQL_NTS, cbEmail = SQL_NTS, cbUrl = SQL_NTS, cbUser_avatar = SQL_NTS, cbUser_icq = SQL_NTS, cbUser_from = SQL_NTS, cbUser_sig = SQL_NTS, cbActkey = SQL_NTS, cbUser_aim = SQL_NTS, cbUser_yim = SQL_NTS, cbUser_msnm = SQL_NTS, cbPass = SQL_NTS, cbTheme = SQL_NTS, cbUmode = SQL_NTS, cbUser_occ = SQL_NTS, cbBio = SQL_NTS, cbUser_intrest = SQL_NTS;
1433      SQLINTEGER cbUid = 0, cbUser_regdate = 0, cbUser_viewemail = 0, cbPosts = 0, cbAttachsig = 0, cbRank = 0, cbLevel = 0, cbLast_login = 0, cbUorder = 0, cbNotify_method = 0, cbNotify_mode, cbUser_mailok = 0, cbTimezone_offset = 0;      SQLINTEGER cbUid = 0, cbUser_regdate = 0, cbUser_viewemail = 0, cbPosts = 0, cbAttachsig = 0, cbRank = 0, cbLevel = 0, cbLast_login = 0, cbUorder = 0, cbNotify_method = 0, cbNotify_mode = 0, cbUser_mailok = 0, cbTimezone_offset = 0;
1434    
1435      SQLUINTEGER activate;      SQLUINTEGER activate;
1436      SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1];      SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1];
# Line 1367  result_t updateAccount( sessionid_t sid, Line 1441  result_t updateAccount( sessionid_t sid,
1441      SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1];      SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1];
1442      SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1];      SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1];
1443      SQLCHAR base_url[XNP_ACCOUNT_BASE_URL_LEN+1];      SQLCHAR base_url[XNP_ACCOUNT_BASE_URL_LEN+1];
1444      SQLINTEGER cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS, cbBase_url = SQL_NTS;      SQLINTEGER cbActivate = 0, cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS, cbBase_url = SQL_NTS;
1445      SQLUINTEGER notice_mail;      SQLUINTEGER notice_mail, notice_mail_since;
1446      SQLUINTEGER notice_mail_since;      SQLINTEGER cbNotice_mail = 0, cbNotice_mail_since = 0;
     SQLINTEGER len = 0;  
1447    
1448      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1449          string sql;          string sql;
1450    
1451          sql = "UPDATE " + dbprefix + "_users SET ";          sql = "UPDATE " + dbprefix + "_users SET ";
1452          sql += "uname=?, ";          sql += "uname=?";
1453          sql += "name=?, ";          sql += ", name=?";
1454          sql += "email=?, ";          sql += ", email=?";
1455          sql += "url=?, ";          sql += ", url=?";
1456          sql += "user_avatar=?, ";          sql += ", user_avatar=?";
1457          sql += "user_regdate=?, ";          sql += ", user_regdate=?";
1458          sql += "user_icq=?, ";          sql += ", user_icq=?";
1459          sql += "user_from=?, ";          sql += ", user_from=?";
1460          sql += "user_sig=?, ";          sql += ", user_sig=?";
1461          sql += "user_viewemail=?, ";          sql += ", user_viewemail=?";
1462          sql += "actkey=?, ";          sql += ", actkey=?";
1463          sql += "user_aim=?, ";          sql += ", user_aim=?";
1464          sql += "user_yim=?, ";          sql += ", user_yim=?";
1465          sql += "user_msnm=?, ";          sql += ", user_msnm=?";
1466          sql += "pass=?, ";          sql += ", pass=?";
1467          sql += "posts=?, ";          sql += ", posts=?";
1468          sql += "attachsig=?, ";          sql += ", attachsig=?";
1469          sql += "rank=?, ";          sql += ", rank=?";
1470          sql += "level=?, ";          sql += ", level=?";
1471          sql += "theme=?, ";          sql += ", theme=?";
1472          sql += "timezone_offset=?, ";          sql += ", timezone_offset=?";
1473          sql += "last_login=?, ";          sql += ", last_login=?";
1474          sql += "umode=?, ";          sql += ", umode=?";
1475          sql += "uorder=?, ";          sql += ", uorder=?";
1476          sql += "notify_method=?, ";          sql += ", notify_method=?";
1477          sql += "notify_mode=?, ";          sql += ", notify_mode=?";
1478          sql += "user_occ=?, ";          sql += ", user_occ=?";
1479          sql += "bio=?, ";          sql += ", bio=?";
1480          sql += "user_intrest=?, ";          sql += ", user_intrest=?";
1481          sql += "user_mailok=? ";          sql += ", user_mailok=? ";
1482          sql += " WHERE uid = ?";          sql += " WHERE uid = ?";
1483            
1484          sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);          sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1485          if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){          if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1486              SQLBindParameter(hstmt,  1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );              SQLBindParameter(hstmt,  1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
# Line 1441  result_t updateAccount( sessionid_t sid, Line 1514  result_t updateAccount( sessionid_t sid,
1514              SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );              SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1515              SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );              SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1516              SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );              SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1517                
1518              strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );              strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1519              strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );              strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1520              strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );              strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
# Line 1485  result_t updateAccount( sessionid_t sid, Line 1558  result_t updateAccount( sessionid_t sid,
1558                      ret = RES_DB_QUERY_ERROR;                      ret = RES_DB_QUERY_ERROR;
1559                  }                  }
1560              }else{              }else{
1561                  string s( "SQLExecute in updateAccount " );                  string s( "SQLExecute in updateAccount 1 " );
1562                  s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );                  s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1563                  setLastErrorString( s.c_str( ) );                  setLastErrorString( s.c_str( ) );
1564                  ret = RES_DB_QUERY_ERROR;                  ret = RES_DB_QUERY_ERROR;
# Line 1495  result_t updateAccount( sessionid_t sid, Line 1568  result_t updateAccount( sessionid_t sid,
1568              ret = RES_ERROR;              ret = RES_ERROR;
1569          }          }
1570          SQLFreeHandle( SQL_HANDLE_STMT, hstmt );          SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1571            hstmt = NULL;
1572      }else{      }else{
1573          setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );          setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1574          ret = RES_ERROR;          ret = RES_ERROR;
1575      }      }
1576            
1577        if( ret != RES_OK ){
1578            return ret;
1579        }
1580        
1581      //xnpaccountのユーザテーブルに残りの情報を上書きする      //xnpaccountのユーザテーブルに残りの情報を上書きする
1582      if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1583          string sql;          string sql;
1584    
1585          sql = "UPDATE " + dbprefix + "_xnpaccount_users SET ";          sql = "UPDATE " + dbprefix + "_xnpaccount_users SET ";
# Line 1520  result_t updateAccount( sessionid_t sid, Line 1598  result_t updateAccount( sessionid_t sid,
1598            
1599          sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);          sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1600          if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){          if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1601              SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &len);              SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate);
1602              SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);              SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1603              SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);              SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1604              SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);              SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
# Line 1529  result_t updateAccount( sessionid_t sid, Line 1607  result_t updateAccount( sessionid_t sid,
1607              SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);              SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1608              SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);              SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1609              SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url);              SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url);
1610              SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &len);              SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &cbNotice_mail);
1611              SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &len);              SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &cbNotice_mail_since);
1612              SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );              SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1613                            
1614              activate = account -> getActivate() ? 1 : 0;              activate = account -> getActivate() ? 1 : 0;
# Line 1557  result_t updateAccount( sessionid_t sid, Line 1635  result_t updateAccount( sessionid_t sid,
1635                      ret = RES_DB_QUERY_ERROR;                      ret = RES_DB_QUERY_ERROR;
1636                  }                  }
1637              }else{              }else{
1638                  string s( "SQLExecute in updateAccount " );                  string s( "SQLExecute in updateAccount 2 " );
1639                  s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );                  s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1640                  setLastErrorString( s.c_str( ) );                  setLastErrorString( s.c_str( ) );
1641                  ret = RES_DB_QUERY_ERROR;                  ret = RES_DB_QUERY_ERROR;
# Line 1964  result_t dumpGroupAdmins( sessionid_t si Line 2042  result_t dumpGroupAdmins( sessionid_t si
2042   */   */
2043  result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )  result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )
2044  {  {
2045      if( gid == DEFAULT_PLATFORM_GROUP_ID ) return RES_ERROR;      if( gid == group_t::GID_DEFAULT ) return RES_ERROR;
2046      return deleteMemberNoLimit( sid, gid, uid );      return deleteMemberNoLimit( sid, gid, uid );
2047  }  }
2048    
# Line 2869  result_t getSession( sessionid_t sid, co Line 2947  result_t getSession( sessionid_t sid, co
2947  */  */
2948  }  }
2949    
2950    
2951    
2952    
2953    /**
2954     *
2955     * アイテム(Basic Information)を登録する.
2956     * Platformユーザ以上の権限が必要.
2957     *
2958     * @param sid セッションID
2959     * @param item 登録したいアイテムの情報
2960     * @param itemid 登録したアイテムのIDを受け取る引数
2961     * @return RES_OK
2962     * @return RES_ERROR
2963     * @return RES_NO_SUCH_SESSION
2964     * @return RES_DB_QUERY_ERROR
2965     * @return RES_DB_NOT_INITIALIZED
2966     * @return RES_NO_WRITE_ACCESS_RIGHT
2967     *
2968     */
2969    result_t insertItem( sessionid_t sid, const item_t* item, itemid_t* itemid )
2970    {
2971        if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2972        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2973        if( !isActivatedBySession( sid ) ) return RES_NO_WRITE_ACCESS_RIGHT;
2974        
2975        string sql;
2976        SQLRETURN sqlcode;
2977        result_t ret = RES_ERROR;
2978        SQLINTEGER uid, item_type_id, creation_date, last_update_date;
2979        SQLINTEGER cbUid = 0, cbItem_type_id = 0, cbCreation_date = 0, cbLast_update_date = 0;
2980        SQLCHAR title[ XNP_ITEM_TITLE_LEN + 1 ],
2981            keywords[ XNP_ITEM_KEYWORDS_LEN + 1 ],
2982            description[ XNP_ITEM_DESCRIPTION_LEN + 1 ],
2983            doi[ XNP_ITEM_DOI_LEN + 1 ];
2984        SQLINTEGER cbTitle = SQL_NTS,
2985            cbKeywords = SQL_NTS,
2986            cbDescription = SQL_NTS,
2987            cbDOI = SQL_NTS;
2988        
2989        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2990            string sql;
2991            sql = "INSERT INTO " + dbprefix + "_xnpaccount_item_basic (item_type_id, title, keywords, description, doi, uid, creation_date, last_update_date) VALUES (?, ?, ?, ?, ?, ?, ?, ? )";
2992            sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
2993            if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
2994                SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 0, 0, &item_type_id, 0, &cbItem_type_id );
2995                SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ITEM_TITLE_LEN, 0, title, 0, &cbTitle );
2996                SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ITEM_KEYWORDS_LEN, 0, keywords, 0, &cbKeywords );
2997                SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ITEM_DESCRIPTION_LEN, 0, description, 0, &cbDescription );
2998                SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ITEM_DOI_LEN, 0, doi, 0, &cbDOI );
2999                SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
3000                SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &creation_date, 0, &cbCreation_date );
3001                SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &last_update_date, 0, &cbLast_update_date );
3002                
3003                strncpy2( (char*)title, item -> getTitle(), XNP_ITEM_TITLE_LEN );
3004                strncpy2( (char*)keywords, item -> getKeywords(), XNP_ITEM_KEYWORDS_LEN );
3005                strncpy2( (char*)description, item -> getDescription(), XNP_ITEM_DESCRIPTION_LEN );
3006                strncpy2( (char*)doi, item -> getDOI(), XNP_ITEM_DOI_LEN );
3007                item_type_id = item -> getItemTypeID( );
3008                uid = item -> getContributorUID( );
3009                creation_date = item -> getCreationDate( );
3010                last_update_date = item -> getLastUpdateDate( );
3011                
3012                if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
3013                    SQLINTEGER count = 0;
3014                    if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
3015                        //アイテムIDを取得する
3016                        SQLHANDLE hstmt2 = NULL;
3017                        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
3018                            sql = "SELECT LAST_INSERT_ID()"; // MySQL
3019                            // sql = "SELECT LAST_INSERT_ROWID()"; // SQLite
3020                            if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
3021                                SQLUINTEGER last_insert_id;
3022                                SQLINTEGER len;
3023                                SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len );
3024                                if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){
3025                                    *itemid = last_insert_id;
3026                                    ret = RES_OK;
3027                                }else{
3028                                    ret = RES_DB_QUERY_ERROR;
3029                                    string s( "SQLFetch in insertItem " );
3030                                    s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
3031                                    setLastErrorString( s.c_str( ) );
3032                                }
3033                            }else{
3034                                string s( "SQLExecDirect in insertItem " );
3035                                s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
3036                                setLastErrorString( s.c_str( ) );
3037                                ret = RES_DB_QUERY_ERROR;
3038                            }
3039                            SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
3040                        }
3041                        //TODO insert into private index
3042                    }else{
3043                        string s( "SQLRowCount in insertItem sql=" );
3044                        s += string( sql );
3045                        setLastErrorString( s.c_str( ) );
3046                        ret = RES_DB_QUERY_ERROR;
3047                    }
3048                }else{
3049                    string s( "SQLExecute in insertItem " );
3050                    s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
3051                    setLastErrorString( s.c_str( ) );
3052                    ret = RES_DB_QUERY_ERROR;
3053                }
3054            }else{
3055                string s( "SQLPrepare in insertItem " );
3056                s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
3057                setLastErrorString( s.c_str( ) );
3058                ret = RES_ERROR;
3059            }
3060            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
3061        }else{
3062            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertItem" );
3063            ret = RES_ERROR;
3064        }
3065        
3066        return ret;
3067    }    
3068    
3069    /**
3070     *
3071     * アイテム情報取得.
3072     * 取得したアイテムは,使用後freeItemで解放する.
3073     *
3074     * @refer freeItem
3075     * @param sid セッションID
3076     * @param iid 取得したいアイテムのID
3077     * @param item 結果のアイテム情報を受け取る引数
3078     * @return RES_OK
3079     * @return RES_DB_NOT_INITIALIZED
3080     * @return RES_NO_SUCH_SESSION
3081     * @return RES_NO_SUCH_ITEM
3082     * @return RES_DB_QUERY_ERROR
3083     *
3084     */
3085    result_t getItem( sessionid_t sid, itemid_t iid, const item_t** item )
3086    {
3087        int len;
3088        static criteria c;
3089        result_t res = getItems( sid, &iid, 1, &c, item, &len );
3090        if( len == 0 ){
3091            freeItem( *item );
3092            item = 0;
3093            return RES_NO_SUCH_ITEM;
3094        }
3095        return res;
3096    }
3097    
3098    /**
3099     *
3100     * アイテム情報取得.
3101     * 取得したアイテムは,使用後freeItemで解放する.
3102     *
3103     * @refer freeItem
3104     * @param sid セッションID
3105     * @param iids 取得したいアイテムのIDの配列
3106     * @param iidsLen iids配列の要素数
3107     * @param cri 結果の範囲指定,ソート条件指定
3108     * @param items 検索結果の配列のポインタを書き込む引数
3109     * @param itemsLen 検索結果の数(配列*itemsの要素数)
3110     * @return RES_OK
3111     * @return RES_DB_NOT_INITIALIZED
3112     * @return RES_NO_SUCH_SESSION
3113     * @return RES_DB_QUERY_ERROR
3114     *
3115     */
3116    result_t getItems( sessionid_t sid, const itemid_t* iids, int iidsLen, criteria_t* cri, const item_t** items, int* itemsLen )
3117    {
3118        if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
3119        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
3120        if( iidsLen <= 0 ){
3121            *items = new item_t[ 0 ];
3122            *itemsLen = 0;
3123            return RES_OK;
3124        }
3125        
3126        result_t ret = RES_ERROR;
3127        SQLRETURN sqlcode;
3128        SQLHANDLE hstmt = NULL;    
3129        string sql;
3130        item_t* dst = new item_t[ iidsLen ];
3131        
3132        sql = "SELECT item_id, item_type_id, title, keywords, description, doi, uid, creation_date, last_update_date ";
3133        sql += "FROM " + dbprefix + "_xnpaccount_item_basic ";
3134        sql += "WHERE ";
3135        if( !isModeratorBySession( sid ) ){
3136            userid_t uid;
3137            if( getUIDFromSession( sid, &uid ) == RES_OK ){
3138                sql += "uid=" + unsignedIntToString( uid );
3139                sql += " AND";
3140            }else{
3141                return RES_ERROR;
3142            }
3143        }
3144        if( iidsLen > 0 ){
3145            sql += " ( item_id=" + string( unsignedIntToString( iids[ 0 ] ) );
3146            for( int i = 1; i < iidsLen; i++ ){
3147                sql += " OR item_id=" + string( unsignedIntToString( iids[ i ] ) );
3148            }
3149            sql += " ) ";
3150        }
3151        sql += criteria2str( cri );
3152        
3153        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
3154            if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
3155                userid_t uid = 0;
3156                itemid_t item_id = 0;
3157                itemtypeid_t item_type_id = 0;
3158                time_t creation_date = 0;
3159                time_t last_update_date = 0;
3160                SQLINTEGER cbUid = 0, cbItem_id = 0, cbItem_type_id = 0, cbCreation_date = 0, cbLast_update_date = 0;
3161                SQLBindCol( hstmt, 1, SQL_C_ULONG, &item_id, 0, &cbItem_id );
3162                SQLBindCol( hstmt, 2, SQL_C_ULONG, &item_type_id, 0, &cbItem_type_id );
3163                SQLBindCol( hstmt, 7, SQL_C_ULONG, &uid, 0, &cbUid );
3164                SQLBindCol( hstmt, 8, SQL_C_SLONG, &creation_date, 0, &cbCreation_date );
3165                SQLBindCol( hstmt, 9, SQL_C_SLONG, &last_update_date, 0, &cbLast_update_date );
3166                
3167                *itemsLen = 0;
3168                for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < iidsLen ; i++ ){
3169                    dst[ i ].setItemID( item_id );
3170                    dst[ i ].setItemTypeID( item_type_id );
3171                    dst[ i ].setTitle( getResultCol( hstmt, 3 ).c_str() );
3172                    dst[ i ].setKeywords( getResultCol( hstmt, 4 ).c_str() );
3173                    dst[ i ].setDescription( getResultCol( hstmt, 5 ).c_str() );
3174                    dst[ i ].setDOI( getResultCol( hstmt, 6 ).c_str() );
3175                    dst[ i ].setContributorUID( uid );
3176                    dst[ i ].setCreationDate( creation_date );
3177                    dst[ i ].setLastUpdateDate( last_update_date );
3178                    ( *itemsLen )++;
3179                }
3180                *items = dst;
3181                ret = RES_OK;
3182            }else{
3183                string s( "SQLExecDirect in getItems" );
3184                s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
3185                s += string( ", sql=" ) + string( sql );
3186                setLastErrorString( s.c_str( ) );
3187                ret = RES_DB_QUERY_ERROR;
3188            }
3189            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
3190        }else{
3191            string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getItems" );
3192            s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
3193            setLastErrorString( s.c_str( ) );
3194            ret = RES_DB_QUERY_ERROR;
3195        }
3196        return ret;
3197    }
3198    
3199    /**
3200     *
3201     * アイテムIDの一覧取得.
3202     * アクセス可能なアイテムのIDを返す.
3203     *
3204     * @refer freeItemID
3205     * @param sid セッションID
3206     * @param cri 結果の範囲指定,ソート条件指定
3207     * @param iids 取得結果の配列のポインタを書き込む引数
3208     * @param iidssLen 検索結果の数
3209     * @return RES_OK
3210     * @return RES_DB_NOT_INITIALIZED
3211     * @return RES_NO_SUCH_SESSION
3212     * @return RES_DB_QUERY_ERROR
3213     *
3214     */
3215    result_t dumpItemID(sessionid_t sid, criteria_t* c, itemid_t** iids, int* iidsLen )
3216    {
3217        if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
3218        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
3219            
3220        result_t ret = RES_ERROR;
3221        SQLRETURN sqlcode;
3222        SQLHANDLE hstmt = NULL;    
3223        SQLINTEGER count = 0;
3224        string sql;
3225        itemid_t* dst = 0;
3226        
3227        sql = "SELECT item_id ";
3228        sql += "FROM " + dbprefix + "_xnpaccount_item_basic ";
3229        if( !isModeratorBySession( sid ) ){
3230            sql += "WHERE ";
3231            userid_t uid;
3232            if( getUIDFromSession( sid, &uid ) == RES_OK ){
3233                sql += "uid=" + unsignedIntToString( uid );
3234            }else{
3235                return RES_ERROR;
3236            }
3237        }
3238        sql += criteria2str( c );
3239        
3240        if( countResultRows( sql.c_str(), &count ) == RES_OK ){
3241            dst = new itemid_t[ count ];
3242            *iids = dst;
3243        }else{
3244            return RES_ERROR;
3245        }
3246        
3247        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
3248            if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
3249                SQLINTEGER len;
3250                userid_t itemid = 0;
3251                SQLBindCol( hstmt, 1, SQL_C_ULONG, &itemid, 0, &len );
3252                *iidsLen = 0;
3253                for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < count ; i++ ){
3254                    dst[ i ] = itemid;
3255                    *iidsLen++;
3256                }
3257                ret = RES_OK;
3258            }else{
3259                string s( "SQLExecDirect in dumpItemID" );
3260                s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
3261                s += string( ", sql=" ) + string( sql );
3262                setLastErrorString( s.c_str( ) );
3263                ret = RES_DB_QUERY_ERROR;
3264            }
3265            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
3266        }else{
3267            string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in dumpItemID" );
3268            s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
3269            setLastErrorString( s.c_str( ) );
3270            ret = RES_DB_QUERY_ERROR;
3271        }
3272        return ret;
3273    }
3274    
3275    /**
3276     *
3277     * アイテム(Basic Information)を更新する.
3278     * Platformユーザ以上の権限が必要.
3279     * itemのitem_idを正しくセットすること.
3280     *
3281     * @param sid セッションID
3282     * @param item 更新したいアイテムの情報
3283     * @return RES_OK
3284     * @return RES_ERROR
3285     * @return RES_NO_SUCH_SESSION
3286     * @return RES_DB_QUERY_ERROR
3287     * @return RES_DB_NOT_INITIALIZED
3288     *
3289     */
3290    result_t updateItem( sessionid_t sid, const item_t* item )
3291    {
3292        if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
3293        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
3294        if( !isActivatedBySession( sid ) ) return RES_NO_WRITE_ACCESS_RIGHT;
3295        
3296        string sql;
3297        SQLRETURN sqlcode;
3298        result_t ret = RES_ERROR;
3299        
3300        userid_t sess_uid;
3301        if( getUIDFromSession( sid, &sess_uid ) == RES_OK ){
3302            if( sess_uid != item -> getContributorUID( ) && !isModeratorBySession( sid ) )
3303                return RES_NO_WRITE_ACCESS_RIGHT;//no permissions to delete this item
3304        }else{
3305            return RES_ERROR;
3306        }
3307        
3308        SQLINTEGER uid, item_type_id, creation_date, last_update_date, item_id;
3309        SQLINTEGER cbUid = 0, cbItem_type_id = 0, cbCreation_date = 0, cbLast_update_date = 0, cbItem_id = 0;
3310        SQLCHAR title[ XNP_ITEM_TITLE_LEN + 1 ],
3311            keywords[ XNP_ITEM_KEYWORDS_LEN + 1 ],
3312            description[ XNP_ITEM_DESCRIPTION_LEN + 1 ],
3313            doi[ XNP_ITEM_DOI_LEN + 1 ];
3314        SQLINTEGER cbTitle = SQL_NTS,
3315            cbKeywords = SQL_NTS,
3316            cbDescription = SQL_NTS,
3317            cbDOI = SQL_NTS;
3318        
3319        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
3320            string sql;
3321            sql = "UPDATE " + dbprefix + "_xnpaccount_item_basic SET ";
3322            sql += "item_type_id=?";
3323            sql += ", title=?";
3324            sql += ", keywords=?";
3325            sql += ", description=?";
3326            sql += ", doi=?";
3327            sql += ", uid=?";
3328            sql += ", creation_date=?";
3329            sql += ", last_update_date=?";
3330            sql += " WHERE item_id=?";
3331            sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
3332            if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
3333                SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 0, 0, &item_type_id, 0, &cbItem_type_id );
3334                SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ITEM_TITLE_LEN, 0, title, 0, &cbTitle );
3335                SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ITEM_KEYWORDS_LEN, 0, keywords, 0, &cbKeywords );
3336                SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ITEM_DESCRIPTION_LEN, 0, description, 0, &cbDescription );
3337                SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ITEM_DOI_LEN, 0, doi, 0, &cbDOI );
3338                SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
3339                SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &creation_date, 0, &cbCreation_date );
3340                SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &last_update_date, 0, &cbLast_update_date );
3341                SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &item_id, 0, &cbItem_id );
3342                
3343                strncpy2( (char*)title, item -> getTitle(), XNP_ITEM_TITLE_LEN );
3344                strncpy2( (char*)keywords, item -> getKeywords(), XNP_ITEM_KEYWORDS_LEN );
3345                strncpy2( (char*)description, item -> getDescription(), XNP_ITEM_DESCRIPTION_LEN );
3346                strncpy2( (char*)doi, item -> getDOI(), XNP_ITEM_DOI_LEN );
3347                item_type_id = item -> getItemTypeID( );
3348                uid = item -> getContributorUID( );
3349                creation_date = item -> getCreationDate( );
3350                last_update_date = item -> getLastUpdateDate( );
3351                item_id = item -> getItemID( );
3352                
3353                if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
3354                    SQLINTEGER count = 0;
3355                    if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
3356                        ret = RES_OK;
3357                        //TODO update certify state
3358                    }else{
3359                        string s( "SQLRowCount in updateItem sql=" );
3360                        s += string( sql );
3361                        setLastErrorString( s.c_str( ) );
3362                        ret = RES_DB_QUERY_ERROR;
3363                    }
3364                }else{
3365                    string s( "SQLExecute in updateItem " );
3366                    s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
3367                    setLastErrorString( s.c_str( ) );
3368                    ret = RES_DB_QUERY_ERROR;
3369                }
3370            }else{
3371                string s( "SQLPrepare in updateItem " );
3372                s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
3373                setLastErrorString( s.c_str( ) );
3374                ret = RES_ERROR;
3375            }
3376            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
3377        }else{
3378            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateItem" );
3379            ret = RES_ERROR;
3380        }
3381        
3382        return ret;
3383    }
3384    
3385    result_t deleteItem( sessionid_t sid, itemid_t itemid )
3386    {
3387        if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
3388        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
3389        if( !isActivatedBySession( sid ) ) return RES_NO_WRITE_ACCESS_RIGHT;
3390        
3391        result_t ret = RES_ERROR;
3392        criteria_t c;
3393        string sql;
3394        groupid_t* gids;
3395        int gidsLen;
3396        SQLRETURN sqlcode;
3397        SQLHANDLE hstmt = NULL;
3398        const item_t* pitem;
3399        userid_t item_uid;
3400        const session_t* psess;
3401        
3402        // retrive an item id
3403        if( getItem( sid, itemid, &pitem ) != RES_OK )
3404            return RES_NO_WRITE_ACCESS_RIGHT;//no permissions to delete this item
3405        item_uid = pitem -> getContributorUID();
3406        freeItem( pitem );
3407        
3408        /*
3409          1. delete item from index keywords
3410          2. delete item from binders
3411          3. delete item
3412        */
3413        
3414        //TODO 1. delete item from index keywords
3415        
3416        //TODO 2. delete item from binders
3417        
3418        // 3. delete item
3419        sql = "DELETE FROM " + dbprefix + "_xnpaccount_item_basic ";
3420        sql += "WHERE item_id = " + string( unsignedIntToString( itemid ) );
3421        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
3422            if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
3423                SQLINTEGER count = 0;
3424                if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
3425                    ret = RES_OK;
3426                }else{
3427                    string s( "SQLRowCount in deleteItem" );
3428                    s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
3429                    s += string( ", sql=" ) + string( sql );
3430                    setLastErrorString( s.c_str( ) );
3431                    ret = RES_NO_SUCH_USER;
3432                }
3433            }else{
3434                string s( "SQLExecDirect in deleteItem" );
3435                s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
3436                s += ", sql=";
3437                s += string( sql );
3438                setLastErrorString( s.c_str( ) );
3439                ret = RES_DB_QUERY_ERROR;
3440            }
3441            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
3442        }else{
3443            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteItem" );
3444            ret = RES_ERROR;
3445        }
3446        
3447        return ret;
3448    }
3449    
3450    result_t getItemIDByIndexID( sessionid_t sid, indexid_t xid, itemid_t** iids, int* iidsLen ){ return RES_ERROR; }
3451    
3452    result_t getCertifyState( sessionid_t sid, itemid_t iid, indexid_t xid, certify_t* certify ){ return RES_ERROR; }
3453    
3454    result_t setCertifyState( sessionid_t sid, itemid_t iid, indexid_t xid, certify_t state ){ return RES_ERROR; }
3455    
3456    bool getCertifyPermission( sessionid_t sid, itemid_t iid, indexid_t xid, certify_t state ){ return RES_ERROR; }
3457    
3458    result_t getOverlappedItems( sessionid_t sid, indexid_t xid, item_t* item, itemid_t** iids, int* iidsLen ){ return RES_ERROR; }
3459    
3460    result_t registerItem( sessionid_t sid, indexid_t xid, itemid_t iid ){ return RES_ERROR; }
3461    
3462    result_t unregisterItem( sessionid_t sid, indexid_t xid, itemid_t iid ){ return RES_ERROR; }
3463    
3464    bool getItemPermission( sessionid_t sid, itemid_t iid, itemop_t op ){ return RES_ERROR; }
3465    
3466    result_t insertChangeLog( sessionid_t sid, itemid_t iid, time_t insertTime, const char* log ){ return RES_ERROR; }
3467    
3468    result_t insertChangeLog( sessionid_t sid, itemid_t iid, changelog_t** logs, int logsLen ){ return RES_ERROR; }
3469    
3470    
3471    
3472  /**  /**
3473   *   *
3474   * セッションの正当性をチェックする.   * セッションの正当性をチェックする.
# Line 4041  result_t swapIndexSortNumber( sessionid_ Line 4641  result_t swapIndexSortNumber( sessionid_
4641      return result;      return result;
4642  }  }
4643    
   
   
4644  void freeIndex( const index_t* ptr ){ delete[] ptr; }  void freeIndex( const index_t* ptr ){ delete[] ptr; }
4645  void freeIndexID( const indexid_t* ptr ){ delete[] ptr; }  void freeIndexID( const indexid_t* ptr ){ delete[] ptr; }
   
   
4646  void freeAccount( const account_t* ptr ){ delete[] ( account_t* )ptr; }  void freeAccount( const account_t* ptr ){ delete[] ( account_t* )ptr; }
4647  void freeGroup( const group_t* ptr ){ delete[] ( group_t* )ptr; }  void freeGroup( const group_t* ptr ){ delete[] ( group_t* )ptr; }
4648  void freeSession( const session_t* ptr ){ delete[] ( session_t* )ptr; }  void freeSession( const session_t* ptr ){ delete[] ( session_t* )ptr; }
4649  void freeUID( const int* ptr ){ delete[] ( int* )ptr; }  void freeUID( const userid_t* ptr ){ delete[] ( userid_t* )ptr; }
4650  void freeGID( const int* ptr ){ delete[] ( int* )ptr; }  void freeGID( const groupid_t* ptr ){ delete[] ( groupid_t* )ptr; }
4651    void freeItem( const item_t* ptr ){ delete[] ( item_t* )ptr; }
4652    void freeItemID( const itemid_t* ptr ){ delete[] ( itemid_t* )ptr; }
4653    
4654  static string errstr;  static string errstr;
4655  const char* getLastErrorString()  const char* getLastErrorString()

Legend:
Removed from v.1.38  
changed lines
  Added in v.1.39

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26