Develop and Download Open Source Software

Browse CVS Repository

Diff of /xoonips/AL/commonal.cc

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

revision 1.31 by youi, Tue Dec 21 11:42:59 2004 UTC revision 1.32 by youi, Sat Dec 25 09:46:47 2004 UTC
# Line 2  Line 2 
2   *   *
3   * $Revision$   * $Revision$
4   * $Log$   * $Log$
5     * Revision 1.32  2004/12/25 09:46:47  youi
6     * MySQL+MyODBCで動作するように修正した.
7     *
8   * Revision 1.31  2004/12/21 11:42:59  youi   * Revision 1.31  2004/12/21 11:42:59  youi
9   * コメントの引数,戻り値の説明などを追加.   * コメントの引数,戻り値の説明などを追加.
10   *   *
# Line 145  typedef int my_socket; Line 148  typedef int my_socket;
148  #include <errmsg.h>  #include <errmsg.h>
149  #include <string>  #include <string>
150  #include <assert.h>  #include <assert.h>
151    #include <sql.h>
152    #include <sqlext.h>
153  using namespace std;  using namespace std;
154    
155  #include "common.h"  #include "common.h"
# Line 154  using namespace std; Line 159  using namespace std;
159  #include "criteria.h"  #include "criteria.h"
160  #include "commonal.h"  #include "commonal.h"
161    
 #ifdef IMPORT_MYSQLDLL  
 typedef MYSQL* (__stdcall *mysql_init_t)(MYSQL *mysql);  
 typedef void (__stdcall *mysql_close_t)(MYSQL *mysql);  
 typedef MYSQL* (__stdcall *mysql_real_connect_t)(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag);  
 typedef unsigned long (__stdcall *mysql_real_escape_string_t)(MYSQL *mysql, char *to, const char *from, unsigned long length);  
 typedef MYSQL_RES* (__stdcall *mysql_store_result_t)(MYSQL *mysql);  
 typedef MYSQL_RES* (__stdcall *mysql_use_result_t)(MYSQL *mysql);  
 typedef int (__stdcall *mysql_query_t)(MYSQL *mysql, const char *query);  
 typedef my_ulonglong (__stdcall *mysql_num_rows_t)(MYSQL_RES *result);  
 typedef MYSQL_ROW (__stdcall *mysql_fetch_row_t)(MYSQL_RES *result);  
 typedef unsigned int (__stdcall *mysql_errno_t)(MYSQL *mysql);  
 typedef char*  (__stdcall *mysql_error_t)(MYSQL *mysql);  
 typedef my_ulonglong (__stdcall *mysql_insert_id_t)(MYSQL *mysql);  
 typedef void (__stdcall *mysql_free_result_t)(MYSQL_RES *result);  
 typedef my_ulonglong (_stdcall* mysql_affected_rows_t)(MYSQL *mysql);  
   
 mysql_init_t fp_mysql_init = NULL;  
 mysql_close_t fp_mysql_close = NULL;  
 mysql_real_connect_t fp_mysql_real_connect = NULL;  
 mysql_real_escape_string_t fp_mysql_real_escape_string = NULL;  
 mysql_store_result_t fp_mysql_store_result = NULL;  
 mysql_use_result_t fp_mysql_use_result = NULL;  
 mysql_query_t fp_mysql_query = NULL;  
 mysql_num_rows_t fp_mysql_num_rows = NULL;  
 mysql_fetch_row_t fp_mysql_fetch_row = NULL;  
 mysql_errno_t fp_mysql_errno = NULL;  
 mysql_error_t fp_mysql_error = NULL;  
 mysql_insert_id_t fp_mysql_insert_id = NULL;  
 mysql_free_result_t fp_mysql_free_result = NULL;  
 mysql_affected_rows_t fp_mysql_affected_rows = NULL;  
 #else  
 #define fp_mysql_init mysql_init  
 #define fp_mysql_close mysql_close  
 #define fp_mysql_real_connect mysql_real_connect  
 #define fp_mysql_real_escape_string mysql_real_escape_string  
 #define fp_mysql_store_result mysql_store_result  
 #define fp_mysql_use_result mysql_use_result  
 #define fp_mysql_query mysql_query  
 #define fp_mysql_num_rows mysql_num_rows  
 #define fp_mysql_fetch_row mysql_fetch_row  
 #define fp_mysql_errno mysql_errno  
 #define fp_mysql_error mysql_error  
 #define fp_mysql_insert_id mysql_insert_id  
 #define fp_mysql_free_result mysql_free_result  
 #define fp_mysql_affected_rows mysql_affected_rows  
 #endif  
   
 static MYSQL* mysql = NULL; //!< MySQLのハンドル  
162  static string dbprefix; //!< XOOPSデータベーステーブルのPREFIX  static string dbprefix; //!< XOOPSデータベーステーブルのPREFIX
163    
164    static SQLHANDLE henv = NULL;
165    static SQLHANDLE hdbc = NULL;
166    static SQLHANDLE hstmt = NULL;
167    
168    static string odbcDiagString( SQLHANDLE hstmt, SQLRETURN sqlcode );
169    
170    static result_t countResultRows( const char* sql, SQLINTEGER* count )
171    {
172        result_t ret = RES_ERROR;
173        SQLRETURN sqlcode;
174        SQLHANDLE hstmt = NULL;
175        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
176            if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql, strlen( sql ) ) ) == SQL_SUCCESS ){
177                *count = 0;
178                while( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ) ( *count )++;
179                ret = RES_OK;
180            }else{
181                string s( "SQLExecDirect in countResultRows " );
182                s += odbcDiagString( hstmt, sqlcode );
183                s += "sql=";
184                s += string( sql );
185                setLastErrorString( s.c_str( ) );
186                ret = RES_DB_QUERY_ERROR;
187            }
188            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
189        }
190        return ret;
191    }
192    
193    /**
194     *
195     * 文字列コピー.
196     * 指定文字数をコピーし,バッファの最後をNULL終端する.
197     * ( dstのサイズ >= len + 1 )であること
198     *
199     */
200    static char* strncpy2( char* dst, const char* src, int len )
201    {
202        strncpy( dst, src, len );
203        dst[ len ] = '\0';
204    //    fprintf( stderr, "strncpy2 '%s'\n", dst );
205        return dst;
206    }
207    
208    /**
209     *
210     * SQLの実行結果からエラー文字列を生成する
211     *
212     * @param hstmt SQL文のハンドル
213     * @param sqlcode SQLExecDirect,SQLExecuteの戻り値
214     * @return エラー文字列
215     */
216    static string odbcDiagString( SQLHANDLE hstmt, SQLRETURN sqlcode )
217    {
218        string s;
219        if( sqlcode == SQL_ERROR || sqlcode == SQL_SUCCESS_WITH_INFO ){
220            SQLCHAR SQLState[6];
221            SQLINTEGER NativeError;
222            SQLCHAR MessageText[ 1024 ];
223            SQLSMALLINT BufferLength;
224            SQLSMALLINT TextLength;
225            SQLGetDiagRec( SQL_HANDLE_STMT, hstmt, 1, SQLState, &NativeError, MessageText, 1024, &TextLength );
226            
227            s += string( (char*)MessageText );
228            s += " SQLSTATE=";
229            s += string( (char*)SQLState );
230            
231        }
232        s += " sqlcode=";
233        s += intToString( sqlcode );
234        return s;
235    }
236    
237  /**  /**
238   *   *
239   * phpのaddslashesと同じ。   * 指定カラムの値を取り出してその文字列を返す
240   *   *
241   * @param addslashesすべき文字列。NULL指定不可。   */
242   * @return addslashesされた文字列  string getResultCol( SQLHANDLE hstmt, int col )
243    {
244        string s;
245        SQLRETURN sqlcode;
246        SQLCHAR       BinaryPtr[5000];
247        SQLUINTEGER   PartID;
248        SQLINTEGER    PartIDInd, BinaryLenOrInd, NumBytes;
249        SQLRETURN     rc;
250        
251        while ( ( sqlcode = SQLGetData(hstmt, col, SQL_C_CHAR, BinaryPtr, sizeof(BinaryPtr),
252                                       &BinaryLenOrInd)) != SQL_NO_DATA) {
253            NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ? 5000 : BinaryLenOrInd;
254            s += string( (char*)BinaryPtr, NumBytes );
255        }
256    //    fprintf( stderr, "getResultCol col=%d ret='%s'\n", col, s.c_str());
257        return s;
258    }
259    
260    
261    /**
262     *
263     * クォートなどを\記号でエスケープする
264     *
265     * @param str addslashesすべき文字列。NULL指定不可。
266     * @return 変換後の文字列
267   */   */
268  string addSlashes( const char *str )  string addSlashes( const char *str )
269  {  {
270          if ( mysql == NULL ){          if ( hdbc == NULL ){
271                  string s;                  string s;
272                  return s;                  return s;
273          }          }else{
274          int len = strlen(str);          string s( str );
275          char *buf = new char[len*2+1];          return s;
276          int bufLen = fp_mysql_real_escape_string( mysql, buf, str, len );      }
277          string s( buf, bufLen );      
278            int len = strlen(str) * 3;
279        char* dst = new char[ len ];
280        const char* from = str;
281        char* to = dst;
282        while( *from != '\0' ){
283            switch( *from ){
284            case '\'':
285            case '\"':
286            case ';':
287                *to = '\\'; to++;
288                break;
289            }
290            *to = *from; to++;
291            from++;
292        }
293        *to = '\0';
294            string s( dst );
295        delete[] dst;
296          return s;          return s;
297  }  }
298    
# Line 237  string addSlashes( const char *str ) Line 309  string addSlashes( const char *str )
309  static bool gidExists( groupid_t gid )  static bool gidExists( groupid_t gid )
310  {  {
311      string sql;      string sql;
312      MYSQL_RES* result;      SQLRETURN sqlcode;
313      MYSQL_ROW row;      SQLHANDLE hstmt = NULL;
314            
315        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) != SQL_SUCCESS ) {
316            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in gidExists" );
317            return false;
318        }
319    
320      sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups ";      sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups ";
321      sql += "WHERE gid=" + string( unsignedIntToString( gid ) );      sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
322      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) != SQL_SUCCESS ){
323          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          setLastErrorString( "SQLExecDirect in gidExists" );
324            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
325          return false;          return false;
326      }      }
327      result = fp_mysql_store_result( mysql ) ;      
328      if( !fp_mysql_fetch_row(result) ){      if( ( sqlcode = SQLFetch( hstmt ) ) != SQL_SUCCESS ){
329          fp_mysql_free_result( result );          setLastErrorString( "SQLFetch in gidExists" );
330            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
331          return false;          return false;
332      }      }
333      fp_mysql_free_result( result );      
334        SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
335      return true;      return true;
336  }  }
337    
# Line 268  static bool gidExists( groupid_t gid ) Line 348  static bool gidExists( groupid_t gid )
348   */   */
349  static bool uidExists( userid_t uid )  static bool uidExists( userid_t uid )
350  {  {
351        bool ret = false;
352      string sql;      string sql;
353      MYSQL_RES* result;      SQLRETURN sqlcode;
354      MYSQL_ROW row;      SQLINTEGER count = 0;
355            
356      sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";      sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
357      sql += "WHERE uid=" + string( unsignedIntToString( uid ) );      sql += "WHERE uid=" + string( unsignedIntToString( uid ) );
358      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
359          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
360          return false;              if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
361      }                  ret = true;
362      result = fp_mysql_store_result( mysql ) ;              }else{
363      if( !fp_mysql_fetch_row(result) ){                  string s( "SQLFetch in uidExists ");
364          fp_mysql_free_result( result );                  s += odbcDiagString( hstmt, sqlcode );
365          return false;                  s += string( ", sql=" ) + string( sql );
366                    setLastErrorString( s.c_str( ) );
367                    ret = false;
368                }
369            }else{
370                string s( "SQLExecDirect in uidExists ");
371                s += odbcDiagString( hstmt, sqlcode );
372                s += string( ", sql=" ) + string( sql );
373                setLastErrorString( s.c_str( ) );
374                ret = false;
375            }
376        }else{
377            string s( "SQLAllocHandle in uidExists ");
378            s += odbcDiagString( hstmt, sqlcode );
379            setLastErrorString( s.c_str( ) );
380            ret = false;
381      }      }
382      fp_mysql_free_result( result );      return ret;
     return true;  
383  }  }
384    
385            
# Line 316  string criteria2str( criteria* cri ) Line 411  string criteria2str( criteria* cri )
411      return sql;      return sql;
412  }  }
413    
414    
415  /**  /**
416   *   *
417   * データベースの初期化   * データベースの初期化
418   *   *
419   * @param host データベースのホスト名   * @param dsn DSN
420   * @param user データベースにアクセスするユーザ名   * @param user データベースにアクセスするユーザ名
421   * @param password 上記ユーザのパスワード   * @param password 上記ユーザのパスワード
422   * @param dbname データベースの名前   * @param dbname ダミー
423   * @param prefix XOOPSデータベーステーブルのPREFIX   * @param prefix XOOPSデータベーステーブルのPREFIX
424   * @return RES_OK   * @return RES_OK
425   * @return RES_DB_INITIALIZE_ERROR   * @return RES_DB_INITIALIZE_ERROR
426   * @return RES_DB_CONNECT_ERROR   * @return RES_DB_CONNECT_ERROR
427   * @refer result_t   * @refer result_t
428   */   */
429  result_t initializeDB( const char* host, const char* user, const char* password, const char* dbname, const char* prefix )  result_t initializeDB( const char* dsn, const char* user, const char* password, const char* dbname, const char* prefix )
430  {  {
431        SQLRETURN sqlcode;
432    
433      // 既に接続中なら、一旦切断      // 既に接続中なら、一旦切断
434      if ( mysql != NULL )      if ( hdbc != NULL )
435          fp_mysql_close( mysql );          SQLDisconnect( hdbc );
436            
437      dbprefix = prefix;      dbprefix = prefix;
438            
       
439      // 初期化と接続      // 初期化と接続
440      mysql = fp_mysql_init(NULL);  //    if( SQLAllocEnv( &henv ) != SQL_SUCCESS ) {
441      if ( mysql == NULL ){      if( SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) != SQL_SUCCESS ) {
442            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_ENV,...) in initializeDB" );
443          return RES_DB_INITIALIZE_ERROR;          return RES_DB_INITIALIZE_ERROR;
444      }      }
445      char *unix_socket = NULL; // ?      //ODBC Ver.3 として振舞うように属性を設定
446      unsigned int flag = 0;       // ?      SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
447      if ( NULL == fp_mysql_real_connect( mysql, host, user, password, dbname, 3306, unix_socket, flag ) ){      
448    //    if( ( sqlcode = SQLAllocConnect( henv, &hdbc ) ) != SQL_SUCCESS ) {
449        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ) ) != SQL_SUCCESS ) {
450            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_DBC,...) in initializeDB" );
451            return RES_DB_INITIALIZE_ERROR;
452        }
453        //ログインに5秒以上要したらタイムアウトする設定
454        SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
455    
456        if ( ( sqlcode = SQLConnect( hdbc, (SQLCHAR*)dsn, strlen( dsn ), (SQLCHAR*)user, strlen( user ), (SQLCHAR*)password, strlen( password ) ) ) != SQL_SUCCESS ){
457            setLastErrorString( "SQLConnect in initializeDB" );
458          return RES_DB_CONNECT_ERROR;          return RES_DB_CONNECT_ERROR;
459      }      }
       
