Develop and Download Open Source Software

Browse CVS Repository

Annotation of /xoonips/AL/commonal.cc

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


Revision 1.83 - (hide annotations) (download) (as text)
Fri Mar 11 20:00:28 2005 UTC (19 years, 1 month ago) by orrisroot
Branch: MAIN
Changes since 1.82: +5 -1 lines
File MIME type: text/x-c++src
- Autotoolized XooNiPs Abstract Layer projects.
- changelog.cc commonal.cc index.cc item.cc :
    included <time.h> header file for undefined data type 'time_t' error.

1 youi 1.1 /*
2     *
3 orrisroot 1.83 * $Revision: 1.82 $
4 youi 1.2 * $Log: commonal.cc,v $
5 orrisroot 1.83 * Revision 1.82 2005/03/11 07:11:30 tani
6     * itemid_t配列の長さ(*iidsLen)の初期化処理を追加.
7     *
8 tani 1.82 * Revision 1.81 2005/03/11 00:34:57 tani
9     * アイテムのアクセス権チェックにcertify_state追加.
10     *
11 tani 1.81 * Revision 1.80 2005/03/09 07:27:37 aga4096
12     * ・activate=0ならloginUserに失敗するよう修正.
13     *
14 aga4096 1.80 * Revision 1.79 2005/03/07 01:20:09 aga4096
15     * ・getItemCountGroupByIndexで未承認アイテム・インデックスを数えないよう修正.
16     *
17 aga4096 1.79 * Revision 1.78 2005/03/05 02:28:05 aga4096
18     * ・個人領域のインデックスが Private と表示されるよう修正.
19     *
20 aga4096 1.78 * Revision 1.77 2005/03/05 01:48:35 aga4096
21     * ・getItemCountGroupByIndexを作成.
22     *
23 aga4096 1.77 * Revision 1.76 2005/03/04 06:13:28 aga4096
24     * ・updateIndexで、同じ名前の兄弟があるか名前が空であるならエラーにした.
25     *
26 aga4096 1.76 * Revision 1.75 2005/03/03 10:13:00 aga4096
27     * ・isValidSessionでtimestampを更新するよう修正.
28     * ・sessionはisValidSessionしない限り1時間でタイムアウトするよう修正.
29     * ・loginUser, createSessionでタイムアウトしたsessionを削除するよう修正.
30     *
31 aga4096 1.75 * Revision 1.74 2005/02/26 05:11:31 tani
32     * getGroupItemID追加.
33     *
34 tani 1.74 * Revision 1.73 2005/02/25 07:41:35 tani
35     * getGroupItemID追加.
36     * item, indexのlimitフィールドを登録,更新処理に追加.
37     *
38 tani 1.73 * Revision 1.72 2005/02/25 01:03:42 tani
39     * dbtype==DBTYPE_SQLITEの時の処理を分岐.
40     *
41 tani 1.72 * Revision 1.71 2005/02/24 11:32:55 aga4096
42     * ・updateGroupでグループインデックスの名前を変更するよう修正.
43     *
44 aga4096 1.71 * Revision 1.70 2005/02/23 06:39:28 tani
45     * isGuestEnabled: 設定を読み込むテーブルを変更.
46     *
47 tani 1.70 * Revision 1.69 2005/02/22 02:39:30 tani
48     * public_item_target_user_all関数を追加.
49     * SQL中のpublic_item_target_user_allの比較式をpublic_item_target_user_all関数に置換.
50     * sessionテーブルのLEFT JOINの条件にsidのチェックを追加.
51     * DB問合せ処理の高速化.
52     *
53 tani 1.69 * Revision 1.68 2005/02/21 05:46:18 tani
54     * getItemCountを追加.
55     * dumpItemID, getItemsの問合せを高速化.
56     *
57 tani 1.68 * Revision 1.67 2005/02/19 02:06:11 tani
58     * 承認状態の権限チェックに作成者を追加.
59     *
60 tani 1.67 * Revision 1.66 2005/02/16 10:03:13 youi
61     * publication_year/month/mdayに対応.
62     *
63 youi 1.66 * Revision 1.65 2005/02/16 07:37:17 youi
64     * insertItem, updateItem, getItems: publication_dateに対応.
65     *
66 youi 1.65 * Revision 1.64 2005/02/15 02:35:47 youi
67     * SQLINTEGERからSQLLENへ型変更.
68     *
69 youi 1.64 * Revision 1.63 2005/02/10 02:33:16 aga
70     * ・zipCreateをコメントアウトしていたのを戻した.
71     *
72 aga 1.63 * Revision 1.62 2005/02/09 11:11:52 youi
73     * deleteItemにアイテムに関係するエントリの削除処理を追加.
74     *
75 youi 1.62 * Revision 1.61 2005/02/09 07:23:50 aga
76     * ・URL to My Personal Archive をDB・ALから消した.
77     *
78 aga 1.61 * Revision 1.60 2005/02/09 02:14:15 aga
79     * ・initializeDB()にdbtype引数を追加(SQLite用).
80     *
81 aga 1.60 * Revision 1.59 2005/02/08 07:15:02 youi
82     * pubmedパース処理:
83     *
84 youi 1.59 * Revision 1.58 2005/02/08 06:40:51 youi
85     * pubmedComplete:ジャーナルの完全なタイトルを取得してpubmed_tにセット.
86     *
87 youi 1.58 * Revision 1.57 2005/02/03 12:04:58 youi
88     * getOwnPublicItemIDを定義.
89     * binder_item_linkのテーブル名を修正.
90     *
91 youi 1.57 * Revision 1.56 2005/01/29 09:49:22 youi
92     * syslog_printf: デバッグメッセージ出力関数を定義した.
93     * getCertifyPermission: チェック用のsqlを定義した.
94     * SQLINTEGER->SQLLENへ型を変更した.
95     * getItemPermission: モデレータであるか?の判断条件を修正.
96     *
97 youi 1.56 * Revision 1.55 2005/01/28 07:01:38 youi
98     * getItemIDByIndexID: 対象となるアイテムの条件見直し.
99     * SQLAllocHandle失敗時のメッセージを追加.
100     *
101 youi 1.55 * Revision 1.54 2005/01/28 00:36:58 aga
102     * ・freeStringで落ちることがあるのを修正.
103     *
104 aga 1.54 * Revision 1.53 2005/01/27 08:30:35 youi
105     * getIndexIDByItemIDを定義した.
106     *
107 youi 1.53 * Revision 1.52 2005/01/25 06:46:50 aga
108     * ・Bindersを含むindexはdeleteIndex不可.
109     * ・getItemsがエラーを出すことがあるのを修正.
110     *
111 aga 1.52 * Revision 1.51 2005/01/24 10:50:29 youi
112     * freeItemType,getItemTypes関数を追加した.
113     *
114 youi 1.51 * Revision 1.50 2005/01/24 01:54:38 youi
115     * 引数の型修飾を変更.
116     * dumpItemID, getItemIDByBinderID, getItemIDByIndexID
117     * 関数追加
118     * getPrivateItemID, getUncertifiedLink
119     *
120 youi 1.50 * Revision 1.49 2005/01/22 09:30:58 youi
121     * setLastErrorStringの宣言を追加した.
122     *
123 youi 1.49 * Revision 1.48 2005/01/22 04:18:22 aga
124     * ・loginUser, insertAccount内ではmd5()を行わないよう修正.
125     *
126 aga 1.48 * Revision 1.47 2005/01/22 02:41:14 aga
127     * ・amazon補完を作成.
128     *
129 aga 1.47 * Revision 1.46 2005/01/21 01:36:11 youi
130     * pubmed補完機能を追加した.
131     *
132 youi 1.46 * Revision 1.45 2005/01/19 10:07:53 aga
133     * ・ゲストユーザ向けの修正.
134     *
135 aga 1.45 * Revision 1.44 2005/01/19 06:01:59 youi
136     * 関数追加
137     * getConfigValue
138     * setConfigValue
139     * getChangeLogs
140     * insertChangeLog
141     * getItemIDByBinderID
142     * registerBinderItem
143     * unregisterBinderItem
144     * getIndexPermission
145     * freeString
146     * freeChangeLog
147     * 引数にcriteria_tを追加
148     * getItemIDByIndexID
149     * 引数の順序を変更
150     * getCertifyState
151     * setCertifyState
152     * getCertifyPermission
153     * sessionID2UID,querySimple,queryGetUnsignedIntの利用
154     * insertItemの内部でPrivateIndexへ登録を行なう
155     * getItems: getItemPermissionを使った読み込み権限チェック.
156     *
157 youi 1.44 * Revision 1.43 2005/01/19 01:42:15 aga
158     * ・x_xnpaccount_indexのgid,uidが0にならないよう修正.
159     *
160 aga 1.43 * Revision 1.42 2005/01/19 00:51:29 aga
161     * ・insertIndexでx_xnpaccount_index.index_idがおかしいのを修正.
162     *
163 aga 1.42 * Revision 1.41 2005/01/19 00:06:51 aga
164     * ・updateIndexで、同じ名前の兄弟があるか名前が空であるならエラーにした.
165     * ・createSessionで、uidがPlatformユーザでないかactivateされていないならエラーにした.
166     *
167 aga 1.41 * Revision 1.40 2005/01/17 00:15:05 aga
168     * ・deleteIndex, updateIndexに失敗することがあるのを修正.
169     *
170 aga 1.40 * Revision 1.39 2005/01/15 05:38:10 youi
171     * insertAccount: 文字列バッファのサイズ調整など.
172     * updateAccount: 文字列バッファのサイズ調整など.
173     * アイテム管理関数を定義した.
174     * insertItem, getItem, getItems, dumpItemID, updateItem, deleteItemなど.
175     * freeGID, freeUID: 引数の型を修正.
176     *
177 youi 1.39 * Revision 1.38 2005/01/15 00:39:16 aga
178     * ・x_xnpaccount_item_basicの構造を変更.
179     *
180 aga 1.38 * Revision 1.37 2005/01/14 10:36:59 aga
181     * ・index関係の処理を追加.
182     * ・insertAccountでprivate indexを作成するよう修正.
183     * ・insertGroupでgroup index を作成するよう修正.
184     *
185 aga 1.37 * Revision 1.36 2005/01/13 04:19:22 aga
186     * ・VPをXNPに変換.
187     *
188 aga 1.36 * Revision 1.35 2005/01/06 07:20:17 youi
189     * WIN32定義時のインクルードの追加.
190     * MySQL APIに関するヘッダファイルを削除.
191     * deleteAccount: 所属するPlatformグループからの削除を内蔵した.
192     * insertAccount: ユーザ登録と同時にデフォルトPlatformグループへ登録する.
193     * deleteMember: デフォルトPlatformグループからの削除を禁止する.
194     * deleteMemberNoLimitの定義.
195     *
196 youi 1.35 * Revision 1.34 2004/12/28 04:38:14 aga
197     * ・logoutUser()の修正.
198     *
199 aga 1.34 * Revision 1.33 2004/12/27 05:56:23 youi
200     * odbcDiagString: STMT以外のハンドルも処理するように変更した.
201     * syslogメッセージの処理を追加した.
202     *
203 youi 1.33 * Revision 1.32 2004/12/25 09:46:47 youi
204     * MySQL+MyODBCで動作するように修正した.
205     *
206 youi 1.32 * Revision 1.31 2004/12/21 11:42:59 youi
207     * コメントの引数,戻り値の説明などを追加.
208     *
209 youi 1.31 * Revision 1.30 2004/12/18 10:24:54 youi
210     * IMPORT_MYSQLDLLを定義したとき,MYSQLのDLLを動的リンクするプロトタイプ宣言が
211     * 有効になるように修正した.
212     *
213 youi 1.30 * Revision 1.29 2004/12/18 01:12:29 youi
214     * freeResultの関数名をfree<データ型>に変更した.
215     *
216 youi 1.29 * Revision 1.28 2004/12/14 12:02:08 youi
217     * __WIN__を定義したときはwindowsのdll作成に必要な処理を行なう.
218     * USE_SYSLOGを定義したときはsyslogdへメッセージを出力する.
219     * getAccounts: uidsLenが0のときの処理を追加した.
220     *
221 youi 1.28 * Revision 1.27 2004/12/06 11:34:47 aga
222     * ・uninitializeDB()を追加.
223     *
224 aga 1.27 * Revision 1.26 2004/12/06 10:17:36 youi
225     * mysql_use_resultの取得結果を残さず取り出すため,
226     * while( row = mysql_fetch_row(result) );を挿入.
227     *
228 youi 1.26 * Revision 1.25 2004/12/06 07:24:33 youi
229     * insertAccount, insertGroup:
230     * 新規追加した情報に対応するユーザID,グループIDを第三引数に書き込む.
231     *
232 youi 1.25 * Revision 1.24 2004/12/06 01:45:50 aga
233     * ・コメントつけ.
234     * ・開放忘れ修正.
235     *
236 aga 1.24 * Revision 1.23 2004/12/04 09:21:10 aga
237 aga 1.36 * ・xnp_config → xnpaccount_config.
238 aga 1.24 *
239 aga 1.23 * Revision 1.22 2004/12/03 07:17:21 youi
240     * isModeratorでアクセスするデータベーステーブル名を修正.
241     *
242 youi 1.22 * Revision 1.21 2004/12/01 10:28:58 youi
243     * DBカラム名の変更に伴う修正
244     * institute -> division
245     * organizaion -> company_name
246     *
247 aga 1.61 * Revis1.20 2004/12/01 04:37:04 youi
248 youi 1.21 * freeResult: unsigned int* を int* へ修正.
249     * コメント部に関数の説明を追記.
250     *
251 youi 1.20 * Revision 1.19 2004/11/30 06:40:11 youi
252     * 関数を追加(gidExists, uidExists)
253     * getGroupCountを定義.
254     * getGroupsByUidを定義.
255     * isGroupAdminを修正.
256     * dumpGroupAdminsを定義.
257     * deleteMemberを定義.
258     * insertMemberを定義.
259     * getMembersを定義.
260     * isModeratorを定義.
261     *
262 youi 1.19 * Revision 1.18 2004/11/30 05:46:32 aga
263     * ・sessionからremoteHostを削除.
264     *
265 aga 1.18 * Revision 1.17 2004/11/27 09:35:49 youi
266     * isActivatedを定義.
267     * activateを定義.
268     * dumpUidを定義.
269     *
270 youi 1.17 * Revision 1.16 2004/11/27 06:29:29 youi
271     * getAccountCountを定義.
272     * dumpGidsを定義.
273     * insertGroup, deleteGroup, updateGroupを定義.
274     * getGroup, getGroupsを定義.
275     * データベース初期前の呼出に対し,RES_DB_NOT_INITIALIZEDを返す処理を各関数に追加
276     * (未対応の関数が残っている)
277     *
278 youi 1.16 * Revision 1.15 2004/11/27 02:22:22 aga
279     * ・initializeDB前にaddSlashes()を呼ぶと落ちるのを修正.
280     *
281 aga 1.15 * Revision 1.14 2004/11/27 01:07:31 youi
282     * criteria2str: LIMITとORDER BYの順番を入れ替えた.
283     *
284 youi 1.14 * Revision 1.13 2004/11/27 00:35:39 youi
285     * getAccountsを定義.
286     * getAccountを修正,内部でgetAccountsを呼び出す.
287     * criteria2strを定義.
288     *
289 youi 1.13 * Revision 1.12 2004/11/26 09:45:28 youi
290     * getAccountを定義.
291     *
292 youi 1.12 * Revision 1.11 2004/11/26 08:16:26 aga
293     * ・getSession, loginUser, createSession, freeResult(const session_t*) 修正.
294     *
295 aga 1.11 * Revision 1.10 2004/11/26 07:57:42 youi
296     * updateAccount, deleteAccountを定義.
297     * mysql_query失敗時はstderrへエラーコードとエラーメッセージを出力.
298     *
299 youi 1.10 * Revision 1.9 2004/11/26 07:38:02 aga
300     * ・FAILUE -> FAILURE.
301     *
302 aga 1.9 * Revision 1.8 2004/11/26 06:36:55 aga
303     * ・createSession, getSession を作成.
304     *
305 aga 1.8 * Revision 1.7 2004/11/26 04:51:47 youi
306     * dbprefixを定義した.
307     * insertAccountを定義した.
308     * isValidSessionIDを定義した.
309     *
310 youi 1.7 * Revision 1.6 2004/11/26 04:35:55 aga
311     * ・loginUser(), logoutUser()を作成.
312     *
313 aga 1.6 * Revision 1.5 2004/11/26 01:08:25 aga
314     * ・addSlashes()作成.
315     *
316 aga 1.5 * Revision 1.4 2004/11/25 12:14:29 youi
317     * getUidの処理を定義した.
318     *
319 youi 1.4 * Revision 1.3 2004/11/25 11:13:59 youi
320     * getLastErrorString/setLastErrorStringを定義.
321     *
322 youi 1.3 * Revision 1.2 2004/11/25 08:55:19 youi
323     * 引数の型を修正.
324     * freeResultを追加.
325     *
326 youi 1.2 * Revision 1.1 2004/11/25 05:14:58 youi
327     * initial version
328     *
329 youi 1.1 *
330     */
331 youi 1.35 #ifdef WIN32
332     #include <windows.h>
333 youi 1.28 #endif
334    
335     #ifdef USE_SYSLOG
336     #include <syslog.h>
337     #endif
338    
339 youi 1.1 #include <stdio.h>
340 aga 1.6 #include <stdlib.h>
341 youi 1.1 #include <string.h>
342 youi 1.3 #include <string>
343 aga 1.27 #include <assert.h>
344 orrisroot 1.83 #include <time.h>
345 youi 1.32 #include <sql.h>
346     #include <sqlext.h>
347 youi 1.46 #include <libxml/xmlreader.h>
348    
349 youi 1.7 using namespace std;
350 youi 1.1
351     #include "common.h"
352     #include "account.h"
353     #include "group.h"
354     #include "session.h"
355 youi 1.39 #include "item.h"
356     #include "itemtype.h"
357 youi 1.1 #include "criteria.h"
358     #include "commonal.h"
359 aga 1.37 #include "item.h"
360     #include "index.h"
361 youi 1.44 #include "changelog.h"
362 youi 1.46 #include "pubmed.h"
363 aga 1.47 #include "amazonbook.h"
364 youi 1.1
365 youi 1.32 static string dbprefix; //!< XOOPSデータベーステーブルのPREFIX
366 aga 1.60 static dbtype_t dbtype; //!< MySQL/SQLite
367 youi 1.32
368     static SQLHANDLE henv = NULL;
369     static SQLHANDLE hdbc = NULL;
370     static SQLHANDLE hstmt = NULL;
371    
372 youi 1.58 static bool processEsummary(xmlTextReaderPtr reader, pubmed_t* p);
373     static bool processEsearch(xmlTextReaderPtr reader, pubmed_t* p, int* DocID );
374 youi 1.46 static void processEfetch(xmlTextReaderPtr reader, pubmed_t* p);
375     static int streamPubmedFile(const char *filename, pubmed_t* p);
376 aga 1.37 static result_t insertIndexInternal( sessionid_t sid, index_t *index, indexid_t *xid );
377 youi 1.33 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode );
378 youi 1.35 static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid );
379 youi 1.56 static result_t getXoopsModuleConfigValue( const char *module, const char *key, char **value );
380 youi 1.49 static void setLastErrorString( const char* str );
381 aga4096 1.76 static result_t checkTitleConflict( sessionid_t sid, indexid_t parentIndexID, const char *title, bool *conflict );
382 youi 1.32
383 youi 1.56 void syslog_printf( char* format, ... )
384     {
385     #ifdef USE_SYSLOG
386     va_list ap;
387     va_start(ap, format);
388     openlog( "commonal", LOG_ODELAY, LOG_USER );
389     vsyslog( LOG_DEBUG, format, ap );
390 tani 1.72 #endif
391 youi 1.56 }
392    
393 tani 1.69 /**
394     *
395     * public_item_target_userの設定値が'all'ならtrueをかえす
396     * 設定値の取得に失敗した場合,'all'以外の場合はfalseをかえす
397     *
398     */
399     static bool public_item_target_user_all( )
400     {
401     char* value = 0;
402     bool public_item_target_user_all = false;
403     if( getConfigValue( XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY, &value ) == RES_OK ){
404     public_item_target_user_all = ( strcmp( value, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL ) == 0 );
405     freeString( value );
406     }
407     return public_item_target_user_all;
408     }
409    
410 youi 1.56 static result_t countResultRows( const char* sql, SQLLEN* count )
411 youi 1.32 {
412     result_t ret = RES_ERROR;
413     SQLRETURN sqlcode;
414     SQLHANDLE hstmt = NULL;
415     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
416     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql, strlen( sql ) ) ) == SQL_SUCCESS ){
417     *count = 0;
418     while( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ) ( *count )++;
419     ret = RES_OK;
420     }else{
421     string s( "SQLExecDirect in countResultRows " );
422 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
423 youi 1.32 s += "sql=";
424     s += string( sql );
425     setLastErrorString( s.c_str( ) );
426     ret = RES_DB_QUERY_ERROR;
427     }
428     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
429     }
430     return ret;
431     }
432    
433 youi 1.44
434 youi 1.39 /**
435     *
436 youi 1.44 * インデックス登録,アイテム更新を行なったときの承認状態の初期値を,
437     * システム設定にしたがって返します.
438     *
439 youi 1.39 */
440 youi 1.44 static certify_t getInitialCertifyStateFromConfig( )
441 youi 1.39 {
442 youi 1.44 char* certify_item_val;
443     certify_t ret = index::NOT_CERTIFIED;
444    
445     if( getConfigValue( XNP_CONFIG_CERTIFY_ITEM_KEY, &certify_item_val ) == RES_OK ){
446     if( strcmp( certify_item_val, XNP_CONFIG_CERTIFY_ITEM_AUTO ) == 0 ){
447     //certify automatic
448     ret = index::CERTIFIED;
449     }else if( strcmp( certify_item_val, XNP_CONFIG_CERTIFY_ITEM_ON ) == 0 ){
450     //certify by moderator or group admin
451     ret = index::CERTIFY_REQUIRED;
452     }
453 tani 1.72 syslog_printf( "\ngetInitialCertifyStateFromConfig certify_item_val=%s", certify_item_val );
454 youi 1.44 freeString( certify_item_val );
455 youi 1.39 }
456 youi 1.44 return ret;
457 youi 1.39 }
458    
459     /**
460     *
461     * セッションに対応付けられたユーザが,PlatformユーザとしてActivateさ
462     * れているかを返す
463     *
464     * @param sid セッションID
465     * @return true Activateされている
466     * @return false Activateされている,またはエラー
467     *
468     */
469     static bool isActivatedBySession( sessionid_t sid )
470     {
471     const session_t* session;
472     if( getSession( sid, &session ) == RES_OK ){
473     userid_t sess_uid = session -> getUID( );
474     freeSession( session );
475     return isActivated( sid, sess_uid );
476     }
477     return false;
478     }
479    
480     /**
481     *
482     * セッションに対応付けられたユーザが,モデレータであるか?
483     *
484     *
485     * @param sid セッションID
486     * @return true モデレータ
487     * @return false モデレータでない,またはエラー
488     *
489     */
490     static bool isModeratorBySession( sessionid_t sid )
491     {
492     const session_t* session;
493     if( getSession( sid, &session ) == RES_OK ){
494     userid_t sess_uid = session -> getUID( );
495     freeSession( session );
496     return isModerator( sid, sess_uid );
497     }
498     return false;
499     }
500    
501 aga 1.45
502    
503    
504 aga 1.37 /** SQLを実行する。結果は捨てる。
505     * @param sql sql
506     * @return result_t
507     */
508     static result_t querySimple( const char *functionName, string &sql ){
509     result_t ret = RES_ERROR;
510     SQLRETURN sqlcode;
511     SQLHANDLE hstmt = NULL;
512     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
513     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){
514     ret = RES_OK;
515     }else{
516     string s( "SQLExecDirect in querySimple " );
517     s += functionName;
518     s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
519     s += "sql=";
520     s += sql;
521     setLastErrorString( s.c_str( ) );
522     ret = RES_DB_QUERY_ERROR;
523     }
524     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
525     }
526     else {
527 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in querySimple " );
528     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
529     setLastErrorString( s.c_str( ) );
530 aga 1.37 ret = RES_ERROR;
531     }
532     return ret;
533     }
534    
535     /** SQLを実行し、1行目の最初の整数値(NULLなら0とみなす)のみ受け取る。
536     * @param sql sql
537     * @param u 整数値を受け取る変数。
538     * @return result_t
539     */
540     static result_t queryGetUnsignedInt( const char *functionName, string &sql, unsigned int *u ){
541     result_t ret = RES_ERROR;
542     SQLRETURN sqlcode;
543     SQLHANDLE hstmt = NULL;
544 youi 1.53
545 aga 1.37 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
546     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){
547     SQLUINTEGER sInt = 0;
548 youi 1.56 SQLLEN len = 0;
549 aga 1.37 SQLBindCol( hstmt, 1, SQL_C_ULONG, &sInt, 0, &len );
550     if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
551     if ( len == SQL_NULL_DATA )
552     sInt = 0;
553     *u = sInt;
554     ret = RES_OK;
555     }else{
556     string s( "SQLFetch in queryGetUnsignedInt " );
557     s += functionName;
558 youi 1.44 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
559 aga 1.37 setLastErrorString( s.c_str( ) );
560     ret = RES_ERROR;
561     }
562     }else{
563     string s( "SQLExecDirect in queryGetUnsignedInt " );
564     s += functionName;
565     s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
566     s += "sql=";
567     s += sql;
568     setLastErrorString( s.c_str( ) );
569     ret = RES_DB_QUERY_ERROR;
570     }
571     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
572     }
573     else {
574 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in queryGetUnsignedInt " );
575     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
576     setLastErrorString( s.c_str( ) );
577 aga 1.37 ret = RES_ERROR;
578     }
579     return ret;
580     }
581    
582 youi 1.32 /**
583     *
584     * 文字列コピー.
585     * 指定文字数をコピーし,バッファの最後をNULL終端する.
586     * ( dstのサイズ >= len + 1 )であること
587     *
588     */
589     static char* strncpy2( char* dst, const char* src, int len )
590     {
591     strncpy( dst, src, len );
592     dst[ len ] = '\0';
593 youi 1.56 syslog_printf( "\nstrncpy2 '%s'\n", dst );
594 youi 1.32 return dst;
595     }
596    
597     /**
598     *
599     * SQLの実行結果からエラー文字列を生成する
600     *
601     * @param hstmt SQL文のハンドル
602     * @param sqlcode SQLExecDirect,SQLExecuteの戻り値
603     * @return エラー文字列
604     */
605 youi 1.33 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode )
606 youi 1.32 {
607     string s;
608     if( sqlcode == SQL_ERROR || sqlcode == SQL_SUCCESS_WITH_INFO ){
609     SQLCHAR SQLState[6];
610     SQLINTEGER NativeError;
611     SQLCHAR MessageText[ 1024 ];
612     SQLSMALLINT TextLength;
613 youi 1.33 SQLGetDiagRec( HandleType, hstmt, 1, SQLState, &NativeError, MessageText, 1024, &TextLength );
614 youi 1.32
615     s += string( (char*)MessageText );
616     s += " SQLSTATE=";
617     s += string( (char*)SQLState );
618    
619     }
620     s += " sqlcode=";
621     s += intToString( sqlcode );
622     return s;
623     }
624    
625     /**
626     *
627     * 指定カラムの値を取り出してその文字列を返す
628     *
629     */
630     string getResultCol( SQLHANDLE hstmt, int col )
631     {
632     string s;
633 youi 1.64 SQLRETURN sqlcode;
634     SQLCHAR BinaryPtr[5000];
635     SQLLEN BinaryLenOrInd;
636     SQLINTEGER NumBytes;
637 youi 1.32
638 tani 1.72 syslog_printf( "getResultCol" );
639 youi 1.32 while ( ( sqlcode = SQLGetData(hstmt, col, SQL_C_CHAR, BinaryPtr, sizeof(BinaryPtr),
640     &BinaryLenOrInd)) != SQL_NO_DATA) {
641 tani 1.72 syslog_printf( "SQLGetData BinaryLenOrInd=%d", BinaryLenOrInd );
642 youi 1.32 NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ? 5000 : BinaryLenOrInd;
643 tani 1.72 if( NumBytes <= 0 ) break;
644     else if( NumBytes > 0 ){
645 youi 1.33 s += string( (char*)BinaryPtr, NumBytes );
646     }
647 youi 1.32 }
648 tani 1.72 syslog_printf( "getResultCol returns %s", s.c_str() );
649 youi 1.32 return s;
650     }
651 youi 1.7
652 aga 1.5
653     /**
654     *
655 youi 1.32 * クォートなどを\記号でエスケープする
656 aga 1.5 *
657 youi 1.32 * @param str addslashesすべき文字列。NULL指定不可。
658     * @return 変換後の文字列
659 aga 1.5 */
660     string addSlashes( const char *str )
661     {
662 youi 1.32 if ( hdbc == NULL ){
663 aga 1.15 string s;
664     return s;
665 youi 1.32 }else{
666     string s( str );
667     return s;
668     }
669    
670     int len = strlen(str) * 3;
671     char* dst = new char[ len ];
672     const char* from = str;
673     char* to = dst;
674     while( *from != '\0' ){
675     switch( *from ){
676     case '\'':
677     case '\"':
678     case ';':
679     *to = '\\'; to++;
680     break;
681     }
682     *to = *from; to++;
683     from++;
684     }
685     *to = '\0';
686     string s( dst );
687     delete[] dst;
688 aga 1.5 return s;
689     }
690    
691 aga 1.45 /** Xoops Module の設定を調べる
692     * @param module モジュールのdirname
693     * @param key 設定のkey
694     * @param value 設定を返す変数。
695     * @return
696     */
697     static result_t getXoopsModuleConfigValue( const char *module, const char *key, char **value ){
698     SQLRETURN sqlcode;
699     SQLHANDLE hstmt = NULL;
700     result_t result = RES_ERROR;
701    
702     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
703     string sql = "SELECT conf_value "
704     " from " + dbprefix + "_config as tc, " + dbprefix + "_modules as tm "
705     " where tm.mid=tc.conf_modid and tm.dirname = ? and tc.conf_name = ? ";
706     sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
707 youi 1.56 SQLLEN cbModule = SQL_NTS, cbKey = SQL_NTS;
708 aga 1.45 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, strlen(module), 0, (SQLCHAR *)module, 0, &cbModule );
709     SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, strlen(key), 0, (SQLCHAR *)key, 0, &cbKey );
710     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){
711     if ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
712     string s = getResultCol( hstmt, 1 );
713     *value = new char[s.length()+1];
714     strcpy( *value, s.c_str() );
715     result = RES_OK;
716     }
717     else if ( sqlcode == SQL_NO_DATA ){
718 aga 1.54 *value = 0;
719 aga 1.45 result = RES_OK;
720     }
721     else {
722     string s( "SQLFetch in getXoopsModuleConfig " );
723     s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
724     s += "sql=";
725     s += sql;
726     setLastErrorString( s.c_str( ) );
727     result = RES_ERROR;
728     }
729     }else{
730     string s( "SQLExecDirect in getXoopsModuleConfig " );
731     s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
732     s += "sql=";
733     s += sql;
734     setLastErrorString( s.c_str( ) );
735     result = RES_DB_QUERY_ERROR;
736     }
737     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
738     }
739     else {
740 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getXoopsModuleConfig " );
741     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
742     setLastErrorString( s.c_str( ) );
743 aga 1.45 result = RES_ERROR;
744     }
745     return result;
746     }
747    
748     /** ゲストユーザがXooNiPsのPublicなアイテムを見ることができるかどうかを返す。
749     */
750     static bool isGuestEnabled(){
751     char *value = 0;
752 tani 1.70 result_t result = getConfigValue( XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY, &value );
753 aga 1.45 if ( result != RES_OK )
754     return false;
755     if ( value == 0 )
756     return false;
757 tani 1.70 bool enabled = ( strcmp( value, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL ) == 0 );
758 aga 1.45 freeString( value );
759     return enabled;
760     }
761    
762     /** sidからuidを得る。
763     * @param sid session id
764     * @param uid uidを受け取る変数
765     * @return RES_OK
766     * sidは有効なsessionidである。この場合*uidには有効なuidが入る。
767     * あるいは、公開アイテムを非XooNiPsユーザに公開 かつsidがsession::SID_GUEST(=0)である。この場合、*uidにはaccount::UID_GUEST(=0)が入る。
768     * @return その他 エラー
769     */
770     static result_t sessionID2UID( sessionid_t sid, userid_t *uid ){
771     if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
772    
773     if ( sid == session::SID_GUEST ){
774     if ( isGuestEnabled() ){
775     *uid = account::UID_GUEST;
776     return RES_OK;
777     }
778     return RES_NO_SUCH_SESSION;
779     }
780     else {
781     string sql = "SELECT uid FROM " + dbprefix + "_xnpaccount_session WHERE sid=" + unsignedIntToString(sid);
782 tani 1.72 syslog_printf( "sql=%s", sql.c_str() );
783 aga 1.45 return queryGetUnsignedInt( "sessionID2UID", sql, uid );
784     }
785     }
786    
787    
788    
789 youi 1.13 /**
790     *
791 youi 1.19 * gidの存在をチェック.
792     * DBのアクセス失敗などもfalseとなる.
793     *
794     * @param gid チェックしたいGID
795     * @return true 存在する
796     * @return false 存在しない
797     *
798     */
799     static bool gidExists( groupid_t gid )
800     {
801     string sql;
802 youi 1.32 SQLRETURN sqlcode;
803     SQLHANDLE hstmt = NULL;
804 youi 1.19
805 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) != SQL_SUCCESS ) {
806 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in gidExists" );
807     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
808     setLastErrorString( s.c_str( ) );
809 youi 1.32 return false;
810     }
811    
812 aga 1.36 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_groups ";
813 youi 1.19 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
814 youi 1.32 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) != SQL_SUCCESS ){
815     setLastErrorString( "SQLExecDirect in gidExists" );
816     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
817 youi 1.19 return false;
818     }
819 youi 1.32
820     if( ( sqlcode = SQLFetch( hstmt ) ) != SQL_SUCCESS ){
821     setLastErrorString( "SQLFetch in gidExists" );
822     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
823 youi 1.19 return false;
824     }
825 youi 1.32
826     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
827 youi 1.19 return true;
828     }
829    
830    
831     /**
832     *
833 youi 1.20 * Platformユーザ情報にuidが存在するかをチェック.
834 youi 1.19 * DBのアクセス失敗などもfalseとなる.
835     *
836     * @param uid チェックしたいUID
837     * @return true 存在する
838     * @return false 存在しない
839     *
840     */
841     static bool uidExists( userid_t uid )
842     {
843 youi 1.32 bool ret = false;
844 youi 1.19 string sql;
845 youi 1.32 SQLRETURN sqlcode;
846 youi 1.19
847 aga 1.36 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_users ";
848 youi 1.19 sql += "WHERE uid=" + string( unsignedIntToString( uid ) );
849 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
850     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
851     if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
852     ret = true;
853     }else{
854     string s( "SQLFetch in uidExists ");
855 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
856 youi 1.32 s += string( ", sql=" ) + string( sql );
857     setLastErrorString( s.c_str( ) );
858     ret = false;
859     }
860     }else{
861     string s( "SQLExecDirect in uidExists ");
862 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
863 youi 1.32 s += string( ", sql=" ) + string( sql );
864     setLastErrorString( s.c_str( ) );
865     ret = false;
866     }
867     }else{
868     string s( "SQLAllocHandle in uidExists ");
869 youi 1.35 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
870 youi 1.32 setLastErrorString( s.c_str( ) );
871     ret = false;
872 youi 1.19 }
873 youi 1.32 return ret;
874 youi 1.19 }
875    
876    
877     /**
878     *
879 youi 1.13 * criteria を SQLに変換する
880     *
881     *
882     *
883     */
884     string criteria2str( criteria* cri )
885     {
886     string sql;
887    
888     const orderby* odrby = cri -> headOrderBy( );
889     if( odrby != 0 ){
890     sql += " ORDER BY " + string( odrby -> getColumn( ) );
891     sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
892     while( ( odrby = cri -> nextOrderBy( ) ) != 0 ){
893     sql += ", " + string( odrby -> getColumn( ) );
894     sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
895     }
896 youi 1.14 }
897    
898     if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){
899     sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) )
900     + ", " + string( intToString( cri -> getLimitRows( ) ) );
901 youi 1.13 }
902     return sql;
903     }
904 youi 1.1
905 youi 1.32
906 youi 1.1 /**
907     *
908     * データベースの初期化
909     *
910 youi 1.32 * @param dsn DSN
911 youi 1.1 * @param user データベースにアクセスするユーザ名
912     * @param password 上記ユーザのパスワード
913 youi 1.32 * @param dbname ダミー
914 youi 1.1 * @param prefix XOOPSデータベーステーブルのPREFIX
915 aga 1.60 * @param dbtype DBTYPE_MYSQL or DBTYPE_SQLITE
916 youi 1.31 * @return RES_OK
917     * @return RES_DB_INITIALIZE_ERROR
918     * @return RES_DB_CONNECT_ERROR
919 youi 1.1 * @refer result_t
920     */
921 aga 1.60 result_t initializeDB( const char* dsn, const char* user, const char* password, const char* dbname, const char* prefix, dbtype_t type )
922 youi 1.1 {
923 youi 1.32 SQLRETURN sqlcode;
924    
925 youi 1.1 // 既に接続中なら、一旦切断
926 youi 1.32 if ( hdbc != NULL )
927     SQLDisconnect( hdbc );
928 youi 1.1
929 youi 1.7 dbprefix = prefix;
930 aga 1.60 dbtype = type;
931 youi 1.7
932 youi 1.32 // 初期化と接続
933     // if( SQLAllocEnv( &henv ) != SQL_SUCCESS ) {
934 youi 1.56 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) ) != SQL_SUCCESS ) {
935 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_ENV,...) in initializeDB" );
936     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
937     setLastErrorString( s.c_str( ) );
938 tani 1.72 syslog_printf( "initializeDB %s", getLastErrorString( ) );
939 youi 1.32 return RES_DB_INITIALIZE_ERROR;
940     }
941     //ODBC Ver.3 として振舞うように属性を設定
942     SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
943 aga 1.27
944 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ) ) != SQL_SUCCESS ) {
945 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_DBC,...) in initializeDB" );
946     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
947     setLastErrorString( s.c_str( ) );
948 tani 1.72 syslog_printf( "initializeDB %s", getLastErrorString( ) );
949 youi 1.1 return RES_DB_INITIALIZE_ERROR;
950     }
951 youi 1.32 //ログインに5秒以上要したらタイムアウトする設定
952     SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
953 youi 1.33
954 youi 1.32 if ( ( sqlcode = SQLConnect( hdbc, (SQLCHAR*)dsn, strlen( dsn ), (SQLCHAR*)user, strlen( user ), (SQLCHAR*)password, strlen( password ) ) ) != SQL_SUCCESS ){
955 youi 1.33 string s( "SQLConnect in initializeDB " );
956     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
957     setLastErrorString( s.c_str( ) );
958 tani 1.72 syslog_printf( "initializeDB %s", getLastErrorString( ) );
959 youi 1.1 return RES_DB_CONNECT_ERROR;
960 aga 1.27 }
961 tani 1.72 syslog_printf( "initializeDB succeed" );
962 aga 1.27 return RES_OK;
963     }
964    
965     /**
966     *
967     * DB接続があれば、それを開放する。
968     *
969     * @param なし
970     * @return RES_OK
971     */
972     result_t uninitializeDB()
973     {
974 youi 1.32 if ( hdbc != NULL ){
975     SQLDisconnect( hdbc );
976     hdbc = NULL;
977 youi 1.1 }
978 youi 1.2 return RES_OK;
979 youi 1.1 }
980    
981     /**
982     *
983     * Platformユーザ承認状態取得
984     *
985 youi 1.31 * @param sid セッションID
986     * @param uid 状態を取得したいユーザのUID
987     * @return true 承認済み
988     * @return false 未承認
989 youi 1.1 *
990     */
991 youi 1.2 bool isActivated( sessionid_t sid, userid_t uid )
992 youi 1.1 {
993 youi 1.32 if( hdbc == NULL ) return false;
994 youi 1.17 if( !isValidSessionID( sid ) ) return false;
995    
996 youi 1.32 bool ret = false;
997 youi 1.17 string sql;
998 youi 1.32 SQLRETURN sqlcode;
999     SQLHANDLE hstmt = NULL;
1000 youi 1.17
1001 aga 1.36 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_users ";
1002 youi 1.17 sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) );
1003 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1004     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1005     if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1006     ret = true;
1007     }else{
1008     string s( "SQLFetch in isActivated " );
1009 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1010 youi 1.32 s += ", sql=" + sql;
1011     setLastErrorString( s.c_str() );
1012     ret = false;
1013     }
1014     }else{
1015     string s( "SQLExecDirect in isActivated " );
1016 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1017 youi 1.32 s += ", sql=" + sql;
1018     setLastErrorString( s.c_str() );
1019     ret = false;
1020     }
1021     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1022     }else{
1023 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isActivated" );
1024     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1025     setLastErrorString( s.c_str( ) );
1026 youi 1.32 ret = false;
1027 youi 1.17 }
1028 youi 1.32 return ret;
1029 youi 1.1 }
1030    
1031     /**
1032     *
1033     * Platformユーザ承認状態変更
1034     *
1035 youi 1.31 * @param sid セッションID
1036     * @param uid 変更したいユーザのUID
1037     * @param activate 承認(true) / 未承認(false)の指定
1038     * @return RES_OK
1039     * @return RES_DB_QUERY_ERROR
1040     * @return RES_NO_SUCH_USER
1041 youi 1.1 */
1042 youi 1.2 result_t activate( sessionid_t sid, userid_t uid, bool activate )
1043 youi 1.1 {
1044 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1045 youi 1.17 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1046    
1047     string sql;
1048 youi 1.32 SQLRETURN sqlcode;
1049     result_t ret = RES_ERROR;
1050 youi 1.17
1051 aga 1.36 sql = "UPDATE " + dbprefix + "_xnpaccount_users ";
1052 youi 1.17 sql += "SET activate=" + string( activate ? "1" : "0" );
1053     sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1054 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1055     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1056 youi 1.64 SQLLEN count = 0;
1057 youi 1.32 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1058     ret = RES_OK;
1059     }else{
1060     string s( "SQLRowCount in activate ");
1061 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1062 youi 1.32 s += string( ", sql=" ) + string( sql );
1063     setLastErrorString( s.c_str( ) );
1064     ret = RES_NO_SUCH_USER;
1065     }
1066     }else{
1067     string s( "SQLExecDirect in activate " );
1068 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1069 youi 1.32 s += ", sql=";
1070     s += string( sql );
1071     setLastErrorString( s.c_str( ) );
1072     ret = RES_DB_QUERY_ERROR;
1073     }
1074     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1075     }else{
1076 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in activate" );
1077     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1078     setLastErrorString( s.c_str( ) );
1079 youi 1.32 ret = RES_ERROR;
1080 youi 1.17 }
1081 youi 1.32 return ret;
1082 youi 1.1 }
1083    
1084     /**
1085     *
1086 youi 1.31 * アカウント数を取得する.
1087 youi 1.1 *
1088 youi 1.31 * @param sid セッションID
1089     * @return アカウント数
1090 youi 1.1 *
1091     */
1092 youi 1.2 int getAccountCount( sessionid_t sid )
1093 youi 1.1 {
1094 youi 1.32 if( hdbc == NULL ) return 0;
1095 youi 1.16 if( !isValidSessionID( sid ) ) return 0;
1096    
1097     int ret = 0;
1098     string sql;
1099 youi 1.32 SQLRETURN sqlcode;
1100     SQLHANDLE hstmt = NULL;
1101 youi 1.16
1102     //アカウント数を求める
1103 aga 1.36 sql = "SELECT COUNT(*) FROM " + dbprefix + "_xnpaccount_users ";
1104 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1105     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1106     SQLUINTEGER count = 0;
1107 youi 1.56 SQLLEN len = 0;
1108 youi 1.32 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1109     if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1110     ret = count;
1111     }else {
1112     string s( "SQLFetch in getAccountCount sql=" );
1113     s += string( sql );
1114     setLastErrorString( s.c_str( ) );
1115     ret = 0;
1116     }
1117     }else{
1118     setLastErrorString( "SQLExecDirect in getAccountCount" );
1119     ret = 0;
1120     }
1121     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1122 youi 1.16 }else{
1123 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccountCount" );
1124     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1125     setLastErrorString( s.c_str( ) );
1126 youi 1.32 ret = 0;
1127 youi 1.16 }
1128     return ret;
1129 youi 1.1 }
1130    
1131     /**
1132     *
1133     * アカウント削除
1134 youi 1.35 * グループからの削除とユーザ情報の削除を行ないます.
1135 youi 1.1 *
1136     * @param
1137 youi 1.20 * @return RES_OK
1138 youi 1.35 * @return RES_ERROR
1139 youi 1.31 * @return RES_DB_NOT_INITIALIZED
1140 youi 1.20 * @return RES_NO_SUCH_SESSION
1141     * @return RES_DB_QUERY_ERROR
1142 youi 1.1 *
1143     */
1144 youi 1.2 result_t deleteAccount( sessionid_t sid, userid_t uid )
1145 youi 1.1 {
1146 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1147 youi 1.10 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1148 youi 1.32
1149     result_t ret1 = RES_ERROR, ret2 = RES_ERROR;
1150 youi 1.35 criteria_t c;
1151 youi 1.32 string sql;
1152 youi 1.35 groupid_t* gids;
1153     int gidsLen;
1154 youi 1.32 SQLRETURN sqlcode;
1155     SQLHANDLE hstmt = NULL;
1156 youi 1.10
1157 youi 1.35 /*
1158     1. delete user from default platform group
1159     2. delete user profile from xoops_users
1160 aga 1.36 3. delete platform user from xnpaccount_users
1161 youi 1.35 */
1162    
1163     //1. delete user from platform groups
1164     c.clearAll();
1165     if( getGroupsByUid( sid, uid, &c, &gids, &gidsLen ) == RES_OK ){
1166     for( int i = 0; i < gidsLen; i++ )
1167     deleteMemberNoLimit( sid, gids[ i ], uid );
1168     freeGID( gids );
1169     }
1170    
1171     //2. delete user profile from xoops_users
1172 youi 1.10 sql = "DELETE FROM " + dbprefix + "_users ";
1173     sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
1174 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1175     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1176 youi 1.64 SQLLEN count = 0;
1177 youi 1.32 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1178     ret1 = RES_OK;
1179     }else{
1180     string s( "SQLRowCount in deleteAccount" );
1181 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1182 youi 1.32 s += string( ", sql=" ) + string( sql );
1183     setLastErrorString( s.c_str( ) );
1184     ret1 = RES_NO_SUCH_USER;
1185     }
1186     }else{
1187     string s( "SQLExecDirect in deleteAccount" );
1188 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1189 youi 1.32 s += ", sql=";
1190     s += string( sql );
1191     setLastErrorString( s.c_str( ) );
1192     ret1 = RES_DB_QUERY_ERROR;
1193     }
1194     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1195     }else{
1196 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
1197     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1198     setLastErrorString( s.c_str( ) );
1199 youi 1.32 ret1 = RES_ERROR;
1200 youi 1.10 }
1201    
1202 aga 1.36 //3. delete platform user from xnpaccount_users
1203     sql = "DELETE FROM " + dbprefix + "_xnpaccount_users ";
1204 youi 1.10 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
1205 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1206     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1207 youi 1.64 SQLLEN count = 0;
1208 youi 1.32 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1209     ret2 = RES_OK;
1210     }else{
1211     string s( "SQLRowCount in deleteAccount" );
1212 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1213 youi 1.32 s += string( ", sql=" ) + string( sql );
1214     setLastErrorString( s.c_str( ) );
1215     ret2 = RES_NO_SUCH_USER;
1216     }
1217     }else{
1218     string s( "SQLExecDirect in deleteAccount" );
1219 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1220 youi 1.32 s += ", sql=";
1221     s += string( sql );
1222     setLastErrorString( s.c_str( ) );
1223     ret2 = RES_DB_QUERY_ERROR;
1224     }
1225     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1226     }else{
1227 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
1228     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1229     setLastErrorString( s.c_str( ) );
1230 youi 1.32 ret2 = RES_ERROR;
1231 youi 1.10 }
1232    
1233 youi 1.32 //一方でもエラーならエラーを返す
1234     return ret1 != RES_OK ? ret1 : ret2;
1235 youi 1.1 }
1236    
1237     /**
1238     *
1239     * アカウント情報取得
1240     *
1241 youi 1.13 * @param sid セッションID
1242     * @param uid 取得したいユーザのUID
1243     * @param acc 取得したアカウント情報(account_t)のポインタを書き込む引数
1244 youi 1.20 * @return RES_OK
1245 youi 1.31 * @return RES_DB_NOT_INITIALIZED
1246 youi 1.20 * @return RES_NO_SUCH_USER
1247     * @return RES_NO_SUCH_SESSION
1248     * @return RES_DB_QUERY_ERROR
1249 youi 1.1 *
1250     */
1251 youi 1.12 result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc )
1252 youi 1.1 {
1253 youi 1.13 int len;
1254     static criteria c;
1255     result_t res = getAccounts( sid, &uid, 1, &c, acc, &len );
1256     if( len == 0 ) return RES_NO_SUCH_USER;
1257     return res;
1258     }
1259    
1260     /**
1261     *
1262     * アカウント情報取得
1263     *
1264     * @param sid セッションID
1265     * @param uids 取得したいユーザのUIDの配列
1266     * @param uidsLen uids配列の要素数
1267     * @param cri 結果の範囲指定,ソート条件指定
1268     * @param accounts 検索結果の配列のポインタを書き込む引数
1269     * @param accountsLen 検索結果の数(配列*accountsの要素数)
1270 youi 1.31 * @return RES_OK
1271     * @return RES_DB_NOT_INITIALIZED
1272     * @return RES_NO_SUCH_SESSION
1273 youi 1.20 * @return RES_DB_QUERY_ERROR
1274 youi 1.13 *
1275     */
1276     result_t getAccounts( sessionid_t sid, const userid_t* uids, int uidsLen, criteria_t* cri, const account_t** accounts, int* accountsLen )
1277     {
1278 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1279 youi 1.12 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1280 youi 1.28 if( uidsLen <= 0 ){
1281     *accounts = new account_t[ 0 ];
1282     *accountsLen = 0;
1283 tani 1.72 syslog_printf( "getAccounts succeed len=0" );
1284 youi 1.28 return RES_OK;
1285     }
1286 youi 1.12
1287 tani 1.72 syslog_printf( "begin of getAccounts" );
1288 youi 1.32 result_t ret = RES_ERROR;
1289     SQLRETURN sqlcode;
1290     SQLHANDLE hstmt = NULL;
1291 youi 1.12 string sql;
1292 youi 1.13 account_t* dst = new account_t[ uidsLen ];
1293 youi 1.12
1294 tani 1.73 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.notice_mail, u2.notice_mail_since, u2.private_index_id, u2.private_item_number_limit, u2.private_index_number_limit, u2.private_item_storage_limit ";
1295 aga 1.36 sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_xnpaccount_users AS u2 ";
1296 youi 1.28 sql += "WHERE u1.uid = u2.uid ";
1297     if( uidsLen > 0 ){
1298 tani 1.72 syslog_printf( "set uid[%d] value=%d to ...", 0, uids[0] );
1299 youi 1.28 sql += "AND ( u1.uid=" + string( unsignedIntToString( uids[ 0 ] ) );
1300     for( int i = 1; i < uidsLen; i++ ){
1301 tani 1.72 syslog_printf( "set uid[%d] value=%d to ...", i, uids[i] );
1302 youi 1.28 sql += " OR u1.uid=" + string( unsignedIntToString( uids[ i ] ) );
1303     }
1304     sql += " ) ";
1305 youi 1.12 }
1306 youi 1.13 sql += criteria2str( cri );
1307 tani 1.72 syslog_printf( "sql=%s", sql.c_str() );
1308 youi 1.32
1309     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1310 tani 1.72 syslog_printf( "SQLAllocHandle" );
1311 youi 1.32 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1312 tani 1.72 syslog_printf( "SQLExecDirect" );
1313 tani 1.73 SQLLEN cbUid = 0, cbStorageLimit = 0;
1314 youi 1.32 userid_t uid = 0;
1315 tani 1.73 SQLDOUBLE storage_limit = 0;
1316     SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &cbUid );
1317     SQLBindCol( hstmt, 45, SQL_C_DOUBLE, &storage_limit, 0, &cbStorageLimit );
1318 tani 1.72 syslog_printf( "SQLBindCol" );
1319 youi 1.32 *accountsLen=0;
1320     for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < uidsLen ; i++ ){
1321 tani 1.72 syslog_printf( "SQLFetch" );
1322 youi 1.32 dst[ i ].setUID( uid );
1323     dst[ i ].setName( getResultCol( hstmt, 2 ).c_str() );
1324     dst[ i ].setUname( getResultCol( hstmt, 3 ).c_str() );
1325     dst[ i ].setEmail( getResultCol( hstmt, 4 ).c_str() );
1326     dst[ i ].setURL( getResultCol( hstmt, 5 ).c_str() );
1327     dst[ i ].setUserAvatar( getResultCol( hstmt, 6 ).c_str() );
1328     dst[ i ].setUserRegdate( atoi( getResultCol( hstmt, 7 ).c_str() ) );
1329     dst[ i ].setUserIcq( getResultCol( hstmt, 8 ).c_str() );
1330     dst[ i ].setUserFrom( getResultCol( hstmt, 9 ).c_str() );
1331     dst[ i ].setUserSig( getResultCol( hstmt, 10 ).c_str() );
1332     dst[ i ].setUserViewemail( atoi( getResultCol( hstmt, 11 ).c_str() ));
1333     dst[ i ].setActkey( getResultCol( hstmt, 12 ).c_str() );
1334     dst[ i ].setUserAim( getResultCol( hstmt, 13 ).c_str() );
1335     dst[ i ].setUserYim( getResultCol( hstmt, 14 ).c_str() );
1336     dst[ i ].setUserMsnm( getResultCol( hstmt, 15 ).c_str() );
1337     dst[ i ].setPass( getResultCol( hstmt, 16 ).c_str() );
1338     dst[ i ].setPosts( atoi( getResultCol( hstmt, 17 ).c_str() ));
1339     dst[ i ].setAttachsig( atoi( getResultCol( hstmt, 18 ).c_str() ));
1340     dst[ i ].setRank( atoi( getResultCol( hstmt, 19 ).c_str() ));
1341     dst[ i ].setLevel( atoi( getResultCol( hstmt, 20 ).c_str() ));
1342     dst[ i ].setTheme( getResultCol( hstmt, 21 ).c_str() );
1343     dst[ i ].setTimezoneOffset( atof( getResultCol( hstmt, 22 ).c_str() ) );
1344     dst[ i ].setLastLogin( atoi( getResultCol( hstmt, 23 ).c_str() ));
1345     dst[ i ].setUmode( getResultCol( hstmt, 24 ).c_str() );
1346     dst[ i ].setUorder( atoi( getResultCol( hstmt, 25 ).c_str() ));
1347     dst[ i ].setNotifyMethod( atoi( getResultCol( hstmt, 26 ).c_str() ));
1348     dst[ i ].setNotifyMode( atoi( getResultCol( hstmt, 27 ).c_str() ));
1349     dst[ i ].setUserOcc( getResultCol( hstmt, 28 ).c_str() );
1350     dst[ i ].setBio( getResultCol( hstmt, 29 ).c_str() );
1351     dst[ i ].setUserIntrest( getResultCol( hstmt, 30 ).c_str() );
1352     dst[ i ].setUserMailok( atoi( getResultCol( hstmt, 31 ).c_str() ));
1353     dst[ i ].setActivate( atoi( getResultCol( hstmt, 32 ).c_str() ));
1354     dst[ i ].setAddress( getResultCol( hstmt, 33 ).c_str() );
1355     dst[ i ].setDivision( getResultCol( hstmt, 34 ).c_str() );
1356     dst[ i ].setTel( getResultCol( hstmt, 35 ).c_str() );
1357     dst[ i ].setCompanyName( getResultCol( hstmt, 36 ).c_str() );
1358     dst[ i ].setCountry( getResultCol( hstmt, 37 ).c_str() );
1359     dst[ i ].setZipcode( getResultCol( hstmt, 38 ).c_str() );
1360     dst[ i ].setFax( getResultCol( hstmt, 39 ).c_str() );
1361 aga 1.61 dst[ i ].setNoticeMail( atoi( getResultCol( hstmt, 40 ).c_str() ));
1362     dst[ i ].setNoticeMailSince( atoi( getResultCol( hstmt, 41 ).c_str() ));
1363     dst[ i ].setPrivateIndexID( atoi( getResultCol( hstmt, 42 ).c_str() ));
1364 tani 1.73 dst[ i ].setItemNumberLimit( atoi( getResultCol( hstmt, 43 ).c_str() ));
1365     dst[ i ].setIndexNumberLimit( atoi( getResultCol( hstmt, 44 ).c_str() ));
1366     dst[ i ].setItemStorageLimit( storage_limit );
1367 youi 1.32 ( *accountsLen )++;
1368     }
1369     *accounts = dst;
1370 tani 1.72 syslog_printf( "getAccounts succeed" );
1371 youi 1.32 ret = RES_OK;
1372     }else{
1373 youi 1.33 string s( "SQLExecDirect in getAccounts" );
1374     s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1375     s += string( ", sql=" ) + string( sql );
1376     setLastErrorString( s.c_str( ) );
1377 tani 1.72 syslog_printf( "getAccounts %s", getLastErrorString( ) );
1378 youi 1.32 ret = RES_DB_QUERY_ERROR;
1379     }
1380     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1381     }else{
1382 youi 1.33 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" );
1383     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1384     setLastErrorString( s.c_str( ) );
1385 tani 1.72 syslog_printf( "getAccounts %s", getLastErrorString( ) );
1386 youi 1.32 ret = RES_DB_QUERY_ERROR;
1387 youi 1.12 }
1388 youi 1.32 return ret;
1389 youi 1.1 }
1390    
1391     /**
1392     *
1393 youi 1.25 * アカウント登録.
1394 youi 1.35 *
1395 youi 1.25 * ユーザ情報をデータベースに登録します.
1396 youi 1.35 * 登録したユーザ情報に対応するユーザIDをuidに格納します.
1397 youi 1.1 *
1398 youi 1.7 * @param sid セッション
1399 youi 1.10 * @param account 登録するアカウント情報
1400 youi 1.25 * @param uid 登録したアカウント情報に対応するユーザID
1401 youi 1.20 * @return RES_OK
1402     * @return RES_NO_SUCH_SESSION
1403     * @return RES_DB_QUERY_ERROR
1404 youi 1.31 * @return RES_DB_NOT_INITIALIZED
1405 youi 1.1 *
1406     */
1407 youi 1.25 result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid )
1408 youi 1.1 {
1409 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1410 youi 1.10 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1411    
1412 youi 1.7 string sql;
1413     string tmp;
1414 youi 1.32 SQLRETURN sqlcode;
1415     result_t ret = RES_ERROR;
1416 youi 1.7
1417 youi 1.35 /*
1418     1. insert user profile into xoops_users
1419 aga 1.36 2. insert platform user profile into xnpaccount_users
1420 youi 1.35 3. add user to default platform group
1421 aga 1.37 4. create private index
1422     5. update account set private_index_id=...
1423 youi 1.35 */
1424    
1425     //1.xoopsのユーザテーブルに書き込む
1426 youi 1.39 SQLCHAR uname[ACCOUNT_UNAME_LEN+1], name[ACCOUNT_NAME_LEN+1], email[ACCOUNT_EMAIL_LEN+1], url[ACCOUNT_URL_LEN+1], user_avatar[ACCOUNT_USER_AVATAR_LEN+1], user_icq[ACCOUNT_USER_ICQ_LEN+1], user_from[ACCOUNT_USER_FROM_LEN+1], user_sig[ACCOUNT_USER_SIG_LEN+1], actkey[ACCOUNT_ACTKEY_LEN+1], user_aim[ACCOUNT_USER_AIM_LEN+1], user_yim[ACCOUNT_USER_YIM_LEN+1], user_msnm[ACCOUNT_USER_MSNM_LEN+1], pass[ACCOUNT_PASS_LEN+1], theme[ACCOUNT_THEME_LEN+1], umode[ACCOUNT_UMODE_LEN+1], user_occ[ACCOUNT_USER_OCC_LEN+1], bio[ACCOUNT_BIO_LEN+1], user_intrest[ACCOUNT_USER_INTREST_LEN+1];
1427 youi 1.32 SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1428     SQLDOUBLE timezone_offset;
1429    
1430 youi 1.56 SQLLEN 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;
1431     SQLLEN 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;
1432 youi 1.32
1433     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1434     string sql;
1435 aga 1.48 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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
1436 youi 1.32 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1437     if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1438     SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1439     SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1440     SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1441     SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1442     SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1443     SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1444     SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1445     SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1446     SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1447     SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1448     SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1449     SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1450     SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1451     SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1452     SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1453     SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1454     SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1455     SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1456     SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1457     SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1458     SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1459     SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1460     SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1461     SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1462     SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1463     SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1464     SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1465     SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1466     SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1467     SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1468    
1469     strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1470     strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1471     strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1472     strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1473     strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1474     user_regdate = time( NULL );
1475     strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1476     strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1477     strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1478     user_viewemail = account -> getUserViewemail( );
1479     strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1480     strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1481     strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1482     strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1483     strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1484     posts = account -> getPosts( );
1485     attachsig = account -> getAttachsig( );
1486     rank = account -> getRank( );
1487     level = account -> getLevel( );
1488     strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1489     timezone_offset = account -> getTimezoneOffset( );
1490     last_login = 0;
1491     strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1492     uorder = account -> getUorder( );
1493     notify_method = account -> getNotifyMethod( );
1494     notify_mode = account -> getNotifyMode( );
1495     strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1496     strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1497     strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1498     user_mailok = account -> getUserMailok( );
1499    
1500     if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1501 youi 1.64 SQLLEN count = 0;
1502 youi 1.32 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1503     //ユーザIDを取得する
1504 tani 1.72 if( dbtype == DBTYPE_MYSQL ){
1505     sql = "SELECT LAST_INSERT_ID()";
1506     }else if( dbtype == DBTYPE_SQLITE ){
1507     sql = "SELECT LAST_INSERT_ROWID()";
1508     }
1509 youi 1.44 ret = queryGetUnsignedInt( "insertAccount", sql, (unsigned int*)uid );
1510 youi 1.32 }else{
1511     string s( "SQLRowCount in insertAccount sql=" );
1512     s += string( sql );
1513     setLastErrorString( s.c_str( ) );
1514     ret = RES_DB_QUERY_ERROR;
1515     }
1516     }else{
1517     string s( "SQLExecute in insertAccount " );
1518 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1519 youi 1.32 setLastErrorString( s.c_str( ) );
1520     ret = RES_DB_QUERY_ERROR;
1521     }
1522     }else{
1523     string s( "SQLPrepare in insertAccount " );
1524 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1525 youi 1.32 setLastErrorString( s.c_str( ) );
1526     ret = RES_ERROR;
1527     }
1528     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1529     }else{
1530 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1531     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1532     setLastErrorString( s.c_str( ) );
1533 youi 1.32 ret = RES_ERROR;
1534 youi 1.7 }
1535    
1536 youi 1.35 if( ret == RES_OK ){
1537 aga 1.36 //2.xnpaccountのユーザテーブルに残りの情報を書き込む
1538 youi 1.35 SQLUINTEGER activate;
1539 aga 1.36 SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1];
1540     SQLCHAR division[XNP_ACCOUNT_DIVISION_LEN+1];
1541     SQLCHAR tel[XNP_ACCOUNT_TEL_LEN+1];
1542     SQLCHAR company_name[XNP_ACCOUNT_COMPANY_NAME_LEN+1];
1543     SQLCHAR country[XNP_ACCOUNT_COUNTRY_LEN+1];
1544     SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1];
1545     SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1];
1546 aga 1.61 SQLLEN cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS;
1547 tani 1.73 SQLLEN cbUid = 0, cbActivate = 0, cbNotice_mail = 0, cbNotice_mail_since = 0, cbItem_number_limit = 0, cbIndex_number_limit = 0, cbItem_storage_limit = 0;
1548 youi 1.35 SQLUINTEGER notice_mail;
1549     SQLUINTEGER notice_mail_since;
1550 tani 1.73 SQLINTEGER item_number_limit;
1551     SQLINTEGER index_number_limit;
1552     SQLDOUBLE item_storage_limit;
1553    
1554 youi 1.35 if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1555     string sql;
1556 tani 1.73 sql = "INSERT INTO " + dbprefix + "_xnpaccount_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, notice_mail, notice_mail_since, private_item_number_limit, private_index_number_limit, private_item_storage_limit) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";
1557 youi 1.35 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1558     if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1559     SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, uid, 0, &cbUid);
1560     SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate);
1561 aga 1.36 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1562     SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1563     SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1564     SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1565     SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1566     SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1567     SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1568 aga 1.61 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &cbNotice_mail);
1569     SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &cbNotice_mail_since);
1570 tani 1.73 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &item_number_limit, 0, &cbItem_number_limit);
1571     SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &index_number_limit, 0, &cbIndex_number_limit);
1572     SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &item_storage_limit, 0, &cbItem_storage_limit);
1573 youi 1.32
1574 youi 1.35 activate = account -> getActivate() ? 1 : 0;
1575 aga 1.36 strncpy2( (char*)address, account -> getAddress(), XNP_ACCOUNT_ADDRESS_LEN );
1576     strncpy2( (char*)division, account -> getDivision(), XNP_ACCOUNT_DIVISION_LEN );
1577     strncpy2( (char*)tel, account -> getTel(), XNP_ACCOUNT_TEL_LEN );
1578     strncpy2( (char*)company_name, account -> getCompanyName(), XNP_ACCOUNT_COMPANY_NAME_LEN );
1579     strncpy2( (char*)country, account -> getCountry(), XNP_ACCOUNT_COUNTRY_LEN );
1580     strncpy2( (char*)zipcode, account -> getZipcode(), XNP_ACCOUNT_ZIPCODE_LEN );
1581     strncpy2( (char*)fax, account -> getFax(), XNP_ACCOUNT_FAX_LEN );
1582 youi 1.35 notice_mail = account -> getNoticeMail( );
1583 tani 1.81 notice_mail_since = time( NULL );
1584 tani 1.73 item_number_limit = account -> getItemNumberLimit( );
1585     index_number_limit = account -> getIndexNumberLimit( );
1586     item_storage_limit = account -> getItemStorageLimit( );
1587 youi 1.32
1588 youi 1.35 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1589 youi 1.64 SQLLEN count = 0;
1590 youi 1.35 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1591     ret = RES_OK;
1592     if( ret == RES_OK ){
1593     //3.add new user to default group(not a group admin)
1594 youi 1.39 ret = insertMember( sid, group_t::GID_DEFAULT, *uid, false );
1595 youi 1.35 }else{
1596     //xoops_usersへinsertしたレコードを削除する
1597     sql = "DELETE FROM " + dbprefix + "_users where uid=";
1598     sql += unsignedIntToString( *uid );
1599     SQLHANDLE hstmt2 = NULL;
1600     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1601     SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1602     SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1603     }
1604     setLastErrorString( "insertMember in insertAccount" );
1605     ret = RES_DB_QUERY_ERROR;
1606     }
1607     }else{
1608     string s( "SQLRowCount in insertAccount sql=" );
1609     s += string( sql );
1610     setLastErrorString( s.c_str( ) );
1611     ret = RES_DB_QUERY_ERROR;
1612     }
1613 youi 1.32 }else{
1614 youi 1.35 string s( "SQLExecute in insertAccount " );
1615     s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1616 youi 1.32 setLastErrorString( s.c_str( ) );
1617     ret = RES_DB_QUERY_ERROR;
1618     }
1619     }else{
1620 youi 1.35 //xoops_usersへinsertしたレコードを削除する
1621     sql = "DELETE FROM " + dbprefix + "_users where uid=";
1622     sql += unsignedIntToString( *uid );
1623     SQLHANDLE hstmt2 = NULL;
1624     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1625     SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1626     SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1627     }
1628     string s( "SQLExecDirect in insertAccount sql=" );
1629     s += string( sql );
1630 youi 1.32 setLastErrorString( s.c_str( ) );
1631     ret = RES_DB_QUERY_ERROR;
1632     }
1633 youi 1.35 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1634 youi 1.32 }else{
1635 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1636     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1637     setLastErrorString( s.c_str( ) );
1638 youi 1.35 ret = RES_ERROR;
1639 youi 1.32 }
1640 youi 1.7 }
1641 aga 1.37
1642     if ( ret == RES_OK ){
1643     //4.private indexを作成
1644    
1645     // private index用のsort_number生成
1646     string sql = "select min(sort_number) from " +
1647     dbprefix + "_xnpaccount_index where parent_index_id=" + unsignedIntToString(item::IID_ROOT) +
1648     " and open_level=" + unsignedIntToString(index::OL_PRIVATE);
1649     unsigned int sortNumber;
1650     ret = queryGetUnsignedInt( "insertAccount", sql, &sortNumber );
1651     sortNumber--;
1652     if ( ret == RES_OK ){
1653     // private index作成
1654     index_t index;
1655     index.setItemTypeID(item::ITID_INDEX);
1656     index.setContributorUID(*uid);
1657     index.setParentIndexID(item::IID_ROOT);
1658     index.setOwnerUID(*uid);
1659     index.setOpenLevel(index::OL_PRIVATE);
1660     index.setSortNumber(sortNumber);
1661     index.setTitle(account->getUname());
1662     indexid_t privateXID;
1663     ret = insertIndexInternal( sid, &index, &privateXID );
1664     if ( ret == RES_OK ){
1665     // xnpaccuont_usersのprivate_index_idの書き換え
1666     sql = "UPDATE " + dbprefix + "_xnpaccount_users SET private_index_id="
1667     + unsignedIntToString(privateXID) + " WHERE uid=" + unsignedIntToString(*uid);
1668     ret = querySimple( "insertAccount", sql );
1669     }
1670     }
1671     }
1672    
1673 youi 1.32 return ret;
1674 youi 1.1 }
1675    
1676     /**
1677     *
1678 youi 1.20 * アカウント情報を変更する.
1679     *
1680 youi 1.1 *
1681 youi 1.20 * @param sid セッションID
1682     * @param account 変更したいアカウント情報
1683     * @return RES_OK
1684 youi 1.31 * @return RES_DB_NOT_INITIALIZED
1685 youi 1.20 * @return RES_NO_SUCH_SESSION
1686     * @return RES_DB_QUERY_ERROR
1687     * @return RES_NO_SUCH_USER
1688 youi 1.31 * @return RES_ERROR
1689 youi 1.1 *
1690     */
1691 youi 1.2 result_t updateAccount( sessionid_t sid, const account_t* account )
1692 youi 1.1 {
1693 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1694 youi 1.20 if( account == NULL ) return RES_ERROR;
1695 youi 1.10 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1696 youi 1.20 if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;
1697 youi 1.39
1698 youi 1.32 SQLRETURN sqlcode;
1699     result_t ret = RES_ERROR;
1700 youi 1.39 SQLHANDLE hstmt = NULL;
1701 youi 1.10
1702     //xoopsのユーザテーブルに書き込む
1703 youi 1.39 SQLCHAR uname[ACCOUNT_UNAME_LEN+1], name[ACCOUNT_NAME_LEN+1], email[ACCOUNT_EMAIL_LEN+1], url[ACCOUNT_URL_LEN+1], user_avatar[ACCOUNT_USER_AVATAR_LEN+1], user_icq[ACCOUNT_USER_ICQ_LEN+1], user_from[ACCOUNT_USER_FROM_LEN+1], user_sig[ACCOUNT_USER_SIG_LEN+1], actkey[ACCOUNT_ACTKEY_LEN+1], user_aim[ACCOUNT_USER_AIM_LEN+1], user_yim[ACCOUNT_USER_YIM_LEN+1], user_msnm[ACCOUNT_USER_MSNM_LEN+1], pass[ACCOUNT_PASS_LEN+1], theme[ACCOUNT_THEME_LEN+1], umode[ACCOUNT_UMODE_LEN+1], user_occ[ACCOUNT_USER_OCC_LEN+1], bio[ACCOUNT_BIO_LEN+1], user_intrest[ACCOUNT_USER_INTREST_LEN+1];
1704 youi 1.32 SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1705     SQLDOUBLE timezone_offset;
1706    
1707 youi 1.56 SQLLEN 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;
1708     SQLLEN 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 = 0, cbUser_mailok = 0, cbTimezone_offset = 0;
1709 youi 1.32
1710     SQLUINTEGER activate;
1711 aga 1.36 SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1];
1712     SQLCHAR division[XNP_ACCOUNT_DIVISION_LEN+1];
1713     SQLCHAR tel[XNP_ACCOUNT_TEL_LEN+1];
1714     SQLCHAR company_name[XNP_ACCOUNT_COMPANY_NAME_LEN+1];
1715     SQLCHAR country[XNP_ACCOUNT_COUNTRY_LEN+1];
1716     SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1];
1717     SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1];
1718 aga 1.61 SQLLEN cbActivate = 0, cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS;
1719 youi 1.39 SQLUINTEGER notice_mail, notice_mail_since;
1720 youi 1.56 SQLLEN cbNotice_mail = 0, cbNotice_mail_since = 0;
1721 youi 1.32
1722     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1723     string sql;
1724    
1725     sql = "UPDATE " + dbprefix + "_users SET ";
1726 youi 1.39 sql += "uname=?";
1727     sql += ", name=?";
1728     sql += ", email=?";
1729     sql += ", url=?";
1730     sql += ", user_avatar=?";
1731     sql += ", user_regdate=?";
1732     sql += ", user_icq=?";
1733     sql += ", user_from=?";
1734     sql += ", user_sig=?";
1735     sql += ", user_viewemail=?";
1736     sql += ", actkey=?";
1737     sql += ", user_aim=?";
1738     sql += ", user_yim=?";
1739     sql += ", user_msnm=?";
1740     sql += ", pass=?";
1741     sql += ", posts=?";
1742     sql += ", attachsig=?";
1743     sql += ", rank=?";
1744     sql += ", level=?";
1745     sql += ", theme=?";
1746     sql += ", timezone_offset=?";
1747     sql += ", last_login=?";
1748     sql += ", umode=?";
1749     sql += ", uorder=?";
1750     sql += ", notify_method=?";
1751     sql += ", notify_mode=?";
1752     sql += ", user_occ=?";
1753     sql += ", bio=?";
1754     sql += ", user_intrest=?";
1755     sql += ", user_mailok=? ";
1756 youi 1.32 sql += " WHERE uid = ?";
1757 youi 1.39
1758 youi 1.32 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1759     if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1760     SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1761     SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1762     SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1763     SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1764     SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1765     SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1766     SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1767     SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1768     SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1769     SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1770     SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1771     SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1772     SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1773     SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1774     SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1775     SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1776     SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1777     SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1778     SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1779     SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1780     SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1781     SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1782     SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1783     SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1784     SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1785     SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1786     SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1787     SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1788     SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1789     SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1790     SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1791 youi 1.39
1792 youi 1.32 strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1793     strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1794     strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1795     strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1796     strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1797     user_regdate = time( NULL );
1798     strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1799     strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1800     strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1801     user_viewemail = account -> getUserViewemail( );
1802     strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1803     strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1804     strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1805     strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1806     strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1807     posts = account -> getPosts( );
1808     attachsig = account -> getAttachsig( );
1809     rank = account -> getRank( );
1810     level = account -> getLevel( );
1811     strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1812     timezone_offset = account -> getTimezoneOffset( );
1813     last_login = 0;
1814     strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1815     uorder = account -> getUorder( );
1816     notify_method = account -> getNotifyMethod( );
1817     notify_mode = account -> getNotifyMode( );
1818     strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1819     strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1820     strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1821     user_mailok = account -> getUserMailok( );
1822     uid = account -> getUID( );
1823    
1824     if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1825 youi 1.64 SQLLEN count = 0;
1826 youi 1.32 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1827     ret = RES_OK;
1828     }else{
1829     string s( "SQLRowCount in updateAccount sql=" );
1830     s += string( sql );
1831     setLastErrorString( s.c_str( ) );
1832     ret = RES_DB_QUERY_ERROR;
1833     }
1834     }else{
1835 youi 1.39 string s( "SQLExecute in updateAccount 1 " );
1836 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1837 youi 1.32 setLastErrorString( s.c_str( ) );
1838     ret = RES_DB_QUERY_ERROR;
1839     }
1840     }else{
1841     setLastErrorString( "SQLPrepare in updateAccount sql=" );
1842     ret = RES_ERROR;
1843     }
1844     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1845 youi 1.39 hstmt = NULL;
1846 youi 1.32 }else{
1847 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1848     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1849     setLastErrorString( s.c_str( ) );
1850 youi 1.32 ret = RES_ERROR;
1851 youi 1.10 }
1852    
1853 youi 1.39 if( ret != RES_OK ){
1854     return ret;
1855     }
1856    
1857 aga 1.36 //xnpaccountのユーザテーブルに残りの情報を上書きする
1858 youi 1.39 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1859 youi 1.32 string sql;
1860    
1861 aga 1.36 sql = "UPDATE " + dbprefix + "_xnpaccount_users SET ";
1862 youi 1.32 sql += "activate=?, ";
1863     sql += "address=?, ";
1864     sql += "division=?, ";
1865     sql += "tel=?, ";
1866     sql += "company_name=?, ";
1867     sql += "country=?, ";
1868     sql += "zipcode=?, ";
1869     sql += "fax=?, ";
1870     sql += "notice_mail=?, ";
1871 tani 1.73 sql += "notice_mail_since=? ,";
1872     sql += "private_item_number_limit=" + unsignedIntToString( account -> getItemNumberLimit( ) ) + " ,";
1873     sql += "private_index_number_limit=" + unsignedIntToString( account -> getIndexNumberLimit( ) ) + " ,";
1874     sql += "private_item_storage_limit=" + doubleToString( account -> getItemStorageLimit( ) ) + " ";
1875 youi 1.32 sql += "WHERE uid=?";
1876    
1877     sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1878     if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1879 youi 1.39 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate);
1880 aga 1.36 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1881     SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1882     SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1883     SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1884     SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1885     SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1886     SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1887 aga 1.61 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &cbNotice_mail);
1888     SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &cbNotice_mail_since);
1889     SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1890 youi 1.32
1891     activate = account -> getActivate() ? 1 : 0;
1892 aga 1.36 strncpy2( (char*)address, account -> getAddress( ) , XNP_ACCOUNT_ADDRESS_LEN );
1893     strncpy2( (char*)division, account -> getDivision(), XNP_ACCOUNT_DIVISION_LEN );
1894     strncpy2( (char*)tel, account -> getTel(), XNP_ACCOUNT_TEL_LEN );
1895     strncpy2( (char*)company_name, account -> getCompanyName(), XNP_ACCOUNT_COMPANY_NAME_LEN );
1896     strncpy2( (char*)country, account -> getCountry(), XNP_ACCOUNT_COUNTRY_LEN );
1897     strncpy2( (char*)zipcode, account -> getZipcode(), XNP_ACCOUNT_ZIPCODE_LEN );
1898     strncpy2( (char*)fax, account -> getFax(), XNP_ACCOUNT_FAX_LEN );
1899 youi 1.32 notice_mail = account -> getNoticeMail( );
1900     notice_mail_since = account -> getNoticeMailSince( );
1901     uid = account -> getUID( );
1902    
1903     if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1904 youi 1.64 SQLLEN count = 0;
1905 youi 1.32 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1906     ret = RES_OK;
1907     }else{
1908     string s( "SQLRowCount in updateAccount sql=" );
1909     s += string( sql );
1910     setLastErrorString( s.c_str( ) );
1911     ret = RES_DB_QUERY_ERROR;
1912     }
1913     }else{
1914 youi 1.39 string s( "SQLExecute in updateAccount 2 " );
1915 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1916 youi 1.32 setLastErrorString( s.c_str( ) );
1917     ret = RES_DB_QUERY_ERROR;
1918     }
1919     }else{
1920     setLastErrorString( "SQLPrepare in updateAccount sql=" );
1921     ret = RES_ERROR;
1922     }
1923     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1924     }else{
1925 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1926     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1927     setLastErrorString( s.c_str( ) );
1928 youi 1.32 ret = RES_ERROR;
1929 youi 1.10 }
1930 youi 1.32 return ret;
1931 youi 1.1 }
1932    
1933     /**
1934     *
1935 youi 1.17 * criteria_tで指定された範囲のユーザIDを返す.
1936     * ユーザIDの配列を確保してそこに書き込み,配列のアドレスを*uidsに書き込む.
1937     * 配列のサイズを*uidsLenに書き込む
1938 youi 1.1 *
1939 youi 1.17 * @param sid セッションID
1940     * @param cri 結果の範囲指定,ソート条件指定
1941 youi 1.31 * @param uids ユーザのUIDの配列の出力先
1942     * @param uidsLen uids配列の要素数の出力先
1943     * @return RES_OK
1944     * @return RES_DB_NOT_INITIALIZED
1945     * @return RES_NO_SUCH_SESSION
1946     * @return RES_DB_QUERY_ERROR
1947 youi 1.1 *
1948     */
1949 youi 1.13 result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen )
1950 youi 1.1 {
1951 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1952 youi 1.17 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1953    
1954 youi 1.32 result_t ret = RES_ERROR;
1955     userid_t* dst = 0;
1956 youi 1.17 string sql;
1957 youi 1.32 SQLRETURN sqlcode;
1958 youi 1.64 SQLLEN count = 0;
1959 youi 1.32
1960    
1961 aga 1.36 sql = "SELECT uid FROM " + dbprefix + "_xnpaccount_users ";
1962 youi 1.17 sql += criteria2str( cri );
1963 youi 1.32 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1964     *uidsLen = count;
1965     dst = new userid_t[ *uidsLen ];
1966     *uids = dst;
1967     }else{
1968     return RES_ERROR;
1969     }
1970     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1971     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1972 youi 1.44 userid_t uid = 0;
1973 youi 1.56 SQLLEN len = 0;
1974 youi 1.32 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1975    
1976     for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
1977     dst[ i ] = uid;
1978     }
1979    
1980 tani 1.72 syslog_printf( "dumpUids succeed" );
1981 youi 1.32 ret = RES_OK;
1982     }else{
1983     string s( "SQLExecDirect in dumpUids " );
1984 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1985 youi 1.32 s += "sql=";
1986     s += string( sql );
1987     setLastErrorString( s.c_str( ) );
1988 tani 1.72 syslog_printf( "dumpUids %s", getLastErrorString( ) );
1989 youi 1.32 ret = RES_DB_QUERY_ERROR;
1990     }
1991     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1992     }else{
1993 youi 1.33 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in dumpUids" );
1994     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1995     setLastErrorString( s.c_str( ) );
1996 tani 1.72 syslog_printf( "dumpUids %s", getLastErrorString( ) );
1997 youi 1.44 ret = RES_ERROR;
1998 youi 1.17 }
1999 youi 1.32 return ret;
2000 youi 1.1 }
2001    
2002     /**
2003     *
2004 youi 1.19 * グループ数を返す.
2005     * 不正なセッションIDなら0を返す.
2006 youi 1.1 *
2007 youi 1.19 * @param sid セッションID
2008     * @return グループ数
2009 youi 1.1 *
2010     */
2011 youi 1.2 int getGroupCount( sessionid_t sid )
2012 youi 1.1 {
2013 youi 1.32 if( hdbc == NULL ) return 0;
2014 youi 1.19 if( !isValidSessionID( sid ) ) return 0;
2015    
2016 youi 1.32 SQLRETURN sqlcode;
2017     SQLHANDLE hstmt = NULL;
2018 youi 1.19 string sql;
2019 youi 1.32 int ret = 0;
2020 youi 1.19
2021     //グループ数を求める
2022 aga 1.36 sql = "SELECT COUNT(*) FROM " + dbprefix + "_xnpaccount_groups";
2023 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2024     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2025     SQLUINTEGER count = 0;
2026 youi 1.56 SQLLEN len = 0;
2027 youi 1.32 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
2028     if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2029     ret = count;
2030     }else {
2031     string s( "SQLFetch in getGroupCount sql=" );
2032     s += string( sql );
2033     setLastErrorString( s.c_str( ) );
2034     ret = 0;
2035     }
2036     }else{
2037     setLastErrorString( "SQLExecDirect in getGroupCount" );
2038     ret = 0;
2039     }
2040     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2041     }else{
2042 youi 1.55 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroupCount" );
2043     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2044     setLastErrorString( s.c_str( ) );
2045 youi 1.32 ret = 0;
2046 youi 1.19 }
2047 youi 1.32 return ret;
2048 youi 1.1 }
2049    
2050     /**
2051     *
2052 youi 1.31 * 所属グループ一覧取得.
2053     * ユーザが所属しているグループのIDを取得する
2054 youi 1.1 *
2055 youi 1.31 * @param sid セッションID
2056     * @param uid ユーザのUID
2057     * @param cri 結果の範囲指定,ソート条件指定
2058     * @param gids グループIDの配列の出力先
2059     * @param gidsLen gids配列の要素数の出力先
2060     * @return RES_DB_NOT_INITIALIZED
2061     * @return RES_NO_SUCH_SESSION
2062     * @return RES_NO_SUCH_USER
2063     * @return RES_DB_QUERY_ERROR
2064     * @return RES_OK
2065 youi 1.1 *
2066     */
2067 youi 1.13 result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )
2068 youi 1.1 {
2069 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2070 youi 1.19 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2071     if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック
2072    
2073 youi 1.32 result_t ret = RES_ERROR;
2074 youi 1.19 string sql;
2075 youi 1.32 SQLRETURN sqlcode;
2076     SQLHANDLE hstmt = NULL;
2077 youi 1.64 SQLLEN count = 0;
2078 youi 1.19 groupid_t* dst = 0;
2079    
2080 aga 1.36 sql = "SELECT gid FROM " + dbprefix + "_xnpaccount_groups_users_link";
2081 youi 1.19 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
2082     sql += criteria2str( cri );
2083 youi 1.32 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
2084     *gidsLen = count;
2085     dst = new groupid_t[ *gidsLen ];
2086     *gids = dst;
2087     }else{
2088     return RES_ERROR;
2089 youi 1.19 }
2090    
2091 youi 1.32 //所属するグループの最大個数を求める
2092     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2093     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2094     if( count > 0 ){
2095     SQLHANDLE hstmt2 = NULL;
2096     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
2097 aga 1.36 sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_xnpaccount_groups_users_link";
2098 youi 1.32 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
2099     sql += criteria2str( cri );
2100     if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2101 youi 1.56 SQLLEN len = 0;
2102 youi 1.32 groupid_t gid = 0;
2103     SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
2104     for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
2105     dst[ i ] = gid;
2106     }
2107     ret = RES_OK;
2108     }else{
2109     string s( "SQLExecDirect in getGroupsByUid " );
2110 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2111 youi 1.32 s += string( ", sql=" ) + string( sql );
2112 youi 1.55 setLastErrorString( s.c_str( ) );
2113 youi 1.32 ret = RES_DB_QUERY_ERROR;
2114     }
2115     }else{
2116     string s( "SQLAllocHandle in getGroupsByUid " );
2117 youi 1.35 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2118 youi 1.55 setLastErrorString( s.c_str( ) );
2119 youi 1.44 ret = RES_ERROR;
2120 youi 1.32 }
2121     }else{
2122     ret = RES_OK;
2123     }
2124     }else{
2125     string s( "SQLExecDirect in getGroupsByUid " );
2126 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2127 youi 1.32 s += string( ", sql=" ) + string( sql );
2128 youi 1.55 setLastErrorString( s.c_str( ) );
2129 youi 1.32 ret = RES_DB_QUERY_ERROR;
2130     }
2131     }else{
2132     string s( "SQLAllocHandle in getGroupsByUid " );
2133 youi 1.55 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2134 youi 1.32 setLastErrorString( s.c_str( ) );
2135 youi 1.44 ret = RES_ERROR;
2136 youi 1.19 }
2137 youi 1.32 return ret;
2138 youi 1.1 }
2139    
2140     /**
2141     *
2142 youi 1.31 * グループ管理権限問合せ.
2143     * ユーザにループの管理権限があるか(グループ管理者であるか)を問い合わせる.
2144     * ユーザやグループが存在しないなどの異常の場合,falseを返す.
2145 youi 1.1 *
2146 youi 1.31 * @param sid セッションID
2147     * @param gid グループのUID
2148     * @param uid ユーザのUID
2149     * @return true 管理権限あり
2150     * @return false 管理権限なし,または不明
2151 youi 1.1 *
2152     */
2153 youi 1.2 bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )
2154 youi 1.1 {
2155 youi 1.32 if( hdbc == NULL ) return false;
2156 youi 1.19 if( !isValidSessionID( sid ) ) return false;
2157     if( !uidExists( uid ) ) return false;
2158     if( !gidExists( gid ) ) return false;
2159    
2160 youi 1.32 bool ret = false;
2161 youi 1.19 string sql;
2162 youi 1.64 SQLLEN count = 0;
2163 youi 1.19
2164 aga 1.36 sql = "SELECT * FROM " + dbprefix