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.114 by tani, Wed Nov 16 03:59:06 2005 UTC revision 1.115 by tani, Thu Nov 17 10:59:36 2005 UTC
# Line 22  Line 22 
22   *   *
23   * $Revision$   * $Revision$
24   * $Log$   * $Log$
25     * Revision 1.115  2005/11/17 10:59:36  tani
26     * アイテム間リンク機能: insertRelatedTo, deleteRelatedTo, getRelatedToを追加.
27     *
28   * Revision 1.114  2005/11/16 03:59:06  tani   * Revision 1.114  2005/11/16 03:59:06  tani
29   * XOONIPS_STABLEの分岐点〜MergePnt_20051116間のXooNIps_STABLE上の修正をCURRENTにマージ.   * XOONIPS_STABLEの分岐点〜MergePnt_20051116間のXooNIps_STABLE上の修正をCURRENTにマージ.
30   *   *
# Line 8372  result_t selectiveHarvesting( time_t fro Line 8375  result_t selectiveHarvesting( time_t fro
8375  }  }
8376    
8377    
8378    /**
8379     *
8380     * アイテム間リンク情報を追加する.
8381     * Platformユーザ以上の権限が必要.
8382     *
8383     * TODO itemidが閲覧できないアイテムをさしている場合,追加できない
8384     * TODO parentid,itemidの何れかまたは一方が指すアイテムが存在しないとき,追加できない
8385     *
8386     * @param sid セッションID
8387     * @param parentid リンク元アイテムのID
8388     * @param itemid リンク先(被リンク)アイテムのID
8389     * @return RES_OK
8390     * @return RES_ERROR
8391     * @return RES_NO_SUCH_SESSION
8392     * @return RES_DB_QUERY_ERROR
8393     * @return RES_DB_NOT_INITIALIZED
8394     * @return RES_NO_WRITE_ACCESS_RIGHT parentidが編集できないアイテムをさしている,<br/>またはitemidが閲覧できないアイテムを指している,<br/>または XooNIpsユーザでない(activate待ち)
8395     *
8396     */
8397    result_t insertRelatedTo( sessionid_t sid, itemid_t parentid, itemid_t itemid )
8398    {
8399        if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
8400        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
8401        if( !isActivatedBySession( sid ) ) return RES_NO_WRITE_ACCESS_RIGHT;
8402        if( !getItemPermission( sid, parentid, item::OP_MODIFY ) ) return RES_NO_WRITE_ACCESS_RIGHT;
8403        if( !getItemPermission( sid, itemid, item::OP_READ ) ) return RES_NO_WRITE_ACCESS_RIGHT;
8404        
8405        string sql;
8406        SQLHANDLE hstmt = NULL;
8407        SQLRETURN sqlcode;
8408        result_t ret = RES_ERROR;
8409    
8410    
8411        sql = "SELECT * FROM " + dbprefix + "_xoonips_related_to WHERE parent_id="
8412            + string( unsignedIntToString( parentid ) ) + " AND item_id=" + string( unsignedIntToString( itemid ) );
8413        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
8414            if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
8415                if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
8416                    //nothing to do because already registered
8417                    SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
8418                    return RES_OK;
8419                }
8420            }
8421        }else{
8422            string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertRelatedTo" );
8423            s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
8424            setLastErrorString( s.c_str( ) );
8425            return RES_ERROR;
8426        }
8427            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
8428        
8429        sql = "INSERT INTO " + dbprefix + "_xoonips_related_to (parent_id, item_id) VALUES ("
8430            + string( unsignedIntToString( parentid ) ) + ", " + string( unsignedIntToString( itemid ) ) + ")";
8431        
8432        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
8433            if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
8434                ret = RES_OK;
8435            }else{
8436                string s( "SQLExecuteDirect in insertRelatedTo " );
8437                s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
8438                setLastErrorString( s.c_str( ) );
8439                ret = RES_DB_QUERY_ERROR;
8440            }
8441            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
8442        }else{
8443            string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertRelatedTo" );
8444            s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
8445            setLastErrorString( s.c_str( ) );
8446            ret = RES_ERROR;
8447        }
8448        
8449        return ret;
8450    }    
8451    
8452    
8453    /**
8454     *
8455     * アイテム間リンク情報を削除する.
8456     *
8457     * @param sid セッションID
8458     * @param parentid 削除したいリンクのリンク元アイテムのID
8459     * @param itemid 削除したいリンクのリンク先(被リンク)アイテムのID
8460     * @return RES_OK 削除に成功した,または指定されたリンク情報が存在しなかった.
8461     * @return RES_ERROR
8462     * @return RES_NO_SUCH_SESSION
8463     * @return RES_DB_QUERY_ERROR
8464     * @return RES_DB_NOT_INITIALIZED
8465     * @return RES_NO_WRITE_ACCESS_RIGHT XooNIpsユーザでない(activate待ち),またはparentidのアイテム編集権限が無い
8466     */
8467    result_t deleteRelatedTo( sessionid_t sid, itemid_t parentid, itemid_t itemid )
8468    {
8469        if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
8470        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
8471        if( !isActivatedBySession( sid ) ) return RES_NO_WRITE_ACCESS_RIGHT;
8472        if( !getItemPermission( sid, parentid, item::OP_MODIFY ) ) return RES_NO_WRITE_ACCESS_RIGHT;
8473        
8474        result_t ret = RES_ERROR;
8475        string sql;
8476        SQLRETURN sqlcode;
8477        SQLHANDLE hstmt = NULL;
8478        
8479        sql = "DELETE FROM " + dbprefix + "_xoonips_related_to ";
8480        sql += "WHERE parent_id=" + string( unsignedIntToString( parentid ) )
8481            + " AND item_id = " + string( unsignedIntToString( itemid ) );
8482        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
8483            if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
8484                ret = RES_OK;
8485            }else{
8486                string s( "SQLExecuteDirect in deleteRelatedTo " );
8487                s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
8488                setLastErrorString( s.c_str( ) );
8489                ret = RES_DB_QUERY_ERROR;
8490            }
8491            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
8492        }else{
8493            string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteRelatedTo" );
8494            s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
8495            setLastErrorString( s.c_str( ) );
8496            ret = RES_ERROR;
8497        }
8498        return ret;
8499    }
8500    
8501    /**
8502     *
8503     * アイテム間リンク情報を取得する.
8504     * リンク先アイテムの閲覧権限が無い場合,そのリンク情報は返さない.
8505     *
8506     * @param sid セッションID
8507     * @param parentid リンク元アイテムのID
8508     * @param itemids 結果を受け取る配列(paerntidからリンクしているアイテムのID)
8509     * @param itemidsLen itemidsの数を受け取る変数
8510     * @return RES_OK
8511     * @return RES_ERROR
8512     * @return RES_NO_SUCH_SESSION
8513     * @return RES_DB_QUERY_ERROR
8514     * @return RES_DB_NOT_INITIALIZED
8515     * @return RES_NO_WRITE_ACCESS_RIGHT parentidが指すにアクセス権が無い, XooNIpsユーザでない(activate待ち)
8516     */
8517    result_t getRelatedTo( sessionid_t sid, itemid_t parentid, itemid_t** itemids, int* itemidsLen )
8518    {
8519        if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
8520        if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
8521        if( !isActivatedBySession( sid ) ) return RES_NO_WRITE_ACCESS_RIGHT;
8522        if( !getItemPermission( sid, parentid, item::OP_READ ) ) return RES_NO_WRITE_ACCESS_RIGHT;
8523        
8524        result_t ret = RES_ERROR;
8525        string sql;
8526        SQLRETURN sqlcode;
8527        SQLHANDLE hstmt = NULL;
8528        
8529        sql = "SELECT count(*) FROM " + dbprefix + "_xoonips_related_to ";
8530        sql += "WHERE parent_id=" + string( unsignedIntToString( parentid ) );
8531        syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() );
8532        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
8533            if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
8534                SQLUINTEGER cnt_tmp = 0;//リンクの総数(閲覧権限の有無に拘らない数)
8535                SQLLEN len = 0;
8536                SQLBindCol( hstmt, 1, SQL_C_ULONG, &cnt_tmp, 0, &len );
8537                if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
8538                    int count = 0; //閲覧可能なアイテムへのリンクの数
8539                    itemid_t *ids_tmp = new itemid_t[ cnt_tmp ];
8540                    if( cnt_tmp > 0 ){
8541                        //retrieve IDs
8542                        SQLHANDLE hstmt2 = NULL;    
8543                        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
8544                            sql = "SELECT item_id FROM " + dbprefix + "_xoonips_related_to ";
8545                            sql += "WHERE parent_id=" + string( unsignedIntToString( parentid ) );
8546                            syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() );
8547                            if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
8548                                SQLUINTEGER iid = 0;
8549                                SQLLEN len = 0;
8550                                SQLBindCol( hstmt2, 1, SQL_C_ULONG, &iid, 0, &len );
8551                                for( SQLUINTEGER i = 0; ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS && i < cnt_tmp ; i++ ){
8552                                    if( getItemPermission( sid, iid, item::OP_READ ) ){
8553                                        ids_tmp[ count ] = iid;
8554                                        count++;
8555                                    }
8556                                }
8557                                *itemids = new itemid_t[ count ];
8558                                if( count > 0 ) memcpy( *itemids, ids_tmp, sizeof( itemid_t ) * count );
8559                                *itemidsLen = count;
8560                                delete[] ids_tmp;
8561                                ret = RES_OK;
8562                            }else{
8563                                setLastErrorString( "SQLExecDirect in getRelatedTo" );
8564                                ret = RES_DB_QUERY_ERROR;
8565                            }
8566                            SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
8567                        }else{
8568                            string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getRelatedTo" );
8569                            s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
8570                            setLastErrorString( s.c_str( ) );
8571                            ret = RES_ERROR;
8572                        }
8573                    }else{
8574                        *itemids = new itemid_t[ 0 ];
8575                        *itemidsLen = 0;
8576                        ret = RES_OK;
8577                    }
8578                    
8579                }else{
8580                    string s( "SQLFetch in getRelatedTo " );
8581                    s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
8582                    setLastErrorString( s.c_str( ) );
8583                    ret = RES_DB_QUERY_ERROR;
8584                }
8585            }else{
8586                string s( "SQLExecuteDirect in getRelatedTo " );
8587                s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
8588                setLastErrorString( s.c_str( ) );
8589                ret = RES_DB_QUERY_ERROR;
8590            }
8591            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
8592        }else{
8593            string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getRelatedTo" );
8594            s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
8595            setLastErrorString( s.c_str( ) );
8596            ret = RES_ERROR;
8597        }
8598        return ret;
8599    }

Legend:
Removed from v.1.114  
changed lines
  Added in v.1.115

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