460      return RES_OK;      return RES_OK;
461  }  }
462    
# Line 362  result_t initializeDB( const char* host, Line 469  result_t initializeDB( const char* host,
469   */   */
470  result_t uninitializeDB()  result_t uninitializeDB()
471  {  {
472      if ( mysql != NULL ){      if ( hdbc != NULL ){
473          fp_mysql_close( mysql );          SQLDisconnect( hdbc );
474          mysql = NULL;          hdbc = NULL;
475      }      }
       
476      return RES_OK;      return RES_OK;
477  }  }
478    
   
479  /**  /**
480   *   *
481   * Platformユーザ承認状態取得   * Platformユーザ承認状態取得
# Line 383  result_t uninitializeDB() Line 488  result_t uninitializeDB()
488   */   */
489  bool isActivated( sessionid_t sid, userid_t uid )  bool isActivated( sessionid_t sid, userid_t uid )
490  {  {
491      if( mysql == NULL ) return false;      if( hdbc == NULL ) return false;
492      if( !isValidSessionID( sid ) ) return false;      if( !isValidSessionID( sid ) ) return false;
493            
494        bool ret = false;
495      string sql;      string sql;
496      MYSQL_RES* result;      SQLRETURN sqlcode;
497      MYSQL_ROW row;      SQLHANDLE hstmt = NULL;    
498            
499      sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";      sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
500      sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) );      sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) );
501      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
502          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
503          return false;              if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
504      }                  ret = true;
505      result = fp_mysql_store_result( mysql ) ;              }else{
506      if( row = fp_mysql_fetch_row(result) ){                  string s( "SQLFetch in isActivated " );
507          fp_mysql_free_result( result );                  s += odbcDiagString( hstmt, sqlcode );
508          return true;                  s += ", sql=" + sql;
509                    setLastErrorString( s.c_str() );
510                    ret = false;
511                }
512            }else{
513                string s( "SQLExecDirect in isActivated " );
514                s += odbcDiagString( hstmt, sqlcode );
515                s += ", sql=" + sql;
516                setLastErrorString( s.c_str() );
517                ret = false;
518            }
519            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
520        }else{
521            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isActivated" );
522            ret = false;
523      }      }
524      return false;      return ret;
525  }  }
526    
527  /**  /**
# Line 417  bool isActivated( sessionid_t sid, useri Line 537  bool isActivated( sessionid_t sid, useri
537   */   */
538  result_t activate( sessionid_t sid, userid_t uid, bool activate )  result_t activate( sessionid_t sid, userid_t uid, bool activate )
539  {  {
540      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
541      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
542            
543      string sql;      string sql;
544      MYSQL_RES* result;      SQLRETURN sqlcode;
545      MYSQL_ROW row;      result_t ret = RES_ERROR;
546            
547      sql = "UPDATE " + dbprefix + "_vpaccount_users ";      sql = "UPDATE " + dbprefix + "_vpaccount_users ";
548      sql += "SET activate=" + string( activate ? "1" : "0" );      sql += "SET activate=" + string( activate ? "1" : "0" );
549      sql += " WHERE uid=" + string( unsignedIntToString( uid ) );      sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
550      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
551          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
552          return RES_DB_QUERY_ERROR;              SQLINTEGER count = 0;
553      }              if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
554      if ( fp_mysql_affected_rows(mysql) == 0 ){                  ret = RES_OK;
555          // 更新失敗              }else{
556          return RES_NO_SUCH_USER;                  string s( "SQLRowCount in activate ");
557                    s += odbcDiagString( hstmt, sqlcode );
558                    s += string( ", sql=" ) + string( sql );
559                    setLastErrorString( s.c_str( ) );
560                    ret = RES_NO_SUCH_USER;
561                }
562            }else{
563                string s( "SQLExecDirect in activate " );
564                s += odbcDiagString( hstmt, sqlcode );
565                s += ", sql=";
566                s += string( sql );
567                setLastErrorString( s.c_str( ) );
568                ret = RES_DB_QUERY_ERROR;
569            }
570            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
571        }else{
572            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in activate" );
573            ret = RES_ERROR;
574      }      }
575      return RES_OK;      return ret;
576  }  }
577    
578  /**  /**
# Line 448  result_t activate( sessionid_t sid, user Line 585  result_t activate( sessionid_t sid, user
585   */   */
586  int getAccountCount( sessionid_t sid )  int getAccountCount( sessionid_t sid )
587  {  {
588      if( mysql == NULL ) return 0;      if( hdbc == NULL ) return 0;
589      if( !isValidSessionID( sid ) ) return 0;      if( !isValidSessionID( sid ) ) return 0;
590            
591      int ret = 0;      int ret = 0;
592      string sql;      string sql;
593      MYSQL_RES* result;      SQLRETURN sqlcode;
594      MYSQL_ROW row;      SQLHANDLE hstmt = NULL;    
595            
596      //アカウント数を求める      //アカウント数を求める
597      sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_users ";      sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_users ";
598      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
599          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
600          return 0;              SQLUINTEGER count = 0;
601      }              SQLINTEGER len;
602      result = fp_mysql_store_result( mysql ) ;              SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
603      if( row = fp_mysql_fetch_row(result) ){              if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
604          ret = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );                  ret = count;
605                }else {
606                    string s( "SQLFetch in getAccountCount sql=" );
607                    s += string( sql );
608                    setLastErrorString( s.c_str( ) );
609                    ret = 0;
610                }
611            }else{
612                setLastErrorString( "SQLExecDirect in getAccountCount" );
613                ret = 0;
614            }
615            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
616      }else{      }else{
617          fp_mysql_free_result( result );          setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccountCount" );
618          return 0;          ret = 0;
619      }      }
     fp_mysql_free_result( result );  
