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.76 by aga4096, Fri Mar 4 06:13:28 2005 UTC revision 1.77 by aga4096, Sat Mar 5 01:48:35 2005 UTC
# Line 2  Line 2 
2   *   *
3   * $Revision$   * $Revision$
4   * $Log$   * $Log$
5     * Revision 1.77  2005/03/05 01:48:35  aga4096
6     * ・getItemCountGroupByIndexを作成.
7     *
8   * Revision 1.76  2005/03/04 06:13:28  aga4096   * Revision 1.76  2005/03/04 06:13:28  aga4096
9   * ・updateIndexで、同じ名前の兄弟があるか名前が空であるならエラーにした.   * ・updateIndexで、同じ名前の兄弟があるか名前が空であるならエラーにした.
10   *   *
# Line 6415  void freeItemID( const itemid_t* ptr ){ Line 6418  void freeItemID( const itemid_t* ptr ){
6418  void freeString( char* str ){ delete[] str; }  void freeString( char* str ){ delete[] str; }
6419  void freeChangeLog( const changelog_t* ptr ){ delete[] ( changelog_t* )ptr; }  void freeChangeLog( const changelog_t* ptr ){ delete[] ( changelog_t* )ptr; }
6420  void freePubmed( const pubmed_t* ptr ){ delete[] ( pubmed_t* )ptr; }  void freePubmed( const pubmed_t* ptr ){ delete[] ( pubmed_t* )ptr; }
6421    void freeInt( const int* ptr ){ delete[] ( int* )ptr; }
6422    
6423  static string errstr;  static string errstr;
6424  const char* getLastErrorString()  const char* getLastErrorString()
# Line 7046  result_t getOwnPublicItemID( sessionid_t Line 7050  result_t getOwnPublicItemID( sessionid_t
7050      return ret;      return ret;
7051  }  }
7052    
7053    /**
7054     * Readアクセス可能な全インデックス毎の、直下のアイテム数を得る.
7055     *
7056     * @param sid セッションID
7057     * @param xids index_idの配列を受け取るポインタ
7058     * @param xidsLen xidsの配列長を受け取るポインタ
7059     * @param counts xids[]の直下のアイテム数の配列を受け取るポインタ
7060     * @return RES_OK
7061     * @return RES_DB_NOT_INITIALIZED
7062     * @return RES_NO_SUCH_SESSION
7063     * @return RES_DB_QUERY_ERROR
7064     * @return RES_ERROR
7065     */
7066    result_t getItemCountGroupByIndex( sessionid_t sid, indexid_t **xids, int *xidsLen, int **counts ){
7067        if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
7068        
7069        result_t ret;
7070        userid_t uid;
7071        ret = sessionID2UID( sid, &uid );
7072        if( ret != RES_OK ) return ret;
7073        
7074        string indexItemLinkTable = dbprefix + "_xnpaccount_index_item_link";
7075        string indexTable = dbprefix + "_xnpaccount_index";
7076        string groupsUsersLinkTable = dbprefix + "_xnpaccount_groups_users_link";
7077        string sql = "SELECT COUNT(*) FROM " + indexTable;
7078        unsigned int maxXIDsLen;
7079        ret = queryGetUnsignedInt( "getItemCountGroupByIndex", sql, &maxXIDsLen );
7080        if ( RES_OK != ret )
7081            return ret;
7082        
7083        *xids = new indexid_t [maxXIDsLen];
7084        *counts = new int [maxXIDsLen];
7085        
7086        if ( isModerator(sid, uid) ) {
7087            sql = "SELECT index_id, COUNT(*) from " + indexItemLinkTable + " GROUP BY index_id";
7088        }
7089        else {
7090           sql = "SELECT  tx.index_id, COUNT(*) "
7091               "  FROM " + indexTable + " AS tx"
7092               "  LEFT JOIN " + groupsUsersLinkTable + " AS tgl ON tx.gid=tgl.gid AND tgl.uid=" + unsignedIntToString(uid) +
7093               "  LEFT JOIN " + indexItemLinkTable + " AS tl ON tx.index_id=tl.index_id"
7094               "  WHERE tx.open_level=" + unsignedIntToString( index::OL_PUBLIC ) +
7095                 " OR tx.open_level=" + unsignedIntToString( index::OL_GROUP_ONLY ) + " AND tgl.uid IS NOT NULL "
7096                 " OR tx.open_level=" + unsignedIntToString( index::OL_PRIVATE ) + " AND tx.uid=" + unsignedIntToString(uid) +
7097               "  GROUP BY tx.index_id";
7098        }
7099        SQLRETURN sqlcode;
7100        SQLHANDLE hstmt = NULL;
7101        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
7102            if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
7103                SQLUINTEGER xid = 0;
7104                SQLUINTEGER count = 0;
7105                SQLLEN xidSQLLen = 0;
7106                SQLLEN countSQLLen = 0;
7107                SQLBindCol( hstmt, 1, SQL_C_ULONG, &xid, 0, &xidSQLLen );
7108                SQLBindCol( hstmt, 2, SQL_C_ULONG, &count, 0, &countSQLLen );
7109                for( *xidsLen=0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && *xidsLen < (int)maxXIDsLen ; (*xidsLen)++ ){
7110                    *( *xids + *xidsLen ) = xid;
7111                    *( *counts + *xidsLen ) = count;
7112                }
7113            }
7114            else {
7115                string s( "SQLExecDirect in getItemCountGroupByIndex " );
7116                s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
7117                s += "sql=";
7118                s += sql;
7119                setLastErrorString( s.c_str( ) );
7120                ret = RES_DB_QUERY_ERROR;
7121            }
7122            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
7123        }
7124        else {
7125            string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getItemCountGroupByIndex " );
7126            s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
7127            setLastErrorString( s.c_str( ) );
7128            ret = RES_ERROR;
7129        }
7130        
7131        if ( ret != RES_OK ){
7132            delete[] *xids;
7133            delete[] *counts;
7134        }
7135        return ret;
7136    }
7137    
7138    
7139  /**  /**
7140   *   *

Legend:
Removed from v.1.76  
changed lines
  Added in v.1.77

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