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.37 - (show annotations) (download) (as text)
Fri Jan 14 10:36:59 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.36: +1293 -24 lines
File MIME type: text/x-c++src
・index関係の処理を追加.
・insertAccountでprivate indexを作成するよう修正.
・insertGroupでgroup index を作成するよう修正.

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