620      return ret;      return ret;
621  }  }
622    
# Line 486  int getAccountCount( sessionid_t sid ) Line 633  int getAccountCount( sessionid_t sid )
633   */   */
634  result_t deleteAccount( sessionid_t sid, userid_t uid )  result_t deleteAccount( sessionid_t sid, userid_t uid )
635  {  {
636      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
637      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
638        
639        result_t ret1 = RES_ERROR, ret2 = RES_ERROR;
640      string sql;      string sql;
641        SQLRETURN sqlcode;
642        SQLHANDLE hstmt = NULL;
643        
644      sql = "DELETE FROM " + dbprefix + "_users ";      sql = "DELETE FROM " + dbprefix + "_users ";
645      sql += "WHERE uid = " + string( unsignedIntToString( uid ) );      sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
646      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
647          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
648          return RES_DB_QUERY_ERROR;              SQLINTEGER count = 0;
649                if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
650                    ret1 = RES_OK;
651                }else{
652                    string s( "SQLRowCount in deleteAccount" );
653                    s += odbcDiagString( hstmt, sqlcode );
654                    s += string( ", sql=" ) + string( sql );
655                    setLastErrorString( s.c_str( ) );
656                    ret1 = RES_NO_SUCH_USER;
657                }
658            }else{
659                string s( "SQLExecDirect in deleteAccount" );
660                s += odbcDiagString( hstmt, sqlcode );
661                s += ", sql=";
662                s += string( sql );
663                setLastErrorString( s.c_str( ) );
664                ret1 = RES_DB_QUERY_ERROR;
665            }
666            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
667        }else{
668            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
669            ret1 = RES_ERROR;
670      }      }
671            
672      sql = "DELETE FROM " + dbprefix + "_vpaccount_users ";      sql = "DELETE FROM " + dbprefix + "_vpaccount_users ";
673      sql += "WHERE uid = " + string( unsignedIntToString( uid ) );      sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
674      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
675          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
676          return RES_DB_QUERY_ERROR;              SQLINTEGER count = 0;
677                if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
678                    ret2 = RES_OK;
679                }else{
680                    string s( "SQLRowCount in deleteAccount" );
681                    s += odbcDiagString( hstmt, sqlcode );
682                    s += string( ", sql=" ) + string( sql );
683                    setLastErrorString( s.c_str( ) );
684                    ret2 = RES_NO_SUCH_USER;
685                }
686            }else{
687                string s( "SQLExecDirect in deleteAccount" );
688                s += odbcDiagString( hstmt, sqlcode );
689                s += ", sql=";
690                s += string( sql );
691                setLastErrorString( s.c_str( ) );
692                ret2 = RES_DB_QUERY_ERROR;
693            }
694            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
695        }else{
696            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
697            ret2 = RES_ERROR;
698      }      }
699            
700      return RES_OK;      //一方でもエラーならエラーを返す
701        return ret1 != RES_OK ? ret1 : ret2;
702  }  }
703    
704  /**  /**
# Line 551  result_t getAccounts( sessionid_t sid, c Line 745  result_t getAccounts( sessionid_t sid, c
745  #ifdef USE_SYSLOG  #ifdef USE_SYSLOG
746      openlog( "commonal", LOG_ODELAY, LOG_USER );      openlog( "commonal", LOG_ODELAY, LOG_USER );
747  #endif  #endif
748      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
749      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
750      if( uidsLen <= 0 ){      if( uidsLen <= 0 ){
751          *accounts = new account_t[ 0 ];          *accounts = new account_t[ 0 ];
# Line 562  result_t getAccounts( sessionid_t sid, c Line 756  result_t getAccounts( sessionid_t sid, c
756          return RES_OK;          return RES_OK;
757      }      }
758            
759        result_t ret = RES_ERROR;
760        SQLRETURN sqlcode;
761        SQLHANDLE hstmt = NULL;    
762      string sql;      string sql;
     MYSQL_RES* result;  
     MYSQL_ROW row;  
763      account_t* dst = new account_t[ uidsLen ];      account_t* dst = new account_t[ uidsLen ];
764            
765      sql += "SELECT u1.uid, u1.name, u1.uname, u1.email, u1.url, u1.user_avatar, u1.user_regdate, u1.user_icq, u1.user_from, u1.user_sig, u1.user_viewemail, u1.actkey, u1.user_aim, u1.user_yim, u1.user_msnm, u1.pass, u1.posts, u1.attachsig, u1.rank, u1.level, u1.theme, u1.timezone_offset, u1.last_login, u1.umode, u1.uorder, u1.notify_method, u1.notify_mode, u1.user_occ, u1.bio, u1.user_intrest, u1.user_mailok, u2.activate, u2.address, u2.division, u2.tel, u2.company_name, u2.country, u2.zipcode, u2.fax, u2.base_url, u2.notice_mail, u2.notice_mail_since ";      sql += "SELECT u1.uid, u1.name, u1.uname, u1.email, u1.url, u1.user_avatar, u1.user_regdate, u1.user_icq, u1.user_from, u1.user_sig, u1.user_viewemail, u1.actkey, u1.user_aim, u1.user_yim, u1.user_msnm, u1.pass, u1.posts, u1.attachsig, u1.rank, u1.level, u1.theme, u1.timezone_offset, u1.last_login, u1.umode, u1.uorder, u1.notify_method, u1.notify_mode, u1.user_occ, u1.bio, u1.user_intrest, u1.user_mailok, u2.activate, u2.address, u2.division, u2.tel, u2.company_name, u2.country, u2.zipcode, u2.fax, u2.base_url, u2.notice_mail, u2.notice_mail_since ";
# Line 578  result_t getAccounts( sessionid_t sid, c Line 773  result_t getAccounts( sessionid_t sid, c
773          sql += " ) ";          sql += " ) ";
774      }      }
775      sql += criteria2str( cri );      sql += criteria2str( cri );
776  #ifdef USE_SYSLOG      
777      syslog( LOG_DEBUG, sql.c_str( ) );      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
778  #endif          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
779      if( fp_mysql_query( mysql, sql.c_str( ) ) ){              SQLINTEGER len;
780          fprintf( stderr, "%s\n", sql.c_str( ) );              userid_t uid = 0;
781          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );              SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
782  #ifdef USE_SYSLOG              *accountsLen=0;
783          syslog( LOG_ERR, "query failed %d %s", fp_mysql_errno(mysql), fp_mysql_error(mysql) );              for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < uidsLen ; i++ ){
784          closelog( );                  dst[ i ].setUID( uid );
785  #endif                  dst[ i ].setName( getResultCol( hstmt, 2 ).c_str() );
786          return RES_DB_QUERY_ERROR;                  dst[ i ].setUname( getResultCol( hstmt, 3 ).c_str() );
787                    dst[ i ].setEmail( getResultCol( hstmt, 4 ).c_str() );
788                    dst[ i ].setURL( getResultCol( hstmt, 5 ).c_str() );
789                    dst[ i ].setUserAvatar( getResultCol( hstmt, 6 ).c_str() );
790                    dst[ i ].setUserRegdate( atoi( getResultCol( hstmt, 7 ).c_str() ) );
791                    dst[ i ].setUserIcq( getResultCol( hstmt, 8 ).c_str() );
792                    dst[ i ].setUserFrom( getResultCol( hstmt, 9 ).c_str() );
793                    dst[ i ].setUserSig( getResultCol( hstmt, 10 ).c_str() );
794                    dst[ i ].setUserViewemail( atoi( getResultCol( hstmt, 11 ).c_str() ));
795                    dst[ i ].setActkey( getResultCol( hstmt, 12 ).c_str() );
796                    dst[ i ].setUserAim( getResultCol( hstmt, 13 ).c_str() );
797                    dst[ i ].setUserYim( getResultCol( hstmt, 14 ).c_str() );
798                    dst[ i ].setUserMsnm( getResultCol( hstmt, 15 ).c_str() );
799                    dst[ i ].setPass( getResultCol( hstmt, 16 ).c_str() );
800                    dst[ i ].setPosts( atoi( getResultCol( hstmt, 17 ).c_str() ));
801                    dst[ i ].setAttachsig( atoi( getResultCol( hstmt, 18 ).c_str() ));
802                    dst[ i ].setRank( atoi( getResultCol( hstmt, 19 ).c_str() ));
803                    dst[ i ].setLevel( atoi( getResultCol( hstmt, 20 ).c_str() ));
804                    dst[ i ].setTheme( getResultCol( hstmt, 21 ).c_str() );
805                    dst[ i ].setTimezoneOffset( atof( getResultCol( hstmt, 22 ).c_str() ) );
806                    dst[ i ].setLastLogin( atoi( getResultCol( hstmt, 23 ).c_str() ));
807                    dst[ i ].setUmode( getResultCol( hstmt, 24 ).c_str() );
808                    dst[ i ].setUorder( atoi( getResultCol( hstmt, 25 ).c_str() ));
809                    dst[ i ].setNotifyMethod( atoi( getResultCol( hstmt, 26 ).c_str() ));
810                    dst[ i ].setNotifyMode( atoi( getResultCol( hstmt, 27 ).c_str() ));
811                    dst[ i ].setUserOcc( getResultCol( hstmt, 28 ).c_str() );
812                    dst[ i ].setBio( getResultCol( hstmt, 29 ).c_str() );
813                    dst[ i ].setUserIntrest( getResultCol( hstmt, 30 ).c_str() );
814                    dst[ i ].setUserMailok( atoi( getResultCol( hstmt, 31 ).c_str() ));
815                    dst[ i ].setActivate( atoi( getResultCol( hstmt, 32 ).c_str() ));
816                    dst[ i ].setAddress( getResultCol( hstmt, 33 ).c_str() );
817                    dst[ i ].setDivision( getResultCol( hstmt, 34 ).c_str() );
818                    dst[ i ].setTel( getResultCol( hstmt, 35 ).c_str() );
819                    dst[ i ].setCompanyName( getResultCol( hstmt, 36 ).c_str() );
820                    dst[ i ].setCountry( getResultCol( hstmt, 37 ).c_str() );
821                    dst[ i ].setZipcode( getResultCol( hstmt, 38 ).c_str() );
822                    dst[ i ].setFax( getResultCol( hstmt, 39 ).c_str() );
823                    dst[ i ].setBaseURL( getResultCol( hstmt, 40 ).c_str() );
824                    dst[ i ].setNoticeMail( atoi( getResultCol( hstmt, 41 ).c_str() ));
825                    dst[ i ].setNoticeMailSince( atoi( getResultCol( hstmt, 42 ).c_str() ));
826                    ( *accountsLen )++;
827                }
828                *accounts = dst;
829                ret = RES_OK;
830            }else{
831                setLastErrorString( "SQLExecDirect in getAccounts" );
832                ret = RES_DB_QUERY_ERROR;
833            }
834            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
835        }else{
836            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" );
837            ret = RES_DB_QUERY_ERROR;
838      }      }
839  #ifdef USE_SYSLOG      return ret;
     syslog( LOG_DEBUG, "query succeed" );  
 #endif  
     result = fp_mysql_use_result( mysql ) ;  
     *accountsLen=0;  
     for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < uidsLen ; i++ ){  
 #ifdef USE_SYSLOG  
         syslog( LOG_DEBUG, "set to account_t %d", i );  
 #endif  
         dst[ i ].setUID( atoi( row[ 0 ] != NULL ? row[ 0 ] : "" ) );  
         dst[ i ].setName( row[ 1 ] );  
         dst[ i ].setUname( row[ 2 ] );  
         dst[ i ].setEmail( row[ 3 ] );  
         dst[ i ].setURL( row[ 4 ] );  
         dst[ i ].setUserAvatar( row[ 5 ] );  
         dst[ i ].setUserRegdate( atoi( row[ 6 ] != NULL ? row[ 6 ] : "" ) );  
         dst[ i ].setUserIcq( row[ 7 ] );  
         dst[ i ].setUserFrom( row[ 8 ] );  
         dst[ i ].setUserSig( row[ 9 ] );  
         dst[ i ].setUserViewemail( atoi( row[ 10 ] != NULL ? row[ 10 ] : "" ) );  
         dst[ i ].setActkey( row[ 11 ] );  
         dst[ i ].setUserAim( row[ 12 ] );  
         dst[ i ].setUserYim( row[ 13 ] );  
         dst[ i ].setUserMsnm( row[ 14 ] );  
         dst[ i ].setPass( row[ 15 ] );  
         dst[ i ].setPosts( atoi( row[ 16 ] != NULL ? row[ 16 ] : "" ) );  
         dst[ i ].setAttachsig( atoi( row[ 17 ] != NULL ? row[ 17 ] : "" ) );  
         dst[ i ].setRank( atoi( row[ 18 ] != NULL ? row[ 18 ] : "" ) );  
         dst[ i ].setLevel( atoi( row[ 19 ] != NULL ? row[ 19 ] : "" ) );  
         dst[ i ].setTheme( row[ 20 ] );  
         dst[ i ].setTimezoneOffset( atof( row[ 21 ] ) );  
         dst[ i ].setLastLogin( atoi( row[ 22 ] != NULL ? row[ 22 ] : "" ) );  
         dst[ i ].setUmode( row[ 23 ] );  
         dst[ i ].setUorder( atoi( row[ 24 ] != NULL ? row[ 24 ] : "" ) );  
         dst[ i ].setNotifyMethod( atoi( row[ 25 ] != NULL ? row[ 25 ] : "" ) );  
         dst[ i ].setNotifyMode( atoi( row[ 26 ] != NULL ? row[ 26 ] : "" ) );  
         dst[ i ].setUserOcc( row[ 27 ] );  
         dst[ i ].setBio( row[ 28 ] );  
         dst[ i ].setUserIntrest( row[ 29 ] );  
         dst[ i ].setUserMailok( atoi( row[ 30 ] != NULL ? row[ 30 ] : "" ) );  
         dst[ i ].setActivate( atoi( row[ 31 ] != NULL ? row[ 31 ] : "" ) );  
         dst[ i ].setAddress( row[ 32 ] );  
         dst[ i ].setDivision( row[ 33 ] );  
         dst[ i ].setTel( row[ 34 ] );  
         dst[ i ].setCompanyName( row[ 35 ] );  
         dst[ i ].setCountry( row[ 36 ] );  
         dst[ i ].setZipcode( row[ 37 ] );  
         dst[ i ].setFax( row[ 38 ] );  
         dst[ i ].setBaseURL( row[ 39 ] );  
         dst[ i ].setNoticeMail( atoi( row[ 40 ] != NULL ? row[ 40 ] : "" ) );  
         dst[ i ].setNoticeMailSince( atoi( row[ 41 ] != NULL ? row[ 41 ] : "" ) );  
         ( *accountsLen )++;  
     }  
     while( row = fp_mysql_fetch_row(result) );  
     fp_mysql_free_result( result );  
     *accounts = dst;  
 #ifdef USE_SYSLOG  
     syslog( LOG_DEBUG, "return RES_OK" );  
     closelog( );  
 #endif  
     return RES_OK;  
840  }  }
841    
842  /**  /**
# Line 670  result_t getAccounts( sessionid_t sid, c Line 856  result_t getAccounts( sessionid_t sid, c
856   */   */
857  result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid )  result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid )
858  {  {
859      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
860      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
861            
862      string sql;      string sql;
863      string tmp;      string tmp;
864      char buf[ 12 ];      char buf[ 12 ];
865        SQLRETURN sqlcode;
866        result_t ret = RES_ERROR;
867            
868      //xoopsのユーザテーブルに書き込む      //xoopsのユーザテーブルに書き込む
869      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 (";      SQLCHAR uname[ACCOUNT_UNAME_LEN], name[ACCOUNT_NAME_LEN], email[ACCOUNT_EMAIL_LEN], url[ACCOUNT_URL_LEN], user_avatar[ACCOUNT_USER_AVATAR_LEN], user_icq[ACCOUNT_USER_ICQ_LEN], user_from[ACCOUNT_USER_FROM_LEN], user_sig[ACCOUNT_USER_SIG_LEN], actkey[ACCOUNT_ACTKEY_LEN], user_aim[ACCOUNT_USER_AIM_LEN], user_yim[ACCOUNT_USER_YIM_LEN], user_msnm[ACCOUNT_USER_MSNM_LEN], pass[ACCOUNT_PASS_LEN], theme[ACCOUNT_THEME_LEN], umode[ACCOUNT_UMODE_LEN], user_occ[ACCOUNT_USER_OCC_LEN], bio[ACCOUNT_BIO_LEN], user_intrest[ACCOUNT_USER_INTREST_LEN];
870      sql += "'" + string( addSlashes( account -> getUname( ) ) ) + "', ";      SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
871      sql += "'" + string( addSlashes( account -> getName( ) ) ) + "', ";      SQLDOUBLE timezone_offset;
872      sql += "'" + string( addSlashes( account -> getEmail( ) ) ) + "', ";      
873      sql += "'" + string( addSlashes( account -> getURL( ) ) ) + "', ";      SQLINTEGER cbUname = SQL_NTS, cbName = SQL_NTS, cbEmail = SQL_NTS, cbUrl = SQL_NTS, cbUser_avatar = SQL_NTS, cbUser_icq = SQL_NTS, cbUser_from = SQL_NTS, cbUser_sig = SQL_NTS, cbActkey = SQL_NTS, cbUser_aim = SQL_NTS, cbUser_yim = SQL_NTS, cbUser_msnm = SQL_NTS, cbPass = SQL_NTS, cbTheme = SQL_NTS, cbUmode = SQL_NTS, cbUser_occ = SQL_NTS, cbBio = SQL_NTS, cbUser_intrest = SQL_NTS;
874      sql += "'" + string( addSlashes( account -> getUserAvatar( ) ) ) + "', ";      SQLINTEGER cbUser_regdate = 0, cbUser_viewemail = 0, cbPosts = 0, cbAttachsig = 0, cbRank = 0, cbLevel = 0, cbLast_login = 0, cbUorder = 0, cbNotify_method = 0, cbNotify_mode = 0, cbUser_mailok = 0, cbTimezone_offset = 0;
875      snprintf( buf, 12, "%d", time( NULL ) );  
876      sql += string( buf ) + ", ";      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
877      sql += "'" + string( addSlashes( account -> getUserIcq( ) ) ) + "', ";          string sql;
878      sql += "'" + string( addSlashes( account -> getUserFrom( ) ) ) + "', ";          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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
879      sql += "'" + string( addSlashes( account -> getUserSig( ) ) ) + "', ";          sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
880      snprintf( buf, 12, "%d", account -> getUserViewemail( ) );          if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
881      sql += string( buf ) + ", ";              SQLBindParameter(hstmt,  1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
882      sql += "'" + string( addSlashes( account -> getActkey( ) ) ) + "', ";              SQLBindParameter(hstmt,  2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
883      sql += "'" + string( addSlashes( account -> getUserAim( ) ) ) + "', ";              SQLBindParameter(hstmt,  3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
884      sql += "'" + string( addSlashes( account -> getUserYim( ) ) ) + "', ";              SQLBindParameter(hstmt,  4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
885      sql += "'" + string( addSlashes( account -> getUserMsnm( ) ) ) + "', ";              SQLBindParameter(hstmt,  5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
886      sql += "'" + string( addSlashes( account -> getPass( ) ) ) + "', ";              SQLBindParameter(hstmt,  6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
887      snprintf( buf, 12, "%d", account -> getPosts( ) );              SQLBindParameter(hstmt,  7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
888      sql += string( buf ) + ", ";              SQLBindParameter(hstmt,  8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
889      snprintf( buf, 12, "%d", account -> getAttachsig( ) );              SQLBindParameter(hstmt,  9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
890      sql += string( buf ) + ", ";              SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
891      snprintf( buf, 12, "%d", account -> getRank( ) );              SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
892      sql += string( buf ) + ", ";              SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
893      snprintf( buf, 12, "%d", account -> getLevel( ) );              SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
894      sql += string( buf ) + ", ";              SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
895      sql += "'" + string( addSlashes( account -> getTheme( ) ) ) + "', ";              SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
896      snprintf( buf, 12, "%lf", account -> getTimezoneOffset( ) );              SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
897      sql += string( buf ) + ", ";              SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
898      sql += "0, "; //last login              SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
899      sql += "'" + string( addSlashes( account -> getUmode( ) ) ) + "', ";              SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
900      snprintf( buf, 12, "%d", account -> getUorder( ) );              SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
901      sql += string( buf ) + ", ";              SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
902      snprintf( buf, 12, "%d", account -> getNotifyMethod( ) );              SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
903      sql += string( buf ) + ", ";              SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
904      snprintf( buf, 12, "%d", account -> getNotifyMode( ) );              SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
905      sql += string( buf ) + ", ";              SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
906      sql += "'" + string( addSlashes( account -> getUserOcc( ) ) ) + "', ";              SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
907      sql += "'" + string( addSlashes( account -> getBio( ) ) ) + "', ";              SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
908      sql += "'" + string( addSlashes( account -> getUserIntrest( ) ) ) + "', ";              SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
909      snprintf( buf, 12, "%d", account -> getUserMailok( ) );              SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
910      sql += string( buf ) + ")";              SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
911      if( fp_mysql_query( mysql, sql.c_str( ) ) ){  
912          fprintf( stderr, "%s\n", sql.c_str( ) );              strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
913          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );              strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
914          return RES_DB_QUERY_ERROR;              strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
915                strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
916                strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
917                user_regdate = time( NULL );
918                strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
919                strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
920                strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
921                user_viewemail = account -> getUserViewemail( );
922                strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
923                strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
924                strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
925                strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
926                strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
927                posts = account -> getPosts( );
928                attachsig = account -> getAttachsig( );
929                rank = account -> getRank( );
930                level = account -> getLevel( );
931                strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
932                timezone_offset = account -> getTimezoneOffset( );
933                last_login = 0;
934                strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
935                uorder = account -> getUorder( );
936                notify_method = account -> getNotifyMethod( );
937                notify_mode = account -> getNotifyMode( );
938                strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
939                strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
940                strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
941                user_mailok = account -> getUserMailok( );
942    
943                if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
944                    SQLINTEGER count = 0;
945                    if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
946                        //ユーザIDを取得する
947                        SQLHANDLE hstmt2 = NULL;
948                        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
949                            sql = "SELECT LAST_INSERT_ID()"; // MySQL
950                            // sql = "SELECT LAST_INSERT_ROWID()"; // SQLite
951                            if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
952                                SQLUINTEGER last_insert_id;
953                                SQLINTEGER len;
954                                SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len );
955                                if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){
956                                    *uid = last_insert_id;
957                                    ret = RES_OK;
958                                }else{
959                                    ret = RES_DB_QUERY_ERROR;
960                                    string s( "SQLFetch in insertAccount " );
961                                    s += odbcDiagString( hstmt, sqlcode );
962                                    setLastErrorString( s.c_str( ) );
963                                }
964                            }else{
965                                string s( "SQLExecDirect in insertAccount " );
966                                s += odbcDiagString( hstmt, sqlcode );
967                                setLastErrorString( s.c_str( ) );
968                                ret = RES_DB_QUERY_ERROR;
969                            }
970                            SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
971                        }
972                    }else{
973                        string s( "SQLRowCount in insertAccount sql=" );
974                        s += string( sql );
975                        setLastErrorString( s.c_str( ) );
976                        ret = RES_DB_QUERY_ERROR;
977                    }
978                }else{
979                    string s( "SQLExecute in insertAccount " );
980                    s += odbcDiagString( hstmt, sqlcode );
981                    setLastErrorString( s.c_str( ) );
982                    ret = RES_DB_QUERY_ERROR;
983                }
984            }else{
985                string s( "SQLPrepare in insertAccount " );
986                s += odbcDiagString( hstmt, sqlcode );
987                setLastErrorString( s.c_str( ) );
988                ret = RES_ERROR;
989            }
990            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
991        }else{
992            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
993            ret = RES_ERROR;
994      }      }
995            
     //ユーザIDを取得する  
     *uid = fp_mysql_insert_id( mysql );  
       
996      //vpaccountのユーザテーブルに残りの情報を書き込む      //vpaccountのユーザテーブルに残りの情報を書き込む
997      sql = "INSERT INTO " + dbprefix + "_vpaccount_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, base_url, notice_mail, notice_mail_since) VALUES (";      SQLUINTEGER activate;
998      snprintf( buf, 12, "%d", *uid );      SQLCHAR address[VP_ACCOUNT_ADDRESS_LEN+1];
999      sql += string( buf ) + ", ";      SQLCHAR division[VP_ACCOUNT_DIVISION_LEN+1];
1000      if( account -> getActivate() ){      SQLCHAR tel[VP_ACCOUNT_TEL_LEN+1];
1001          sql += "1, ";      SQLCHAR company_name[VP_ACCOUNT_COMPANY_NAME_LEN+1];
1002      }else{      SQLCHAR country[VP_ACCOUNT_COUNTRY_LEN+1];
1003          sql += "0, ";      SQLCHAR zipcode[VP_ACCOUNT_ZIPCODE_LEN+1];
1004      }      SQLCHAR fax[VP_ACCOUNT_FAX_LEN+1];
1005      sql += "'" + string( addSlashes( account -> getAddress() ) ) + "', ";      SQLCHAR base_url[VP_ACCOUNT_BASE_URL_LEN+1];
1006      sql += "'" + string( addSlashes( account -> getDivision() ) ) + "', ";      SQLINTEGER cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS, cbBase_url = SQL_NTS;
1007      sql += "'" + string( addSlashes( account -> getTel() ) ) + "', ";      SQLINTEGER cbUid = 0, cbActivate = 0, cbNotice_mail = 0, cbNotice_mail_since = 0;
1008      sql += "'" + string( addSlashes( account -> getCompanyName() ) ) + "', ";      SQLUINTEGER notice_mail;
1009      sql += "'" + string( addSlashes( account -> getCountry() ) ) + "', ";      SQLUINTEGER notice_mail_since;
1010      sql += "'" + string( addSlashes( account -> getZipcode() ) ) + "', ";      if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1011      sql += "'" + string( addSlashes( account -> getFax() ) ) + "', ";          string sql;
1012      sql += "'" + string( addSlashes( account -> getBaseURL() ) ) + "', ";          sql = "INSERT INTO " + dbprefix + "_vpaccount_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, base_url, notice_mail, notice_mail_since) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";
1013      snprintf( buf, 12, "%d", account -> getNoticeMail( ) );          sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1014      sql += string( buf ) + ", ";          if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1015      snprintf( buf, 12, "%d", account -> getNoticeMailSince( ) );              SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, uid, 0, &cbUid);
1016      sql += string( buf ) + ")";              SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate);
1017      if( fp_mysql_query( mysql, sql.c_str( ) ) ){              SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1018          fprintf( stderr, "%s\n", sql.c_str( ) );              SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1019          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );              SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1020          //xoops_usersへinsertしたレコードを削除する              SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1021          sql = "DELETE FROM " + dbprefix + "_users where uid=";              SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1022          snprintf( buf, 12, "%d", *uid );              SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1023          sql += string( buf );              SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1024          fp_mysql_query( mysql, sql.c_str( ) );              SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url);
1025          return RES_DB_QUERY_ERROR;              SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &cbNotice_mail);
1026                SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &cbNotice_mail_since);
1027                
1028                activate = account -> getActivate() ? 1 : 0;
1029                strncpy2( (char*)address, account -> getAddress(), VP_ACCOUNT_ADDRESS_LEN );
1030                strncpy2( (char*)division, account -> getDivision(), VP_ACCOUNT_DIVISION_LEN );
1031                strncpy2( (char*)tel, account -> getTel(), VP_ACCOUNT_TEL_LEN );
1032                strncpy2( (char*)company_name, account -> getCompanyName(), VP_ACCOUNT_COMPANY_NAME_LEN );
1033                strncpy2( (char*)country, account -> getCountry(), VP_ACCOUNT_COUNTRY_LEN );
1034                strncpy2( (char*)zipcode, account -> getZipcode(), VP_ACCOUNT_ZIPCODE_LEN );
1035                strncpy2( (char*)fax, account -> getFax(), VP_ACCOUNT_FAX_LEN );
1036                strncpy2( (char*)base_url, account -> getBaseURL(), VP_ACCOUNT_BASE_URL_LEN );
1037                notice_mail = account -> getNoticeMail( );
1038                notice_mail_since = account -> getNoticeMailSince( );
1039                
1040                if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1041                    SQLINTEGER count = 0;
1042                    if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1043                        ret = RES_OK;
1044                    }else{
1045                        string s( "SQLRowCount in insertAccount sql=" );
1046                        s += string( sql );
1047                        setLastErrorString( s.c_str( ) );
1048                        ret = RES_DB_QUERY_ERROR;
1049                    }
1050                }else{
1051                    string s( "SQLExecute in insertAccount " );
1052                    s += odbcDiagString( hstmt, sqlcode );
1053                    setLastErrorString( s.c_str( ) );
1054                    ret = RES_DB_QUERY_ERROR;
1055                }
1056            }else{
1057                //xoops_usersへinsertしたレコードを削除する
1058                sql = "DELETE FROM " + dbprefix + "_users where uid=";
1059                snprintf( buf, 12, "%d", *uid );
1060                sql += string( buf );
1061                SQLHANDLE hstmt2 = NULL;
1062                if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1063                    SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1064                    SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1065                }
1066                string s( "SQLExecDirect in insertAccount sql=" );
1067                s += string( sql );
1068                setLastErrorString( s.c_str( ) );
1069                ret = RES_DB_QUERY_ERROR;
1070            }
1071            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1072        }else{
1073            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1074            ret = RES_ERROR;
1075      }      }
1076            
1077      return RES_OK;      return ret;
1078  }  }
1079    
1080  /**  /**
# Line 781  result_t insertAccount( sessionid_t sid, Line 1094  result_t insertAccount( sessionid_t sid,
1094   */   */
1095  result_t updateAccount( sessionid_t sid, const account_t* account )  result_t updateAccount( sessionid_t sid, const account_t* account )
1096  {  {
1097      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1098      if( account == NULL ) return RES_ERROR;      if( account == NULL ) return RES_ERROR;
1099      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1100      if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;      if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;
1101            SQLRETURN sqlcode;
1102      string sql;      result_t ret = RES_ERROR;
     string tmp;  
     char buf[ 12 ];  
1103            
1104      //xoopsのユーザテーブルに書き込む      //xoopsのユーザテーブルに書き込む
1105      sql = "UPDATE " + dbprefix + "_users SET ";      SQLCHAR uname[ACCOUNT_UNAME_LEN], name[ACCOUNT_NAME_LEN], email[ACCOUNT_EMAIL_LEN], url[ACCOUNT_URL_LEN], user_avatar[ACCOUNT_USER_AVATAR_LEN], user_icq[ACCOUNT_USER_ICQ_LEN], user_from[ACCOUNT_USER_FROM_LEN], user_sig[ACCOUNT_USER_SIG_LEN], actkey[ACCOUNT_ACTKEY_LEN], user_aim[ACCOUNT_USER_AIM_LEN], user_yim[ACCOUNT_USER_YIM_LEN], user_msnm[ACCOUNT_USER_MSNM_LEN], pass[ACCOUNT_PASS_LEN], theme[ACCOUNT_THEME_LEN], umode[ACCOUNT_UMODE_LEN], user_occ[ACCOUNT_USER_OCC_LEN], bio[ACCOUNT_BIO_LEN], user_intrest[ACCOUNT_USER_INTREST_LEN];
1106      sql += "uname='" + string( addSlashes( account -> getUname( ) ) ) + "', ";      SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1107      sql += "name='" + string( addSlashes( account -> getName( ) ) ) + "', ";      SQLDOUBLE timezone_offset;
1108      sql += "email='" + string( addSlashes( account -> getEmail( ) ) ) + "', ";      
1109      sql += "url='" + string( addSlashes( account -> getURL( ) ) ) + "', ";      SQLINTEGER cbUname = SQL_NTS, cbName = SQL_NTS, cbEmail = SQL_NTS, cbUrl = SQL_NTS, cbUser_avatar = SQL_NTS, cbUser_icq = SQL_NTS, cbUser_from = SQL_NTS, cbUser_sig = SQL_NTS, cbActkey = SQL_NTS, cbUser_aim = SQL_NTS, cbUser_yim = SQL_NTS, cbUser_msnm = SQL_NTS, cbPass = SQL_NTS, cbTheme = SQL_NTS, cbUmode = SQL_NTS, cbUser_occ = SQL_NTS, cbBio = SQL_NTS, cbUser_intrest = SQL_NTS;
1110      sql += "user_avatar='" + string( addSlashes( account -> getUserAvatar( ) ) ) + "', ";      SQLINTEGER cbUid = 0, cbUser_regdate = 0, cbUser_viewemail = 0, cbPosts = 0, cbAttachsig = 0, cbRank = 0, cbLevel = 0, cbLast_login = 0, cbUorder = 0, cbNotify_method = 0, cbNotify_mode, cbUser_mailok = 0, cbTimezone_offset = 0;
1111      sql += "user_regdate=" + string( intToString( account -> getUserRegdate( ) ) ) + ", ";  
1112      sql += "user_icq='" + string( addSlashes( account -> getUserIcq( ) ) ) + "', ";      SQLUINTEGER activate;
1113      sql += "user_from='" + string( addSlashes( account -> getUserFrom( ) ) ) + "', ";      SQLCHAR address[VP_ACCOUNT_ADDRESS_LEN+1];
1114      sql += "user_sig='" + string( addSlashes( account -> getUserSig( ) ) ) + "', ";      SQLCHAR division[VP_ACCOUNT_DIVISION_LEN+1];
1115      sql += "user_viewemail=" + string( intToString( account -> getUserViewemail( ) ) ) + ", ";      SQLCHAR tel[VP_ACCOUNT_TEL_LEN+1];
1116      sql += "actkey='" + string( addSlashes( account -> getActkey( ) ) ) + "', ";      SQLCHAR company_name[VP_ACCOUNT_COMPANY_NAME_LEN+1];
1117      sql += "user_aim='" + string( addSlashes( account -> getUserAim( ) ) ) + "', ";      SQLCHAR country[VP_ACCOUNT_COUNTRY_LEN+1];
1118      sql += "user_yim='" + string( addSlashes( account -> getUserYim( ) ) ) + "', ";      SQLCHAR zipcode[VP_ACCOUNT_ZIPCODE_LEN+1];
1119      sql += "user_msnm='" + string( addSlashes( account -> getUserMsnm( ) ) ) + "', ";      SQLCHAR fax[VP_ACCOUNT_FAX_LEN+1];
1120      sql += "pass='" + string( account -> getPass( ) ) + "', ";      SQLCHAR base_url[VP_ACCOUNT_BASE_URL_LEN+1];
1121      sql += "posts=" + string( intToString( account -> getPosts( ) ) ) + ", ";      SQLINTEGER cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS, cbBase_url = SQL_NTS;
1122      sql += "attachsig=" + string( intToString( account -> getAttachsig( ) ) ) + ", ";      SQLUINTEGER notice_mail;
1123      sql += "rank=" + string( intToString( account -> getRank( ) ) ) + ", ";      SQLUINTEGER notice_mail_since;
1124      sql += "level=" + string( intToString( account -> getLevel( ) ) ) + ", ";      SQLINTEGER len = 0;
1125      sql += "theme='" + string( addSlashes( account -> getTheme( ) ) ) + "', ";  
1126      snprintf( buf, 12, "%.2f", account -> getTimezoneOffset( ) );      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1127      sql += "timezone_offset=" + string( buf ) + ", ";          string sql;
1128      sql += "last_login=" + string( unsignedIntToString( account -> getLastLogin( ) ) ) + ", ";  
1129      sql += "umode='" + string( account -> getUmode( ) ) + "', ";          sql = "UPDATE " + dbprefix + "_users SET ";
1130      sql += "uorder=" + string( intToString( account -> getUorder( ) ) ) + ", ";          sql += "uname=?, ";
1131      sql += "notify_method=" + string( intToString( account -> getNotifyMethod( ) ) ) + ", ";          sql += "name=?, ";
1132      sql += "notify_mode=" + string( intToString( account -> getNotifyMode( ) ) ) + ", ";          sql += "email=?, ";
1133      sql += "user_occ='" + string( addSlashes( account -> getUserOcc( ) ) ) + "', ";          sql += "url=?, ";
1134      sql += "bio='" + string( addSlashes( account -> getBio( ) ) ) + "', ";          sql += "user_avatar=?, ";
1135      sql += "user_intrest='" + string( addSlashes( account -> getUserIntrest( ) ) ) + "', ";          sql += "user_regdate=?, ";
1136      sql += "user_mailok=" + string( intToString( account -> getUserMailok( ) ) );          sql += "user_icq=?, ";
1137      sql += " WHERE uid = " + string( intToString( account -> getUID( ) ) );          sql += "user_from=?, ";
1138                sql += "user_sig=?, ";
1139      if( fp_mysql_query( mysql, sql.c_str( ) ) ){          sql += "user_viewemail=?, ";
1140          fprintf( stderr, "%s\n", sql.c_str( ) );          sql += "actkey=?, ";
1141          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          sql += "user_aim=?, ";
1142          return RES_DB_QUERY_ERROR;          sql += "user_yim=?, ";
1143            sql += "user_msnm=?, ";
1144            sql += "pass=?, ";
1145            sql += "posts=?, ";
1146            sql += "attachsig=?, ";
1147            sql += "rank=?, ";
1148            sql += "level=?, ";
1149            sql += "theme=?, ";
1150            sql += "timezone_offset=?, ";
1151            sql += "last_login=?, ";
1152            sql += "umode=?, ";
1153            sql += "uorder=?, ";
1154            sql += "notify_method=?, ";
1155            sql += "notify_mode=?, ";
1156            sql += "user_occ=?, ";
1157            sql += "bio=?, ";
1158            sql += "user_intrest=?, ";
1159            sql += "user_mailok=? ";
1160            sql += " WHERE uid = ?";
1161            
1162            sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1163            if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1164                SQLBindParameter(hstmt,  1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1165                SQLBindParameter(hstmt,  2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1166                SQLBindParameter(hstmt,  3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1167                SQLBindParameter(hstmt,  4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1168                SQLBindParameter(hstmt,  5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1169                SQLBindParameter(hstmt,  6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1170                SQLBindParameter(hstmt,  7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1171                SQLBindParameter(hstmt,  8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1172                SQLBindParameter(hstmt,  9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1173                SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1174                SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1175                SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1176                SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1177                SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1178                SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1179                SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1180                SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1181                SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1182                SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1183                SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1184                SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1185                SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1186                SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1187                SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1188                SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1189                SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1190                SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1191                SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1192                SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1193                SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1194                SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1195    
1196                strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1197                strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1198                strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1199                strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1200                strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1201                user_regdate = time( NULL );
1202                strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1203                strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1204                strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1205                user_viewemail = account -> getUserViewemail( );
1206                strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1207                strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1208                strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1209                strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1210                strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1211                posts = account -> getPosts( );
1212                attachsig = account -> getAttachsig( );
1213                rank = account -> getRank( );
1214                level = account -> getLevel( );
1215                strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1216                timezone_offset = account -> getTimezoneOffset( );
1217                last_login = 0;
1218                strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1219                uorder = account -> getUorder( );
1220                notify_method = account -> getNotifyMethod( );
1221                notify_mode = account -> getNotifyMode( );
1222                strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1223                strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1224                strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1225                user_mailok = account -> getUserMailok( );
1226                uid = account -> getUID( );
1227                
1228                if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1229                    SQLINTEGER count = 0;
1230                    if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1231                        ret = RES_OK;
1232                    }else{
1233                        string s( "SQLRowCount in updateAccount sql=" );
1234                        s += string( sql );
1235                        setLastErrorString( s.c_str( ) );
1236                        ret = RES_DB_QUERY_ERROR;
1237                    }
1238                }else{
1239                    string s( "SQLExecute in updateAccount " );
1240                    s += odbcDiagString( hstmt, sqlcode );
1241                    setLastErrorString( s.c_str( ) );
1242                    ret = RES_DB_QUERY_ERROR;
1243                }
1244            }else{
1245                setLastErrorString( "SQLPrepare in updateAccount sql=" );
1246                ret = RES_ERROR;
1247            }
1248            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1249        }else{
1250            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1251            ret = RES_ERROR;
1252      }      }
1253            
1254      //vpaccountのユーザテーブルに残りの情報を上書きする      //vpaccountのユーザテーブルに残りの情報を上書きする
1255      sql = "UPDATE " + dbprefix + "_vpaccount_users SET ";      if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1256      sql += "activate=";          string sql;
1257      if( account -> getActivate() ){  
1258          sql += "1, ";          sql = "UPDATE " + dbprefix + "_vpaccount_users SET ";
1259      }else{          sql += "activate=?, ";
1260          sql += "0, ";          sql += "address=?, ";
1261      }          sql += "division=?, ";
1262      sql += "address='" + string( addSlashes( account -> getAddress() ) ) + "', ";          sql += "tel=?, ";
1263      sql += "division='" + string( addSlashes( account -> getDivision() ) ) + "', ";          sql += "company_name=?, ";
1264      sql += "tel='" + string( addSlashes( account -> getTel() ) ) + "', ";          sql += "country=?, ";
1265      sql += "company_name='" + string( addSlashes( account -> getCompanyName() ) ) + "', ";          sql += "zipcode=?, ";
1266      sql += "country='" + string( addSlashes( account -> getCountry() ) ) + "', ";          sql += "fax=?, ";
1267      sql += "zipcode='" + string( addSlashes( account -> getZipcode() ) ) + "', ";          sql += "base_url=?, ";
1268      sql += "fax='" + string( addSlashes( account -> getFax() ) ) + "', ";          sql += "notice_mail=?, ";
1269      sql += "base_url='" + string( addSlashes( account -> getBaseURL() ) ) + "', ";          sql += "notice_mail_since=? ";
1270      sql += "notice_mail=" + string( intToString( account -> getNoticeMail( ) ) ) + ", ";          sql += "WHERE uid=?";
1271      sql += "notice_mail_since=" + string( intToString( account -> getNoticeMailSince( ) ) );      
1272      sql += " WHERE uid = " + string( intToString( account -> getUID( ) ) );          sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1273                if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1274      if( fp_mysql_query( mysql, sql.c_str( ) ) ){              SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &len);
1275          fprintf( stderr, "%s\n", sql.c_str( ) );              SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1276          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );              SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1277          return RES_DB_QUERY_ERROR;              SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1278                SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1279                SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1280                SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1281                SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1282                SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url);
1283                SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &len);
1284                SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &len);
1285                SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1286                
1287                activate = account -> getActivate() ? 1 : 0;
1288                strncpy2( (char*)address, account -> getAddress( ) , VP_ACCOUNT_ADDRESS_LEN );
1289                strncpy2( (char*)division, account -> getDivision(), VP_ACCOUNT_DIVISION_LEN );
1290                strncpy2( (char*)tel, account -> getTel(), VP_ACCOUNT_TEL_LEN );
1291                strncpy2( (char*)company_name, account -> getCompanyName(), VP_ACCOUNT_COMPANY_NAME_LEN );
1292                strncpy2( (char*)country, account -> getCountry(), VP_ACCOUNT_COUNTRY_LEN );
1293                strncpy2( (char*)zipcode, account -> getZipcode(), VP_ACCOUNT_ZIPCODE_LEN );
1294                strncpy2( (char*)fax, account -> getFax(), VP_ACCOUNT_FAX_LEN );
1295                strncpy2( (char*)base_url, account -> getBaseURL(), VP_ACCOUNT_BASE_URL_LEN );
1296                notice_mail = account -> getNoticeMail( );
1297                notice_mail_since = account -> getNoticeMailSince( );
1298                uid = account -> getUID( );
1299                
1300                if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1301                    SQLINTEGER count = 0;
1302                    if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1303                        ret = RES_OK;
1304                    }else{
1305                        string s( "SQLRowCount in updateAccount sql=" );
1306                        s += string( sql );
1307                        setLastErrorString( s.c_str( ) );
1308                        ret = RES_DB_QUERY_ERROR;
1309                    }
1310                }else{
1311                    string s( "SQLExecute in updateAccount " );
1312                    s += odbcDiagString( hstmt, sqlcode );
1313                    setLastErrorString( s.c_str( ) );
1314                    ret = RES_DB_QUERY_ERROR;
1315                }
1316            }else{
1317                setLastErrorString( "SQLPrepare in updateAccount sql=" );
1318                ret = RES_ERROR;
1319            }
1320            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1321        }else{
1322            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1323            ret = RES_ERROR;
1324      }      }
1325            return ret;
     return RES_OK;  
1326  }  }
1327    
1328  /**  /**
# Line 878  result_t updateAccount( sessionid_t sid, Line 1343  result_t updateAccount( sessionid_t sid,
1343   */   */
1344  result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen )  result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen )
1345  {  {
1346      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1347      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1348            
1349      string sql;      result_t ret = RES_ERROR;
     MYSQL_RES* result;  
     MYSQL_ROW row;  
1350      userid_t* dst = 0;      userid_t* dst = 0;
1351            string sql;
1352        SQLRETURN sqlcode;
1353        SQLINTEGER count = 0;
1354                
1355    
1356      sql = "SELECT uid FROM " + dbprefix + "_vpaccount_users ";      sql = "SELECT uid FROM " + dbprefix + "_vpaccount_users ";
1357      sql += criteria2str( cri );      sql += criteria2str( cri );
1358      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1359          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          *uidsLen = count;
1360          return RES_DB_QUERY_ERROR;          dst = new userid_t[ *uidsLen ];
1361      }          *uids = dst;
1362      result = fp_mysql_store_result( mysql ) ;      }else{
1363      if( result == NULL ){          return RES_ERROR;
         fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );  
         return RES_DB_QUERY_ERROR;  
     }  
     *uidsLen = fp_mysql_num_rows( result );  
     dst = new userid_t[ *uidsLen ];  
     for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < *uidsLen ; i++ ){  
         dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );  
