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