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.16 - (show annotations) (download) (as text)
Sat Nov 27 06:29:29 2004 UTC (19 years, 4 months ago) by youi
Branch: MAIN
Changes since 1.15: +157 -11 lines
File MIME type: text/x-c++src
getAccountCountを定義.
dumpGidsを定義.
insertGroup, deleteGroup, updateGroupを定義.
getGroup, getGroupsを定義.
データベース初期前の呼出に対し,RES_DB_NOT_INITIALIZEDを返す処理を各関数に追加
(未対応の関数が残っている)

1 /*
2 *
3 * $Revision: 1.15 $
4 * $Log: commonal.cc,v $
5 * Revision 1.15 2004/11/27 02:22:22 aga
6 * ??nitializeDB????ddSlashes()???若?吟???純?<??????篆??.
7 *
8 * Revision 1.14 2004/11/27 01:07:31 youi
9 * criteria2str: LIMIT??RDER BY?????????ャ???帥????.
10 *
11 * Revision 1.13 2004/11/27 00:35:39 youi
12 * getAccounts??絎?臂?
13 * getAccount??篆??鐚???????etAccounts???若?喝?冴??.
14 * criteria2str??絎?臂?
15 *
16 * Revision 1.12 2004/11/26 09:45:28 youi
17 * getAccount??絎?臂?
18 *
19 * Revision 1.11 2004/11/26 08:16:26 aga
20 * ??etSession, loginUser, createSession, freeResult(const session_t*) 篆??.
21 *
22 * Revision 1.10 2004/11/26 07:57:42 youi
23 * updateAccount, deleteAccount??絎?臂?
24 * mysql_query紊掩??????tderr?吾?????若?潟?若?????????若?<???祉?若?吾???阪??.
25 *
26 * Revision 1.9 2004/11/26 07:38:02 aga
27 * ??AILUE -> FAILURE.
28 *
29 * Revision 1.8 2004/11/26 06:36:55 aga
30 * ??reateSession, getSession ??篏???.
31 *
32 * Revision 1.7 2004/11/26 04:51:47 youi
33 * dbprefix??絎?臂?????.
34 * insertAccount??絎?臂?????.
35 * isValidSessionID??絎?臂?????.
36 *
37 * Revision 1.6 2004/11/26 04:35:55 aga
38 * ??oginUser(), logoutUser()??篏???.
39 *
40 * Revision 1.5 2004/11/26 01:08:25 aga
41 * ??ddSlashes()篏???.
42 *
43 * Revision 1.4 2004/11/25 12:14:29 youi
44 * getUid????????絎?臂?????.
45 *
46 * Revision 1.3 2004/11/25 11:13:59 youi
47 * getLastErrorString/setLastErrorString??絎?臂?
48 *
49 * Revision 1.2 2004/11/25 08:55:19 youi
50 * 綣??違??????篆??.
51 * freeResult??菴遵??.
52 *
53 * Revision 1.1 2004/11/25 05:14:58 youi
54 * initial version
55 *
56 *
57 */
58 #include <stdio.h>
59 #include <stdlib.h>
60 #include <string.h>
61 #include <mysql.h>
62 #include <errmsg.h>
63 #include <string>
64 using namespace std;
65
66 #include "common.h"
67 #include "account.h"
68 #include "group.h"
69 #include "session.h"
70 #include "criteria.h"
71 #include "commonal.h"
72
73
74 static MYSQL* mysql = NULL; //!< MySQL????潟????/span>
75 static string dbprefix; //!< XOOPS???若?帥???若?鴻???若??????REFIX
76
77 /**
78 *
79 * php??ddslashes????????
80 *
81 * @param addslashes???鴻????絖?????NULL??絎?筝?????
82 * @return addslashes????????絖???
83 */
84 string addSlashes( const char *str )
85 {
86 if ( mysql == NULL ){
87 string s;
88 return s;
89 }
90 int len = strlen(str);
91 char *buf = new char[len*2+1];
92 int bufLen = mysql_real_escape_string( mysql, buf, str, len );
93 string s( buf, bufLen );
94 return s;
95 }
96
97 /**
98 *
99 * criteria ?? SQL?????????
100 *
101 *
102 *
103 */
104 string criteria2str( criteria* cri )
105 {
106 string sql;
107
108 const orderby* odrby = cri -> headOrderBy( );
109 if( odrby != 0 ){
110 sql += " ORDER BY " + string( odrby -> getColumn( ) );
111 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
112 while( ( odrby = cri -> nextOrderBy( ) ) != 0 ){
113 sql += ", " + string( odrby -> getColumn( ) );
114 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
115 }
116 }
117
118 if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){
119 sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) )
120 + ", " + string( intToString( cri -> getLimitRows( ) ) );
121 }
122 return sql;
123 }
124
125 /**
126 *
127 * ???若?帥???若?鴻????????
128 *
129 * @param host ???若?帥???若?鴻?????鴻????
130 * @param user ???若?帥???若?鴻???≪???祉?鴻???????若?九??
131 * @param password 筝?荐????若?吟?????鴻???若??
132 * @param dbname ???若?帥???若?鴻??????
133 * @param prefix XOOPS???若?帥???若?鴻???若??????REFIX
134 * @return result_t
135 * @refer result_t
136 */
137 result_t initializeDB( const char* host, const char* user, const char* password, const char* dbname, const char* prefix )
138 {
139 // ?≪??・膓?筝???????筝???????/span>
140 if ( mysql != NULL )
141 mysql_close( mysql );
142
143 dbprefix = prefix;
144
145 // ????????・膓?
146 mysql = mysql_init(NULL);
147 if ( mysql == NULL ){
148 return RES_DB_INITIALIZE_ERROR;
149 }
150 char *unix_socket = NULL; // ?
151 uint flag = 0; // ?
152 if ( NULL == mysql_real_connect( mysql, host, user, password, dbname, 3306, unix_socket, flag ) ){
153 return RES_DB_CONNECT_ERROR;
154 }
155
156 return RES_OK;
157 }
158
159
160 /**
161 *
162 * Platform???若?倶?粋??倶????緇?
163 *
164 * @param
165 * @return
166 *
167 */
168 bool isActivated( sessionid_t sid, userid_t uid )
169 {
170 return false;
171 }
172
173 /**
174 *
175 * Platform???若?倶?粋??倶??紊???/span>
176 *
177 * @param
178 * @return
179 *
180 */
181 result_t activate( sessionid_t sid, userid_t uid, bool activate )
182 {
183 return RES_ERROR;
184 }
185
186 /**
187 *
188 * ?≪?????潟????/span>
189 *
190 * @param
191 * @return
192 *
193 */
194 int getAccountCount( sessionid_t sid )
195 {
196 if( mysql == NULL ) return 0;
197 if( !isValidSessionID( sid ) ) return 0;
198
199 int ret = 0;
200 string sql;
201 MYSQL_RES* result;
202 MYSQL_ROW row;
203
204 //?≪?????潟???違??羆?????
205 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_users ";
206 if( mysql_query( mysql, sql.c_str( ) ) ){
207 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
208 return 0;
209 }
210 result = mysql_store_result( mysql ) ;
211 if( row = mysql_fetch_row(result) ){
212 ret = atoi( row[ 0 ] );
213 }else{
214 mysql_free_result( result );
215 return 0;
216 }
217 mysql_free_result( result );
218 return ret;
219 }
220
221 /**
222 *
223 * ?≪?????潟??????/span>
224 *
225 * @param
226 * @return RES_OK | RES_NO_SUCH_SESSION | RES_DB_QUERY_ERROR
227 *
228 */
229 result_t deleteAccount( sessionid_t sid, userid_t uid )
230 {
231 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
232 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
233
234 string sql;
235 sql = "DELETE FROM " + dbprefix + "_users ";
236 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
237 if( mysql_query( mysql, sql.c_str( ) ) ){
238 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
239 return RES_DB_QUERY_ERROR;
240 }
241
242 sql = "DELETE FROM " + dbprefix + "_vpaccount_users ";
243 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
244 if( mysql_query( mysql, sql.c_str( ) ) ){
245 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
246 return RES_DB_QUERY_ERROR;
247 }
248
249 return RES_OK;
250 }
251
252 /**
253 *
254 * ?≪?????潟?????怨??
255 *
256 * @param sid ?祉???激?с??D
257 * @param uid ??緇??????????若?吟??ID
258 * @param acc ??緇??????≪?????潟??????account_t)?????ゃ?潟?帥???吾??莨若??綣???/span>
259 * @return RES_OK | RES_NO_SUCH_USER | RES_NO_SUCH_SESSION | RES_DB_QUERY_ERROR | RES_ERROR
260 *
261 */
262 result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc )
263 {
264 int len;
265 static criteria c;
266 result_t res = getAccounts( sid, &uid, 1, &c, acc, &len );
267 if( len == 0 ) return RES_NO_SUCH_USER;
268 return res;
269 }
270
271 /**
272 *
273 * ?≪?????潟?????怨??
274 *
275 * @param sid ?祉???激?с??D
276 * @param uids ??緇??????????若?吟??ID??????
277 * @param uidsLen uids???????膣???/span>
278 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
279 * @param accounts 罎?膣∝??????????????ゃ?潟?帥???吾??莨若??綣???/span>
280 * @param accountsLen 罎?膣∝???????????*accounts???膣???
281 * @return RES_OK| RES_NO_SUCH_SESSION | RES_DB_QUERY_ERROR
282 *
283 */
284 result_t getAccounts( sessionid_t sid, const userid_t* uids, int uidsLen, criteria_t* cri, const account_t** accounts, int* accountsLen )
285 {
286 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
287 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
288
289 string sql;
290 MYSQL_RES* result;
291 MYSQL_ROW row;
292 account_t* dst = new account_t[ uidsLen ];
293
294 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.institute, u2.tel, u2.organization, u2.country, u2.zipcode, u2.fax, u2.base_url, u2.notice_mail, u2.notice_mail_since ";
295 sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_vpaccount_users AS u2 ";
296 sql += "WHERE u1.uid = u2.uid AND ( u1.uid=" + string( unsignedIntToString( uids[ 0 ] ) );
297 for( int i = 1; i < uidsLen; i++ ){
298 sql += " OR u1.uid=" + string( unsignedIntToString( uids[ i ] ) );
299 }
300 sql += " ) ";
301 sql += criteria2str( cri );
302 if( mysql_query( mysql, sql.c_str( ) ) ){
303 fprintf( stderr, "%s\n", sql.c_str( ) );
304 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
305 return RES_DB_QUERY_ERROR;
306 }
307 result = mysql_use_result( mysql ) ;
308 *accountsLen=0;
309 for( int i = 0; ( row = mysql_fetch_row(result) ) != 0 && i < uidsLen ; i++ ){
310 dst[ i ].setUID( atoi( row[ 0 ] ) );
311 dst[ i ].setName( row[ 1 ] );
312 dst[ i ].setUname( row[ 2 ] );
313 dst[ i ].setEmail( row[ 3 ] );
314 dst[ i ].setURL( row[ 4 ] );
315 dst[ i ].setUserAvatar( row[ 5 ] );
316 dst[ i ].setUserRegdate( atoi( row[ 6 ] ) );
317 dst[ i ].setUserIcq( row[ 7 ] );
318 dst[ i ].setUserFrom( row[ 8 ] );
319 dst[ i ].setUserSig( row[ 9 ] );
320 dst[ i ].setUserViewemail( atoi( row[ 10 ] ) );
321 dst[ i ].setActkey( row[ 11 ] );
322 dst[ i ].setUserAim( row[ 12 ] );
323 dst[ i ].setUserYim( row[ 13 ] );
324 dst[ i ].setUserMsnm( row[ 14 ] );
325 dst[ i ].setPass( row[ 15 ] );
326 dst[ i ].setPosts( atoi( row[ 16 ] ) );
327 dst[ i ].setAttachsig( atoi( row[ 17 ] ) );
328 dst[ i ].setRank( atoi( row[ 18 ] ) );
329 dst[ i ].setLevel( atoi( row[ 19 ] ) );
330 dst[ i ].setTheme( row[ 20 ] );
331 dst[ i ].setTimezoneOffset( atof( row[ 21 ] ) );
332 dst[ i ].setLastLogin( atoi( row[ 22 ] ) );
333 dst[ i ].setUmode( row[ 23 ] );
334 dst[ i ].setUorder( atoi( row[ 24 ] ) );
335 dst[ i ].setNotifyMethod( atoi( row[ 25 ] ) );
336 dst[ i ].setNotifyMode( atoi( row[ 26 ] ) );
337 dst[ i ].setUserOcc( row[ 27 ] );
338 dst[ i ].setBio( row[ 28 ] );
339 dst[ i ].setUserIntrest( row[ 29 ] );
340 dst[ i ].setUserMailok( atoi( row[ 30 ] ) );
341 dst[ i ].setActivate( atoi( row[ 31 ] ) );
342 dst[ i ].setAddress( row[ 32 ] );
343 dst[ i ].setInstitute( row[ 33 ] );
344 dst[ i ].setTel( row[ 34 ] );
345 dst[ i ].setOrganization( row[ 35 ] );
346 dst[ i ].setCountry( row[ 36 ] );
347 dst[ i ].setZipcode( row[ 37 ] );
348 dst[ i ].setFax( row[ 38 ] );
349 dst[ i ].setBaseURL( row[ 39 ] );
350 dst[ i ].setNoticeMail( atoi( row[ 40 ] ) );
351 dst[ i ].setNoticeMailSince( atoi( row[ 41 ] ) );
352 ( *accountsLen )++;
353 }
354 mysql_free_result( result );
355 *accounts = dst;
356 return RES_OK;
357 }
358
359 /**
360 *
361 * ?≪?????潟???脂??/span>
362 *
363 * @param sid ?祉???激?с??/span>
364 * @param account ?脂?蚊?????≪?????潟??????/span>
365 * @return RES_OK | RES_NO_SUCH_SESSION | RES_DB_QUERY_ERROR | RES_ERROR
366 *
367 */
368 result_t insertAccount( sessionid_t sid, const account_t* account )
369 {
370 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
371 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
372
373 string sql;
374 string tmp;
375 char buf[ 12 ];
376
377 //xoops?????若?吟???若???????吾??莨若??
378 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 (";
379 sql += "'" + string( addSlashes( account -> getUname( ) ) ) + "', ";
380 sql += "'" + string( addSlashes( account -> getName( ) ) ) + "', ";
381 sql += "'" + string( addSlashes( account -> getEmail( ) ) ) + "', ";
382 sql += "'" + string( addSlashes( account -> getURL( ) ) ) + "', ";
383 sql += "'" + string( addSlashes( account -> getUserAvatar( ) ) ) + "', ";
384 snprintf( buf, 12, "%d", time( NULL ) );
385 sql += string( buf ) + ", ";
386 sql += "'" + string( addSlashes( account -> getUserIcq( ) ) ) + "', ";
387 sql += "'" + string( addSlashes( account -> getUserFrom( ) ) ) + "', ";
388 sql += "'" + string( addSlashes( account -> getUserSig( ) ) ) + "', ";
389 snprintf( buf, 12, "%d", account -> getUserViewemail( ) );
390 sql += string( buf ) + ", ";
391 sql += "'" + string( addSlashes( account -> getActkey( ) ) ) + "', ";
392 sql += "'" + string( addSlashes( account -> getUserAim( ) ) ) + "', ";
393 sql += "'" + string( addSlashes( account -> getUserYim( ) ) ) + "', ";
394 sql += "'" + string( addSlashes( account -> getUserMsnm( ) ) ) + "', ";
395 sql += "'" + string( addSlashes( account -> getPass( ) ) ) + "', ";
396 snprintf( buf, 12, "%d", account -> getPosts( ) );
397 sql += string( buf ) + ", ";
398 snprintf( buf, 12, "%d", account -> getAttachsig( ) );
399 sql += string( buf ) + ", ";
400 snprintf( buf, 12, "%d", account -> getRank( ) );
401 sql += string( buf ) + ", ";
402 snprintf( buf, 12, "%d", account -> getLevel( ) );
403 sql += string( buf ) + ", ";
404 sql += "'" + string( addSlashes( account -> getTheme( ) ) ) + "', ";
405 snprintf( buf, 12, "%lf", account -> getTimezoneOffset( ) );
406 sql += string( buf ) + ", ";
407 sql += "0, "; //last login
408 sql += "'" + string( addSlashes( account -> getUmode( ) ) ) + "', ";
409 snprintf( buf, 12, "%d", account -> getUorder( ) );
410 sql += string( buf ) + ", ";
411 snprintf( buf, 12, "%d", account -> getNotifyMethod( ) );
412 sql += string( buf ) + ", ";
413 snprintf( buf, 12, "%d", account -> getNotifyMode( ) );
414 sql += string( buf ) + ", ";
415 sql += "'" + string( addSlashes( account -> getUserOcc( ) ) ) + "', ";
416 sql += "'" + string( addSlashes( account -> getBio( ) ) ) + "', ";
417 sql += "'" + string( addSlashes( account -> getUserIntrest( ) ) ) + "', ";
418 snprintf( buf, 12, "%d", account -> getUserMailok( ) );
419 sql += string( buf ) + ")";
420 if( mysql_query( mysql, sql.c_str( ) ) ){
421 fprintf( stderr, "%s\n", sql.c_str( ) );
422 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
423 return RES_DB_QUERY_ERROR;
424 }
425
426 //???若??D????緇?????
427 userid_t uid;
428 if( getUid( account -> getUname( ), &uid ) != RES_OK ){
429 return RES_ERROR;
430 }
431
432 //vpaccount?????若?吟???若??????????????宴???吾??莨若??
433 sql = "INSERT INTO " + dbprefix + "_vpaccount_users (uid, activate, address, institute, tel, organization, country, zipcode, fax, base_url, notice_mail, notice_mail_since) VALUES (";
434 snprintf( buf, 12, "%d", uid );
435 sql += string( buf ) + ", ";
436 if( account -> getActivate() ){
437 sql += "1, ";
438 }else{
439 sql += "0, ";
440 }
441 sql += "'" + string( addSlashes( account -> getAddress() ) ) + "', ";
442 sql += "'" + string( addSlashes( account -> getInstitute() ) ) + "', ";
443 sql += "'" + string( addSlashes( account -> getTel() ) ) + "', ";
444 sql += "'" + string( addSlashes( account -> getOrganization() ) ) + "', ";
445 sql += "'" + string( addSlashes( account -> getCountry() ) ) + "', ";
446 sql += "'" + string( addSlashes( account -> getZipcode() ) ) + "', ";
447 sql += "'" + string( addSlashes( account -> getFax() ) ) + "', ";
448 sql += "'" + string( addSlashes( account -> getBaseURL() ) ) + "', ";
449 snprintf( buf, 12, "%d", account -> getNoticeMail( ) );
450 sql += string( buf ) + ", ";
451 snprintf( buf, 12, "%d", account -> getNoticeMailSince( ) );
452 sql += string( buf ) + ")";
453 if( mysql_query( mysql, sql.c_str( ) ) ){
454 fprintf( stderr, "%s\n", sql.c_str( ) );
455 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
456 //xoops_users??nsert???????潟?若???????ゃ????
457 sql = "DELETE FROM " + dbprefix + "_users where uid=";
458 snprintf( buf, 12, "%d", uid );
459 sql += string( buf );
460 mysql_query( mysql, sql.c_str( ) );
461 return RES_DB_QUERY_ERROR;
462 }
463
464 return RES_OK;
465 }
466
467 /**
468 *
469 * ?≪?????潟??紊???/span>
470 *
471 * @param
472 * @return RES_OK | RES_NO_SUCH_SESSION | RES_DB_QUERY_ERROR
473 *
474 */
475 result_t updateAccount( sessionid_t sid, const account_t* account )
476 {
477 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
478 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
479
480 string sql;
481 string tmp;
482 char buf[ 12 ];
483
484 //xoops?????若?吟???若???????吾??莨若??
485 sql = "UPDATE " + dbprefix + "_users SET ";
486 sql += "uname='" + string( addSlashes( account -> getUname( ) ) ) + "', ";
487 sql += "name='" + string( addSlashes( account -> getName( ) ) ) + "', ";
488 sql += "email='" + string( addSlashes( account -> getEmail( ) ) ) + "', ";
489 sql += "url='" + string( addSlashes( account -> getURL( ) ) ) + "', ";
490 sql += "user_avatar='" + string( addSlashes( account -> getUserAvatar( ) ) ) + "', ";
491 sql += "user_regdate=" + string( intToString( account -> getUserRegdate( ) ) ) + ", ";
492 sql += "user_icq='" + string( addSlashes( account -> getUserIcq( ) ) ) + "', ";
493 sql += "user_from='" + string( addSlashes( account -> getUserFrom( ) ) ) + "', ";
494 sql += "user_sig='" + string( addSlashes( account -> getUserSig( ) ) ) + "', ";
495 sql += "user_viewemail=" + string( intToString( account -> getUserViewemail( ) ) ) + ", ";
496 sql += "actkey='" + string( addSlashes( account -> getActkey( ) ) ) + "', ";
497 sql += "user_aim='" + string( addSlashes( account -> getUserAim( ) ) ) + "', ";
498 sql += "user_yim='" + string( addSlashes( account -> getUserYim( ) ) ) + "', ";
499 sql += "user_msnm='" + string( addSlashes( account -> getUserMsnm( ) ) ) + "', ";
500 sql += "pass='" + string( account -> getPass( ) ) + "', ";
501 sql += "posts=" + string( intToString( account -> getPosts( ) ) ) + ", ";
502 sql += "attachsig=" + string( intToString( account -> getAttachsig( ) ) ) + ", ";
503 sql += "rank=" + string( intToString( account -> getRank( ) ) ) + ", ";
504 sql += "level=" + string( intToString( account -> getLevel( ) ) ) + ", ";
505 sql += "theme='" + string( addSlashes( account -> getTheme( ) ) ) + "', ";
506 snprintf( buf, 12, "%.2f", account -> getTimezoneOffset( ) );
507 sql += "timezone_offset=" + string( buf ) + ", ";
508 sql += "last_login=" + string( unsignedIntToString( account -> getLastLogin( ) ) ) + ", ";
509 sql += "umode='" + string( account -> getUmode( ) ) + "', ";
510 sql += "uorder=" + string( intToString( account -> getUorder( ) ) ) + ", ";
511 sql += "notify_method=" + string( intToString( account -> getNotifyMethod( ) ) ) + ", ";
512 sql += "notify_mode=" + string( intToString( account -> getNotifyMode( ) ) ) + ", ";
513 sql += "user_occ='" + string( addSlashes( account -> getUserOcc( ) ) ) + "', ";
514 sql += "bio='" + string( addSlashes( account -> getBio( ) ) ) + "', ";
515 sql += "user_intrest='" + string( addSlashes( account -> getUserIntrest( ) ) ) + "', ";
516 sql += "user_mailok=" + string( intToString( account -> getUserMailok( ) ) );
517 sql += " WHERE uid = " + string( intToString( account -> getUID( ) ) );
518
519 if( mysql_query( mysql, sql.c_str( ) ) ){
520 fprintf( stderr, "%s\n", sql.c_str( ) );
521 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
522 return RES_DB_QUERY_ERROR;
523 }
524
525 //vpaccount?????若?吟???若??????????????宴??筝??吾??????
526 sql = "UPDATE " + dbprefix + "_vpaccount_users SET ";
527 sql += "activate=";
528 if( account -> getActivate() ){
529 sql += "1, ";
530 }else{
531 sql += "0, ";
532 }
533 sql += "address='" + string( addSlashes( account -> getAddress() ) ) + "', ";
534 sql += "institute='" + string( addSlashes( account -> getInstitute() ) ) + "', ";
535 sql += "tel='" + string( addSlashes( account -> getTel() ) ) + "', ";
536 sql += "organization='" + string( addSlashes( account -> getOrganization() ) ) + "', ";
537 sql += "country='" + string( addSlashes( account -> getCountry() ) ) + "', ";
538 sql += "zipcode='" + string( addSlashes( account -> getZipcode() ) ) + "', ";
539 sql += "fax='" + string( addSlashes( account -> getFax() ) ) + "', ";
540 sql += "base_url='" + string( addSlashes( account -> getBaseURL() ) ) + "', ";
541 sql += "notice_mail=" + string( intToString( account -> getNoticeMail( ) ) ) + ", ";
542 sql += "notice_mail_since=" + string( intToString( account -> getNoticeMailSince( ) ) );
543 sql += " WHERE uid = " + string( intToString( account -> getUID( ) ) );
544
545 if( mysql_query( mysql, sql.c_str( ) ) ){
546 fprintf( stderr, "%s\n", sql.c_str( ) );
547 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
548 return RES_DB_QUERY_ERROR;
549 }
550
551 return RES_OK;
552 }
553
554 /**
555 *
556 * ???若??D筝?荀?/span>
557 *
558 * @param
559 * @return
560 *
561 */
562 result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen )
563 {
564 return RES_ERROR;
565 }
566
567 /**
568 *
569 * ?違???若????/span>
570 *
571 * @param
572 * @return
573 *
574 */
575 int getGroupCount( sessionid_t sid )
576 {
577 return 0;
578 }
579
580 /**
581 *
582 * ??絮??違???若??筝?荀у??
583 *
584 * @param
585 * @return
586 *
587 */
588 result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )
589 {
590 return RES_ERROR;
591 }
592
593 /**
594 *
595 * ?違???若??膊∞??罔????????
596 *
597 * @param
598 * @return
599 *
600 */
601 bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )
602 {
603 return RES_ERROR;
604 }
605
606 /**
607 *
608 * ?違???若??ID筝?荀?/span>
609 *
610 * @param
611 * @return
612 *
613 */
614 result_t dumpGids( sessionid_t sid, criteria_t* cri, groupid_t** gids, int* gidsLen )
615 {
616 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
617 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
618
619 string sql;
620 MYSQL_RES* result;
621 MYSQL_ROW row;
622 groupid_t* dst = 0;
623
624 //?違???若???違??羆?????
625 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups ";
626 sql += criteria2str( cri );
627 if( mysql_query( mysql, sql.c_str( ) ) ){
628 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
629 return RES_DB_QUERY_ERROR;
630 }
631 result = mysql_store_result( mysql ) ;
632 if( row = mysql_fetch_row(result) ){
633 *gidsLen = atoi( row[ 0 ] );
634 dst = new groupid_t[ *gidsLen ];
635 }else{
636 mysql_free_result( result );
637 return RES_ERROR;
638 }
639 mysql_free_result( result );
640
641 sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups ";
642 sql += criteria2str( cri );
643 if( mysql_query( mysql, sql.c_str( ) ) ){
644 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
645 return RES_DB_QUERY_ERROR;
646 }
647
648 result = mysql_use_result( mysql ) ;
649 for( int i = 0; ( row = mysql_fetch_row(result) ) != 0 && i < *gidsLen ; i++ ){
650 dst[ i ] = atoi( row[ 0 ] );
651 }
652 mysql_free_result( result );
653 *gids = dst;
654
655 return RES_OK;
656 }
657
658 /**
659 *
660 * ?違???若??膊∞????ID??緇?
661 *
662 * @param
663 * @return
664 *
665 */
666 result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
667 {
668 return RES_ERROR;
669 }
670
671 /**
672 *
673 * ?違???若????絮????若?九????/span>
674 *
675 * @param
676 * @return
677 *
678 */
679 result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )
680 {
681 return RES_ERROR;
682 }
683
684 /**
685 *
686 * ?違???若????絮????若?区申??
687 *
688 * @param
689 * @return
690 *
691 */
692 result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid )
693 {
694 return RES_ERROR;
695 }
696
697 /**
698 *
699 * ?違???若????絮????若?九??
700 *
701 * @param
702 * @return
703 *
704 */
705 result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
706 {
707 return RES_ERROR;
708 }
709
710 /**
711 *
712 * ?違???若????????/span>
713 *
714 * @param
715 * @return
716 *
717 */
718 result_t deleteGroup( sessionid_t sid, groupid_t gid )
719 {
720 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
721 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
722
723 string sql;
724 sql = "DELETE FROM " + dbprefix + "_vpaccount_groups ";
725 sql += "WHERE gid = " + string( unsignedIntToString( gid ) );
726 if( mysql_query( mysql, sql.c_str( ) ) ){
727 fprintf( stderr, "%s\n", sql.c_str( ) );
728 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
729 return RES_DB_QUERY_ERROR;
730 }
731 return RES_OK;
732 }
733
734 /**
735 *
736 * ?違???若?????脂??/span>
737 *
738 * @param
739 * @return
740 *
741 */
742 result_t insertGroup( sessionid_t sid, const group_t* group )
743 {
744 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
745 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
746
747 string sql;
748 sql = "INSERT INTO " + dbprefix + "_vpaccount_groups ( gname, gdesc ) VALUES (";
749 sql += "'" + string( addSlashes( group -> getGname( ) ) ) + "', ";
750 sql += "'" + string( addSlashes( group -> getDesc( ) ) ) + "' )";
751 if( mysql_query( mysql, sql.c_str( ) ) ){
752 fprintf( stderr, "%s\n", sql.c_str( ) );
753 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
754 return RES_DB_QUERY_ERROR;
755 }
756 return RES_OK;
757 }
758
759 /**
760 *
761 * ?違???若???????/span>
762 *
763 * @param
764 * @return
765 *
766 */
767 result_t updateGroup( sessionid_t sid, const group_t* group )
768 {
769 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
770 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
771
772 string sql;
773 sql = "UPDATE " + dbprefix + "_vpaccount_groups SET ";
774 sql += "gname='" + string( addSlashes( group -> getGname( ) ) ) + "', ";
775 sql += "gdesc='" + string( addSlashes( group -> getDesc( ) ) ) + "' ";
776 sql += "WHERE gid=" + string( unsignedIntToString( group -> getGID( ) ) );
777 if( mysql_query( mysql, sql.c_str( ) ) ){
778 fprintf( stderr, "%s\n", sql.c_str( ) );
779 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
780 return RES_DB_QUERY_ERROR;
781 }
782 return RES_OK;
783 }
784
785 /**
786 *
787 * ?違???若?????怨??
788 *
789 * @param
790 * @return
791 *
792 */
793 result_t getGroup( sessionid_t sid, groupid_t gid, const group_t** group )
794 {
795 int len;
796 static criteria c;
797 result_t res = getGroups( sid, &gid, 1, &c, group, &len );
798 if( len == 0 ) return RES_NO_SUCH_GROUP;
799 return res;
800 }
801
802 /**
803 *
804 * ?違???若?????怨??
805 *
806 * @param
807 * @return
808 *
809 */
810 result_t getGroups( sessionid_t sid, groupid_t* gids, int gidsLen, criteria_t* cri, const group_t** groups, int* groupsLen )
811 {
812 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
813 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
814
815 string sql;
816 MYSQL_RES* result;
817 MYSQL_ROW row;
818 group_t* dst = new group_t[ gidsLen ];
819
820 sql += "SELECT gid, gname, gdesc ";
821 sql += "FROM " + dbprefix + "_vpaccount_groups ";
822 sql += "WHERE gid=" + string( unsignedIntToString( gids[ 0 ] ) );
823 for( int i = 1; i < gidsLen; i++ ){
824 sql += " OR gid=" + string( unsignedIntToString( gids[ i ] ) );
825 }
826 sql += criteria2str( cri );
827 if( mysql_query( mysql, sql.c_str( ) ) ){
828 fprintf( stderr, "%s\n", sql.c_str( ) );
829 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
830 return RES_DB_QUERY_ERROR;
831 }
832 result = mysql_use_result( mysql ) ;
833 *groupsLen=0;
834 for( int i = 0; ( row = mysql_fetch_row(result) ) != 0 && i < gidsLen ; i++ ){
835 dst[ i ].setGID( atoi( row[ 0 ] ) );
836 dst[ i ].setGname( row[ 1 ] );
837 dst[ i ].setDesc( row[ 2 ] );
838 ( *groupsLen )++;
839 }
840 mysql_free_result( result );
841 *groups = dst;
842 return RES_OK;
843 }
844
845 /**
846 *
847 * ?≪?????若?炊┤???????
848 *
849 * @param
850 * @return
851 *
852 */
853 bool isModerator( sessionid_t sid, userid_t uid )
854 {
855 return RES_ERROR;
856 }
857
858 /**
859 *
860 * ???若??D??緇?
861 *
862 * @param uname ID????緇??????????若?吟?弱??
863 * @param uid ID??篁e?ャ??????紊??違?????ゃ?潟??/span>
864 * @return RES_ERROR | RES_OK
865 * @refer result_t
866 *
867 */
868 result_t getUid( const char* uname, userid_t* uid )
869 {
870 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
871 if( uname == NULL ) return RES_ERROR;
872
873 string sql;
874 string uname2 = addSlashes( uname );
875 sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + uname2 + "';";
876 if( mysql_query( mysql, sql.c_str( ) ) ){
877 fprintf( stderr, "%d %s\n", mysql_errno(mysql), mysql_error(mysql) );
878 return RES_DB_QUERY_ERROR;
879 }
880 MYSQL_RES* result = mysql_store_result( mysql ) ;
881 MYSQL_ROW row = mysql_fetch_row(result);
882 if( row ){
883 *uid = atoi( row[0] );
884 mysql_free_result( result );
885 return RES_OK;
886 }else{
887 mysql_free_result( result );
888 return RES_NO_SUCH_USER;
889 }
890 }
891
892 /**
893 *
894 * ?祉???激?с?潟??篏?????xoops_vpaccount_session???吾??莨若???? sessionid_t??session???????
895 *
896 * @param uid xoops_users??id
897 * @param remoteHost remote ip (host order)
898 * @param session sessionid_t???????????????????ゃ?潟?帥??
899 * @return RES_OK ????
900 * @return RES_DB_QUERY_ERROR DB????????筝?????????/span>
901 */
902 static result_t addSession( userid_t uid, unsigned long remoteHost, sessionid_t* session )
903 {
904 result_t ret;
905 string sql = "INSERT INTO " + dbprefix + "_vpaccount_session (uid,remote_host) values (" +
906 unsignedIntToString(uid) + "," + unsignedIntToString((unsigned int)remoteHost) + ")";
907 if ( 0 == mysql_query( mysql, sql.c_str() ) ){
908 *session = (int)mysql_insert_id(mysql);
909 ret = RES_OK;
910 }
911 else {
912 ret = RES_DB_QUERY_ERROR;
913 }
914 return ret;
915 }
916
917
918 /**
919 *
920 * ???違?ゃ?活?荐若???祉???激?с?割???
921 *
922 * @param uname ???違?ゃ?喝??
923 * @param passwd ???鴻???若??
924 * @param session sessionid_t???????????????????ゃ?潟?帥??
925 * @return RES_OK ???違?ゃ?恰??????session??essionid_t???吾??莨若??????
926 * @return RES_LOGIN_FAILURE uname?障????asswd???医幻
927 * @return RES_DB_QUERY_ERROR DB????????筝?????????/span>
928 *
929 */
930 result_t loginUser(const char* uname, const char* passwd, sessionid_t* session )
931 {
932 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
933
934 result_t ret;
935 string sql;
936
937 // uname, passwd -> uid
938 string escUname = addSlashes( uname );
939 string escPasswd = addSlashes( passwd );
940 sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + escUname + "' and pass=md5('" + escPasswd + "')";
941 if( 0 == mysql_query( mysql, sql.c_str( ) ) ){
942 MYSQL_RES* result = mysql_store_result( mysql );
943 if( result ){
944 MYSQL_ROW row = mysql_fetch_row(result);
945 if( row ){
946 userid_t uid = atoi(row[0]);
947 ret = addSession( uid, 0, session );
948 }else{
949 ret = RES_LOGIN_FAILURE;
950 }
951 mysql_free_result( result );
952 }else {
953 ret = RES_DB_QUERY_ERROR;
954 }
955 }else{
956 ret = RES_DB_QUERY_ERROR;
957 }
958
959 return ret;
960 }
961
962 /**
963 *
964 * ???違?≪???????祉???激?с?括?篋?
965 *
966 * @param sid session id
967 * @return ????
968 *
969 */
970 void logoutUser( sessionid_t sid )
971 {
972 result_t ret;
973 string sql;
974
975 sql = "DELETE FROM " + dbprefix + "_vpaccount_session WHERE sid=" + intToString((int)sid);
976 if ( 0 == mysql_query( mysql, sql.c_str() ) ){
977 if ( mysql_affected_rows(mysql) == 1 ){
978 // ???違?≪????????
979 }
980 else {
981 // sid???≦??/span>
982 }
983 }
984 else {
985 // DB????????筝?????????/span>
986 }
987 }
988
989 /**
990 *
991 * ?祉???激?с?潟?????.<br>
992 * XOOPS??ession???若????????蚊??????sess_id?????essionid??膈???????
993 * ?逸?session_t??篏?????????
994 * ???若?帥???若?鴻???祉???激?с?潟????違?????宴??荐??蚊????
995 *
996 * @param sessionid xoops??ession_id
997 * @param uid xoops_users??id
998 * @param remoteHost remote ip (host order)
999 * @param session sessionid_t???????????????????ゃ?潟?帥??
1000 * @return RES_OK
1001 * @return RES_ERROR
1002 * @return RES_DB_QUERY_ERROR
1003 *
1004 */
1005 result_t createSession( const char* sessionid, userid_t uid, unsigned long remoteHost, sessionid_t* session )
1006 {
1007 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1008
1009 result_t ret;
1010 string sql;
1011
1012 string escSessionid = addSlashes(sessionid);
1013 sql = "SELECT sess_id from " + dbprefix + "_session where sess_id='" + escSessionid + "'";
1014 if( 0 == mysql_query( mysql, sql.c_str( ) ) ){
1015 MYSQL_RES* result = mysql_store_result( mysql );
1016 if( result ){
1017 MYSQL_ROW row = mysql_fetch_row(result);
1018 if( row ){
1019 ret = addSession( uid, remoteHost, session );
1020 }else{
1021 ret = RES_ERROR;
1022 }
1023 mysql_free_result( result );
1024 }else {
1025 ret = RES_DB_QUERY_ERROR;
1026 }
1027 }else{
1028 ret = RES_DB_QUERY_ERROR;
1029 }
1030
1031 return ret;
1032 }
1033
1034 /**
1035 *
1036 * ?祉???激?с?潟???膣違??session_t?у??????.<br>
1037 *
1038 * @param sess_id
1039 * @param session
1040 * @return
1041 *
1042 */
1043 result_t getSession( sessionid_t sess_id, const session_t** ppsession )
1044 {
1045 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1046
1047 result_t ret;
1048 string sql;
1049
1050 sql = "SELECT sid, uid, unix_timestamp(timestamp), remote_host from " + dbprefix +
1051 "_vpaccount_session where sid=" + unsignedIntToString((unsigned int)sess_id);
1052 if( 0 == mysql_query( mysql, sql.c_str( ) ) ){
1053 MYSQL_RES* result = mysql_store_result( mysql );
1054 if( result ){
1055 MYSQL_ROW row = mysql_fetch_row(result);
1056 if( row ){
1057 session_t *p = new session[1];
1058 p->setSessionID(sess_id);
1059 p->setUserID(atoi(row[1]));
1060 p->setDate(atoi(row[2]));
1061 p->setRemoteHost(atoi(row[3]));
1062 *ppsession = p;
1063 ret = RES_OK;
1064 }else{
1065 ret = RES_NO_SUCH_SESSION;
1066 }
1067 mysql_free_result( result );
1068 }else {
1069 ret = RES_DB_QUERY_ERROR;
1070 }
1071 }else{
1072 ret = RES_DB_QUERY_ERROR;
1073 }
1074
1075 return ret;
1076 }
1077
1078 /**
1079 *
1080 * ?祉???激?с?潟???綵??с?????с????????.
1081 *
1082 * @param sid ???с??????????session
1083 * @return true 罩e?
1084 * @return false 筝?罩?/span>
1085 *
1086 */
1087 bool isValidSessionID( sessionid_t sid )
1088 {
1089 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1090
1091 string sql;
1092 string sidstr;
1093 char buf[ 12 ];
1094 snprintf( buf, 12, "%d", sid );
1095
1096 sql = "SELECT * FROM " + dbprefix + "_vpaccount_session WHERE sid=" + string( buf );
1097 if( mysql_query( mysql, sql.c_str( ) ) ){
1098 return false;
1099 }
1100 MYSQL_RES* result = mysql_store_result( mysql ) ;
1101 MYSQL_ROW row = mysql_fetch_row(result);
1102 if( row ){
1103 return true;
1104 }else{
1105 return false;
1106 }
1107 }
1108
1109 void freeResult( const account_t* ptr ){ delete[] ( account_t* )ptr; }
1110 void freeResult( const group_t* ptr ){ delete[] ( group_t* )ptr; }
1111 void freeResult( const session_t* ptr ){ delete[] ( session_t* )ptr; }
1112 void freeResult( const unsigned int* ptr ){ delete[] ( unsigned int* )ptr; }
1113
1114 static string errstr;
1115 const char* getLastErrorString()
1116 {
1117 return errstr.c_str( );
1118 }
1119
1120 void setLastErrorString( const char* str )
1121 {
1122 errstr = str;
1123 }

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