00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <sys/param.h>
00040 #include <sys/types.h>
00041 #include <sys/stat.h>
00042 #include <errno.h>
00043 #include <unistd.h>
00044
00045 #include "DurableStore.h"
00046 #include "debug/DebugUtils.h"
00047 #include "serialize/MarshalSerialize.h"
00048
00049 namespace oasys {
00050
00051 void
00052 DurableStoreImpl::prune_db_dir(const char* dir, int tidy_wait)
00053 {
00054 char cmd[256];
00055 for (int i = tidy_wait; i > 0; --i)
00056 {
00057 log_warn("PRUNING CONTENTS OF %s IN %d SECONDS", dir, i);
00058 sleep(1);
00059 }
00060 sprintf(cmd, "/bin/rm -rf %s", dir);
00061 log_notice("tidy option removing directory '%s'", cmd);
00062 system(cmd);
00063 }
00064
00065 int
00066 DurableStoreImpl::check_db_dir(const char* db_dir, bool* dir_exists)
00067 {
00068 *dir_exists = false;
00069
00070 struct stat f_stat;
00071 if (stat(db_dir, &f_stat) == -1)
00072 {
00073 if (errno == ENOENT)
00074 {
00075 *dir_exists = false;
00076 }
00077 else
00078 {
00079 log_err("error trying to stat database directory %s: %s",
00080 db_dir, strerror(errno));
00081 return DS_ERR;
00082 }
00083 }
00084 else
00085 {
00086 *dir_exists = true;
00087 }
00088
00089 return 0;
00090 }
00091
00092 int
00093 DurableStoreImpl::create_db_dir(const char* db_dir)
00094 {
00095
00096 char pwd[PATH_MAX];
00097
00098 log_notice("creating new database directory %s%s%s",
00099 db_dir[0] == '/' ? "" : getcwd(pwd, PATH_MAX),
00100 db_dir[0] == '/' ? "" : "/",
00101 db_dir);
00102
00103 if (mkdir(db_dir, 0700) != 0)
00104 {
00105 log_crit("can't create datastore directory %s: %s",
00106 db_dir, strerror(errno));
00107 return DS_ERR;
00108 }
00109 return 0;
00110 }
00111
00112 int
00113 DurableTableImpl::get(const SerializableObject& key,
00114 SerializableObject** data,
00115 TypeCollection::Allocator_t allocator)
00116 {
00117 (void)key;
00118 (void)data;
00119 (void)allocator;
00120 PANIC("Generic DurableTableImpl get method called for "
00121 "multi-type tables");
00122 }
00123
00124 size_t
00125 DurableTableImpl::flatten(const SerializableObject& key,
00126 u_char* key_buf, size_t size)
00127 {
00128 MarshalSize sizer(Serialize::CONTEXT_LOCAL);
00129 sizer.action(&key);
00130
00131 if (sizer.size() > size)
00132 {
00133 return 0;
00134 }
00135
00136 Marshal marshaller(Serialize::CONTEXT_LOCAL, key_buf, 256);
00137 marshaller.action(&key);
00138
00139 return sizer.size();
00140 }
00141
00142 }