mirror of https://github.com/JAJames/Jupiter.git
JustinAJ
10 years ago
2 changed files with 238 additions and 0 deletions
@ -0,0 +1,167 @@ |
|||||
|
/**
|
||||
|
* Copyright (C) Justin James - All Rights Reserved. |
||||
|
* Unauthorized use or copying of this file via any medium is strictly prohibited. |
||||
|
* This document is proprietary and confidential. |
||||
|
* This document should be immediately destroyed unless given explicit permission by Justin James. |
||||
|
* Written by Justin James <justin.aj@hotmail.com> |
||||
|
*/ |
||||
|
|
||||
|
#include "Database.h" |
||||
|
|
||||
|
void Jupiter::Database::process_header(FILE *) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
void Jupiter::Database::create_header(FILE *) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::process_file(Jupiter::ReadableString &file) |
||||
|
{ |
||||
|
Jupiter::Database::file_name = file; |
||||
|
return Jupiter::Database::process_file(); |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::process_file(Jupiter::CStringType &file) |
||||
|
{ |
||||
|
Jupiter::Database::file_name = file; |
||||
|
return Jupiter::Database::process_file(); |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::process_file(const char *file) |
||||
|
{ |
||||
|
Jupiter::Database::file_name = file; |
||||
|
return Jupiter::Database::process_file(); |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::process_file() |
||||
|
{ |
||||
|
FILE *file = fopen(Jupiter::Database::file_name.c_str(), "rb"); |
||||
|
if (file == nullptr) |
||||
|
{ |
||||
|
if (Jupiter::Database::auto_create) |
||||
|
{ |
||||
|
file = fopen(Jupiter::Database::file_name.c_str(), "wb"); |
||||
|
if (file != nullptr) |
||||
|
{ |
||||
|
this->create_header(file); |
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
bool r = Jupiter::Database::process_file(file); |
||||
|
fclose(file); |
||||
|
return r; |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::process_file(FILE *file) |
||||
|
{ |
||||
|
/**
|
||||
|
* FILE FORMAT: |
||||
|
* HEADER |
||||
|
* DATA (Buffer[x]) |
||||
|
*/ |
||||
|
Jupiter::DataBuffer buffer; |
||||
|
this->process_header(file); |
||||
|
fpos_t pos; |
||||
|
fgetpos(file, &pos); |
||||
|
|
||||
|
while (fgetc(file) != EOF) |
||||
|
{ |
||||
|
fsetpos(file, &pos); |
||||
|
buffer.pop_from(file); |
||||
|
this->process_data(buffer, file, pos); |
||||
|
buffer.empty(); |
||||
|
fgetpos(file, &pos); |
||||
|
} |
||||
|
this->process_file_finish(file); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
void Jupiter::Database::process_file_finish(FILE *) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::append(Jupiter::DataBuffer &data) |
||||
|
{ |
||||
|
return Jupiter::Database::append(Jupiter::Database::file_name, data); |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::append(Jupiter::ReadableString &file, Jupiter::DataBuffer &data) |
||||
|
{ |
||||
|
char *str = new char[file.size() + 1]; |
||||
|
memcpy(str, file.ptr(), file.size() * sizeof(char)); |
||||
|
str[file.size()] = '\0'; |
||||
|
bool r = Jupiter::Database::append(str, data); |
||||
|
delete[] str; |
||||
|
return r; |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::append(Jupiter::CStringType &file, Jupiter::DataBuffer &data) |
||||
|
{ |
||||
|
return Jupiter::Database::append(file.c_str(), data); |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::append(const char *file, Jupiter::DataBuffer &data) |
||||
|
{ |
||||
|
FILE *f = fopen(file, "ab"); |
||||
|
if (f == nullptr) |
||||
|
return false; |
||||
|
bool r = Jupiter::Database::append(f, data); |
||||
|
fclose(f); |
||||
|
return r; |
||||
|
} |
||||
|
|
||||
|
template<typename T> T *get_ptr(T &in) |
||||
|
{ |
||||
|
return ∈ |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::append(FILE *file, Jupiter::DataBuffer &data) |
||||
|
{ |
||||
|
fwrite(std::addressof<const size_t>(data.size()), sizeof(size_t), 1, file); |
||||
|
fwrite(data.getHead(), sizeof(uint8_t), data.size(), file); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::create_database(Jupiter::ReadableString &file, Jupiter::DataBuffer *header) |
||||
|
{ |
||||
|
char *str = new char[file.size() + 1]; |
||||
|
memcpy(str, file.ptr(), file.size() * sizeof(char)); |
||||
|
str[file.size()] = '\0'; |
||||
|
bool r = Jupiter::Database::create_database(str, header); |
||||
|
delete[] str; |
||||
|
return r; |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::create_database(Jupiter::CStringType &file, Jupiter::DataBuffer *header) |
||||
|
{ |
||||
|
return Jupiter::Database::create_database(file.c_str(), header); |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::create_database(const char *file, Jupiter::DataBuffer *header) |
||||
|
{ |
||||
|
FILE *f = fopen(file, "wb"); |
||||
|
if (file == nullptr) |
||||
|
return false; |
||||
|
return Jupiter::Database::create_database(f, header); |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::create_database(FILE *file, Jupiter::DataBuffer *header) |
||||
|
{ |
||||
|
if (header != nullptr) |
||||
|
fwrite(header->getHead(), sizeof(uint8_t), header->size(), file); |
||||
|
fclose(file); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
bool Jupiter::Database::is_auto_create() |
||||
|
{ |
||||
|
return Jupiter::Database::auto_create; |
||||
|
} |
||||
|
|
||||
|
void Jupiter::Database::set_auto_create(bool auto_create_) |
||||
|
{ |
||||
|
Jupiter::Database::auto_create = auto_create_; |
||||
|
} |
@ -0,0 +1,71 @@ |
|||||
|
/**
|
||||
|
* Copyright (C) 2015 Justin James. |
||||
|
* |
||||
|
* This license must be preserved. |
||||
|
* Any applications, libraries, or code which make any use of any |
||||
|
* component of this program must not be commercial, unless explicit |
||||
|
* permission is granted from the original author. The use of this |
||||
|
* program for non-profit purposes is permitted. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
||||
|
* |
||||
|
* In the event that this license restricts you from making desired use of this program, contact the original author. |
||||
|
* Written by Justin James <justin.aj@hotmail.com> |
||||
|
*/ |
||||
|
|
||||
|
#if !defined _DATABASE_H_HEADER |
||||
|
#define _DATABASE_H_HEADER |
||||
|
|
||||
|
/**
|
||||
|
* @file Database.h |
||||
|
* @brief Defines a database file structure. |
||||
|
*/ |
||||
|
|
||||
|
#include "CString.h" |
||||
|
|
||||
|
namespace Jupiter |
||||
|
{ |
||||
|
|
||||
|
/**
|
||||
|
* @brief Provides an implementation for database files. |
||||
|
* |
||||
|
* @param T Element type which the String will store. Defaults to char. |
||||
|
*/ |
||||
|
class JUPITER_API Database |
||||
|
{ |
||||
|
public: |
||||
|
virtual void process_data(Jupiter::DataBuffer &buffer, FILE *file, fpos_t pos) = 0; |
||||
|
virtual void process_header(FILE *file); |
||||
|
virtual void create_header(FILE *file); |
||||
|
|
||||
|
bool process_file(Jupiter::ReadableString &file); |
||||
|
bool process_file(Jupiter::CStringType &file); |
||||
|
bool process_file(const char *file); |
||||
|
bool process_file(FILE *file); |
||||
|
virtual void process_file_finish(FILE *file); |
||||
|
|
||||
|
bool append(Jupiter::DataBuffer &data); |
||||
|
|
||||
|
static bool append(Jupiter::ReadableString &file, Jupiter::DataBuffer &data); |
||||
|
static bool append(Jupiter::CStringType &file, Jupiter::DataBuffer &data); |
||||
|
static bool append(const char *file, Jupiter::DataBuffer &data); |
||||
|
static bool append(FILE *file, Jupiter::DataBuffer &data); |
||||
|
|
||||
|
static bool create_database(Jupiter::ReadableString &file, Jupiter::DataBuffer *header = nullptr); |
||||
|
static bool create_database(Jupiter::CStringType &file, Jupiter::DataBuffer *header = nullptr); |
||||
|
static bool create_database(const char *file, Jupiter::DataBuffer *header = nullptr); |
||||
|
|
||||
|
bool is_auto_create(); |
||||
|
void set_auto_create(bool auto_create); |
||||
|
private: |
||||
|
bool process_file(); |
||||
|
static bool create_database(FILE *file, Jupiter::DataBuffer *header); |
||||
|
|
||||
|
bool auto_create = true; |
||||
|
Jupiter::CStringS file_name; |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
#endif // _DATABASE_H_HEADER
|
Loading…
Reference in new issue