summaryrefslogblamecommitdiff
path: root/src/char_sql/itemdb.c
blob: 3e1c22db56f24bd51d707224ae1050c69e51d283 (plain) (tree)


















                                                               
                                         
 
                                                                                   
 
                           




                                            
                                            
 































                                                





                                            
                               
 



                                                                       
 
 



                                            
                                            
 








                                                                           

 



                                            
                               
 













































                                                                                             

 
                                                                                                               
 

                                                                                                                                 
 
                 
 

                                                                     
 





                                                                       
 

                                                 
 






                                                          
 




                                                                                    
 
                         
 
                                                      












                                                                              



























                                                                              

 
                                                           
 
                         
 





                                
 
             

 



                                            
                           
 




                                            
 

                         
 
                            
 




                                                                                                                                     
 
// $Id: itemdb.c,v 1.1.1.1 2004/09/10 17:44:48 MagicalTux Exp $
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "itemdb.h"
#include "db.h"
#include "inter.h"
#include "char.h"
#include "utils.h"

#ifdef MEMWATCH
#include "memwatch.h"
#endif

#define MAX_RANDITEM	2000

// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
//   ��`����ƁAitemdb.txt��grf�Ŗ��O���قȂ�ꍇ�A�\�����܂�.
//#define ITEMDB_OVERRIDE_NAME_VERBOSE  1

char item_db_db[256] = "item_db";   // added to specify item_db sql table [Valaris]

static struct dbt *item_db;

/*==========================================
 * DB�̌���
 *------------------------------------------
 */
struct item_data *itemdb_search (int nameid)
{
    struct item_data *id;

    id = numdb_search (item_db, nameid);
    if (id)
        return id;

    CREATE (id, struct item_data, 1);

    numdb_insert (item_db, nameid, id);

    if (nameid > 500 && nameid < 600)
        id->type = 0;           //heal item
    else if (nameid > 600 && nameid < 700)
        id->type = 2;           //use item
    else if ((nameid > 700 && nameid < 1100) ||
             (nameid > 7000 && nameid < 8000))
        id->type = 3;           //correction
    else if (nameid >= 1750 && nameid < 1771)
        id->type = 10;          //arrow
    else if (nameid > 1100 && nameid < 2000)
        id->type = 4;           //weapon
    else if ((nameid > 2100 && nameid < 3000) ||
             (nameid > 5000 && nameid < 6000))
        id->type = 5;           //armor
    else if (nameid > 4000 && nameid < 5000)
        id->type = 6;           //card
    else if (nameid > 9000 && nameid < 10000)
        id->type = 7;           //egg
    else if (nameid > 10000)
        id->type = 8;           //petequip

    return id;
}

/*==========================================
 *
 *------------------------------------------
 */
int itemdb_isequip (int nameid)
{
    int  type = itemdb_type (nameid);
    if (type == 0 || type == 2 || type == 3 || type == 6 || type == 10)
        return 0;
    return 1;
}

/*==========================================
 *
 *------------------------------------------
 */
int itemdb_isequip2 (struct item_data *data)
{
    if (data)
    {
        int  type = data->type;
        if (type == 0 || type == 2 || type == 3 || type == 6 || type == 10)
            return 0;
        else
            return 1;
    }
    return 0;
}

/*==========================================
 * �A�C�e���f�[�^�x�[�X�̓ǂݍ���
 *------------------------------------------
 */
static int itemdb_readdb (void)
{
    FILE *fp;
    char line[1024];
    int  ln = 0;
    int  nameid, j;
    char *str[32], *p, *np;
    struct item_data *id;

    fp = fopen_ ("db/item_db.txt", "r");
    if (fp == NULL)
    {
        printf ("can't read db/item_db.txt\n");
        exit (1);
    }
    while (fgets (line, 1020, fp))
    {
        if (line[0] == '/' && line[1] == '/')
            continue;
        memset (str, 0, sizeof (str));
        for (j = 0, np = p = line; j < 17 && p; j++)
        {
            str[j] = p;
            p = strchr (p, ',');
            if (p)
            {
                *p++ = 0;
                np = p;
            }
        }
        if (str[0] == NULL)
            continue;

        nameid = atoi (str[0]);
        if (nameid <= 0 || nameid >= 20000)
            continue;
        ln++;

        //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View
        id = itemdb_search (nameid);
        memcpy (id->name, str[1], 24);
        memcpy (id->jname, str[2], 24);
        id->type = atoi (str[3]);

    }
    fclose_ (fp);
    printf ("read db/item_db.txt done (count=%d)\n", ln);
    return 0;
}

static int itemdb_read_sqldb (void) // sql item_db read, shortened version of map-server item_db read [Valaris]
{
    unsigned int nameid;        // Type should be "unsigned short int", but currently isn't for compatibility with numdb_insert()
    struct item_data *id;

    // ----------

    // Output query to retrieve all rows from the item database table
    sprintf (tmp_sql, "SELECT * FROM `%s`", item_db_db);

    // Execute the query; if the query execution fails, output an error
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("Database server error (executing query for %s): %s\n",
                item_db_db, mysql_error (&mysql_handle));
    }

    // Store the query result
    sql_res = mysql_store_result (&mysql_handle);

    // If the storage of the query result succeeded
    if (sql_res)
    {
        // Parse each row in the query result into sql_row
        while ((sql_row = mysql_fetch_row (sql_res)))
        {
            nameid = atoi (sql_row[0]);

            // If the identifier is not within the valid range, process the next row
            if (nameid == 0 || nameid >= 20000)
            {                   // Should ">= 20000" be "> 20000"?
                continue;
            }

            // ----------

            // Insert a new row into the item database
/*
			id = calloc(sizeof(struct item_data), 1);

			if (id == NULL) {
				printf("out of memory : itemdb_read_sqldb\n");
				exit(1);
			}

			memset(id, 0, sizeof(struct item_data));
			numdb_insert(item_db, nameid, id);

			// ----------
*/
            id = itemdb_search (nameid);

            memcpy (id->name, sql_row[1], 24);
            memcpy (id->jname, sql_row[2], 24);

            id->type = atoi (sql_row[3]);
        }

        // If the retrieval failed, output an error
        if (mysql_errno (&mysql_handle))
        {
            printf ("Database server error (retrieving rows from %s): %s\n",
                    item_db_db, mysql_error (&mysql_handle));
        }

        printf ("read %s done (count = %lu)\n", item_db_db,
                (unsigned long) mysql_num_rows (sql_res));

        // Free the query result
        mysql_free_result (sql_res);
    }
    else
    {
        printf ("MySQL error (storing query result for %s): %s\n", item_db_db,
                mysql_error (&mysql_handle));
    }

    return 0;
}

static int itemdb_final (void *key, void *data, va_list ap)
{
    struct item_data *id;

    id = data;
    if (id->use_script)
        free (id->use_script);
    if (id->equip_script)
        free (id->equip_script);
    free (id);

    return 0;
}

/*==========================================
 *
 *------------------------------------------
 */
void do_final_itemdb (void)
{
    if (item_db)
    {
        numdb_final (item_db, itemdb_final);
        item_db = NULL;
    }
}

int do_init_itemdb (void)
{
    item_db = numdb_init ();

    if (db_use_sqldbs)          // it db_use_sqldbs in inter config are yes, will read from item_db for char server display [Valaris]
        itemdb_read_sqldb ();
    else
        itemdb_readdb ();
    return 0;
}