1364      }      }
1365      fp_mysql_free_result( result );      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1366      *uids = dst;          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1367                    userid_t uid;
1368      return RES_OK;              SQLINTEGER len = 0;
1369                SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1370    
1371                for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
1372                    dst[ i ] = uid;
1373                }
1374                
1375                ret = RES_OK;
1376            }else{
1377                string s( "SQLExecDirect in dumpUids " );
1378                s += odbcDiagString( hstmt, sqlcode );
1379                s += "sql=";
1380                s += string( sql );
1381                setLastErrorString( s.c_str( ) );
1382                ret = RES_DB_QUERY_ERROR;
1383            }
1384            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1385        }else{
1386            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in dumpUids " );
1387            ret = RES_DB_QUERY_ERROR;
1388        }
1389        return ret;
1390  }  }
1391    
1392  /**  /**
# Line 919  result_t dumpUids( sessionid_t sid, crit Line 1400  result_t dumpUids( sessionid_t sid, crit
1400   */   */
1401  int getGroupCount( sessionid_t sid )  int getGroupCount( sessionid_t sid )
1402  {  {
1403      if( mysql == NULL ) return 0;      if( hdbc == NULL ) return 0;
1404      if( !isValidSessionID( sid ) ) return 0;      if( !isValidSessionID( sid ) ) return 0;
1405            
1406        SQLRETURN sqlcode;
1407        SQLHANDLE hstmt = NULL;    
1408      string sql;      string sql;
1409      MYSQL_RES* result;      int ret = 0;
     MYSQL_ROW row;  
     int groupLen = 0;  
1410            
1411      //グループ数を求める      //グループ数を求める
1412      sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups";      sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups";
1413      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1414          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1415          return RES_DB_QUERY_ERROR;              SQLUINTEGER count = 0;
1416      }              SQLINTEGER len;
1417      result = fp_mysql_store_result( mysql ) ;              SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1418      if( row = fp_mysql_fetch_row(result) ){              if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1419          groupLen = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );                  ret = count;
1420                }else {
1421                    string s( "SQLFetch in getGroupCount sql=" );
1422                    s += string( sql );
1423                    setLastErrorString( s.c_str( ) );
1424                    ret = 0;
1425                }
1426            }else{
1427                setLastErrorString( "SQLExecDirect in getGroupCount" );
1428                ret = 0;
1429            }
1430            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1431        }else{
1432            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroupCount" );
1433            ret = 0;
1434      }      }
1435      fp_mysql_free_result( result );      return ret;
     return groupLen;  
1436  }  }
1437    
1438  /**  /**
# Line 960  int getGroupCount( sessionid_t sid ) Line 1454  int getGroupCount( sessionid_t sid )
1454   */   */
1455  result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )  result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1456  {  {
1457      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1458      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1459      if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック      if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック
1460            
1461        result_t ret = RES_ERROR;
1462      string sql;      string sql;
1463      MYSQL_RES* result;      SQLRETURN sqlcode;
1464      MYSQL_ROW row;      SQLHANDLE hstmt = NULL;    
1465        SQLINTEGER count = 0;
1466      groupid_t* dst = 0;      groupid_t* dst = 0;
1467      int len = 0;      int len = 0;
1468            
1469      //所属するグループの最大個数を求める      sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups_users_link";
     sql = "SELECT count(*) FROM " + dbprefix + "_vpaccount_groups_users_link";  
1470      sql += " WHERE uid=" + string( unsignedIntToString( uid ) );      sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1471      sql += criteria2str( cri );      sql += criteria2str( cri );
1472      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1473          fprintf( stderr, "%s\n", sql.c_str( ) );          *gidsLen = count;
1474          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          dst = new groupid_t[ *gidsLen ];
1475          return RES_DB_QUERY_ERROR;          *gids = dst;
1476      }      }else{
1477      result = fp_mysql_store_result( mysql ) ;          return RES_ERROR;
     if( row = fp_mysql_fetch_row(result) ){  
         len = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );  
1478      }      }
     fp_mysql_free_result( result );  
