Develop and Download Open Source Software

Browse CVS Repository

Contents of /xoonips/AL/commonal.cc

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


Revision 1.38 - (show annotations) (download) (as text)
Sat Jan 15 00:39:16 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.37: +11 -10 lines
File MIME type: text/x-c++src
・x_xnpaccount_item_basicの構造を変更.

1 /*
2 *
3 * $Revision: 1.37 $
4 * $Log: commonal.cc,v $
5 * Revision 1.37 2005/01/14 10:36:59 aga
6 * ??ndex?≫?????????菴遵??.
7 * ??nsertAccount??rivate index??篏???????????篆??.
8 * ??nsertGroup??roup index ??篏???????????篆??.
9 *
10 * Revision 1.36 2005/01/13 04:19:22 aga
11 * ??P??XNP?????.
12 *
13 * Revision 1.35 2005/01/06 07:20:17 youi
14 * WIN32絎?臂??????ゃ?潟?????若????申??.
15 * MySQL API???≪?????????????<?ゃ????????
16 * deleteAccount: ??絮?????Platform?違???若???????????ゃ?????泣????.
17 * insertAccount: ???若?句?脂?蚊??????????????????Platform?違???若???悟?脂?蚊????.
18 * deleteMember: ??????????Platform?違???若???????????ゃ??胼?罩≪????.
19 * deleteMemberNoLimit???臂?
20 *
21 * Revision 1.34 2004/12/28 04:38:14 aga
22 * ??ogoutUser()??信罩?
23 *
24 * Revision 1.33 2004/12/27 05:56:23 youi
25 * odbcDiagString: STMT篁ュ?????潟??????????????????????眼????.
26 * syslog?<???祉?若?吾????????菴遵??????.
27 *
28 * Revision 1.32 2004/12/25 09:46:47 youi
29 * MySQL+MyODBC?у??篏???????????信罩c????.
30 *
31 * Revision 1.31 2004/12/21 11:42:59 youi
32 * ?潟?<?潟??????逸??祉???ゃ???????????菴遵??.
33 *
34 * Revision 1.30 2004/12/18 10:24:54 youi
35 * IMPORT_MYSQLDLL??絎?臂?????????鐚?MYSQL??LL?????????潟?????????????帥?ゃ??絎h???
36 * ???鴻????????????信罩c????.
37 *
38 * Revision 1.29 2004/12/18 01:12:29 youi
39 * freeResult???∽?医????free<???若?水??>????眼????.
40 *
41 * Revision 1.28 2004/12/14 12:02:08 youi
42 * __WIN__??絎?臂???????????indows??ll篏??????荀?????????茵?????.
43 * USE_SYSLOG??絎?臂???????????yslogd?吾?<???祉?若?吾???阪??????.
44 * getAccounts: uidsLen??0??????????????菴遵??????.
45 *
46 * Revision 1.27 2004/12/06 11:34:47 aga
47 * ??ninitializeDB()??菴遵??.
48 *
49 * Revision 1.26 2004/12/06 10:17:36 youi
50 * mysql_use_result????腟?????罧??????????冴??????鐚?
51 * while( row = mysql_fetch_row(result) );???水?ワ?
52 *
53 * Revision 1.25 2004/12/06 07:24:33 youi
54 * insertAccount, insertGroup:
55 * ?域?菴遵?????????宴???綽????????若??D鐚??違???若??ID??膃??綣??違???吾??莨若??.
56 *
57 * Revision 1.24 2004/12/06 01:45:50 aga
58 * ?祉?潟?<?潟???ゃ??.
59 * ?脂???上???篆??.
60 *
61 * Revision 1.23 2004/12/04 09:21:10 aga
62 * ??np_config ?? xnpaccount_config.
63 *
64 * Revision 1.22 2004/12/03 07:17:21 youi
65 * isModerator?с?≪???祉?鴻???????若?帥???若?鴻???若????????篆??.
66 *
67 * Revision 1.21 2004/12/01 10:28:58 youi
68 * DB????????????眼??軸??篆??
69 * institute -> division
70 * organizaion -> company_name
71 *
72 * Revision 1.20 2004/12/01 04:37:04 youi
73 * freeResult: unsigned int* ?? int* ?娯信罩?
74 * ?潟?<?潟???????∽?違???????菴処?.
75 *
76 * Revision 1.19 2004/11/30 06:40:11 youi
77 * ?∽?違??菴遵??(gidExists, uidExists)
78 * getGroupCount??絎?臂?
79 * getGroupsByUid??絎?臂?
80 * isGroupAdmin??篆??.
81 * dumpGroupAdmins??絎?臂?
82 * deleteMember??絎?臂?
83 * insertMember??絎?臂?
84 * getMembers??絎?臂?
85 * isModerator??絎?臂?
86 *
87 * Revision 1.18 2004/11/30 05:46:32 aga
88 * ??ession????remoteHost??????
89 *
90 * Revision 1.17 2004/11/27 09:35:49 youi
91 * isActivated??絎?臂?
92 * activate??絎?臂?
93 * dumpUid??絎?臂?
94 *
95 * Revision 1.16 2004/11/27 06:29:29 youi
96 * getAccountCount??絎?臂?
97 * dumpGids??絎?臂?
98 * insertGroup, deleteGroup, updateGroup??絎?臂?
99 * getGroup, getGroups??絎?臂?
100 * ???若?帥???若?劫?????????弱?冴?????鐚?RES_DB_NOT_INITIALIZED??菴????????????∽?違??申??
101 * (???綽????∽?違??罧??c??????)
102 *
103 * Revision 1.15 2004/11/27 02:22:22 aga
104 * ??nitializeDB????ddSlashes()???若?吟???純?<??????篆??.
105 *
106 * Revision 1.14 2004/11/27 01:07:31 youi
107 * criteria2str: LIMIT??RDER BY?????????ャ???帥????.
108 *
109 * Revision 1.13 2004/11/27 00:35:39 youi
110 * getAccounts??絎?臂?
111 * getAccount??篆??鐚???????etAccounts???若?喝?冴??.
112 * criteria2str??絎?臂?
113 *
114 * Revision 1.12 2004/11/26 09:45:28 youi
115 * getAccount??絎?臂?
116 *
117 * Revision 1.11 2004/11/26 08:16:26 aga
118 * ??etSession, loginUser, createSession, freeResult(const session_t*) 篆??.
119 *
120 * Revision 1.10 2004/11/26 07:57:42 youi
121 * updateAccount, deleteAccount??絎?臂?
122 * mysql_query紊掩??????tderr?吾?????若?潟?若?????????若?<???祉?若?吾???阪??.
123 *
124 * Revision 1.9 2004/11/26 07:38:02 aga
125 * ??AILUE -> FAILURE.
126 *
127 * Revision 1.8 2004/11/26 06:36:55 aga
128 * ??reateSession, getSession ??篏???.
129 *
130 * Revision 1.7 2004/11/26 04:51:47 youi
131 * dbprefix??絎?臂?????.
132 * insertAccount??絎?臂?????.
133 * isValidSessionID??絎?臂?????.
134 *
135 * Revision 1.6 2004/11/26 04:35:55 aga
136 * ??oginUser(), logoutUser()??篏???.
137 *
138 * Revision 1.5 2004/11/26 01:08:25 aga
139 * ??ddSlashes()篏???.
140 *
141 * Revision 1.4 2004/11/25 12:14:29 youi
142 * getUid????????絎?臂?????.
143 *
144 * Revision 1.3 2004/11/25 11:13:59 youi
145 * getLastErrorString/setLastErrorString??絎?臂?
146 *
147 * Revision 1.2 2004/11/25 08:55:19 youi
148 * 綣??違??????篆??.
149 * freeResult??菴遵??.
150 *
151 * Revision 1.1 2004/11/25 05:14:58 youi
152 * initial version
153 *
154 *
155 */
156 #ifdef WIN32
157 #include <windows.h>
158 #endif
159
160 #ifdef USE_SYSLOG
161 #include <syslog.h>
162 #endif
163
164 #include <stdio.h>
165 #include <stdlib.h>
166 #include <string.h>
167 #include <string>
168 #include <assert.h>
169 #include <sql.h>
170 #include <sqlext.h>
171 using namespace std;
172
173 #include "common.h"
174 #include "account.h"
175 #include "group.h"
176 #include "session.h"
177 #include "criteria.h"
178 #include "commonal.h"
179 #include "item.h"
180 #include "index.h"
181
182 static string dbprefix; //!< XOOPS???若?帥???若?鴻???若??????REFIX
183
184 static SQLHANDLE henv = NULL;
185 static SQLHANDLE hdbc = NULL;
186 static SQLHANDLE hstmt = NULL;
187
188 static result_t insertIndexInternal( sessionid_t sid, index_t *index, indexid_t *xid );
189
190 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode );
191 static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid );
192
193 static result_t countResultRows( const char* sql, SQLINTEGER* count )
194 {
195 result_t ret = RES_ERROR;
196 SQLRETURN sqlcode;
197 SQLHANDLE hstmt = NULL;
198 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
199 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql, strlen( sql ) ) ) == SQL_SUCCESS ){
200 *count = 0;
201 while( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ) ( *count )++;
202 ret = RES_OK;
203 }else{
204 string s( "SQLExecDirect in countResultRows " );
205 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
206 s += "sql=";
207 s += string( sql );
208 setLastErrorString( s.c_str( ) );
209 ret = RES_DB_QUERY_ERROR;
210 }
211 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
212 }
213 return ret;
214 }
215
216 /** SQL??絎?茵???????腟?????????????
217 * @param sql sql
218 * @return result_t
219 */
220 static result_t querySimple( const char *functionName, string &sql ){
221 result_t ret = RES_ERROR;
222 SQLRETURN sqlcode;
223 SQLHANDLE hstmt = NULL;
224 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
225 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){
226 ret = RES_OK;
227 }else{
228 string s( "SQLExecDirect in querySimple " );
229 s += functionName;
230 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
231 s += "sql=";
232 s += sql;
233 setLastErrorString( s.c_str( ) );
234 ret = RES_DB_QUERY_ERROR;
235 }
236 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
237 }
238 else {
239 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in querySimple " );
240 ret = RES_ERROR;
241 }
242 return ret;
243 }
244
245 /** SQL??絎?茵?????1茵????????????贋?医??NULL????0???帥????)???水?????????
246 * @param sql sql
247 * @param u ?贋?医?ゃ??????????紊??違??
248 * @return result_t
249 */
250 static result_t queryGetUnsignedInt( const char *functionName, string &sql, unsigned int *u ){
251 result_t ret = RES_ERROR;
252 SQLRETURN sqlcode;
253 SQLHANDLE hstmt = NULL;
254 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
255 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){
256 SQLUINTEGER sInt = 0;
257 SQLINTEGER len;
258 SQLBindCol( hstmt, 1, SQL_C_ULONG, &sInt, 0, &len );
259 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
260 if ( len == SQL_NULL_DATA )
261 sInt = 0;
262 *u = sInt;
263 ret = RES_OK;
264 }else{
265 string s( "SQLFetch in queryGetUnsignedInt " );
266 s += functionName;
267 setLastErrorString( s.c_str( ) );
268 ret = RES_ERROR;
269 }
270 }else{
271 string s( "SQLExecDirect in queryGetUnsignedInt " );
272 s += functionName;
273 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
274 s += "sql=";
275 s += sql;
276 setLastErrorString( s.c_str( ) );
277 ret = RES_DB_QUERY_ERROR;
278 }
279 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
280 }
281 else {
282 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in queryGetUnsignedInt " );
283 ret = RES_ERROR;
284 }
285 return ret;
286 }
287
288 /** sid????uid??緇?????
289 * @param sid session id
290 * @param uid uid??????????紊???/span>
291 * @return
292 */
293 static result_t sessionID2UID( sessionid_t sid, userid_t *uid ){
294 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
295
296 SQLRETURN sqlcode;
297 SQLHANDLE hstmt = NULL;
298
299 string sql = "SELECT uid FROM " + dbprefix + "_xnpaccount_session WHERE sid=" + unsignedIntToString(sid);
300 return queryGetUnsignedInt( "sessionID2UID", sql, (unsigned int*)uid );
301 }
302
303 /**
304 *
305 * ??絖????潟???種?
306 * ??絎???絖??違???潟???若??鐚????????<????緇???NULL腟?腴?????鐚?/span>
307 * ( dst???泣?ゃ? >= len + 1 )?с????????/span>
308 *
309 */
310 static char* strncpy2( char* dst, const char* src, int len )
311 {
312 strncpy( dst, src, len );
313 dst[ len ] = '\0';
314 // fprintf( stderr, "strncpy2 '%s'\n", dst );
315 return dst;
316 }
317
318 /**
319 *
320 * SQL???茵?腟????????????惹??絖?????????????
321 *
322 * @param hstmt SQL??????潟????/span>
323 * @param sqlcode SQLExecDirect,SQLExecute???祉????/span>
324 * @return ?????惹??絖???
325 */
326 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode )
327 {
328 string s;
329 if( sqlcode == SQL_ERROR || sqlcode == SQL_SUCCESS_WITH_INFO ){
330 SQLCHAR SQLState[6];
331 SQLINTEGER NativeError;
332 SQLCHAR MessageText[ 1024 ];
333 SQLSMALLINT BufferLength;
334 SQLSMALLINT TextLength;
335 SQLGetDiagRec( HandleType, hstmt, 1, SQLState, &NativeError, MessageText, 1024, &TextLength );
336
337 s += string( (char*)MessageText );
338 s += " SQLSTATE=";
339 s += string( (char*)SQLState );
340
341 }
342 s += " sqlcode=";
343 s += intToString( sqlcode );
344 return s;
345 }
346
347 /**
348 *
349 * ??絎??????????ゃ???????冴??????????絖?????菴???
350 *
351 */
352 string getResultCol( SQLHANDLE hstmt, int col )
353 {
354 string s;
355 SQLRETURN sqlcode;
356 SQLCHAR BinaryPtr[5000];
357 SQLUINTEGER PartID;
358 SQLINTEGER PartIDInd, BinaryLenOrInd, NumBytes;
359 SQLRETURN rc;
360
361 while ( ( sqlcode = SQLGetData(hstmt, col, SQL_C_CHAR, BinaryPtr, sizeof(BinaryPtr),
362 &BinaryLenOrInd)) != SQL_NO_DATA) {
363 NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ? 5000 : BinaryLenOrInd;
364 if( NumBytes >= 0 ){
365 s += string( (char*)BinaryPtr, NumBytes );
366 }
367 }
368 #ifdef USE_SYSLOG
369 // openlog( "commonal", LOG_ODELAY, LOG_USER );
370 // syslog( LOG_DEBUG, "getResultCol col=%d ret='%s'\n", col, s.c_str());
371 // closelog( );
372 #endif
373 return s;
374 }
375
376
377 /**
378 *
379 * ?????若????????\荐??激?с???鴻?宴?若??????
380 *
381 * @param str addslashes???鴻????絖?????NULL??絎?筝?????
382 * @return 紊???緇?????絖???
383 */
384 string addSlashes( const char *str )
385 {
386 if ( hdbc == NULL ){
387 string s;
388 return s;
389 }else{
390 string s( str );
391 return s;
392 }
393
394 int len = strlen(str) * 3;
395 char* dst = new char[ len ];
396 const char* from = str;
397 char* to = dst;
398 while( *from != '\0' ){
399 switch( *from ){
400 case '\'':
401 case '\"':
402 case ';':
403 *to = '\\'; to++;
404 break;
405 }
406 *to = *from; to++;
407 from++;
408 }
409 *to = '\0';
410 string s( dst );
411 delete[] dst;
412 return s;
413 }
414
415 /**
416 *
417 * gid??????????с????
418 * DB???≪???祉?劫け????????false??????鐚?/span>
419 *
420 * @param gid ???с??????????GID
421 * @return true 絖???????
422 * @return false 絖?????????
423 *
424 */
425 static bool gidExists( groupid_t gid )
426 {
427 string sql;
428 SQLRETURN sqlcode;
429 SQLHANDLE hstmt = NULL;
430
431 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) != SQL_SUCCESS ) {
432 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in gidExists" );
433 return false;
434 }
435
436 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_groups ";
437 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
438 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) != SQL_SUCCESS ){
439 setLastErrorString( "SQLExecDirect in gidExists" );
440 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
441 return false;
442 }
443
444 if( ( sqlcode = SQLFetch( hstmt ) ) != SQL_SUCCESS ){
445 setLastErrorString( "SQLFetch in gidExists" );
446 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
447 return false;
448 }
449
450 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
451 return true;
452 }
453
454
455 /**
456 *
457 * Platform???若?倶???宴??id??絖??????????????с????
458 * DB???≪???祉?劫け????????false??????鐚?/span>
459 *
460 * @param uid ???с??????????UID
461 * @return true 絖???????
462 * @return false 絖?????????
463 *
464 */
465 static bool uidExists( userid_t uid )
466 {
467 bool ret = false;
468 string sql;
469 SQLRETURN sqlcode;
470 SQLINTEGER count = 0;
471
472 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_users ";
473 sql += "WHERE uid=" + string( unsignedIntToString( uid ) );
474 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
475 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
476 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
477 ret = true;
478 }else{
479 string s( "SQLFetch in uidExists ");
480 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
481 s += string( ", sql=" ) + string( sql );
482 setLastErrorString( s.c_str( ) );
483 ret = false;
484 }
485 }else{
486 string s( "SQLExecDirect in uidExists ");
487 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
488 s += string( ", sql=" ) + string( sql );
489 setLastErrorString( s.c_str( ) );
490 ret = false;
491 }
492 }else{
493 string s( "SQLAllocHandle in uidExists ");
494 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
495 setLastErrorString( s.c_str( ) );
496 ret = false;
497 }
498 return ret;
499 }
500
501
502 /**
503 *
504 * criteria ?? SQL?????????
505 *
506 *
507 *
508 */
509 string criteria2str( criteria* cri )
510 {
511 string sql;
512
513 const orderby* odrby = cri -> headOrderBy( );
514 if( odrby != 0 ){
515 sql += " ORDER BY " + string( odrby -> getColumn( ) );
516 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
517 while( ( odrby = cri -> nextOrderBy( ) ) != 0 ){
518 sql += ", " + string( odrby -> getColumn( ) );
519 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
520 }
521 }
522
523 if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){
524 sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) )
525 + ", " + string( intToString( cri -> getLimitRows( ) ) );
526 }
527 return sql;
528 }
529
530
531 /**
532 *
533 * ???若?帥???若?鴻????????
534 *
535 * @param dsn DSN
536 * @param user ???若?帥???若?鴻???≪???祉?鴻???????若?九??
537 * @param password 筝?荐????若?吟?????鴻???若??
538 * @param dbname ??????/span>
539 * @param prefix XOOPS???若?帥???若?鴻???若??????REFIX
540 * @return RES_OK
541 * @return RES_DB_INITIALIZE_ERROR
542 * @return RES_DB_CONNECT_ERROR
543 * @refer result_t
544 */
545 result_t initializeDB( const char* dsn, const char* user, const char* password, const char* dbname, const char* prefix )
546 {
547 SQLRETURN sqlcode;
548
549 #ifdef USE_SYSLOG
550 openlog( "commonal", LOG_ODELAY, LOG_USER );
551 #endif
552 // ?≪??・膓?筝???????筝???????/span>
553 if ( hdbc != NULL )
554 SQLDisconnect( hdbc );
555
556 dbprefix = prefix;
557
558 // ????????・膓?
559 // if( SQLAllocEnv( &henv ) != SQL_SUCCESS ) {
560 if( SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) != SQL_SUCCESS ) {
561 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_ENV,...) in initializeDB" );
562 #ifdef USE_SYSLOG
563 syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
564 closelog( );
565 #endif
566 return RES_DB_INITIALIZE_ERROR;
567 }
568 //ODBC Ver.3 ????????????????????с??荐??
569 SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
570
571 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ) ) != SQL_SUCCESS ) {
572 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_DBC,...) in initializeDB" );
573 #ifdef USE_SYSLOG
574 syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
575 closelog( );
576 #endif
577 return RES_DB_INITIALIZE_ERROR;
578 }
579 //???違?ゃ?潟??腱?篁ヤ?荀????????帥?ゃ???≪????????荐??
580 SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
581
582 if ( ( sqlcode = SQLConnect( hdbc, (SQLCHAR*)dsn, strlen( dsn ), (SQLCHAR*)user, strlen( user ), (SQLCHAR*)password, strlen( password ) ) ) != SQL_SUCCESS ){
583 string s( "SQLConnect in initializeDB " );
584 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
585 setLastErrorString( s.c_str( ) );
586 #ifdef USE_SYSLOG
587 syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
588 closelog( );
589 #endif
590 return RES_DB_CONNECT_ERROR;
591 }
592 #ifdef USE_SYSLOG
593 syslog( LOG_DEBUG, "initializeDB succeed" );
594 closelog( );
595 #endif
596 return RES_OK;
597 }
598
599 /**
600 *
601 * DB?ョ????????違???????????障??????
602 *
603 * @param ????
604 * @return RES_OK
605 */
606 result_t uninitializeDB()
607 {
608 if ( hdbc != NULL ){
609 SQLDisconnect( hdbc );
610 hdbc = NULL;
611 }
612 return RES_OK;
613 }
614
615 /**
616 *
617 * Platform???若?倶?粋??倶????緇?
618 *
619 * @param sid ?祉???激?с??D
620 * @param uid ?倶??????緇??????????若?吟??ID
621 * @return true ?粋?羝???/span>
622 * @return false ???粋?
623 *
624 */
625 bool isActivated( sessionid_t sid, userid_t uid )
626 {
627 if( hdbc == NULL ) return false;
628 if( !isValidSessionID( sid ) ) return false;
629
630 bool ret = false;
631 string sql;
632 SQLRETURN sqlcode;
633 SQLHANDLE hstmt = NULL;
634
635 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_users ";
636 sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) );
637 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
638 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
639 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
640 ret = true;
641 }else{
642 string s( "SQLFetch in isActivated " );
643 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
644 s += ", sql=" + sql;
645 setLastErrorString( s.c_str() );
646 ret = false;
647 }
648 }else{
649 string s( "SQLExecDirect in isActivated " );
650 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
651 s += ", sql=" + sql;
652 setLastErrorString( s.c_str() );
653 ret = false;
654 }
655 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
656 }else{
657 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isActivated" );
658 ret = false;
659 }
660 return ret;
661 }
662
663 /**
664 *
665 * Platform???若?倶?粋??倶??紊???/span>
666 *
667 * @param sid ?祉???激?с??D
668 * @param uid 紊??眼?????????若?吟??ID
669 * @param activate ?粋?(true) / ???粋?(false)????絎?
670 * @return RES_OK
671 * @return RES_DB_QUERY_ERROR
672 * @return RES_NO_SUCH_USER
673 */
674 result_t activate( sessionid_t sid, userid_t uid, bool activate )
675 {
676 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
677 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
678
679 string sql;
680 SQLRETURN sqlcode;
681 result_t ret = RES_ERROR;
682
683 sql = "UPDATE " + dbprefix + "_xnpaccount_users ";
684 sql += "SET activate=" + string( activate ? "1" : "0" );
685 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
686 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
687 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
688 SQLINTEGER count = 0;
689 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
690 ret = RES_OK;
691 }else{
692 string s( "SQLRowCount in activate ");
693 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
694 s += string( ", sql=" ) + string( sql );
695 setLastErrorString( s.c_str( ) );
696 ret = RES_NO_SUCH_USER;
697 }
698 }else{
699 string s( "SQLExecDirect in activate " );
700 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
701 s += ", sql=";
702 s += string( sql );
703 setLastErrorString( s.c_str( ) );
704 ret = RES_DB_QUERY_ERROR;
705 }
706 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
707 }else{
708 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in activate" );
709 ret = RES_ERROR;
710 }
711 return ret;
712 }
713
714 /**
715 *
716 * ?≪?????潟???違????緇?????鐚?/span>
717 *
718 * @param sid ?祉???激?с??D
719 * @return ?≪?????潟????/span>
720 *
721 */
722 int getAccountCount( sessionid_t sid )
723 {
724 if( hdbc == NULL ) return 0;
725 if( !isValidSessionID( sid ) ) return 0;
726
727 int ret = 0;
728 string sql;
729 SQLRETURN sqlcode;
730 SQLHANDLE hstmt = NULL;
731
732 //?≪?????潟???違??羆?????
733 sql = "SELECT COUNT(*) FROM " + dbprefix + "_xnpaccount_users ";
734 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
735 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
736 SQLUINTEGER count = 0;
737 SQLINTEGER len;
738 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
739 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
740 ret = count;
741 }else {
742 string s( "SQLFetch in getAccountCount sql=" );
743 s += string( sql );
744 setLastErrorString( s.c_str( ) );
745 ret = 0;
746 }
747 }else{
748 setLastErrorString( "SQLExecDirect in getAccountCount" );
749 ret = 0;
750 }
751 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
752 }else{
753 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccountCount" );
754 ret = 0;
755 }
756 return ret;
757 }
758
759 /**
760 *
761 * ?≪?????潟??????/span>
762 * ?違???若???????????ゃ?????若?倶???宴?????ゃ??茵??????障??鐚?/span>
763 *
764 * @param
765 * @return RES_OK
766 * @return RES_ERROR
767 * @return RES_DB_NOT_INITIALIZED
768 * @return RES_NO_SUCH_SESSION
769 * @return RES_DB_QUERY_ERROR
770 *
771 */
772 result_t deleteAccount( sessionid_t sid, userid_t uid )
773 {
774 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
775 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
776
777 result_t ret1 = RES_ERROR, ret2 = RES_ERROR;
778 criteria_t c;
779 string sql;
780 groupid_t* gids;
781 int gidsLen;
782 SQLRETURN sqlcode;
783 SQLHANDLE hstmt = NULL;
784
785 /*
786 1. delete user from default platform group
787 2. delete user profile from xoops_users
788 3. delete platform user from xnpaccount_users
789 */
790
791 //1. delete user from platform groups
792 c.clearAll();
793 if( getGroupsByUid( sid, uid, &c, &gids, &gidsLen ) == RES_OK ){
794 for( int i = 0; i < gidsLen; i++ )
795 deleteMemberNoLimit( sid, gids[ i ], uid );
796 freeGID( gids );
797 }
798
799 //2. delete user profile from xoops_users
800 sql = "DELETE FROM " + dbprefix + "_users ";
801 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
802 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
803 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
804 SQLINTEGER count = 0;
805 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
806 ret1 = RES_OK;
807 }else{
808 string s( "SQLRowCount in deleteAccount" );
809 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
810 s += string( ", sql=" ) + string( sql );
811 setLastErrorString( s.c_str( ) );
812 ret1 = RES_NO_SUCH_USER;
813 }
814 }else{
815 string s( "SQLExecDirect in deleteAccount" );
816 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
817 s += ", sql=";
818 s += string( sql );
819 setLastErrorString( s.c_str( ) );
820 ret1 = RES_DB_QUERY_ERROR;
821 }
822 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
823 }else{
824 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
825 ret1 = RES_ERROR;
826 }
827
828 //3. delete platform user from xnpaccount_users
829 sql = "DELETE FROM " + dbprefix + "_xnpaccount_users ";
830 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
831 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
832 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
833 SQLINTEGER count = 0;
834 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
835 ret2 = RES_OK;
836 }else{
837 string s( "SQLRowCount in deleteAccount" );
838 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
839 s += string( ", sql=" ) + string( sql );
840 setLastErrorString( s.c_str( ) );
841 ret2 = RES_NO_SUCH_USER;
842 }
843 }else{
844 string s( "SQLExecDirect in deleteAccount" );
845 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
846 s += ", sql=";
847 s += string( sql );
848 setLastErrorString( s.c_str( ) );
849 ret2 = RES_DB_QUERY_ERROR;
850 }
851 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
852 }else{
853 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
854 ret2 = RES_ERROR;
855 }
856
857 //筝??鴻?с???????若?????????若??菴???
858 return ret1 != RES_OK ? ret1 : ret2;
859 }
860
861 /**
862 *
863 * ?≪?????潟?????怨??
864 *
865 * @param sid ?祉???激?с??D
866 * @param uid ??緇??????????若?吟??ID
867 * @param acc ??緇??????≪?????潟??????account_t)?????ゃ?潟?帥???吾??莨若??綣???/span>
868 * @return RES_OK
869 * @return RES_DB_NOT_INITIALIZED
870 * @return RES_NO_SUCH_USER
871 * @return RES_NO_SUCH_SESSION
872 * @return RES_DB_QUERY_ERROR
873 *
874 */
875 result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc )
876 {
877 int len;
878 static criteria c;
879 result_t res = getAccounts( sid, &uid, 1, &c, acc, &len );
880 if( len == 0 ) return RES_NO_SUCH_USER;
881 return res;
882 }
883
884 /**
885 *
886 * ?≪?????潟?????怨??
887 *
888 * @param sid ?祉???激?с??D
889 * @param uids ??緇??????????若?吟??ID??????
890 * @param uidsLen uids???????膣???/span>
891 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
892 * @param accounts 罎?膣∝??????????????ゃ?潟?帥???吾??莨若??綣???/span>
893 * @param accountsLen 罎?膣∝???????????*accounts???膣???
894 * @return RES_OK
895 * @return RES_DB_NOT_INITIALIZED
896 * @return RES_NO_SUCH_SESSION
897 * @return RES_DB_QUERY_ERROR
898 *
899 */
900 result_t getAccounts( sessionid_t sid, const userid_t* uids, int uidsLen, criteria_t* cri, const account_t** accounts, int* accountsLen )
901 {
902 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
903 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
904 if( uidsLen <= 0 ){
905 *accounts = new account_t[ 0 ];
906 *accountsLen = 0;
907 #ifdef USE_SYSLOG
908 openlog( "commonal", LOG_ODELAY, LOG_USER );
909 syslog( LOG_DEBUG, "getAccounts succeed len=0" );
910 closelog( );
911 #endif
912 return RES_OK;
913 }
914
915 #ifdef USE_SYSLOG
916 openlog( "commonal", LOG_ODELAY, LOG_USER );
917 syslog( LOG_DEBUG, "begin of getAccounts" );
918 #endif
919 result_t ret = RES_ERROR;
920 SQLRETURN sqlcode;
921 SQLHANDLE hstmt = NULL;
922 string sql;
923 account_t* dst = new account_t[ uidsLen ];
924
925 sql += "SELECT u1.uid, u1.name, u1.uname, u1.email, u1.url, u1.user_avatar, u1.user_regdate, u1.user_icq, u1.user_from, u1.user_sig, u1.user_viewemail, u1.actkey, u1.user_aim, u1.user_yim, u1.user_msnm, u1.pass, u1.posts, u1.attachsig, u1.rank, u1.level, u1.theme, u1.timezone_offset, u1.last_login, u1.umode, u1.uorder, u1.notify_method, u1.notify_mode, u1.user_occ, u1.bio, u1.user_intrest, u1.user_mailok, u2.activate, u2.address, u2.division, u2.tel, u2.company_name, u2.country, u2.zipcode, u2.fax, u2.base_url, u2.notice_mail, u2.notice_mail_since, u2.private_index_id ";
926 sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_xnpaccount_users AS u2 ";
927 sql += "WHERE u1.uid = u2.uid ";
928 if( uidsLen > 0 ){
929 #ifdef USE_SYSLOG
930 syslog( LOG_DEBUG, "set uid[%d] value=%d to ...", 0, uids[0] );
931 #endif
932 sql += "AND ( u1.uid=" + string( unsignedIntToString( uids[ 0 ] ) );
933 for( int i = 1; i < uidsLen; i++ ){
934 #ifdef USE_SYSLOG
935 syslog( LOG_DEBUG, "set uid[%d] value=%d to ...", i, uids[i] );
936 #endif
937 sql += " OR u1.uid=" + string( unsignedIntToString( uids[ i ] ) );
938 }
939 sql += " ) ";
940 }
941 sql += criteria2str( cri );
942 #ifdef USE_SYSLOG
943 syslog( LOG_DEBUG, "sql=%s", sql.c_str() );
944 #endif
945
946 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
947 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
948 SQLINTEGER len;
949 userid_t uid = 0;
950 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
951 *accountsLen=0;
952 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < uidsLen ; i++ ){
953 dst[ i ].setUID( uid );
954 dst[ i ].setName( getResultCol( hstmt, 2 ).c_str() );
955 dst[ i ].setUname( getResultCol( hstmt, 3 ).c_str() );
956 dst[ i ].setEmail( getResultCol( hstmt, 4 ).c_str() );
957 dst[ i ].setURL( getResultCol( hstmt, 5 ).c_str() );
958 dst[ i ].setUserAvatar( getResultCol( hstmt, 6 ).c_str() );
959 dst[ i ].setUserRegdate( atoi( getResultCol( hstmt, 7 ).c_str() ) );
960 dst[ i ].setUserIcq( getResultCol( hstmt, 8 ).c_str() );
961 dst[ i ].setUserFrom( getResultCol( hstmt, 9 ).c_str() );
962 dst[ i ].setUserSig( getResultCol( hstmt, 10 ).c_str() );
963 dst[ i ].setUserViewemail( atoi( getResultCol( hstmt, 11 ).c_str() ));
964 dst[ i ].setActkey( getResultCol( hstmt, 12 ).c_str() );
965 dst[ i ].setUserAim( getResultCol( hstmt, 13 ).c_str() );
966 dst[ i ].setUserYim( getResultCol( hstmt, 14 ).c_str() );
967 dst[ i ].setUserMsnm( getResultCol( hstmt, 15 ).c_str() );
968 dst[ i ].setPass( getResultCol( hstmt, 16 ).c_str() );
969 dst[ i ].setPosts( atoi( getResultCol( hstmt, 17 ).c_str() ));
970 dst[ i ].setAttachsig( atoi( getResultCol( hstmt, 18 ).c_str() ));
971 dst[ i ].setRank( atoi( getResultCol( hstmt, 19 ).c_str() ));
972 dst[ i ].setLevel( atoi( getResultCol( hstmt, 20 ).c_str() ));
973 dst[ i ].setTheme( getResultCol( hstmt, 21 ).c_str() );
974 dst[ i ].setTimezoneOffset( atof( getResultCol( hstmt, 22 ).c_str() ) );
975 dst[ i ].setLastLogin( atoi( getResultCol( hstmt, 23 ).c_str() ));
976 dst[ i ].setUmode( getResultCol( hstmt, 24 ).c_str() );
977 dst[ i ].setUorder( atoi( getResultCol( hstmt, 25 ).c_str() ));
978 dst[ i ].setNotifyMethod( atoi( getResultCol( hstmt, 26 ).c_str() ));
979 dst[ i ].setNotifyMode( atoi( getResultCol( hstmt, 27 ).c_str() ));
980 dst[ i ].setUserOcc( getResultCol( hstmt, 28 ).c_str() );
981 dst[ i ].setBio( getResultCol( hstmt, 29 ).c_str() );
982 dst[ i ].setUserIntrest( getResultCol( hstmt, 30 ).c_str() );
983 dst[ i ].setUserMailok( atoi( getResultCol( hstmt, 31 ).c_str() ));
984 dst[ i ].setActivate( atoi( getResultCol( hstmt, 32 ).c_str() ));
985 dst[ i ].setAddress( getResultCol( hstmt, 33 ).c_str() );
986 dst[ i ].setDivision( getResultCol( hstmt, 34 ).c_str() );
987 dst[ i ].setTel( getResultCol( hstmt, 35 ).c_str() );
988 dst[ i ].setCompanyName( getResultCol( hstmt, 36 ).c_str() );
989 dst[ i ].setCountry( getResultCol( hstmt, 37 ).c_str() );
990 dst[ i ].setZipcode( getResultCol( hstmt, 38 ).c_str() );
991 dst[ i ].setFax( getResultCol( hstmt, 39 ).c_str() );
992 dst[ i ].setBaseURL( getResultCol( hstmt, 40 ).c_str() );
993 dst[ i ].setNoticeMail( atoi( getResultCol( hstmt, 41 ).c_str() ));
994 dst[ i ].setNoticeMailSince( atoi( getResultCol( hstmt, 42 ).c_str() ));
995 dst[ i ].setPrivateIndexID( atoi( getResultCol( hstmt, 43 ).c_str() ));
996 #ifdef USE_SYSLOG
997 syslog( LOG_DEBUG, "set to account_t %d", i );
998 #endif
999 ( *accountsLen )++;
1000 }
1001 *accounts = dst;
1002 #ifdef USE_SYSLOG
1003 syslog( LOG_DEBUG, "getAccounts succeed" );
1004 #endif
1005 ret = RES_OK;
1006 }else{
1007 string s( "SQLExecDirect in getAccounts" );
1008 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1009 s += string( ", sql=" ) + string( sql );
1010 setLastErrorString( s.c_str( ) );
1011 #ifdef USE_SYSLOG
1012 syslog( LOG_DEBUG, "getAccounts %s", getLastErrorString( ) );
1013 #endif
1014 ret = RES_DB_QUERY_ERROR;
1015 }
1016 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1017 }else{
1018 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" );
1019 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1020 setLastErrorString( s.c_str( ) );
1021 #ifdef USE_SYSLOG
1022 syslog( LOG_DEBUG, "getAccounts %s", getLastErrorString( ) );
1023 #endif
1024 ret = RES_DB_QUERY_ERROR;
1025 }
1026 #ifdef USE_SYSLOG
1027 closelog( );
1028 #endif
1029 return ret;
1030 }
1031
1032 /**
1033 *
1034 * ?≪?????潟???脂??
1035 *
1036 * ???若?倶???宴?????若?帥???若?鴻???脂?蚊???障??鐚?/span>
1037 * ?脂?蚊???????若?倶???宴???綽????????若??D??uid???主????障??鐚?/span>
1038 *
1039 * @param sid ?祉???激?с??/span>
1040 * @param account ?脂?蚊?????≪?????潟??????/span>
1041 * @param uid ?脂?蚊?????≪?????潟?????宴???綽????????若??D
1042 * @return RES_OK
1043 * @return RES_NO_SUCH_SESSION
1044 * @return RES_DB_QUERY_ERROR
1045 * @return RES_DB_NOT_INITIALIZED
1046 *
1047 */
1048 result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid )
1049 {
1050 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1051 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1052
1053 string sql;
1054 string tmp;
1055 char buf[ 12 ];
1056 SQLRETURN sqlcode;
1057 result_t ret = RES_ERROR;
1058
1059 /*
1060 1. insert user profile into xoops_users
1061 2. insert platform user profile into xnpaccount_users
1062 3. add user to default platform group
1063 4. create private index
1064 5. update account set private_index_id=...
1065 */
1066
1067 //1.xoops?????若?吟???若???????吾??莨若??
1068 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];
1069 SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1070 SQLDOUBLE timezone_offset;
1071
1072 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;
1073 SQLINTEGER 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;
1074
1075 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1076 string sql;
1077 sql = "INSERT INTO " + dbprefix + "_users (uname, name, email, url, user_avatar, user_regdate, user_icq, user_from, user_sig, user_viewemail, actkey, user_aim, user_yim, user_msnm, pass, posts, attachsig, rank, level, theme, timezone_offset, last_login, umode, uorder, notify_method, notify_mode, user_occ, bio, user_intrest, user_mailok) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
1078 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1079 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1080 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1081 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1082 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1083 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1084 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1085 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1086 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1087 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1088 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1089 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1090 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1091 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1092 SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1093 SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1094 SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1095 SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1096 SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1097 SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1098 SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1099 SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1100 SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1101 SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1102 SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1103 SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1104 SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1105 SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1106 SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1107 SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1108 SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1109 SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1110
1111 strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1112 strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1113 strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1114 strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1115 strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1116 user_regdate = time( NULL );
1117 strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1118 strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1119 strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1120 user_viewemail = account -> getUserViewemail( );
1121 strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1122 strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1123 strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1124 strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1125 strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1126 posts = account -> getPosts( );
1127 attachsig = account -> getAttachsig( );
1128 rank = account -> getRank( );
1129 level = account -> getLevel( );
1130 strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1131 timezone_offset = account -> getTimezoneOffset( );
1132 last_login = 0;
1133 strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1134 uorder = account -> getUorder( );
1135 notify_method = account -> getNotifyMethod( );
1136 notify_mode = account -> getNotifyMode( );
1137 strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1138 strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1139 strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1140 user_mailok = account -> getUserMailok( );
1141
1142 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1143 SQLINTEGER count = 0;
1144 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1145 //???若??D????緇?????
1146 SQLHANDLE hstmt2 = NULL;
1147 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1148 sql = "SELECT LAST_INSERT_ID()"; // MySQL
1149 // sql = "SELECT LAST_INSERT_ROWID()"; // SQLite
1150 if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1151 SQLUINTEGER last_insert_id;
1152 SQLINTEGER len;
1153 SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len );
1154 if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){
1155 *uid = last_insert_id;
1156 ret = RES_OK;
1157 }else{
1158 ret = RES_DB_QUERY_ERROR;
1159 string s( "SQLFetch in insertAccount " );
1160 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1161 setLastErrorString( s.c_str( ) );
1162 }
1163 }else{
1164 string s( "SQLExecDirect in insertAccount " );
1165 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1166 setLastErrorString( s.c_str( ) );
1167 ret = RES_DB_QUERY_ERROR;
1168 }
1169 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1170 }
1171 }else{
1172 string s( "SQLRowCount in insertAccount sql=" );
1173 s += string( sql );
1174 setLastErrorString( s.c_str( ) );
1175 ret = RES_DB_QUERY_ERROR;
1176 }
1177 }else{
1178 string s( "SQLExecute in insertAccount " );
1179 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1180 setLastErrorString( s.c_str( ) );
1181 ret = RES_DB_QUERY_ERROR;
1182 }
1183 }else{
1184 string s( "SQLPrepare in insertAccount " );
1185 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1186 setLastErrorString( s.c_str( ) );
1187 ret = RES_ERROR;
1188 }
1189 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1190 }else{
1191 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1192 ret = RES_ERROR;
1193 }
1194
1195 if( ret == RES_OK ){
1196 //2.xnpaccount?????若?吟???若??????????????宴???吾??莨若??
1197 SQLUINTEGER activate;
1198 SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1];
1199 SQLCHAR division[XNP_ACCOUNT_DIVISION_LEN+1];
1200 SQLCHAR tel[XNP_ACCOUNT_TEL_LEN+1];
1201 SQLCHAR company_name[XNP_ACCOUNT_COMPANY_NAME_LEN+1];
1202 SQLCHAR country[XNP_ACCOUNT_COUNTRY_LEN+1];
1203 SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1];
1204 SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1];
1205 SQLCHAR base_url[XNP_ACCOUNT_BASE_URL_LEN+1];
1206 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;
1207 SQLINTEGER cbUid = 0, cbActivate = 0, cbNotice_mail = 0, cbNotice_mail_since = 0;
1208 SQLUINTEGER notice_mail;
1209 SQLUINTEGER notice_mail_since;
1210 if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1211 string sql;
1212 sql = "INSERT INTO " + dbprefix + "_xnpaccount_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, base_url, notice_mail, notice_mail_since) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";
1213 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1214 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1215 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, uid, 0, &cbUid);
1216 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate);
1217 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1218 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1219 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1220 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1221 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1222 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1223 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1224 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url);
1225 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &cbNotice_mail);
1226 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &cbNotice_mail_since);
1227
1228 activate = account -> getActivate() ? 1 : 0;
1229 strncpy2( (char*)address, account -> getAddress(), XNP_ACCOUNT_ADDRESS_LEN );
1230 strncpy2( (char*)division, account -> getDivision(), XNP_ACCOUNT_DIVISION_LEN );
1231 strncpy2( (char*)tel, account -> getTel(), XNP_ACCOUNT_TEL_LEN );
1232 strncpy2( (char*)company_name, account -> getCompanyName(), XNP_ACCOUNT_COMPANY_NAME_LEN );
1233 strncpy2( (char*)country, account -> getCountry(), XNP_ACCOUNT_COUNTRY_LEN );
1234 strncpy2( (char*)zipcode, account -> getZipcode(), XNP_ACCOUNT_ZIPCODE_LEN );
1235 strncpy2( (char*)fax, account -> getFax(), XNP_ACCOUNT_FAX_LEN );
1236 strncpy2( (char*)base_url, account -> getBaseURL(), XNP_ACCOUNT_BASE_URL_LEN );
1237 notice_mail = account -> getNoticeMail( );
1238 notice_mail_since = account -> getNoticeMailSince( );
1239
1240 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1241 SQLINTEGER count = 0;
1242 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1243 ret = RES_OK;
1244 if( ret == RES_OK ){
1245 //3.add new user to default group(not a group admin)
1246 ret = insertMember( sid, DEFAULT_PLATFORM_GROUP_ID, *uid, false );
1247 }else{
1248 //xoops_users??nsert???????潟?若???????ゃ????
1249 sql = "DELETE FROM " + dbprefix + "_users where uid=";
1250 sql += unsignedIntToString( *uid );
1251 SQLHANDLE hstmt2 = NULL;
1252 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1253 SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1254 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1255 }
1256 setLastErrorString( "insertMember in insertAccount" );
1257 ret = RES_DB_QUERY_ERROR;
1258 }
1259 }else{
1260 string s( "SQLRowCount in insertAccount sql=" );
1261 s += string( sql );
1262 setLastErrorString( s.c_str( ) );
1263 ret = RES_DB_QUERY_ERROR;
1264 }
1265 }else{
1266 string s( "SQLExecute in insertAccount " );
1267 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1268 setLastErrorString( s.c_str( ) );
1269 ret = RES_DB_QUERY_ERROR;
1270 }
1271 }else{
1272 //xoops_users??nsert???????潟?若???????ゃ????
1273 sql = "DELETE FROM " + dbprefix + "_users where uid=";
1274 sql += unsignedIntToString( *uid );
1275 SQLHANDLE hstmt2 = NULL;
1276 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1277 SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1278 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1279 }
1280 string s( "SQLExecDirect in insertAccount sql=" );
1281 s += string( sql );
1282 setLastErrorString( s.c_str( ) );
1283 ret = RES_DB_QUERY_ERROR;
1284 }
1285 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1286 }else{
1287 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1288 ret = RES_ERROR;
1289 }
1290 }
1291
1292 if ( ret == RES_OK ){
1293 //4.private index??篏???
1294
1295 // private index????ort_number????
1296 string sql = "select min(sort_number) from " +
1297 dbprefix + "_xnpaccount_index where parent_index_id=" + unsignedIntToString(item::IID_ROOT) +
1298 " and open_level=" + unsignedIntToString(index::OL_PRIVATE);
1299 unsigned int sortNumber;
1300 ret = queryGetUnsignedInt( "insertAccount", sql, &sortNumber );
1301 sortNumber--;
1302 if ( ret == RES_OK ){
1303 // private index篏???
1304 index_t index;
1305 index.setItemTypeID(item::ITID_INDEX);
1306 index.setContributorUID(*uid);
1307 index.setParentIndexID(item::IID_ROOT);
1308 index.setOwnerUID(*uid);
1309 index.setOpenLevel(index::OL_PRIVATE);
1310 index.setSortNumber(sortNumber);
1311 index.setTitle(account->getUname());
1312 indexid_t privateXID;
1313 ret = insertIndexInternal( sid, &index, &privateXID );
1314 if ( ret == RES_OK ){
1315 // xnpaccuont_users??rivate_index_id???吾??????
1316 sql = "UPDATE " + dbprefix + "_xnpaccount_users SET private_index_id="
1317 + unsignedIntToString(privateXID) + " WHERE uid=" + unsignedIntToString(*uid);
1318 ret = querySimple( "insertAccount", sql );
1319 }
1320 }
1321 }
1322
1323 return ret;
1324 }
1325
1326 /**
1327 *
1328 * ?≪?????潟?????宴??紊??眼????.
1329 *
1330 *
1331 * @param sid ?祉???激?с??D
1332 * @param account 紊??眼???????≪?????潟??????/span>
1333 * @return RES_OK
1334 * @return RES_DB_NOT_INITIALIZED
1335 * @return RES_NO_SUCH_SESSION
1336 * @return RES_DB_QUERY_ERROR
1337 * @return RES_NO_SUCH_USER
1338 * @return RES_ERROR
1339 *
1340 */
1341 result_t updateAccount( sessionid_t sid, const account_t* account )
1342 {
1343 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1344 if( account == NULL ) return RES_ERROR;
1345 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1346 if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;
1347 SQLRETURN sqlcode;
1348 result_t ret = RES_ERROR;
1349
1350 //xoops?????若?吟???若???????吾??莨若??
1351 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];
1352 SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1353 SQLDOUBLE timezone_offset;
1354
1355 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;
1356 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;
1357
1358 SQLUINTEGER activate;
1359 SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1];
1360 SQLCHAR division[XNP_ACCOUNT_DIVISION_LEN+1];
1361 SQLCHAR tel[XNP_ACCOUNT_TEL_LEN+1];
1362 SQLCHAR company_name[XNP_ACCOUNT_COMPANY_NAME_LEN+1];
1363 SQLCHAR country[XNP_ACCOUNT_COUNTRY_LEN+1];
1364 SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1];
1365 SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1];
1366 SQLCHAR base_url[XNP_ACCOUNT_BASE_URL_LEN+1];
1367 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;
1368 SQLUINTEGER notice_mail;
1369 SQLUINTEGER notice_mail_since;
1370 SQLINTEGER len = 0;
1371
1372 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1373 string sql;
1374
1375 sql = "UPDATE " + dbprefix + "_users SET ";
1376 sql += "uname=?, ";
1377 sql += "name=?, ";
1378 sql += "email=?, ";
1379 sql += "url=?, ";
1380 sql += "user_avatar=?, ";
1381 sql += "user_regdate=?, ";
1382 sql += "user_icq=?, ";
1383 sql += "user_from=?, ";
1384 sql += "user_sig=?, ";
1385 sql += "user_viewemail=?, ";
1386 sql += "actkey=?, ";
1387 sql += "user_aim=?, ";
1388 sql += "user_yim=?, ";
1389 sql += "user_msnm=?, ";
1390 sql += "pass=?, ";
1391 sql += "posts=?, ";
1392 sql += "attachsig=?, ";
1393 sql += "rank=?, ";
1394 sql += "level=?, ";
1395 sql += "theme=?, ";
1396 sql += "timezone_offset=?, ";
1397 sql += "last_login=?, ";
1398 sql += "umode=?, ";
1399 sql += "uorder=?, ";
1400 sql += "notify_method=?, ";
1401 sql += "notify_mode=?, ";
1402 sql += "user_occ=?, ";
1403 sql += "bio=?, ";
1404 sql += "user_intrest=?, ";
1405 sql += "user_mailok=? ";
1406 sql += " WHERE uid = ?";
1407
1408 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1409 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1410 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1411 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1412 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1413 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1414 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1415 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1416 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1417 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1418 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1419 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1420 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1421 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1422 SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1423 SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1424 SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1425 SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1426 SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1427 SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1428 SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1429 SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1430 SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1431 SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1432 SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1433 SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1434 SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1435 SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1436 SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1437 SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1438 SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1439 SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1440 SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1441
1442 strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1443 strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1444 strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1445 strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1446 strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1447 user_regdate = time( NULL );
1448 strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1449 strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1450 strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1451 user_viewemail = account -> getUserViewemail( );
1452 strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1453 strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1454 strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1455 strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1456 strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1457 posts = account -> getPosts( );
1458 attachsig = account -> getAttachsig( );
1459 rank = account -> getRank( );
1460 level = account -> getLevel( );
1461 strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1462 timezone_offset = account -> getTimezoneOffset( );
1463 last_login = 0;
1464 strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1465 uorder = account -> getUorder( );
1466 notify_method = account -> getNotifyMethod( );
1467 notify_mode = account -> getNotifyMode( );
1468 strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1469 strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1470 strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1471 user_mailok = account -> getUserMailok( );
1472 uid = account -> getUID( );
1473
1474 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1475 SQLINTEGER count = 0;
1476 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1477 ret = RES_OK;
1478 }else{
1479 string s( "SQLRowCount in updateAccount sql=" );
1480 s += string( sql );
1481 setLastErrorString( s.c_str( ) );
1482 ret = RES_DB_QUERY_ERROR;
1483 }
1484 }else{
1485 string s( "SQLExecute in updateAccount " );
1486 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1487 setLastErrorString( s.c_str( ) );
1488 ret = RES_DB_QUERY_ERROR;
1489 }
1490 }else{
1491 setLastErrorString( "SQLPrepare in updateAccount sql=" );
1492 ret = RES_ERROR;
1493 }
1494 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1495 }else{
1496 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1497 ret = RES_ERROR;
1498 }
1499
1500 //xnpaccount?????若?吟???若??????????????宴??筝??吾??????
1501 if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1502 string sql;
1503
1504 sql = "UPDATE " + dbprefix + "_xnpaccount_users SET ";
1505 sql += "activate=?, ";
1506 sql += "address=?, ";
1507 sql += "division=?, ";
1508 sql += "tel=?, ";
1509 sql += "company_name=?, ";
1510 sql += "country=?, ";
1511 sql += "zipcode=?, ";
1512 sql += "fax=?, ";
1513 sql += "base_url=?, ";
1514 sql += "notice_mail=?, ";
1515 sql += "notice_mail_since=? ";
1516 sql += "WHERE uid=?";
1517
1518 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1519 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1520 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &len);
1521 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1522 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1523 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1524 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1525 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1526 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1527 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1528 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url);
1529 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &len);
1530 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &len);
1531 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1532
1533 activate = account -> getActivate() ? 1 : 0;
1534 strncpy2( (char*)address, account -> getAddress( ) , XNP_ACCOUNT_ADDRESS_LEN );
1535 strncpy2( (char*)division, account -> getDivision(), XNP_ACCOUNT_DIVISION_LEN );
1536 strncpy2( (char*)tel, account -> getTel(), XNP_ACCOUNT_TEL_LEN );
1537 strncpy2( (char*)company_name, account -> getCompanyName(), XNP_ACCOUNT_COMPANY_NAME_LEN );
1538 strncpy2( (char*)country, account -> getCountry(), XNP_ACCOUNT_COUNTRY_LEN );
1539 strncpy2( (char*)zipcode, account -> getZipcode(), XNP_ACCOUNT_ZIPCODE_LEN );
1540 strncpy2( (char*)fax, account -> getFax(), XNP_ACCOUNT_FAX_LEN );
1541 strncpy2( (char*)base_url, account -> getBaseURL(), XNP_ACCOUNT_BASE_URL_LEN );
1542 notice_mail = account -> getNoticeMail( );
1543 notice_mail_since = account -> getNoticeMailSince( );
1544 uid = account -> getUID( );
1545
1546 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1547 SQLINTEGER count = 0;
1548 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1549 ret = RES_OK;
1550 }else{
1551 string s( "SQLRowCount in updateAccount sql=" );
1552 s += string( sql );
1553 setLastErrorString( s.c_str( ) );
1554 ret = RES_DB_QUERY_ERROR;
1555 }
1556 }else{
1557 string s( "SQLExecute in updateAccount " );
1558 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1559 setLastErrorString( s.c_str( ) );
1560 ret = RES_DB_QUERY_ERROR;
1561 }
1562 }else{
1563 setLastErrorString( "SQLPrepare in updateAccount sql=" );
1564 ret = RES_ERROR;
1565 }
1566 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1567 }else{
1568 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1569 ret = RES_ERROR;
1570 }
1571 return ret;
1572 }
1573
1574 /**
1575 *
1576 * criteria_t?ф??絎???????膀??蚊?????若??D??菴???.
1577 * ???若??D????????腆坂????????????吾??莨若?随????????≪?????鴻??*uids???吾??莨若??.
1578 * ???????泣?ゃ?冴??*uidsLen???吾??莨若??
1579 *
1580 * @param sid ?祉???激?с??D
1581 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1582 * @param uids ???若?吟??ID?????????阪????
1583 * @param uidsLen uids???????膣??違???阪????
1584 * @return RES_OK
1585 * @return RES_DB_NOT_INITIALIZED
1586 * @return RES_NO_SUCH_SESSION
1587 * @return RES_DB_QUERY_ERROR
1588 *
1589 */
1590 result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen )
1591 {
1592 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1593 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1594
1595 #ifdef USE_SYSLOG
1596 openlog( "commonal", LOG_ODELAY, LOG_USER );
1597 #endif
1598
1599 result_t ret = RES_ERROR;
1600 userid_t* dst = 0;
1601 string sql;
1602 SQLRETURN sqlcode;
1603 SQLINTEGER count = 0;
1604
1605
1606 sql = "SELECT uid FROM " + dbprefix + "_xnpaccount_users ";
1607 sql += criteria2str( cri );
1608 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1609 *uidsLen = count;
1610 dst = new userid_t[ *uidsLen ];
1611 *uids = dst;
1612 }else{
1613 return RES_ERROR;
1614 }
1615 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1616 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1617 userid_t uid;
1618 SQLINTEGER len = 0;
1619 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1620
1621 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
1622 dst[ i ] = uid;
1623 }
1624
1625 #ifdef USE_SYSLOG
1626 syslog( LOG_DEBUG, "dumpUids succeed" );
1627 #endif
1628 ret = RES_OK;
1629 }else{
1630 string s( "SQLExecDirect in dumpUids " );
1631 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1632 s += "sql=";
1633 s += string( sql );
1634 setLastErrorString( s.c_str( ) );
1635 #ifdef USE_SYSLOG
1636 syslog( LOG_DEBUG, "dumpUids %s", getLastErrorString( ) );
1637 #endif
1638 ret = RES_DB_QUERY_ERROR;
1639 }
1640 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1641 }else{
1642 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in dumpUids" );
1643 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1644 setLastErrorString( s.c_str( ) );
1645 #ifdef USE_SYSLOG
1646 syslog( LOG_DEBUG, "dumpUids %s", getLastErrorString( ) );
1647 #endif
1648 ret = RES_DB_QUERY_ERROR;
1649 }
1650 return ret;
1651 }
1652
1653 /**
1654 *
1655 * ?違???若???違??菴???.
1656 * 筝?罩c???祉???激?с??D????0??菴???.
1657 *
1658 * @param sid ?祉???激?с??D
1659 * @return ?違???若????/span>
1660 *
1661 */
1662 int getGroupCount( sessionid_t sid )
1663 {
1664 if( hdbc == NULL ) return 0;
1665 if( !isValidSessionID( sid ) ) return 0;
1666
1667 SQLRETURN sqlcode;
1668 SQLHANDLE hstmt = NULL;
1669 string sql;
1670 int ret = 0;
1671
1672 //?違???若???違??羆?????
1673 sql = "SELECT COUNT(*) FROM " + dbprefix + "_xnpaccount_groups";
1674 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1675 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1676 SQLUINTEGER count = 0;
1677 SQLINTEGER len;
1678 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1679 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1680 ret = count;
1681 }else {
1682 string s( "SQLFetch in getGroupCount sql=" );
1683 s += string( sql );
1684 setLastErrorString( s.c_str( ) );
1685 ret = 0;
1686 }
1687 }else{
1688 setLastErrorString( "SQLExecDirect in getGroupCount" );
1689 ret = 0;
1690 }
1691 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1692 }else{
1693 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroupCount" );
1694 ret = 0;
1695 }
1696 return ret;
1697 }
1698
1699 /**
1700 *
1701 * ??絮??違???若??筝?荀у??.
1702 * ???若?吟????絮??????????違???若????D????緇?????
1703 *
1704 * @param sid ?祉???激?с??D
1705 * @param uid ???若?吟??ID
1706 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1707 * @param gids ?違???若??ID?????????阪????
1708 * @param gidsLen gids???????膣??違???阪????
1709 * @return RES_DB_NOT_INITIALIZED
1710 * @return RES_NO_SUCH_SESSION
1711 * @return RES_NO_SUCH_USER
1712 * @return RES_DB_QUERY_ERROR
1713 * @return RES_OK
1714 *
1715 */
1716 result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1717 {
1718 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1719 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1720 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
1721
1722 result_t ret = RES_ERROR;
1723 string sql;
1724 SQLRETURN sqlcode;
1725 SQLHANDLE hstmt = NULL;
1726 SQLINTEGER count = 0;
1727 groupid_t* dst = 0;
1728 int len = 0;
1729
1730 sql = "SELECT gid FROM " + dbprefix + "_xnpaccount_groups_users_link";
1731 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1732 sql += criteria2str( cri );
1733 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1734 *gidsLen = count;
1735 dst = new groupid_t[ *gidsLen ];
1736 *gids = dst;
1737 }else{
1738 return RES_ERROR;
1739 }
1740
1741 //??絮??????違???若??????紊у???違??羆?????
1742 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1743 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1744 if( count > 0 ){
1745 SQLHANDLE hstmt2 = NULL;
1746 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1747 sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_xnpaccount_groups_users_link";
1748 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1749 sql += criteria2str( cri );
1750 if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1751 SQLINTEGER len;
1752 groupid_t gid = 0;
1753 SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
1754 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
1755 dst[ i ] = gid;
1756 }
1757 ret = RES_OK;
1758 }else{
1759 string s( "SQLExecDirect in getGroupsByUid " );
1760 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1761 s += string( ", sql=" ) + string( sql );
1762 ret = RES_DB_QUERY_ERROR;
1763 }
1764 }else{
1765 string s( "SQLAllocHandle in getGroupsByUid " );
1766 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1767 ret = RES_DB_QUERY_ERROR;
1768 }
1769 }else{
1770 ret = RES_OK;
1771 }
1772 }else{
1773 string s( "SQLExecDirect in getGroupsByUid " );
1774 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1775 s += string( ", sql=" ) + string( sql );
1776 ret = RES_DB_QUERY_ERROR;
1777 }
1778 }else{
1779 string s( "SQLAllocHandle in getGroupsByUid " );
1780 setLastErrorString( s.c_str( ) );
1781 ret = RES_DB_QUERY_ERROR;
1782 }
1783 return ret;
1784 }
1785
1786 /**
1787 *
1788 * ?違???若??膊∞??罔????????.
1789 * ???若?吟?????若???????罔???????????(?違???若??膊∞?????с??????)????????????.
1790 * ???若?吟???違???若????絖????????????????医幻???翫??鐚?false??菴???.
1791 *
1792 * @param sid ?祉???激?с??D
1793 * @param gid ?違???若????ID
1794 * @param uid ???若?吟??ID
1795 * @return true 膊∞??罔???????
1796 * @return false 膊∞??罔???????鐚??障???????/span>
1797 *
1798 */
1799 bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )
1800 {
1801 if( hdbc == NULL ) return false;
1802 if( !isValidSessionID( sid ) ) return false;
1803 if( !uidExists( uid ) ) return false;
1804 if( !gidExists( gid ) ) return false;
1805
1806 bool ret = false;
1807 string sql;
1808 SQLRETURN sqlcode;
1809 SQLINTEGER count = 0;
1810
1811 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_groups_users_link ";
1812 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1813 sql += " AND uid=" + string( unsignedIntToString( uid ) );
1814 sql += " AND is_admin=1";
1815 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1816 if( count > 0 ){
1817 ret = true;
1818 }else{
1819 ret = false;
1820 }
1821 }else{
1822 ret = false;
1823 }
1824 return ret;
1825 }
1826
1827 /**
1828 *
1829 * ?違???若??ID筝?荀?
1830 * ?脂?蚊???????????違???若????D筝?荀с????緇?????.
1831 *
1832 * @param sid ?祉???激?с??D
1833 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1834 * @param gids ?違???若??ID?????????阪????
1835 * @param gidsLen gids???????膣??違???阪????
1836 * @return RES_DB_NOT_INITIALIZED
1837 * @return RES_NO_SUCH_SESSION
1838 * @return RES_DB_QUERY_ERROR
1839 * @return RES_OK
1840 *
1841 */
1842 result_t dumpGids( sessionid_t sid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1843 {
1844 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1845 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1846
1847 result_t ret = RES_ERROR;
1848 groupid_t* dst = 0;
1849 string sql;
1850 SQLRETURN sqlcode;
1851 SQLINTEGER count = 0;
1852
1853 sql = "SELECT gid FROM " + dbprefix + "_xnpaccount_groups ";
1854 sql += criteria2str( cri );
1855 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1856 *gidsLen = count;
1857 dst = new groupid_t[ *gidsLen ];
1858 *gids = dst;
1859 }else{
1860 return RES_ERROR;
1861 }
1862
1863 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1864 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1865 groupid_t gid;
1866 SQLINTEGER len = 0;
1867 SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
1868 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
1869 dst[ i ] = gid;
1870 }
1871
1872 ret = RES_OK;
1873 }else{
1874 string s( "SQLExecDirect in dumpGids " );
1875 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1876 s += "sql=";
1877 s += string( sql );
1878 setLastErrorString( s.c_str( ) );
1879 ret = RES_DB_QUERY_ERROR;
1880 }
1881 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1882 }
1883 return ret;
1884 }
1885
1886 /**
1887 *
1888 * ?違???若??膊∞????ID????緇?????.
1889 * ?????違???若??????????????若??D????緇?????.
1890 *
1891 * @param sid ?祉???激?с??D
1892 * @param gid ???????????違???若????ID?ф??絎?????
1893 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1894 * @param uids 膊∞??????ID???????????????????ゃ?潟??/span>
1895 * @param uidsLen uids???????膣???/span>
1896 * @return RES_OK
1897 * @return RES_DB_NOT_INITIALIZED
1898 * @return RES_NO_SUCH_SESSION
1899 * @return RES_DB_QUERY_ERROR
1900 * @return RES_ERROR
1901 *
1902 */
1903 result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1904 {
1905 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1906 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1907
1908 result_t ret = RES_ERROR;
1909 groupid_t* dst = 0;
1910 string sql;
1911 SQLRETURN sqlcode;
1912 SQLINTEGER count = 0;
1913
1914 sql = "SELECT uid FROM " + dbprefix + "_xnpaccount_groups_users_link ";
1915 sql += " WHERE is_admin=1 and gid=" + unsignedIntToString( gid );
1916 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1917 *uidsLen = count;
1918 *uids = new groupid_t[ *uidsLen ];
1919 }else{
1920 return RES_ERROR;
1921 }
1922 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1923 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1924 userid_t uid;
1925 SQLINTEGER len = 0;
1926 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1927 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
1928 (*uids)[ i ] = uid;
1929 }
1930 ret = RES_OK;
1931 }else{
1932 string s( "SQLExecDirect in dumpGroupAdmins " );
1933 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1934 s += "sql=";
1935 s += string( sql );
1936 setLastErrorString( s.c_str( ) );
1937 ret = RES_DB_QUERY_ERROR;
1938 }
1939 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1940 }
1941 return ret;
1942 }
1943
1944 /**
1945 *
1946 * ?違???若????絮????若?九????
1947 * ?違???若??????絮????????若?吟??鐚??違???若?????????ゃ????.
1948 * ???????????違???若???????????ゃ?с??????
1949 *
1950 * @param sid ?祉???激?с??D
1951 * @param gid ?????違???若?????????ゃ??????????絎??????違???若??ID
1952 * @param uid ???ゅ?莟<?????若?吟??D
1953 * @return RES_DB_NOT_INITIALIZED
1954 * @return RES_NO_SUCH_SESSION
1955 * @return RES_NO_SUCH_USER
1956 * @return RES_NO_SUCH_GROUP
1957 * @return RES_DB_QUERY_ERROR
1958 * @return RES_OK
1959 * @return RES_ERROR
1960 *
1961 */
1962 result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )
1963 {
1964 if( gid == DEFAULT_PLATFORM_GROUP_ID ) return RES_ERROR;
1965 return deleteMemberNoLimit( sid, gid, uid );
1966 }
1967
1968 /**
1969 *
1970 * ?違???若????絮????若?九????
1971 * ?違???若??????絮????????若?吟??鐚??違???若?????????ゃ????.
1972 * ???????????違???若???????????ゃ?с?????鴻??鐚?deleteMember???違????
1973 *
1974 * @param sid ?祉???激?с??D
1975 * @param gid ?????違???若?????????ゃ??????????絎??????違???若??ID
1976 * @param uid ???ゅ?莟<?????若?吟??D
1977 * @return RES_DB_NOT_INITIALIZED
1978 * @return RES_NO_SUCH_SESSION
1979 * @return RES_NO_SUCH_USER
1980 * @return RES_NO_SUCH_GROUP
1981 * @return RES_DB_QUERY_ERROR
1982 * @return RES_OK
1983 * @return RES_ERROR
1984 *
1985 */
1986 static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid )
1987 {
1988 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1989 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1990 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
1991 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
1992
1993 result_t ret = RES_ERROR;
1994 string sql;
1995 SQLRETURN sqlcode;
1996 SQLHANDLE hstmt = NULL;
1997
1998 sql = "DELETE FROM " + dbprefix + "_xnpaccount_groups_users_link ";
1999 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
2000 sql += " AND uid=" + string( unsignedIntToString( uid ) );
2001 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2002 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2003 SQLINTEGER count = 0;
2004 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2005 ret = RES_OK;
2006 }else{
2007 string s( "SQLRowCount in deleteMember" );
2008 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2009 s += string( ", sql=" ) + string( sql );
2010 setLastErrorString( s.c_str( ) );
2011 ret = RES_NO_SUCH_USER;
2012 }
2013 }else{
2014 string s( "SQLExecDirect in deleteMember" );
2015 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2016 s += ", sql=";
2017 s += string( sql );
2018 setLastErrorString( s.c_str( ) );
2019 ret = RES_DB_QUERY_ERROR;
2020 }
2021 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2022 }else{
2023 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteMember" );
2024 ret = RES_ERROR;
2025 }
2026 return ret;
2027 }
2028
2029 /**
2030 *
2031 * ?違???若????絮????若?区申??.
2032 * ?違???若?????<?潟???若?????若?吟??菴遵??????.
2033 *
2034 * @param sid ?祉???激?с??D
2035 * @param gid ??絮????違???若????D
2036 * @param uid ??絮??????????若?吟??D
2037 * @param admin 膊∞????罔?????筝?????????true
2038 * @return RES_OK
2039 * @return RES_DB_NOT_INITIALIZED
2040 * @return RES_NO_SUCH_SESSION
2041 * @return RES_NO_SUCH_USER
2042 * @return RES_NO_SUCH_GROUP
2043 * @return RES_DB_QUERY_ERROR
2044 *
2045 */
2046 result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid, bool admin )
2047 {
2048 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2049 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2050 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
2051 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
2052
2053 result_t ret = RES_ERROR;
2054 string sql;
2055 SQLRETURN sqlcode;
2056
2057 //?<?潟???若??菴遵??
2058 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2059 sql = "INSERT INTO " + dbprefix + "_xnpaccount_groups_users_link ( gid, uid, is_admin ) VALUES (";
2060 sql += string( unsignedIntToString( gid ) ) + ", ";
2061 sql += string( unsignedIntToString( uid ) ) + ", ";
2062 sql += string( admin ? "1" : "0" ) + ") ";
2063 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2064 SQLINTEGER count = 0;
2065 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2066 ret = RES_OK;
2067 }else{
2068 string s( "SQLRowCount in insertMember " );
2069 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2070 s += string( ", sql=" ) + string( sql );
2071 setLastErrorString( s.c_str( ) );
2072 ret = RES_DB_QUERY_ERROR;
2073 }
2074 }else{
2075 string s( "SQLExecDirect in insertMember " );
2076 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2077 s += string( ", sql=" ) + string( sql );
2078 setLastErrorString( s.c_str( ) );
2079 ret = RES_DB_QUERY_ERROR;
2080 }
2081 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2082 }else{
2083 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertMember" );
2084 ret = RES_DB_QUERY_ERROR;
2085 }
2086 return ret;
2087 }
2088
2089 /**
2090 *
2091 * ?違???若????絮????若?九??.
2092 * ?????違???若??????絮????????????若?吟?????若??D????緇?????
2093 *
2094 * @param sid ?祉???激?с??D
2095 * @param gid ?????違???若??????絮????若?吟?????????????????違???若????ID?ф??絎?
2096 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
2097 * @param uids ??絮????若?吟??ID???????????????????ゃ?潟??/span>
2098 * @param uidsLen uids???????膣???/span>
2099 * @return RES_OK
2100 * @return RES_DB_NOT_INITIALIZED
2101 * @return RES_NO_SUCH_SESSION
2102 * @return RES_NO_SUCH_GROUP
2103 * @return RES_DB_QUERY_ERROR
2104 * @return RES_ERROR
2105 *
2106 */
2107 result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
2108 {
2109 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2110 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2111 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
2112
2113 result_t ret = RES_ERROR;
2114 string sql;
2115 SQLRETURN sqlcode;
2116 SQLHANDLE hstmt = NULL;
2117 userid_t* dst = 0;
2118
2119 //how many members ?
2120 sql = "SELECT COUNT(*) FROM " + dbprefix + "_xnpaccount_groups_users_link ";
2121 sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
2122 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2123 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2124 SQLUINTEGER count = 0;
2125 SQLINTEGER len;
2126 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
2127 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2128 dst = new userid_t[ count ];
2129 *uids = dst;
2130 *uidsLen = count;
2131 if( count > 0 ){
2132 //retrive member's IDs
2133 SQLHANDLE hstmt2 = NULL;
2134 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
2135 sql = "SELECT uid, gid, is_admin FROM " + dbprefix + "_xnpaccount_groups_users_link ";
2136 sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
2137 sql += " " + string( criteria2str( cri ) );
2138 if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2139 SQLUINTEGER uid = 0;
2140 SQLINTEGER len;
2141 SQLBindCol( hstmt2, 1, SQL_C_ULONG, &uid, 0, &len );
2142 for( int i = 0; ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS && i < count ; i++ ){
2143 dst[ i ] = uid;
2144 }
2145 ret = RES_OK;
2146 }else{
2147 setLastErrorString( "SQLExecDirect in getMembers" );
2148 ret = RES_DB_QUERY_ERROR;
2149 }
2150 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
2151 }else{
2152 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
2153 ret = RES_DB_QUERY_ERROR;
2154 }
2155 }else{
2156 ret = RES_OK;
2157 }
2158 }else{
2159 string s( "SQLFetch in getMembers sql=" );
2160 s += string( sql );
2161 setLastErrorString( s.c_str( ) );
2162 ret = RES_DB_QUERY_ERROR;
2163 }
2164 }else{
2165 setLastErrorString( "SQLExecDirect in getMembers" );
2166 ret = RES_DB_QUERY_ERROR;
2167 }
2168 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2169 }else{
2170 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
2171 ret = RES_DB_QUERY_ERROR;
2172 }
2173 return ret;
2174 }
2175
2176 /**
2177 *
2178 * ?違???若????????
2179 * ???若?帥???若?鴻?????違???若???????ゃ???障??.
2180 *
2181 * @param sid ?祉???激?с??D
2182 * @param gid ?????違???若??????絮????若?吟?????????????????違???若????ID?ф??絎?
2183 * @return RES_OK
2184 * @return RES_DB_QUERY_ERROR
2185 * @return RES_NO_SUCH_SESSION
2186 * @return RES_DB_NOT_INITIALIZED
2187 *
2188 */
2189 result_t deleteGroup( sessionid_t sid, groupid_t gid )
2190 {
2191 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2192 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2193
2194 result_t ret = RES_ERROR;
2195 string sql;
2196 SQLRETURN sqlcode;
2197 SQLHANDLE hstmt = NULL;
2198
2199 sql = "DELETE FROM " + dbprefix + "_xnpaccount_groups ";
2200 sql += "WHERE gid = " + string( unsignedIntToString( gid ) );
2201 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2202 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2203 SQLINTEGER count = 0;
2204 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2205 ret = RES_OK;
2206 }else{
2207 string s( "SQLRowCount in deleteGroup" );
2208 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2209 s += string( ", sql=" ) + string( sql );
2210 setLastErrorString( s.c_str( ) );
2211 ret = RES_NO_SUCH_USER;
2212 }
2213 }else{
2214 string s( "SQLExecDirect in deleteGroup" );
2215 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2216 s += ", sql=";
2217 s += string( sql );
2218 setLastErrorString( s.c_str( ) );
2219 ret = RES_DB_QUERY_ERROR;
2220 }
2221 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2222 }else{
2223 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteGroup" );
2224 ret = RES_ERROR;
2225 }
2226 return ret;
2227 }
2228
2229 /**
2230 *
2231 * ?違???若???脂??
2232 * ?違???若???????宴?????若?帥???若?鴻????蚊????鐚?/span>
2233 * ?脂?蚊?????違???若?????綽??????違???若??ID??gid???主?????鐚?/span>
2234 *
2235 * @param sid ?祉???激?с??D
2236 * @param group ?脂?蚊???????違???若????????/span>
2237 * @param gid ?脂?蚊?????違???若?????綽??????違???若??ID
2238 * @return RES_OK
2239 * @return RES_DB_NOT_INITIALIZED
2240 * @return RES_NO_SUCH_SESSION
2241 * @return RES_DB_QUERY_ERROR
2242 *
2243 */
2244 result_t insertGroup( sessionid_t sid, const group_t* group, groupid_t* gid )
2245 {
2246 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2247 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2248
2249 result_t ret = RES_ERROR;
2250 string sql;
2251 SQLCHAR gname[XNP_GROUP_GNAME_LEN+1], gdesc[XNP_GROUP_GDESC_LEN+1];
2252 SQLINTEGER cbGname = SQL_NTS, cbGdesc = SQL_NTS;
2253 SQLRETURN sqlcode;
2254
2255 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2256 sql = "INSERT INTO " + dbprefix + "_xnpaccount_groups ( gname, gdesc ) VALUES ( ?, ? )";
2257 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
2258 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
2259 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname );
2260 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc );
2261 strncpy2( (char*)gname, group -> getGname( ), XNP_GROUP_GNAME_LEN );
2262 strncpy2( (char*)gdesc, group -> getDesc( ), XNP_GROUP_GDESC_LEN );
2263 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
2264 SQLINTEGER count = 0;
2265 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2266 //?違???若??ID????緇?????
2267 SQLHANDLE hstmt2 = NULL;
2268 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
2269 sql = "SELECT LAST_INSERT_ID()"; // MySQL
2270 // sql = "SELECT LAST_INSERT_ROWID()"; // SQLite
2271 if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2272 SQLUINTEGER last_insert_id;
2273 SQLINTEGER len;
2274 SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len );
2275 if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){
2276 *gid = last_insert_id;
2277 ret = RES_OK;
2278 }else{
2279 ret = RES_DB_QUERY_ERROR;
2280 string s( "SQLFetch in insertGroup " );
2281 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2282 setLastErrorString( s.c_str( ) );
2283 }
2284 }else{
2285 string s( "SQLExecDirect in insertGroup " );
2286 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2287 setLastErrorString( s.c_str( ) );
2288 ret = RES_DB_QUERY_ERROR;
2289 }
2290 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
2291 }
2292 }else{
2293 string s( "SQLRowCount in insertGroup sql=" );
2294 s += string( sql );
2295 setLastErrorString( s.c_str( ) );
2296 ret = RES_DB_QUERY_ERROR;
2297 }
2298 }else{
2299 string s( "SQLExecute in insertGroup " );
2300 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2301 setLastErrorString( s.c_str( ) );
2302 ret = RES_DB_QUERY_ERROR;
2303 }
2304 }else{
2305 string s( "SQLPrepare in insertGroup " );
2306 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2307 setLastErrorString( s.c_str( ) );
2308 ret = RES_ERROR;
2309 }
2310 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2311 }else{
2312 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertGroup" );
2313 ret = RES_ERROR;
2314 }
2315
2316 //
2317 if ( ret == RES_OK ){
2318 //group index??篏???
2319
2320 //group index????ort_num????
2321 string sql = "SELECT MAX(sort_number) FROM " +
2322 dbprefix + "_xnpaccount_index WHERE parent_index_id=" + unsignedIntToString(item::IID_ROOT) +
2323 " AND (open_level=" + unsignedIntToString(index::OL_GROUP_ONLY) +
2324 " OR open_level=" + unsignedIntToString(index::OL_PUBLIC) + ")";
2325 unsigned int sortNumber;
2326 ret = queryGetUnsignedInt( "insertGroup", sql, &sortNumber );
2327 sortNumber++;
2328 if ( ret == RES_OK ){
2329 // group index篏???
2330 index_t index;
2331 userid_t uid;
2332 ret = sessionID2UID( sid, &uid );
2333 if ( ret == RES_OK ){
2334 index.setItemTypeID(item::ITID_INDEX);
2335 index.setContributorUID(uid);
2336 index.setParentIndexID(item::IID_ROOT);
2337 index.setOwnerGID(*gid);
2338 index.setOpenLevel(index::OL_GROUP_ONLY);
2339 index.setSortNumber(sortNumber);
2340 index.setTitle(group->getGname());
2341 indexid_t groupXID;
2342 ret = insertIndexInternal( sid, &index, &groupXID );
2343 if ( ret == RES_OK ){
2344 // xnpaccuont_groups??roup_index_id???吾??????
2345 sql = "UPDATE " + dbprefix + "_xnpaccount_groups SET group_index_id="
2346 + unsignedIntToString(groupXID) + " WHERE gid=" + unsignedIntToString(*gid);
2347 ret = querySimple( "insertGroup", sql );
2348 }
2349 }
2350 }
2351 }
2352
2353 return ret;
2354 }
2355
2356 /**
2357 *
2358 * ?違???若?????宴??紊??眼????
2359 *
2360 * @param sid ?祉???激?с??D
2361 * @param group ?違?????違???若??????/span>
2362 * @return RES_OK
2363 * @return RES_ERROR
2364 * @return RES_DB_NOT_INITIALIZED
2365 * @return RES_NO_SUCH_SESSION
2366 * @return RES_NO_SUCH_GROUP
2367 * @return RES_DB_QUERY_ERROR
2368 *
2369 */
2370 result_t updateGroup( sessionid_t sid, const group_t* group )
2371 {
2372 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2373 if( group == NULL ) return RES_ERROR;
2374 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2375 if( !gidExists( group -> getGID( ) ) ) return RES_NO_SUCH_GROUP;
2376
2377 result_t ret = RES_ERROR;
2378 string sql;
2379 SQLCHAR gname[XNP_GROUP_GNAME_LEN+1], gdesc[XNP_GROUP_GDESC_LEN+1];
2380 SQLINTEGER cbGname = SQL_NTS, cbGdesc = SQL_NTS;
2381 SQLRETURN sqlcode;
2382
2383 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2384 sql = "UPDATE " + dbprefix + "_xnpaccount_groups SET gname=?, gdesc=? WHERE gid=" + string( unsignedIntToString( group -> getGID( ) ) );
2385 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
2386 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
2387 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname );
2388 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc );
2389 strncpy2( (char*)gname, group -> getGname( ), XNP_GROUP_GNAME_LEN );
2390 strncpy2( (char*)gdesc, group -> getDesc( ), XNP_GROUP_GDESC_LEN );
2391 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
2392 SQLINTEGER count = 0;
2393 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2394 ret = RES_OK;
2395 }else{
2396 string s( "SQLRowCount in updateGroup sql=" );
2397 s += string( sql );
2398 setLastErrorString( s.c_str( ) );
2399 ret = RES_DB_QUERY_ERROR;
2400 }
2401 }else{
2402 string s( "SQLExecute in updateGroup " );
2403 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2404 setLastErrorString( s.c_str( ) );
2405 ret = RES_DB_QUERY_ERROR;
2406 }
2407 }else{
2408 setLastErrorString( "SQLPrepare in updateGroup sql=" );
2409 ret = RES_ERROR;
2410 }
2411 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2412 }else{
2413 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateGroup" );
2414 ret = RES_ERROR;
2415 }
2416 return RES_OK;
2417 }
2418
2419 /**
2420 *
2421 * ?違???若?????怨??
2422 *
2423 * @param sid ?祉???激?с??D
2424 * @param gid ??緇????????違???若????ID
2425 * @param group ??緇??????違???若?????宴???≪?????鴻???吾??莨若?????ゃ?潟??/span>
2426 * @return RES_OK
2427 * @return RES_DB_NOT_INITIALIZED
2428 * @return RES_NO_SUCH_SESSION
2429 * @return RES_NO_SUCH_GROUP
2430 * @return RES_DB_QUERY_ERROR
2431 *
2432 */
2433 result_t getGroup( sessionid_t sid, groupid_t gid, const group_t** group )
2434 {
2435 int len;
2436 static criteria c;
2437 result_t res = getGroups( sid, &gid, 1, &c, group, &len );
2438 if( len == 0 ) return RES_NO_SUCH_GROUP;
2439 return res;
2440 }
2441
2442 /**
2443 *
2444 * 茲??違???違???若?????宴??筝?綺?????????.
2445 *
2446 * @param sid ?祉???激?с??D
2447 * @param gids ??緇????????違???若????ID??????
2448 * @param gidsLen gids???????膣???/span>
2449 * @param cri 腟???????膀??駕??純?若???>散????絎?
2450 * @param groups ??緇?腟??????違???若?????宴?????????≪?????鴻???吾??莨若?????ゃ?潟??/span>
2451 * @param groupsLen ??緇?腟????????????膣???/span>
2452 * @return RES_OK
2453 * @return RES_DB_NOT_INITIALIZED
2454 * @return RES_NO_SUCH_SESSION
2455 * @return RES_DB_QUERY_ERROR
2456 *
2457 */
2458 result_t getGroups( sessionid_t sid, groupid_t* gids, int gidsLen, criteria_t* cri, const group_t** groups, int* groupsLen )
2459 {
2460 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2461 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2462
2463 #ifdef USE_SYSLOG
2464 openlog( "commonal", LOG_ODELAY, LOG_USER );
2465 #endif
2466
2467 SQLRETURN sqlcode;
2468 SQLHANDLE hstmt = NULL;
2469 result_t ret = RES_ERROR;
2470 string sql;
2471 group_t* dst = new group_t[ gidsLen ];
2472
2473 sql += "SELECT gid, gname, gdesc, group_index_id ";
2474 sql += "FROM " + dbprefix + "_xnpaccount_groups ";
2475 if( gidsLen > 0 ){
2476 sql += "WHERE gid=" + string( unsignedIntToString( gids[ 0 ] ) );
2477 for( int i = 1; i < gidsLen; i++ ){
2478 sql += " OR gid=" + string( unsignedIntToString( gids[ i ] ) );
2479 }
2480 }
2481 sql += criteria2str( cri );
2482
2483 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2484 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2485 SQLINTEGER len;
2486 groupid_t gid = 0;
2487 SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
2488 *groupsLen=0;
2489 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < gidsLen ; i++ ){
2490 dst[ i ].setGID( gid );
2491 dst[ i ].setGname( getResultCol( hstmt, 2 ).c_str() );
2492 dst[ i ].setDesc( getResultCol( hstmt, 3 ).c_str() );
2493 dst[ i ].setGroupIndexID( atoi(getResultCol( hstmt, 4 ).c_str()) );
2494 ( *groupsLen )++;
2495 }
2496 *groups = dst;
2497 #ifdef USE_SYSLOG
2498 syslog( LOG_DEBUG, "getGroups succeed" );
2499 #endif
2500 ret = RES_OK;
2501 }else{
2502 string s( "SQLExecDirect in getGroups" );
2503 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2504 s += string( ", sql=" ) + string( sql );
2505 setLastErrorString( s.c_str( ) );
2506 #ifdef USE_SYSLOG
2507 syslog( LOG_DEBUG, "getGroups %s", getLastErrorString( ) );
2508 #endif
2509 ret = RES_DB_QUERY_ERROR;
2510 }
2511 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2512 }else{
2513 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroups" );
2514 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2515 setLastErrorString( s.c_str( ) );
2516 #ifdef USE_SYSLOG
2517 syslog( LOG_DEBUG, "getGroups %s", getLastErrorString( ) );
2518 #endif
2519 ret = RES_DB_QUERY_ERROR;
2520 }
2521 #ifdef USE_SYSLOG
2522 closelog( );
2523 #endif
2524 return ret;
2525 }
2526
2527 /**
2528 *
2529 * ?≪?????若?炊┤???????<??菴???
2530 *
2531 * @param sid ?祉???激?с??D
2532 * @param uid ???????????????若?吟??ID
2533 * @return true 罔???????
2534 * @return false 罔???????
2535 *
2536 */
2537 bool isModerator( sessionid_t sid, userid_t uid )
2538 {
2539 if( hdbc == NULL ) return false;
2540 if( !isValidSessionID( sid ) ) return false;
2541 if( !uidExists( uid ) ) return false;
2542
2543 bool ret = false;
2544 SQLRETURN sqlcode;
2545 SQLHANDLE hstmt = NULL;
2546 SQLINTEGER count = 0;
2547 string sql;
2548 groupid_t moderator_gid;
2549
2550 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2551 sql = "SELECT value FROM " + dbprefix + "_xnpaccount_config";
2552 sql += " WHERE name='moderator_gid'";
2553 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2554 SQLINTEGER len = 0;
2555 SQLBindCol( hstmt, 1, SQL_C_ULONG, &moderator_gid, 0, &len );
2556 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2557 sql = "SELECT * from " + dbprefix + "_groups_users_link ";
2558 sql += "WHERE groupid=" + unsignedIntToString( moderator_gid );
2559 sql += " AND uid=" + string( unsignedIntToString( uid ) );
2560 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
2561 if( count > 0 ){
2562 ret = true;
2563 }
2564 }
2565 }else{
2566 setLastErrorString( "SQLFetch in isModerator " );
2567 }
2568 }else{
2569 string s( "SQLExecDirect in isModerator " );
2570 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2571 s += ", sql=";
2572 s += string( sql );
2573 setLastErrorString( s.c_str( ) );
2574 }
2575 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2576 }else{
2577 setLastErrorString( "SQLAllocHandle in isModerator " );
2578 }
2579 return ret;
2580 }
2581
2582 /**
2583 *
2584 * ???若??D??緇?
2585 *
2586 * @param uname ID????緇??????????若?吟?弱??
2587 * @param uid ID??篁e?ャ??????紊??違?????ゃ?潟??/span>
2588 * @return RES_ERROR
2589 * @return RES_OK
2590 * @refer result_t
2591 *
2592 */
2593 result_t getUid( const char* uname, userid_t* uid )
2594 {
2595 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2596 if( uname == NULL ) return RES_ERROR;
2597
2598 result_t ret = RES_ERROR;
2599 SQLRETURN sqlcode;
2600 SQLHANDLE hstmt = NULL;
2601 string sql;
2602 string uname2 = addSlashes( uname );
2603
2604 sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + uname2 + "';";
2605 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2606 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2607 userid_t _uid = 0;
2608 SQLINTEGER len;
2609 SQLBindCol( hstmt, 1, SQL_C_ULONG, &_uid, 0, &len );
2610 sqlcode = SQLFetch( hstmt );
2611 if( sqlcode == SQL_SUCCESS ){
2612 *uid = _uid;
2613 ret = RES_OK;
2614 }else {
2615 string s( "SQLFetch in getUid sql=" );
2616 s += string( sql );
2617 setLastErrorString( s.c_str( ) );
2618 ret = RES_NO_SUCH_USER;
2619 }
2620 }else{
2621 setLastErrorString( "SQLExecDirect in getUid" );
2622 ret = RES_DB_QUERY_ERROR;
2623 }
2624 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2625 }else{
2626 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getUid" );
2627 ret = RES_DB_QUERY_ERROR;
2628 }
2629
2630 return ret;
2631 }
2632
2633 /**
2634 *
2635 * ?祉???激?с?潟??篏?????xoops_xnpaccount_session???吾??莨若???? sessionid_t??session???????
2636 *
2637 * @param uid xoops_users??id
2638 * @param session sessionid_t???????????????????ゃ?潟?帥??
2639 * @return RES_OK ????
2640 * @return RES_DB_QUERY_ERROR DB????????筝?????????/span>
2641 */
2642 static result_t addSession( userid_t uid, sessionid_t* session )
2643 {
2644 char *functionName = "addSession";
2645 string sql = "INSERT INTO " + dbprefix + "_xnpaccount_session (uid) values (" +
2646 unsignedIntToString(uid) + ")";
2647 result_t ret = querySimple( functionName, sql );
2648 if ( ret == RES_OK ){
2649 sql = "SELECT LAST_INSERT_ID()";
2650 ret = queryGetUnsignedInt( functionName, sql, (unsigned int*)session );
2651 }
2652 return ret;
2653 }
2654
2655
2656 /**
2657 *
2658 * ???違?ゃ?活?荐若???祉???激?с?割???
2659 *
2660 * @param uname ???違?ゃ?喝??
2661 * @param passwd ???鴻???若??
2662 * @param session sessionid_t???????????????????ゃ?潟?帥??
2663 * @return RES_OK ???違?ゃ?恰??????session??essionid_t???吾??莨若??????<br>
2664 * @return RES_LOGIN_FAILURE uname?障????asswd???医幻<br>
2665 * @return RES_DB_QUERY_ERROR DB????????筝?????????/span>
2666 *
2667 */
2668 result_t loginUser(const char* uname, const char* passwd, sessionid_t* session )
2669 {
2670 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2671
2672 result_t ret;
2673 string sql;
2674 SQLRETURN sqlcode;
2675
2676 // uname, passwd -> uid
2677 string escUname = addSlashes( uname );
2678 string escPasswd = addSlashes( passwd );
2679 sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + escUname + "' and pass=md5('" + escPasswd + "')";
2680
2681 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2682 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2683 userid_t uid = 0;
2684 SQLINTEGER len;
2685 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
2686 sqlcode = SQLFetch( hstmt );
2687 if( sqlcode == SQL_SUCCESS ){
2688 ret = addSession( uid, session );
2689 }else {
2690 string s( "SQLFetch in loginUser" );
2691 setLastErrorString( s.c_str( ) );
2692 ret = RES_LOGIN_FAILURE;//illegal loginname or password
2693 }
2694 }else{
2695 setLastErrorString( "SQLExecDirect in loginUser" );
2696 ret = RES_DB_QUERY_ERROR;
2697 }
2698 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2699 }else{
2700 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in loginUser" );
2701 ret = RES_DB_QUERY_ERROR;
2702 }
2703
2704 return ret;
2705 }
2706
2707 /**
2708 *
2709 * ???違?≪???????祉???激?с?括?篋?
2710 *
2711 * @param sid session id
2712 * @return ????
2713 *
2714 */
2715 void logoutUser( sessionid_t sid )
2716 {
2717 if( hdbc == NULL ) return; // RES_DB_NOT_INITIALIZED;
2718
2719 result_t ret;
2720 string sql;
2721 SQLRETURN sqlcode;
2722 SQLHANDLE hstmt = NULL;
2723
2724 sql = "DELETE FROM " + dbprefix + "_xnpaccount_session WHERE sid=" + intToString((int)sid);
2725 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2726 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2727 ;
2728 }
2729 else {
2730 setLastErrorString( "SQLExecDirect in logoutUser" );
2731 }
2732 }
2733 else {
2734 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in logoutUser" );
2735 }
2736 }
2737
2738 /**
2739 *
2740 * ?祉???激?с?潟?????.<br>
2741 * XOOPS??ession???若????????蚊??????sess_id?????ess_id??膈???????
2742 * ?逸?session_t??篏?????????
2743 * ???若?帥???若?鴻???祉???激?с?潟????違?????宴??荐??蚊????
2744 *
2745 * @param sessionid xoops??ession_id
2746 * @param uid xoops_users??id
2747 * @param session sessionid_t???????????????????ゃ?潟?帥??
2748 * @return RES_OK
2749 * @return RES_ERROR
2750 * @return RES_DB_QUERY_ERROR
2751 *
2752 */
2753 result_t createSession( const char* sess_id, userid_t uid, sessionid_t* session )
2754 {
2755 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2756
2757 result_t ret;
2758 string sql;
2759 SQLHANDLE hstmt = NULL;
2760 SQLRETURN sqlcode;
2761
2762 string escSess_id = addSlashes(sess_id);
2763 sql = "SELECT sess_id from " + dbprefix + "_session where sess_id='" + escSess_id + "'";
2764 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2765 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2766 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2767 ret = addSession( uid, session );
2768 }else{
2769 ret = RES_ERROR;
2770 }
2771 }else {
2772 ret = RES_DB_QUERY_ERROR;
2773 }
2774 }else{
2775 ret = RES_DB_QUERY_ERROR;
2776 }
2777 return ret;
2778 }
2779
2780 /**
2781 *
2782 * ?祉???激?с?潟???膣違??session_t?у??????.<br>
2783 *
2784 * @param sid ?祉???激?с??D
2785 * @param ppsession sessionid_t*???????????????????ゃ?潟?帥??
2786 * @return RES_OK ??????freeSession(*ppsession)??綽?荀???<br>
2787 * @return RES_NO_SUCH_SESSION<br>
2788 * @return RES_DB_QUERY_ERROR<br>
2789 * @return RES_DB_NOT_INITIALIZED
2790 *
2791 */
2792 result_t getSession( sessionid_t sid, const session_t** ppsession )
2793 {
2794 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2795 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2796
2797 result_t ret = RES_ERROR;
2798 string sql;
2799 SQLHANDLE hstmt = NULL;
2800 SQLRETURN sqlcode;
2801
2802 sql = "SELECT sid, uid, unix_timestamp(timestamp) from " + dbprefix +
2803 "_xnpaccount_session where sid=" + unsignedIntToString((unsigned int)sid);
2804 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2805 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2806 userid_t uid = 0;
2807 SQLINTEGER cbUid = 0;
2808 unsigned long date = 0;
2809 SQLINTEGER cbDate = 0;
2810 SQLBindCol( hstmt, 2, SQL_C_ULONG, &uid, 0, &cbUid );
2811 SQLBindCol( hstmt, 3, SQL_C_ULONG, &date, 0, &cbDate );
2812 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2813 session_t *p = new session[ 1 ];
2814 p->setSessionID( sid );
2815 p->setUID( uid );
2816 p->setDate( date );
2817 *ppsession = p;
2818 ret = RES_OK;
2819 }else{
2820 string s( "SQLFetch in getSession " );
2821 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2822 setLastErrorString( s.c_str( ) );
2823 ret = RES_ERROR;
2824 }
2825 }else {
2826 string s( "SQLExecDirect in getSession " );
2827 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2828 s += ", sql=";
2829 s += string( sql );
2830 setLastErrorString( s.c_str( ) );
2831 ret = RES_DB_QUERY_ERROR;
2832 }
2833 }else{
2834 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getSession" );
2835 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2836 setLastErrorString( s.c_str( ) );
2837 ret = RES_DB_QUERY_ERROR