/** * @author Mario Kolmacic updated by Ivan Pusic and Tomislav Ilisevic * @brief Function for executing given commands (SELECT, UPDATE, DELETE AND INSERT) * @param komande Commands array to execute * @param brojkomandi Number of commands in array */ int AK_command(command * komande, int brojkomandi) { int i; AK_PRO; for (i = 0; i < brojkomandi; ++i) { switch(komande[i].id_command){ case SELECT: printf("***SELECT***\n"); char *ext = "_selection_tmp_table"; char *dest_table = AK_malloc(strlen(ext) + strlen(komande[i].tblName)+1); strcpy(dest_table, komande[i].tblName); strcat(dest_table, ext); if(AK_selection(komande[i].tblName, dest_table, (struct list_node*)komande[i].parameters) == EXIT_ERROR){ // unutar funkcije je ispis privremene tablice AK_EPI; return EXIT_ERROR; } break; case UPDATE: printf("***UPDATE***\n"); if(Ak_update_row( ((struct list_node *) (komande[i].parameters))) == EXIT_ERROR){ AK_EPI; return EXIT_ERROR; } AK_print_table(komande[i].tblName); break; case DELETE: printf("***DELETE***\n"); if(Ak_delete_row( ((struct list_node *) (komande[i].parameters))) == EXIT_ERROR){ AK_EPI; return EXIT_ERROR; } AK_print_table(komande[i].tblName); break; case INSERT: printf("***INSERT***\n"); if(Ak_insert_row( ((struct list_node *) (komande[i].parameters))) == EXIT_ERROR){ AK_EPI; return EXIT_ERROR; } AK_print_table(komande[i].tblName); break; default: break; } } AK_EPI; return EXIT_SUCCESS; }
/** * @author unknown, Jurica Hlevnjak - fix bugs and reorganize code in this function * @brief Help function for the drop command. Delete memory blocks and addresses of table * and removes table or index from system table. * @param tblName name of table or index * @param sys_table name of system catalog table */ void AK_drop_help_function(char *tblName, char *sys_table) { table_addresses *addresses; AK_PRO; addresses = (table_addresses*) AK_get_table_addresses(tblName); AK_mem_block *mem_block; int from = 0, to = 0, i = 0, j = 0, c; for (j = 0; j < MAX_EXTENTS_IN_SEGMENT; j++) { if (addresses->address_from != 0) { from = addresses->address_from[j]; to = addresses->address_to[j]; if (from == 0 || to == 0) break; for (i = from; i <= to; i++) { mem_block = (AK_mem_block *) AK_get_block(i); mem_block->block->type = BLOCK_TYPE_FREE; for (c = 0; c < DATA_BLOCK_SIZE; c++) { mem_block->block->tuple_dict[c].type = FREE_INT; mem_block->block->data[c] = FREE_CHAR; } } } else break; } int data_adr = 0; int data_size = 0; //int data_type = 0; int address_sys; char name_sys[MAX_ATT_NAME]; AK_mem_block *mem_block2 = (AK_mem_block *) AK_get_block(0); for (i = 0; i < DATA_BLOCK_SIZE; i++) { memset(name_sys, 0, MAX_ATT_NAME); if (mem_block2->block->tuple_dict[i].address == FREE_INT) { break; } data_adr = mem_block2->block->tuple_dict[i].address; data_size = mem_block2->block->tuple_dict[i].size; memcpy(name_sys, mem_block2->block->data + data_adr, data_size); i++; data_adr = mem_block2->block->tuple_dict[i].address; data_size = mem_block2->block->tuple_dict[i].size; memcpy(&address_sys, mem_block2->block->data + data_adr, data_size); if (strcmp(name_sys, sys_table) == 0) { break; } } mem_block2 = (AK_mem_block *) AK_get_block(address_sys); table_addresses *addresses2; addresses2 = (table_addresses*) AK_get_table_addresses(tblName); for (i = 0; i < MAX_EXTENTS_IN_SEGMENT; i++) { addresses2->address_from[i] = 0; addresses2->address_to[i] = 0; } char name[MAX_VARCHAR_LENGTH]; for (i = 0; i < DATA_BLOCK_SIZE; i++) { if (mem_block2->block->tuple_dict[i].type == FREE_INT) break; i++; memcpy(name, &(mem_block2->block->data[mem_block2->block->tuple_dict[i].address]), mem_block2->block->tuple_dict[i].size); name[ mem_block2->block->tuple_dict[i].size] = '\0'; if (strcmp(name, tblName) == 0) { i++; mem_block2->block->data[mem_block2->block->tuple_dict[i].address] = 0; i++; mem_block2->block->data[mem_block2->block->tuple_dict[i].address] = 0; } } struct list_node *row_root = (struct list_node *) AK_malloc(sizeof (struct list_node )); Ak_Init_L3(&row_root); Ak_DeleteAll_L3(&row_root); Ak_Update_Existing_Element(TYPE_VARCHAR, tblName, sys_table, "name", row_root); Ak_delete_row(row_root); AK_free(addresses); AK_free(addresses2); AK_EPI; }