1479            
1480      sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link";      //所属するグループの最大個数を求める
1481      sql += " WHERE uid=" + string( unsignedIntToString( uid ) );      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1482      sql += criteria2str( cri );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1483      if( fp_mysql_query( mysql, sql.c_str( ) ) ){              if( count > 0 ){
1484          fprintf( stderr, "%s\n", sql.c_str( ) );                  SQLHANDLE hstmt2 = NULL;    
1485          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );                  if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1486          return RES_DB_QUERY_ERROR;                      sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link";
1487      }                      sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1488      *gidsLen = 0;                      sql += criteria2str( cri );
1489      dst = new groupid_t[ len ];                      if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1490      result = fp_mysql_store_result( mysql ) ;                          SQLINTEGER len;
1491      for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < len ; i++ ){                          groupid_t gid = 0;
1492          dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );                          SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
1493          ( *gidsLen )++;                          for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
1494                                dst[ i ] = gid;
1495                            }
1496                            ret = RES_OK;
1497                        }else{
1498                            string s( "SQLExecDirect in getGroupsByUid " );
1499                            s += odbcDiagString( hstmt, sqlcode );
1500                            s += string( ", sql=" ) + string( sql );
1501                            ret = RES_DB_QUERY_ERROR;
1502                        }
1503                    }else{
1504                        string s( "SQLAllocHandle in getGroupsByUid " );
1505                        s += odbcDiagString( hstmt, sqlcode );
1506                        s += string( ", sql=" ) + string( sql );
1507                        ret = RES_DB_QUERY_ERROR;
1508                    }
1509                }else{
1510                    ret = RES_OK;
1511                }
1512            }else{
1513                string s( "SQLExecDirect in getGroupsByUid " );
1514                s += odbcDiagString( hstmt, sqlcode );
1515                s += string( ", sql=" ) + string( sql );
1516                ret = RES_DB_QUERY_ERROR;
1517            }
1518        }else{
1519            string s( "SQLAllocHandle in getGroupsByUid " );
1520            setLastErrorString( s.c_str( ) );
1521            ret = RES_DB_QUERY_ERROR;
1522      }      }
1523      fp_mysql_free_result( result );      return ret;
     *gids = dst;  
       
     return RES_OK;  
1524  }  }
1525    
1526  /**  /**
# Line 1021  result_t getGroupsByUid( sessionid_t sid Line 1538  result_t getGroupsByUid( sessionid_t sid
1538   */   */
1539  bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )  bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )
1540  {  {
1541      if( mysql == NULL ) return false;      if( hdbc == NULL ) return false;
1542      if( !isValidSessionID( sid ) ) return false;      if( !isValidSessionID( sid ) ) return false;
1543      if( !uidExists( uid ) ) return false;      if( !uidExists( uid ) ) return false;
1544      if( !gidExists( gid ) ) return false;      if( !gidExists( gid ) ) return false;
1545            
1546        bool ret = false;
1547      string sql;      string sql;
1548      MYSQL_RES* result;      SQLRETURN sqlcode;
1549      MYSQL_ROW row;      SQLINTEGER count = 0;
     groupid_t* dst = 0;  
     result_t res;  
1550            
1551      sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups_users_link ";      sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups_users_link ";
1552      sql += "WHERE gid=" + string( unsignedIntToString( gid ) );      sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1553      sql += " AND uid=" + string( unsignedIntToString( uid ) );      sql += " AND uid=" + string( unsignedIntToString( uid ) );
1554      sql += " AND is_admin=1";      sql += " AND is_admin=1";
1555      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1556          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( count > 0 ){
1557          return false;              ret = true;
1558      }          }else{
1559      result = fp_mysql_store_result( mysql );              ret = false;
1560      if( !fp_mysql_fetch_row(result) ){          }
1561          fp_mysql_free_result( result );      }else{
1562          return false;          ret = false;
1563      }      }
1564            return ret;
     fp_mysql_free_result( result );  
     return true;;  
1565  }  }
1566    
1567  /**  /**
# Line 1067  bool isGroupAdmin( sessionid_t sid, grou Line 1581  bool isGroupAdmin( sessionid_t sid, grou
1581   */   */
1582  result_t dumpGids( sessionid_t sid, criteria_t* cri, groupid_t** gids, int* gidsLen )  result_t dumpGids( sessionid_t sid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1583  {  {
1584      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1585      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1586            
1587      string sql;      result_t ret = RES_ERROR;
     MYSQL_RES* result;  
     MYSQL_ROW row;  
1588      groupid_t* dst = 0;      groupid_t* dst = 0;
       
     sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups ";  
     sql += criteria2str( cri );  
     if( fp_mysql_query( mysql, sql.c_str( ) ) ){  
         fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );  
         return RES_DB_QUERY_ERROR;  
     }  
     result = fp_mysql_store_result( mysql ) ;  
     if( result == NULL ){  
         fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );  
         return RES_DB_QUERY_ERROR;  
     }  
     *gidsLen = fp_mysql_num_rows( result );  
     dst = new groupid_t[ *gidsLen ];  
     for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < *gidsLen ; i++ ){  
         dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );  
     }  
     fp_mysql_free_result( result );  
     *gids = dst;  
       
     return RES_OK;  
 /*  
     if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;  
     if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;  
       
1589      string sql;      string sql;
1590      MYSQL_RES* result;      SQLRETURN sqlcode;
1591      MYSQL_ROW row;      SQLINTEGER count = 0;
1592      groupid_t* dst = 0;              
1593            sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups ";
     //グループ数を求める  
     sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups ";  
1594      sql += criteria2str( cri );      sql += criteria2str( cri );
1595      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1596          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          *gidsLen = count;
         return RES_DB_QUERY_ERROR;  
     }  
     result = fp_mysql_store_result( mysql ) ;  
     if( row = fp_mysql_fetch_row(result) ){  
         *gidsLen = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );  
1597          dst = new groupid_t[ *gidsLen ];          dst = new groupid_t[ *gidsLen ];
1598            *gids = dst;
1599      }else{      }else{
         fp_mysql_free_result( result );  
1600          return RES_ERROR;          return RES_ERROR;
1601      }      }
     fp_mysql_free_result( result );  
       
     sql = "SELECT gid, gname, gdesc FROM " + dbprefix + "_vpaccount_groups ";  
     sql += criteria2str( cri );  
     if( fp_mysql_query( mysql, sql.c_str( ) ) ){  
         fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );  
         return RES_DB_QUERY_ERROR;  
     }  
1602            
1603      result = fp_mysql_use_result( mysql ) ;      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1604      for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < *gidsLen ; i++ ){          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1605          dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );              groupid_t gid;
1606                SQLINTEGER len = 0;
1607                SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
1608                for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
1609                    dst[ i ] = gid;
1610                }
1611                
1612                ret = RES_OK;
1613            }else{
1614                string s( "SQLExecDirect in dumpGids " );
1615                s += odbcDiagString( hstmt, sqlcode );
1616                s += "sql=";
1617                s += string( sql );
1618                setLastErrorString( s.c_str( ) );
1619                ret = RES_DB_QUERY_ERROR;
1620            }
1621            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1622      }      }
1623      fp_mysql_free_result( result );      return ret;
     *gids = dst;  
       
     return RES_OK;  
 */  
1624  }  }
1625    
1626  /**  /**
# Line 1158  result_t dumpGids( sessionid_t sid, crit Line 1642  result_t dumpGids( sessionid_t sid, crit
1642   */   */
1643  result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )  result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1644  {  {
1645      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1646      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1647            
1648        result_t ret = RES_ERROR;
1649        groupid_t* dst = 0;
1650      string sql;      string sql;
1651      MYSQL_RES* result;      SQLRETURN sqlcode;
1652      MYSQL_ROW row;      SQLINTEGER count = 0;
1653      userid_t* dst = 0;              
       
1654      sql = "SELECT uid FROM " + dbprefix + "_vpaccount_groups_users_link ";      sql = "SELECT uid FROM " + dbprefix + "_vpaccount_groups_users_link ";
1655      sql += " WHERE is_admin=1";      sql += " WHERE is_admin=1 and gid=" + unsignedIntToString( gid );
1656      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1657          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          *uidsLen = count;
1658          return RES_DB_QUERY_ERROR;          *uids = new groupid_t[ *uidsLen ];
1659      }      }else{
1660                return RES_ERROR;
     result = fp_mysql_store_result( mysql );  
     if( result == NULL ){  
         fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );  
         return RES_DB_QUERY_ERROR;  
1661      }      }
1662            if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1663      *uidsLen = fp_mysql_num_rows( result );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1664      dst = new userid_t[ *uidsLen ];              userid_t uid;
1665      for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < *uidsLen ; i++ ){              SQLINTEGER len = 0;
1666          dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );              SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1667                for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
1668                    (*uids)[ i ] = uid;
1669                }
1670                ret = RES_OK;
1671            }else{
1672                string s( "SQLExecDirect in dumpGroupAdmins " );
1673                s += odbcDiagString( hstmt, sqlcode );
1674                s += "sql=";
1675                s += string( sql );
1676                setLastErrorString( s.c_str( ) );
1677                ret = RES_DB_QUERY_ERROR;
1678            }
1679            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1680      }      }
1681      fp_mysql_free_result( result );      return ret;
     *uids = dst;  
       
     return RES_OK;  
1682  }  }
1683    
1684  /**  /**
# Line 1208  result_t dumpGroupAdmins( sessionid_t si Line 1699  result_t dumpGroupAdmins( sessionid_t si
1699   */   */
1700  result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )  result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )
1701  {  {
1702      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1703      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1704      if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック      if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック
1705      if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gidの存在をチェック      if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gidの存在をチェック
1706            
1707        result_t ret = RES_ERROR;
1708      string sql;      string sql;
1709        SQLRETURN sqlcode;
1710        SQLHANDLE hstmt = NULL;
1711            
1712      sql = "DELETE FROM " + dbprefix + "_vpaccount_groups_users_link ";      sql = "DELETE FROM " + dbprefix + "_vpaccount_groups_users_link ";
1713      sql += "WHERE gid=" + string( unsignedIntToString( gid ) );      sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1714      sql += " AND uid=" + string( unsignedIntToString( uid ) );      sql += " AND uid=" + string( unsignedIntToString( uid ) );
1715      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1716          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1717          return RES_DB_QUERY_ERROR;              SQLINTEGER count = 0;
1718                if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1719                    ret = RES_OK;
1720                }else{
1721                    string s( "SQLRowCount in deleteMember" );
1722                    s += odbcDiagString( hstmt, sqlcode );
1723                    s += string( ", sql=" ) + string( sql );
1724                    setLastErrorString( s.c_str( ) );
1725                    ret = RES_NO_SUCH_USER;
1726                }
1727            }else{
1728                string s( "SQLExecDirect in deleteMember" );
1729                s += odbcDiagString( hstmt, sqlcode );
1730                s += ", sql=";
1731                s += string( sql );
1732                setLastErrorString( s.c_str( ) );
1733                ret = RES_DB_QUERY_ERROR;
1734            }
1735            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1736        }else{
1737            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteMember" );
1738            ret = RES_ERROR;
1739      }      }
1740      return RES_OK;      return ret;
1741  }  }
1742    
1743  /**  /**
# Line 1244  result_t deleteMember( sessionid_t sid, Line 1759  result_t deleteMember( sessionid_t sid,
1759   */   */
1760  result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid, bool admin )  result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid, bool admin )
1761  {  {
1762      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1763      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1764      if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック      if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック
1765      if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gidの存在をチェック      if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gidの存在をチェック
1766            
1767        result_t ret = RES_ERROR;
1768      string sql;      string sql;
1769      MYSQL_RES* result;      SQLRETURN sqlcode;
     MYSQL_ROW row;  
     groupid_t* dst = 0;  
     result_t res;  
1770            
1771      //メンバーを追加      //メンバーを追加
1772      sql = "INSERT INTO " + dbprefix + "_vpaccount_groups_users_link ( gid, uid, is_admin ) VALUES (";      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1773      sql += string( unsignedIntToString( gid ) ) + ", ";          sql = "INSERT INTO " + dbprefix + "_vpaccount_groups_users_link ( gid, uid, is_admin ) VALUES (";
1774      sql += string( unsignedIntToString( uid ) ) + ", ";          sql += string( unsignedIntToString( gid ) ) + ", ";
1775      sql += string( admin ? "1" : "0" ) + ") ";          sql += string( unsignedIntToString( uid ) ) + ", ";
1776      if( fp_mysql_query( mysql, sql.c_str( ) ) ){          sql += string( admin ? "1" : "0" ) + ") ";
1777          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1778          return RES_DB_QUERY_ERROR;              SQLINTEGER count = 0;
1779                if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1780                    ret = RES_OK;
1781                }else{
1782                    string s( "SQLRowCount in insertMember " );
1783                    s += odbcDiagString( hstmt, sqlcode );
1784                    s += string( ", sql=" ) + string( sql );
1785                    setLastErrorString( s.c_str( ) );
1786                    ret = RES_DB_QUERY_ERROR;
1787                }
1788            }else{
1789                string s( "SQLExecDirect in insertMember " );
1790                s += odbcDiagString( hstmt, sqlcode );
1791                s += string( ", sql=" ) + string( sql );
1792                setLastErrorString( s.c_str( ) );
1793                ret = RES_DB_QUERY_ERROR;
1794            }
1795            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1796        }else{
1797            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertMember" );
1798            ret = RES_DB_QUERY_ERROR;
1799      }      }
1800      return RES_OK;      return ret;
1801  }  }
1802    
1803  /**  /**
# Line 1287  result_t insertMember( sessionid_t sid, Line 1820  result_t insertMember( sessionid_t sid,
1820   */   */
1821  result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )  result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1822  {  {
1823      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1824      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1825      if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gidの存在をチェック      if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gidの存在をチェック
1826            
1827        result_t ret = RES_ERROR;
1828      string sql;      string sql;
1829      MYSQL_RES* result;      SQLRETURN sqlcode;
1830      MYSQL_ROW row;      SQLHANDLE hstmt = NULL;    
1831      userid_t* dst = 0;      userid_t* dst = 0;
     int len = 0;  
1832            
1833      //メンバー数を求めてメモリ確保      //how many members ?
1834      sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups_users_link ";      sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups_users_link ";
1835      sql += " WHERE gid=" + string( unsignedIntToString( gid ) );      sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1836      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1837          fprintf( stderr, "%s\n", sql.c_str( ) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1838          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );              SQLUINTEGER count = 0;
1839          return RES_DB_QUERY_ERROR;              SQLINTEGER len;
1840      }              SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1841      result = fp_mysql_store_result( mysql ) ;              if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1842      if( row = fp_mysql_fetch_row(result) ){                  dst = new userid_t[ count ];
1843          len = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );                  *uids = dst;
1844          dst = new userid_t[ len ];                  *uidsLen = count;
1845                    if( count > 0 ){
1846                        //retrive member's IDs
1847                        SQLHANDLE hstmt2 = NULL;    
1848                       if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1849                            sql = "SELECT uid, gid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link ";
1850                            sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1851                            sql += " " + string( criteria2str( cri ) );
1852                            if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1853                                SQLUINTEGER uid = 0;
1854                                SQLINTEGER len;
1855                                SQLBindCol( hstmt2, 1, SQL_C_ULONG, &uid, 0, &len );
1856                                for( int i = 0; ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS && i < count ; i++ ){
1857                                    dst[ i ] = uid;
1858                                }
1859                                ret = RES_OK;
1860                            }else{
1861                                setLastErrorString( "SQLExecDirect in getMembers" );
1862                                ret = RES_DB_QUERY_ERROR;
1863                            }
1864                            SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1865                        }else{
1866                            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
1867                            ret = RES_DB_QUERY_ERROR;
1868                        }
1869                    }else{
1870                        ret = RES_OK;
1871                    }
1872                }else{
1873                    string s( "SQLFetch in getMembers sql=" );
1874                    s += string( sql );
1875                    setLastErrorString( s.c_str( ) );
1876                    ret = RES_DB_QUERY_ERROR;
1877                }
1878            }else{
1879                setLastErrorString( "SQLExecDirect in getMembers" );
1880                ret = RES_DB_QUERY_ERROR;
1881            }
1882            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1883      }else{      }else{
1884          fp_mysql_free_result( result );          setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
1885          return RES_ERROR;          ret = RES_DB_QUERY_ERROR;
1886      }      }
1887      fp_mysql_free_result( result );      return ret;
       
     sql = "SELECT uid, gid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link ";  
     sql += " WHERE gid=" + string( unsignedIntToString( gid ) );  
     sql += " " + string( criteria2str( cri ) );  
     if( fp_mysql_query( mysql, sql.c_str( ) ) ){  
         fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );  
         delete[] dst;  
         *uidsLen = 0;  
         return RES_DB_QUERY_ERROR;  
     }  
     *uidsLen = 0;  
     result = fp_mysql_use_result( mysql ) ;  
     for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < len ; i++ ){  
         dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );  
         ( *uidsLen )++;  
     }  
     while( row = fp_mysql_fetch_row(result) );  
     fp_mysql_free_result( result );  
     *uids = dst;  
     return RES_OK;  
