Advertisement
TwITe

Untitled

Oct 1st, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. //It's database library
  2. //Use the function "set_filesize" to set a default size of the data file
  3. //Use the function "set_path" to set path for saving data files
  4. #pragma once
  5. #include <iostream>
  6. #include <fstream>
  7. #include <string>
  8. #include <cassert>
  9. #include <map>
  10. #include <unordered_map>
  11. #include <vector>
  12. #include <set>
  13. using namespace std;
  14.  
  15. string id_filename = "index";
  16. string data_filename;
  17. string user_path;
  18. const char* full_path;
  19. const int default_file_size = 8388608;
  20. int data_file_number = -1;
  21. int data_file_size = default_file_size;
  22. unordered_map <int, index> indexes;
  23. int map_size = 0;
  24.  
  25. void check_path() {
  26.     if (user_path.empty()) {
  27.         throw runtime_error("path is invalid");
  28.     }
  29. }
  30.  
  31. void check_sets() {
  32.     check_path();
  33. }
  34.  
  35. struct index {
  36.     vector <string> file_names;
  37.     vector <int> start_reading_positions;
  38.     vector <int> end_reading_positions;
  39. };
  40.  
  41. void set_filesize(int user_size) {
  42.     data_file_size = user_size;
  43. }
  44.  
  45. void set_path(const string &saving_path) {
  46.     user_path = saving_path;
  47. }
  48.  
  49. char create_new_file() {
  50.     data_file_number++;
  51.     data_filename = "data" + to_string(data_file_number);
  52.     string path = user_path + data_filename + ".txt";
  53.     full_path = path.c_str();
  54. }
  55.  
  56. void write_id(int id) {
  57.  
  58. }
  59.  
  60. void save_file_name_and_reading_position(int id, int start_position, int end_position) {
  61.     indexes[id].file_names.push_back(data_filename);
  62.     indexes[id].start_reading_positions.push_back(start_position);
  63.     indexes[id].end_reading_positions(end_position);
  64.    
  65. }
  66.  
  67. int get_file_free_space() {
  68.     ifstream current_file(full_path, ifstream::binary);
  69.     current_file.seekg(0, current_file.end);
  70.     int current_file_size = current_file.tellg();
  71.     current_file.seekg(0, current_file.beg);
  72.     return data_file_size - current_file_size;
  73. }
  74.  
  75. void store(int id, void* data, int array_length) {
  76.     check_sets();
  77.     int free_space;
  78.     int current_data_size = array_length * sizeof(data);
  79.     FILE * data_file;
  80.     int last_written_byte_position = 0;
  81.     while (current_data_size != 0) {
  82.         create_new_file();
  83.         free_space = get_file_free_space();
  84.         data_file = fopen(full_path, "rw");
  85.         if (current_data_size > free_space) {
  86.             long int start_position = ftell(data_file);
  87.             fwrite(&data + last_written_byte_position, 1, free_space, data_file);
  88.             long int end_position = ftell(data_file);
  89.             save_file_name_and_reading_position(id, start_position, end_position);
  90.             last_written_byte_position += free_space;
  91.             current_data_size -= free_space;
  92.         }
  93.         else {
  94.             long int start_position = ftell(data_file);
  95.             fwrite(&data + last_written_byte_position, 1, current_data_size, data_file);
  96.             long int end_position = ftell(data_file);
  97.             save_file_name_and_reading_position(id, start_position, end_position);
  98.             current_data_size -= current_data_size;
  99.         }
  100.         fclose(data_file);
  101.     }
  102. }
  103.  
  104. void* load(int id) {
  105.     FILE * data_file;
  106.     void* return_data = (void*) malloc(0);
  107.     for (int i = 0; i < indexes[id].file_names.size(); i++) {
  108.         const char* current_filename = indexes[id].file_names[i].c_str();
  109.         int start_reading_position = indexes[id].start_reading_positions[i];
  110.         int end_reading_position = indexes[id].end_reading_positions[i];
  111.         int reading_elements_number = end_reading_position - start_reading_position;
  112.         data_file = fopen(current_filename, "rw");
  113.         void* current_read_data = (void*) malloc(reading_elements_number);
  114.         fread(current_read_data, 1, reading_elements_number, data_file);
  115.         memcpy(return_data, current_read_data, reading_elements_number);
  116.         free (current_read_data);
  117.     }
  118.     return return_data;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement