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.68 by tani, Mon Feb 21 05:46:18 2005 UTC revision 1.69 by tani, Tue Feb 22 02:39:30 2005 UTC
# Line 2  Line 2 
2   *   *
3   * $Revision$   * $Revision$
4   * $Log$   * $Log$
5     * Revision 1.69  2005/02/22 02:39:30  tani
6     * public_item_target_user_all関数を追加.
7     * SQL中のpublic_item_target_user_allの比較式をpublic_item_target_user_all関数に置換.
8     * sessionテーブルのLEFT JOINの条件にsidのチェックを追加.
9     * DB問合せ処理の高速化.
10     *
11   * Revision 1.68  2005/02/21 05:46:18  tani   * Revision 1.68  2005/02/21 05:46:18  tani
12   * getItemCountを追加.   * getItemCountを追加.
13   * dumpItemID, getItemsの問合せを高速化.   * dumpItemID, getItemsの問合せを高速化.
# Line 341  void syslog_printf( char* format, ... ) Line 347  void syslog_printf( char* format, ... )
347  #endif  #endif
348  }  }
349    
350    /**
351     *
352     * public_item_target_userの設定値が'all'ならtrueをかえす
353     * 設定値の取得に失敗した場合,'all'以外の場合はfalseをかえす
354     *
355     */
356    static bool public_item_target_user_all( )
357    {
358        char* value = 0;
359        bool public_item_target_user_all = false;
360        if( getConfigValue( XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY, &value ) == RES_OK ){
361            public_item_target_user_all = ( strcmp( value, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL ) == 0 );
362            freeString( value );
363        }
364        return public_item_target_user_all;
365    }
366    
367  static result_t countResultRows( const char* sql, SQLLEN* count )  static result_t countResultRows( const char* sql, SQLLEN* count )
368  {  {
369      result_t ret = RES_ERROR;      result_t ret = RES_ERROR;
# Line 3403  result_t getItems( sessionid_t sid, cons Line 3426  result_t getItems( sessionid_t sid, cons
3426      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";
3427      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";
3428      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid";      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid";
3429      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_config AS tc ON tc.name=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY "\" LEFT JOIN ";      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );
     sql+= dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );  
3430      sql+= " AND tsess.sid=" + unsignedIntToString( sid );      sql+= " AND tsess.sid=" + unsignedIntToString( sid );
3431      sql+= " WHERE ( tc.value=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";      sql+= " WHERE ( " + string( public_item_target_user_all( ) ? "1" : "0" );
3432      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";
3433      sql+=    " OR tc.value!=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";      sql+=    " OR " + string( !public_item_target_user_all( ) ? "1" : "0" );
3434      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";
3435      sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );      sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );
3436      sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );      sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );
# Line 3503  unsigned int getItemCount( sessionid_t s Line 3525  unsigned int getItemCount( sessionid_t s
3525      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";
3526      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";
3527      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid";      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid";
3528      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_config AS tc ON tc.name=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY "\" LEFT JOIN ";      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );
3529      sql+= dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );      sql+= " AND tsess.sid=" + unsignedIntToString( sid );
3530      sql+= " WHERE ( tc.value=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";      sql+= " WHERE ( " + string( public_item_target_user_all( ) ? "1" : "0" );
3531      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";
3532      sql+=    " OR tc.value!=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";      sql+=    " OR " + string( !public_item_target_user_all( ) ? "1" : "0" );
3533      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";
3534      sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );      sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );
3535      sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );      sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );
# Line 3546  result_t dumpItemID(sessionid_t sid, cri Line 3568  result_t dumpItemID(sessionid_t sid, cri
3568      result_t ret = RES_ERROR;      result_t ret = RES_ERROR;
3569      SQLRETURN sqlcode;      SQLRETURN sqlcode;
3570      SQLHANDLE hstmt = NULL;          SQLHANDLE hstmt = NULL;    
     SQLLEN count = 0;  