1888  }  }
1889    
1890  /**  /**
# Line 1351  result_t getMembers( sessionid_t sid, gr Line 1902  result_t getMembers( sessionid_t sid, gr
1902   */   */
1903  result_t deleteGroup( sessionid_t sid, groupid_t gid )  result_t deleteGroup( sessionid_t sid, groupid_t gid )
1904  {  {
1905      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1906      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1907            
1908        result_t ret = RES_ERROR;
1909      string sql;      string sql;
1910        SQLRETURN sqlcode;
1911        SQLHANDLE hstmt = NULL;
1912        
1913      sql = "DELETE FROM " + dbprefix + "_vpaccount_groups ";      sql = "DELETE FROM " + dbprefix + "_vpaccount_groups ";
1914      sql += "WHERE gid = " + string( unsignedIntToString( gid ) );      sql += "WHERE gid = " + string( unsignedIntToString( gid ) );
1915      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1916          fprintf( stderr, "%s\n", sql.c_str( ) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1917          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );              SQLINTEGER count = 0;
1918          return RES_DB_QUERY_ERROR;              if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1919                    ret = RES_OK;
1920                }else{
1921                    string s( "SQLRowCount in deleteGroup" );
1922                    s += odbcDiagString( hstmt, sqlcode );
1923                    s += string( ", sql=" ) + string( sql );
1924                    setLastErrorString( s.c_str( ) );
1925                    ret = RES_NO_SUCH_USER;
1926                }
1927            }else{
1928                string s( "SQLExecDirect in deleteGroup" );
1929                s += odbcDiagString( hstmt, sqlcode );
1930                s += ", sql=";
1931                s += string( sql );
1932                setLastErrorString( s.c_str( ) );
1933                ret = RES_DB_QUERY_ERROR;
1934            }
1935            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1936        }else{
1937            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteGroup" );
1938            ret = RES_ERROR;
1939      }      }
1940      return RES_OK;      return ret;
1941  }  }
1942    
1943  /**  /**
# Line 1382  result_t deleteGroup( sessionid_t sid, g Line 1957  result_t deleteGroup( sessionid_t sid, g
1957   */   */
1958  result_t insertGroup( sessionid_t sid, const group_t* group, groupid_t* gid )  result_t insertGroup( sessionid_t sid, const group_t* group, groupid_t* gid )
1959  {  {
1960      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1961      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1962            
1963        result_t ret = RES_ERROR;
1964      string sql;      string sql;
1965      sql = "INSERT INTO " + dbprefix + "_vpaccount_groups ( gname, gdesc ) VALUES (";      SQLCHAR gname[VP_GROUP_GNAME_LEN+1], gdesc[VP_GROUP_GDESC_LEN+1];
1966      sql += "'" + string( addSlashes( group -> getGname( ) ) ) + "', ";      SQLINTEGER cbGname = SQL_NTS, cbGdesc = SQL_NTS;
1967      sql += "'" + string( addSlashes( group -> getDesc( ) ) ) + "' )";      SQLRETURN sqlcode;
1968      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      
1969          fprintf( stderr, "%s\n", sql.c_str( ) );      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1970          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          sql = "INSERT INTO " + dbprefix + "_vpaccount_groups ( gname, gdesc ) VALUES ( ?, ? )";
1971          return RES_DB_QUERY_ERROR;          sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1972            if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1973                SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname );
1974                SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc );
1975                strncpy2( (char*)gname, group -> getGname( ), VP_GROUP_GNAME_LEN );
1976                strncpy2( (char*)gdesc, group -> getDesc( ), VP_GROUP_GDESC_LEN );
1977                if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1978                    SQLINTEGER count = 0;
1979                    if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1980                        //グループIDを取得する
1981                        SQLHANDLE hstmt2 = NULL;
1982                        if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1983                            sql = "SELECT LAST_INSERT_ID()"; // MySQL
1984                            // sql = "SELECT LAST_INSERT_ROWID()"; // SQLite
1985                            if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1986                                SQLUINTEGER last_insert_id;
1987                                SQLINTEGER len;
1988                                SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len );
1989                                if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){
1990                                    *gid = last_insert_id;
1991                                    ret = RES_OK;
1992                                }else{
1993                                    ret = RES_DB_QUERY_ERROR;
1994                                    string s( "SQLFetch in insertGroup " );
1995                                    s += odbcDiagString( hstmt, sqlcode );
1996                                    setLastErrorString( s.c_str( ) );
1997                                }
1998                            }else{
1999                                string s( "SQLExecDirect in insertGroup " );
2000                                s += odbcDiagString( hstmt, sqlcode );
2001                                setLastErrorString( s.c_str( ) );
2002                                ret = RES_DB_QUERY_ERROR;
2003                            }
2004                            SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
2005                        }
2006                    }else{
2007                        string s( "SQLRowCount in insertGroup sql=" );
2008                        s += string( sql );
2009                        setLastErrorString( s.c_str( ) );
2010                        ret = RES_DB_QUERY_ERROR;
2011                    }
2012                }else{
2013                    string s( "SQLExecute in insertGroup " );
2014                    s += odbcDiagString( hstmt, sqlcode );
2015                    setLastErrorString( s.c_str( ) );
2016                    ret = RES_DB_QUERY_ERROR;
2017                }
2018            }else{
2019                string s( "SQLPrepare in insertGroup " );
2020                s += odbcDiagString( hstmt, sqlcode );
2021                setLastErrorString( s.c_str( ) );
2022                ret = RES_ERROR;
2023            }
2024            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2025        }else{
2026            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertGroup" );
2027            ret = RES_ERROR;
2028      }      }
2029      *gid = fp_mysql_insert_id( mysql );      return ret;
     return RES_OK;  
2030  }  }
2031    
2032  /**  /**
# Line 1414  result_t insertGroup( sessionid_t sid, c Line 2045  result_t insertGroup( sessionid_t sid, c
2045   */   */
2046  result_t updateGroup( sessionid_t sid, const group_t* group )  result_t updateGroup( sessionid_t sid, const group_t* group )
2047  {  {
2048      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2049      if( group == NULL ) return RES_ERROR;      if( group == NULL ) return RES_ERROR;
2050      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2051      if( !gidExists( group -> getGID( ) ) ) return RES_NO_SUCH_GROUP;      if( !gidExists( group -> getGID( ) ) ) return RES_NO_SUCH_GROUP;
2052            
2053        result_t ret = RES_ERROR;
2054      string sql;      string sql;
2055      sql = "UPDATE " + dbprefix + "_vpaccount_groups SET ";      SQLCHAR gname[VP_GROUP_GNAME_LEN+1], gdesc[VP_GROUP_GDESC_LEN+1];
2056      sql += "gname='" + string( addSlashes( group -> getGname( ) ) ) + "', ";      SQLINTEGER cbGname = SQL_NTS, cbGdesc = SQL_NTS;
2057      sql += "gdesc='" + string( addSlashes( group -> getDesc( ) ) ) + "' ";      SQLRETURN sqlcode;
2058      sql += "WHERE gid=" + string( unsignedIntToString( group -> getGID( ) ) );      
2059      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2060          fprintf( stderr, "%s\n", sql.c_str( ) );          sql = "UPDATE " + dbprefix + "_vpaccount_groups SET gname=?, gdesc=? WHERE gid=" + string( unsignedIntToString( group -> getGID( ) ) );
2061          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
2062          return RES_DB_QUERY_ERROR;          if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
2063                SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname );
2064                SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc );
2065                strncpy2( (char*)gname, group -> getGname( ), VP_GROUP_GNAME_LEN );
2066                strncpy2( (char*)gdesc, group -> getDesc( ), VP_GROUP_GDESC_LEN );
2067                if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
2068                    SQLINTEGER count = 0;
2069                    if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2070                        ret = RES_OK;
2071                    }else{
2072                        string s( "SQLRowCount in updateGroup sql=" );
2073                        s += string( sql );
2074                        setLastErrorString( s.c_str( ) );
2075                        ret = RES_DB_QUERY_ERROR;
2076                    }
2077                }else{
2078                    string s( "SQLExecute in updateGroup " );
2079                    s += odbcDiagString( hstmt, sqlcode );
2080                    setLastErrorString( s.c_str( ) );
2081                    ret = RES_DB_QUERY_ERROR;
2082                }
2083            }else{
2084                setLastErrorString( "SQLPrepare in updateGroup sql=" );
2085                ret = RES_ERROR;
2086            }
2087            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2088        }else{
2089            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateGroup" );
2090            ret = RES_ERROR;
2091      }      }
2092      return RES_OK;      return RES_OK;
2093  }  }
# Line 1473  result_t getGroup( sessionid_t sid, grou Line 2133  result_t getGroup( sessionid_t sid, grou
2133   */   */
2134  result_t getGroups( sessionid_t sid, groupid_t* gids, int gidsLen, criteria_t* cri, const group_t** groups, int* groupsLen )  result_t getGroups( sessionid_t sid, groupid_t* gids, int gidsLen, criteria_t* cri, const group_t** groups, int* groupsLen )
2135  {  {
2136      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2137      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;      if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2138            
2139        SQLRETURN sqlcode;
2140        SQLHANDLE hstmt = NULL;    
2141        result_t ret = RES_ERROR;
2142      string sql;      string sql;
     MYSQL_RES* result;  
     MYSQL_ROW row;  
2143      group_t* dst = new group_t[ gidsLen ];      group_t* dst = new group_t[ gidsLen ];
2144            
2145      sql += "SELECT gid, gname, gdesc ";      sql += "SELECT gid, gname, gdesc ";
# Line 1490  result_t getGroups( sessionid_t sid, gro Line 2151  result_t getGroups( sessionid_t sid, gro
2151          }          }
2152      }      }
2153      sql += criteria2str( cri );      sql += criteria2str( cri );
2154      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      
2155          fprintf( stderr, "%s\n", sql.c_str( ) );      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2156          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2157          return RES_DB_QUERY_ERROR;              SQLINTEGER len;
2158      }              groupid_t gid = 0;
2159      result = fp_mysql_use_result( mysql ) ;              SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
2160      *groupsLen=0;              *groupsLen=0;
2161      for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < gidsLen ; i++ ){              for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < gidsLen ; i++ ){
2162          dst[ i ].setGID( atoi( row[ 0 ] != NULL ? row[ 0 ] : "" ) );                  dst[ i ].setGID( gid );
2163          dst[ i ].setGname( row[ 1 ] );                  dst[ i ].setGname( getResultCol( hstmt, 2 ).c_str() );
2164          dst[ i ].setDesc( row[ 2 ] );                  dst[ i ].setDesc( getResultCol( hstmt, 3 ).c_str() );
2165          ( *groupsLen )++;                  ( *groupsLen )++;
2166      }              }
2167      while( row = fp_mysql_fetch_row(result) );              *groups = dst;
2168      fp_mysql_free_result( result );              ret = RES_OK;
2169      *groups = dst;          }else{
2170      return RES_OK;              setLastErrorString( "SQLExecDirect in getAccounts" );
2171                ret = RES_DB_QUERY_ERROR;
2172            }
2173            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2174        }else{
2175            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" );
2176            ret = RES_DB_QUERY_ERROR;
2177        }
2178        return ret;
2179  }  }
2180    
2181  /**  /**
# Line 1521  result_t getGroups( sessionid_t sid, gro Line 2190  result_t getGroups( sessionid_t sid, gro
2190   */   */
2191  bool isModerator( sessionid_t sid, userid_t uid )  bool isModerator( sessionid_t sid, userid_t uid )
2192  {  {
2193      if( mysql == NULL ) return false;      if( hdbc == NULL ) return false;
2194      if( !isValidSessionID( sid ) ) return false;      if( !isValidSessionID( sid ) ) return false;
2195      //if( !uidExists( uid ) ) return false;      if( !uidExists( uid ) ) return false;
       
     string sql;  
     MYSQL_RES* result;  
     MYSQL_ROW row;  
     groupid_t* dst = 0;  
     result_t res;  
2196            
2197      sql = "SELECT value FROM " + dbprefix + "_vpaccount_config";      bool ret = false;
2198      sql += " WHERE name='moderator_gid'";      SQLRETURN sqlcode;
2199      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      SQLHANDLE hstmt = NULL;    
2200          fprintf( stderr, "%s\n", sql.c_str( ) );      SQLINTEGER count = 0;
2201          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );      string sql;
2202          return false;      groupid_t moderator_gid;
2203      }      
2204      result = fp_mysql_store_result( mysql ) ;      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2205      if( result == NULL ){          sql = "SELECT value FROM " + dbprefix + "_vpaccount_config";
2206          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          sql += " WHERE name='moderator_gid'";
2207          return false;          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2208      }              SQLINTEGER len = 0;
2209      if( row = fp_mysql_fetch_row(result) ){              SQLBindCol( hstmt, 1, SQL_C_ULONG, &moderator_gid, 0, &len );
2210          sql = "SELECT * from " + dbprefix + "_groups_users_link ";              if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2211          sql += "WHERE groupid=" + string( row[ 0 ] );                  sql = "SELECT * from " + dbprefix + "_groups_users_link ";
2212          sql += " AND uid=" + string( unsignedIntToString( uid ) );                  sql += "WHERE groupid=" + unsignedIntToString( moderator_gid );
2213          fp_mysql_free_result( result );                  sql += " AND uid=" + string( unsignedIntToString( uid ) );
2214                            if( countResultRows( sql.c_str(), &count ) == RES_OK ){
2215          if( fp_mysql_query( mysql, sql.c_str( ) ) ){                      if( count > 0 ){
2216              fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );                          ret = true;
2217              return false;                      }
2218          }                  }
2219          result = fp_mysql_store_result( mysql );              }else{
2220          if( result == NULL ){                  setLastErrorString( "SQLFetch in isModerator " );
2221              fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );              }
2222              return false;          }else{
2223          }              string s( "SQLExecDirect in isModerator " );
2224          if( !fp_mysql_fetch_row(result) ){              s += odbcDiagString( hstmt, sqlcode );
2225              fp_mysql_free_result( result );              s += ", sql=";
2226              return false;              s += string( sql );
2227                setLastErrorString( s.c_str( ) );
2228          }          }
2229          fp_mysql_free_result( result );          SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
         return true;  
