| 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 |
* |
* |
| 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() |
| 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 |
* |
* |