3571      string sql;      string sql;
3572      itemid_t* dst = 0;      itemid_t* dst = 0;
3573        int dst_max = 1024;
3574      userid_t uid;      userid_t uid;
3575            
 /*  
     sql = "SELECT item_id";  
     sql += " FROM " + dbprefix + "_xnpaccount_item_basic";  
     sql += " WHERE item_type_id!=" + unsignedIntToString( item::ITID_INDEX );  
     if( !isModeratorBySession( sid ) ){  
         userid_t uid;  
         if( sessionID2UID( sid, &uid ) == RES_OK ){  
             sql += " AND uid=" + unsignedIntToString( uid );  
         }else{  
             return RES_ERROR;  
         }  
     }  
     sql += criteria2str( c );  
 */  
3576      ret = sessionID2UID( sid, &uid );      ret = sessionID2UID( sid, &uid );
3577      if( ret != RES_OK ) return ret;      if( ret != RES_OK ) return ret;
3578    
# Line 3573  result_t dumpItemID(sessionid_t sid, cri Line 3581  result_t dumpItemID(sessionid_t sid, cri
3581      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";
3582      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";
3583      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid";      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid";
3584      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_config AS tc ON tc.name=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY "\" LEFT JOIN ";      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );
3585      sql+= dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );      sql+= " AND tsess.sid=" + unsignedIntToString( sid );
3586      sql+= " WHERE ( tc.value=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";      sql+= " WHERE ( " + string( public_item_target_user_all( ) ? "1" : "0" );
3587      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";
3588      sql+=    " OR tc.value!=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";      sql+=    " OR " + string( !public_item_target_user_all( ) ? "1" : "0" );
3589      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";
3590      sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );      sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );
3591      sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );      sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );
# Line 3586  result_t dumpItemID(sessionid_t sid, cri Line 3594  result_t dumpItemID(sessionid_t sid, cri
3594      sql+=    " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC );      sql+=    " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC );
3595      sql+= string( isModerator( sid, uid ) ? " OR 1" : " OR 0" ); //モデレータならOR 1,それ以外は OR 0      sql+= string( isModerator( sid, uid ) ? " OR 1" : " OR 0" ); //モデレータならOR 1,それ以外は OR 0
3596      sql+=    ") ";      sql+=    ") ";
3597      sql += criteria2str( c );      sql+= " AND ti.item_type_id != " + unsignedIntToString( item::ITID_INDEX ); //
3598        sql+= criteria2str( c );
3599    
3600      if( countResultRows( sql.c_str(), &count ) == RES_OK ){      dst = new itemid_t[ dst_max ];
3601          dst = new itemid_t[ count ];      *iids = dst;
3602          *iids = dst;      if( *iids == 0 ) return RES_ERROR; // out of memory
     }else{  
         return RES_ERROR;  
     }  
       