2230      }else{      }else{
2231          fp_mysql_free_result( result );          setLastErrorString( "SQLAllocHandle in isModerator " );
         return false;  
2232      }      }
2233        return ret;
2234  }  }
2235    
2236  /**  /**
# Line 1583  bool isModerator( sessionid_t sid, useri Line 2246  bool isModerator( sessionid_t sid, useri
2246   */   */
2247  result_t getUid( const char* uname, userid_t* uid )  result_t getUid( const char* uname, userid_t* uid )
2248  {  {
2249      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2250      if( uname == NULL ) return RES_ERROR;      if( uname == NULL ) return RES_ERROR;
2251            
2252        result_t ret = RES_ERROR;
2253        SQLRETURN sqlcode;
2254        SQLHANDLE hstmt = NULL;    
2255      string sql;      string sql;
2256      string uname2 = addSlashes( uname );      string uname2 = addSlashes( uname );
2257        
2258      sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + uname2 + "';";      sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + uname2 + "';";
2259      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2260          fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2261          return RES_DB_QUERY_ERROR;              userid_t _uid = 0;
2262      }              SQLINTEGER len;
2263      MYSQL_RES* result = fp_mysql_store_result( mysql ) ;              SQLBindCol( hstmt, 1, SQL_C_ULONG, &_uid, 0, &len );
2264      MYSQL_ROW row = fp_mysql_fetch_row(result);              sqlcode = SQLFetch( hstmt );
2265      if( row ){              if( sqlcode == SQL_SUCCESS ){
2266          *uid = atoi( row[0] != NULL ? row[0] : "" );                  *uid = _uid;
2267          fp_mysql_free_result( result );                  ret = RES_OK;
2268          return RES_OK;              }else {
2269                    string s( "SQLFetch in getUid sql=" );
2270                    s += string( sql );
2271                    setLastErrorString( s.c_str( ) );
2272                    ret = RES_NO_SUCH_USER;
2273                }
2274            }else{
2275                setLastErrorString( "SQLExecDirect in getUid" );
2276                ret = RES_DB_QUERY_ERROR;
2277            }
2278            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2279      }else{      }else{
2280          fp_mysql_free_result( result );          setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getUid" );
2281          return RES_NO_SUCH_USER;          ret = RES_DB_QUERY_ERROR;
2282      }      }
2283        
2284        return ret;
2285  }  }
2286    
2287  /**  /**
# Line 1616  result_t getUid( const char* uname, user Line 2295  result_t getUid( const char* uname, user
2295   */   */
2296  static result_t addSession( userid_t uid, sessionid_t* session )  static result_t addSession( userid_t uid, sessionid_t* session )
2297  {  {
2298      result_t ret;      result_t ret = RES_DB_QUERY_ERROR;
2299        SQLRETURN sqlcode;
2300      string sql = "INSERT INTO " + dbprefix + "_vpaccount_session (uid) values (" +      string sql = "INSERT INTO " + dbprefix + "_vpaccount_session (uid) values (" +
2301        unsignedIntToString(uid) + ")";        unsignedIntToString(uid) + ")";
2302      if ( 0 == fp_mysql_query( mysql, sql.c_str() ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2303          *session = (int)fp_mysql_insert_id(mysql);          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2304          ret = RES_OK;              SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2305      }              if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2306      else {                  sql = "SELECT LAST_INSERT_ID()";
2307          ret = RES_DB_QUERY_ERROR;                  if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2308                        sessionid_t sid;
2309                        SQLINTEGER len;
2310                        SQLBindCol( hstmt, 1, SQL_C_ULONG, &sid, 0, &len );
2311                        if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2312                            *session = sid;
2313                            ret = RES_OK;
2314                        }
2315                    }
2316                    SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2317                }
2318            }else{
2319                SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2320            }
2321      }      }
2322      return ret;      return ret;
2323  }  }
# Line 1644  static result_t addSession( userid_t uid Line 2337  static result_t addSession( userid_t uid
2337   */   */
2338  result_t loginUser(const char* uname, const char* passwd, sessionid_t* session )  result_t loginUser(const char* uname, const char* passwd, sessionid_t* session )
2339  {  {
2340      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2341            
2342      result_t ret;      result_t ret;
2343      string sql;      string sql;
2344        SQLRETURN sqlcode;
2345            
2346      // uname, passwd -> uid      // uname, passwd -> uid
2347      string escUname = addSlashes( uname );      string escUname = addSlashes( uname );
2348      string escPasswd = addSlashes( passwd );      string escPasswd = addSlashes( passwd );
2349      sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + escUname + "' and pass=md5('" + escPasswd + "')";      sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + escUname + "' and pass=md5('" + escPasswd + "')";
2350      if( 0 == fp_mysql_query( mysql, sql.c_str( ) ) ){      
2351          MYSQL_RES* result = fp_mysql_store_result( mysql );      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2352          if( result ){          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2353              MYSQL_ROW row = fp_mysql_fetch_row(result);              userid_t uid = 0;
2354              if( row ){              SQLINTEGER len;
2355                  userid_t uid = atoi( row[0] != NULL ? row[0] : "" );              SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
2356                sqlcode = SQLFetch( hstmt );
2357                if( sqlcode == SQL_SUCCESS ){
2358                  ret = addSession( uid, session );                  ret = addSession( uid, session );
2359              }else{              }else {
2360                  ret = RES_LOGIN_FAILURE;                  string s( "SQLFetch in loginUser" );
2361                    setLastErrorString( s.c_str( ) );
2362                    ret = RES_LOGIN_FAILURE;//illegal loginname or password
2363              }              }
2364              fp_mysql_free_result( result );          }else{
2365          }else {              setLastErrorString( "SQLExecDirect in loginUser" );
2366              ret = RES_DB_QUERY_ERROR;              ret = RES_DB_QUERY_ERROR;
2367          }          }
2368            SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2369      }else{      }else{
2370            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in loginUser" );
2371          ret = RES_DB_QUERY_ERROR;          ret = RES_DB_QUERY_ERROR;
2372      }      }
2373            
# Line 1684  result_t loginUser(const char* uname, co Line 2384  result_t loginUser(const char* uname, co
2384   */   */
2385  void logoutUser( sessionid_t sid )  void logoutUser( sessionid_t sid )
2386  {  {
2387      if( mysql == NULL ) return; // RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return; // RES_DB_NOT_INITIALIZED;
2388            
2389      result_t ret;      result_t ret;
2390      string sql;      string sql;
2391            
2392      sql = "DELETE FROM " + dbprefix + "_vpaccount_session WHERE sid=" + intToString((int)sid);      sql = "DELETE FROM " + dbprefix + "_vpaccount_session WHERE sid=" + intToString((int)sid);
2393      if ( 0 == fp_mysql_query( mysql, sql.c_str() ) ){      if ( 0 == SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ){
2394    /*
2395          if ( fp_mysql_affected_rows(mysql) == 1 ){          if ( fp_mysql_affected_rows(mysql) == 1 ){
2396              // ログアウトした              // ログアウトした
2397          }          }
2398          else {          else {
2399              // sidが無効              // sidが無効
2400          }          }
2401    */
2402      }      }
2403      else {      else {
2404          // DB問い合わせ中のエラー          // DB問い合わせ中のエラー
# Line 1720  void logoutUser( sessionid_t sid ) Line 2422  void logoutUser( sessionid_t sid )
2422   */   */
2423  result_t createSession( const char* sess_id, userid_t uid, sessionid_t* session )  result_t createSession( const char* sess_id, userid_t uid, sessionid_t* session )
2424  {  {
2425      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2426            
2427      result_t ret;      result_t ret;
2428      string sql;      string sql;
2429        SQLHANDLE hstmt = NULL;
2430        SQLRETURN sqlcode;
2431            
2432      string escSess_id = addSlashes(sess_id);      string escSess_id = addSlashes(sess_id);
2433      sql = "SELECT sess_id from " + dbprefix + "_session where sess_id='" + escSess_id + "'";      sql = "SELECT sess_id from " + dbprefix + "_session where sess_id='" + escSess_id + "'";
2434      if( 0 == fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2435          MYSQL_RES* result = fp_mysql_store_result( mysql );          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2436          if( result ){              if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
             MYSQL_ROW row = fp_mysql_fetch_row(result);  
             if( row ){  
2437                  ret = addSession( uid, session );                  ret = addSession( uid, session );
2438              }else{              }else{
2439                  ret = RES_ERROR;                  ret = RES_ERROR;
2440              }              }
             fp_mysql_free_result( result );  
2441          }else {          }else {
2442              ret = RES_DB_QUERY_ERROR;              ret = RES_DB_QUERY_ERROR;
2443          }          }
2444      }else{      }else{
2445          ret = RES_DB_QUERY_ERROR;          ret = RES_DB_QUERY_ERROR;
2446      }      }
       
2447      return ret;      return ret;
2448  }  }
2449    
# Line 1761  result_t createSession( const char* sess Line 2461  result_t createSession( const char* sess
2461   */   */
2462  result_t getSession( sessionid_t sid, const session_t** ppsession )  result_t getSession( sessionid_t sid, const session_t** ppsession )
2463  {  {
2464      if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;      if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2465            
2466      result_t ret;      result_t ret;
2467      string sql;      string sql;
2468            
2469    /*
2470      sql = "SELECT sid, uid, unix_timestamp(timestamp) from " + dbprefix +      sql = "SELECT sid, uid, unix_timestamp(timestamp) from " + dbprefix +
2471        "_vpaccount_session where sid=" + unsignedIntToString((unsigned int)sid);        "_vpaccount_session where sid=" + unsignedIntToString((unsigned int)sid);
2472      if( 0 == fp_mysql_query( mysql, sql.c_str( ) ) ){      if( 0 == SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ){
2473          MYSQL_RES* result = fp_mysql_store_result( mysql );          MYSQL_RES* result = fp_mysql_store_result( mysql );
2474          if( result ){          if( result ){
2475              MYSQL_ROW row = fp_mysql_fetch_row(result);              MYSQL_ROW row = fp_mysql_fetch_row(result);
# Line 1790  result_t getSession( sessionid_t sid, co Line 2491  result_t getSession( sessionid_t sid, co
2491          ret = RES_DB_QUERY_ERROR;          ret = RES_DB_QUERY_ERROR;
2492      }      }
2493            
2494    */
2495      return ret;      return ret;
2496  }  }
2497    
# Line 1804  result_t getSession( sessionid_t sid, co Line 2506  result_t getSession( sessionid_t sid, co
2506   */   */
2507  bool isValidSessionID( sessionid_t sid )  bool isValidSessionID( sessionid_t sid )
2508  {  {
2509      if( mysql == NULL ) return false;      if( hdbc == NULL ) return false;
2510            
2511      bool ret;      bool ret = false;
2512      string sql;      string sql;
     string sidstr;  
2513      char buf[ 12 ];      char buf[ 12 ];
2514      snprintf( buf, 12, "%d", sid );      snprintf( buf, 12, "%d", sid );
2515        SQLRETURN sqlcode;
2516        SQLHANDLE hstmt = NULL;    
2517            
2518      sql = "SELECT * FROM " + dbprefix + "_vpaccount_session WHERE sid=" + string( buf );      sql = "SELECT * FROM " + dbprefix + "_vpaccount_session WHERE sid=" + string( buf );
2519      if( fp_mysql_query( mysql, sql.c_str( ) ) ){      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2520          return false;          if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2521      }              if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2522      MYSQL_RES* result = fp_mysql_store_result( mysql );                  ret = true;
2523      if( result ){              }else{
2524          MYSQL_ROW row = fp_mysql_fetch_row(result);                  snprintf( buf, 12, "%d", sqlcode );
2525          if( row ){                  string s( "SQLFetch in isValidSessionID(sqlcode=" );
2526              ret = true;                  s += string( buf ) + ", sql=" + sql + ")";
2527                    setLastErrorString( s.c_str() );
2528                    ret = false;
2529                }
2530          }else{          }else{
2531                setLastErrorString( "SQLExecDirect in isValidSessionID" );
2532              ret = false;              ret = false;
2533          }          }
2534          fp_mysql_free_result( result );          SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2535        }else{
2536            setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isValidSessionID" );
2537            ret = false;
2538      }      }
2539      return ret;      return ret;
2540  }  }
# Line 1844  const char* getLastErrorString() Line 2554  const char* getLastErrorString()
2554  void setLastErrorString( const char* str )  void setLastErrorString( const char* str )
2555  {  {
2556      errstr = str;      errstr = str;
2557    //    fprintf( stderr, "setLastErrorString( '%s' );\n", str );
2558  }  }

Legend:
Removed from v.1.31  
changed lines
  Added in v.1.32

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