Changeset 260 for trunk/src/shared/Database/SQLStorage.cpp
- Timestamp:
- 11/21/08 08:47:55 (17 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shared/Database/SQLStorage.cpp
r102 r260 11 11 * This program is distributed in the hope that it will be useful, 12 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 14 * GNU General Public License for more details. 15 15 * 16 16 * You should have received a copy of the GNU General Public License 17 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307USA18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 19 */ 20 20 21 21 #include "SQLStorage.h" 22 #include "ProgressBar.h" 23 #include "Log.h" 24 #include "dbcfile.h" 22 #include "SQLStorageImpl.h" 25 23 26 24 #ifdef DO_POSTGRESQL … … 30 28 #endif 31 29 32 const char CreatureInfofmt[]="iiiiiisssiiiiiiiiiiffiffiiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiilliiis"; 30 const char CreatureInfosrcfmt[]="iiiiiisssiiiiiiiiiiffiffiiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiilliiis"; 31 const char CreatureInfodstfmt[]="iiiiiisssiiiiiiiiiiffiffiiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiilliiii"; 33 32 const char CreatureDataAddonInfofmt[]="iiiiiiis"; 34 33 const char CreatureModelfmt[]="iffbi"; 35 34 const char CreatureInfoAddonInfofmt[]="iiiiiiis"; 36 35 const char EquipmentInfofmt[]="iiiiiiiiii"; 37 const char GameObjectInfofmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiis"; 38 const char ItemPrototypefmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifsiiiii"; 36 const char GameObjectInfosrcfmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiis"; 37 const char GameObjectInfodstfmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiii"; 38 const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifsiiiii"; 39 const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiii"; 39 40 const char PageTextfmt[]="isi"; 40 41 const char SpellThreatfmt[]="ii"; 41 const char InstanceTemplatefmt[]="iiiiiiffffs"; 42 const char InstanceTemplatesrcfmt[]="iiiiiiffffs"; 43 const char InstanceTemplatedstfmt[]="iiiiiiffffi"; 42 44 43 SQLStorage sCreatureStorage(CreatureInfo fmt,"entry","creature_template");45 SQLStorage sCreatureStorage(CreatureInfosrcfmt, CreatureInfodstfmt, "entry","creature_template"); 44 46 SQLStorage sCreatureDataAddonStorage(CreatureDataAddonInfofmt,"guid","creature_addon"); 45 47 SQLStorage sCreatureModelStorage(CreatureModelfmt,"modelid","creature_model_info"); 46 48 SQLStorage sCreatureInfoAddonStorage(CreatureInfoAddonInfofmt,"entry","creature_template_addon"); 47 49 SQLStorage sEquipmentStorage(EquipmentInfofmt,"entry","creature_equip_template"); 48 SQLStorage sGOStorage(GameObjectInfo fmt,"entry","gameobject_template");49 SQLStorage sItemStorage(ItemPrototype fmt,"entry","item_template");50 SQLStorage sGOStorage(GameObjectInfosrcfmt, GameObjectInfodstfmt, "entry","gameobject_template"); 51 SQLStorage sItemStorage(ItemPrototypesrcfmt, ItemPrototypedstfmt, "entry","item_template"); 50 52 SQLStorage sPageTextStore(PageTextfmt,"entry","page_text"); 51 53 SQLStorage sSpellThreatStore(SpellThreatfmt,"entry","spell_threat"); 52 SQLStorage sInstanceTemplate(InstanceTemplate fmt,"map","instance_template");54 SQLStorage sInstanceTemplate(InstanceTemplatesrcfmt, InstanceTemplatedstfmt, "map","instance_template"); 53 55 54 56 void SQLStorage::Free () … … 56 58 uint32 offset=0; 57 59 for(uint32 x=0;x<iNumFields;x++) 58 if ( format[x]==FT_STRING)60 if (dst_format[x]==FT_STRING) 59 61 { 60 62 for(uint32 y=0;y<MaxEntry;y++) … … 62 64 delete [] *(char**)((char*)(pIndex[y])+offset); 63 65 64 offset +=sizeof(char*);66 offset += sizeof(char*); 65 67 } 66 else if ( format[x]==FT_LOGIC)67 offset +=sizeof(bool);68 else if ( format[x]==FT_BYTE)69 offset +=sizeof(char);68 else if (dst_format[x]==FT_LOGIC) 69 offset += sizeof(bool); 70 else if (dst_format[x]==FT_BYTE) 71 offset += sizeof(char); 70 72 else 71 offset +=4;73 offset += 4; 72 74 73 75 delete [] pIndex; … … 75 77 } 76 78 77 void SQLStorage::Load 79 void SQLStorage::Load() 78 80 { 79 uint32 maxi; 80 Field *fields; 81 QueryResult *result = WorldDatabase.PQuery("SELECT MAX(%s) FROM %s",entry_field,table); 82 if(!result) 83 { 84 sLog.outError("Error loading %s table (not exist?)\n",table); 85 exit(1); // Stop server at loading non exited table or not accessable table 86 } 87 88 maxi= (*result)[0].GetUInt32()+1; 89 delete result; 90 91 result = WorldDatabase.PQuery("SELECT COUNT(*) FROM %s",table); 92 if(result) 93 { 94 fields = result->Fetch(); 95 RecordCount=fields[0].GetUInt32(); 96 delete result; 97 } 98 else 99 RecordCount = 0; 100 101 result = WorldDatabase.PQuery("SELECT * FROM %s",table); 102 103 if(!result) 104 { 105 sLog.outError("%s table is empty!\n",table); 106 RecordCount = 0; 107 return; 108 } 109 110 uint32 recordsize=0; 111 uint32 offset=0; 112 113 if(iNumFields!=result->GetFieldCount()) 114 { 115 RecordCount = 0; 116 sLog.outError("Error in %s table, probably sql file format was updated (there should be %d fields in sql).\n",table,iNumFields); 117 delete result; 118 exit(1); // Stop server at loading broken or non-compatiable table. 119 } 120 121 //get struct size 122 uint32 sc=0; 123 uint32 bo=0; 124 uint32 bb=0; 125 for(uint32 x=0;x<iNumFields;x++) 126 if(format[x]==FT_STRING) 127 ++sc; 128 else if (format[x]==FT_LOGIC) 129 ++bo; 130 else if (format[x]==FT_BYTE) 131 ++bb; 132 recordsize=(iNumFields-sc-bo-bb)*4+sc*sizeof(char*)+bo*sizeof(bool)+bb*sizeof(char); 133 134 char** newIndex=new char*[maxi]; 135 memset(newIndex,0,maxi*sizeof(char*)); 136 137 char * _data= new char[RecordCount *recordsize]; 138 uint32 count=0; 139 barGoLink bar( RecordCount ); 140 do 141 { 142 fields = result->Fetch(); 143 bar.step(); 144 char *p=(char*)&_data[recordsize*count]; 145 newIndex[fields[0].GetUInt32()]=p; 146 147 offset=0; 148 for(uint32 x=0;x<iNumFields;x++) 149 switch(format[x]) 150 { 151 case FT_LOGIC: 152 *((bool*)(&p[offset]))=(fields[x].GetUInt32()>0); 153 offset+=sizeof(bool); 154 break; 155 case FT_BYTE: 156 *((char*)(&p[offset]))=(fields[x].GetUInt8()); 157 offset+=sizeof(char); 158 break; 159 case FT_INT: 160 *((uint32*)(&p[offset]))=fields[x].GetUInt32(); 161 offset+=sizeof(uint32); 162 break; 163 case FT_FLOAT: 164 *((float*)(&p[offset]))=fields[x].GetFloat(); 165 offset+=sizeof(float); 166 break; 167 case FT_STRING: 168 char const* tmp = fields[x].GetString(); 169 char* st; 170 if(!tmp) 171 { 172 st=new char[1]; 173 *st=0; 174 } 175 else 176 { 177 uint32 l=strlen(tmp)+1; 178 st=new char[l]; 179 memcpy(st,tmp,l); 180 } 181 *((char**)(&p[offset]))=st; 182 offset+=sizeof(char*); 183 break; 184 } 185 ++count; 186 }while( result->NextRow() ); 187 188 delete result; 189 190 pIndex =newIndex; 191 MaxEntry=maxi; 192 data=_data; 81 SQLStorageLoader loader; 82 loader.Load(*this); 193 83 }