3603      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
3604          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
3605              SQLLEN len = 0;              SQLLEN len = 0;
3606              SQLUINTEGER itemid = 0;              SQLUINTEGER itemid = 0;
3607              SQLBindCol( hstmt, 1, SQL_C_ULONG, &itemid, 0, &len );              SQLBindCol( hstmt, 1, SQL_C_ULONG, &itemid, 0, &len );
3608              *iidsLen = 0;              *iidsLen = 0;
3609              for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < count ; i++ ){              for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ; i++ ){
3610                    if( dst_max <= i ){
3611                        itemid_t* old_dst = dst;
3612                        dst = new itemid_t[ dst_max * 2 ];
3613                        if( *iids == 0 ){
3614                            delete[] old_dst;
3615                            return RES_ERROR; // out of memory
3616                        }
3617                        memcpy( dst, old_dst, dst_max );
3618                        dst_max *= 2;
3619                        *iids = dst;
3620                        delete[] old_dst;
3621                    }
3622                  dst[ i ] = itemid;                  dst[ i ] = itemid;
3623                  (*iidsLen)++;                  (*iidsLen)++;
3624              }              }
# Line 4085  result_t getItemIDByIndexID( sessionid_t Line 4102  result_t getItemIDByIndexID( sessionid_t
4102      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid AND (ti.uid=";      sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid AND (ti.uid=";
4103      sql+= unsignedIntToString( uid ) + " OR ";      sql+= unsignedIntToString( uid ) + " OR ";
4104      sql+= string( isModerator( sid, uid ) ? "1" : "0" ) + ") LEFT JOIN ";      sql+= string( isModerator( sid, uid ) ? "1" : "0" ) + ") LEFT JOIN ";
     sql+= dbprefix + "_xnpaccount_config AS tc ON tc.name=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY "\" LEFT JOIN ";  
4105      sql+= dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );      sql+= dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );
4106      sql+= " WHERE ( tc.value=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";      sql+= " AND tsess.sid=" + unsignedIntToString( sid );
4107        sql+= " WHERE ( " + string( public_item_target_user_all( ) ? "1" : "0" );
4108      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";
4109      sql+=    " OR tc.value!=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";      sql+=    " OR " + string( !public_item_target_user_all( ) ? "1" : "0" );
4110      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";      sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";
4111  //    sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );  //    sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );
4112      sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );      sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );
# Line 4502  result_t getItemPermissions( sessionid_t Line 4519  result_t getItemPermissions( sessionid_t
4519                    
4520          sql1 = "SELECT count(DISTINCT tlink.item_id) ;          sql1 = "SELECT count(DISTINCT tlink.item_id) ;
4521          sql2 = "SELECT DISTINCT tlink.item_id ;          sql2 = "SELECT DISTINCT tlink.item_id ;
4522          sql+= " FROM " + dbprefix + "_xnpaccount_index_item_link AS tlink";          sql= " FROM " + dbprefix + "_xnpaccount_index_item_link AS tlink";
4523          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";
4524          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";
4525          sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid";          sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid";
4526          sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_config AS tc ON tc.name=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY "\" LEFT JOIN ";          sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );
4527          sql+= dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );          sql+= " AND tsess.sid=" + unsignedIntToString( sid );
4528          sql+= " WHERE ( tc.value=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";          sql+= " WHERE ( " + string( public_item_target_user_all( ) ? "1" : "0" );
4529          sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";          sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";
4530          sql+=    " OR tc.value!=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";          sql+=    " OR " + string( !public_item_target_user_all( ) ? "1" : "0" );
4531          sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";          sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";
4532          sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );          sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );
4533          sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );          sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );
# Line 4574  bool getItemPermission( sessionid_t sid, Line 4591  bool getItemPermission( sessionid_t sid,
4591          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";
4592          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";
4593          sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid";          sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_groups_users_link as tgulink ON tx.gid=tgulink.gid";
4594          sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_config AS tc ON tc.name=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY "\" LEFT JOIN ";          sql+= " LEFT JOIN " + dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );
4595          sql+= dbprefix + "_xnpaccount_session AS tsess ON tsess.uid=" + unsignedIntToString( uid );          sql+= " AND tsess.sid=" + unsignedIntToString( sid );
4596          sql+= " WHERE ( tc.value=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";          sql+= " WHERE ( " + string( public_item_target_user_all( ) ? "1" : "0" );
4597          sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";          sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NULL";
4598          sql+=    " OR tc.value!=\"" XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL "\"";          sql+=    " OR " + string( !public_item_target_user_all( ) ? "1" : "0" );
4599          sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";          sql+=       " AND tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) + " AND tsess.uid IS NOT NULL";
4600          sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );          sql+=    " OR tgulink.uid=" + unsignedIntToString( uid );
4601          sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );          sql+=    " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE );

Legend:
Removed from v.1.68  
changed lines
  Added in v.1.69

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