Add gexport and update gmonitor, gshow, ginit.

This commit is contained in:
suxunbin 2019-07-27 22:42:15 +08:00
parent 4ae5aa4326
commit 54fb001f67
12 changed files with 381 additions and 149 deletions

View File

@ -1513,7 +1513,7 @@ Database::get_query_parse_lock()
}
int
Database::query(const string _query, ResultSet& _result_set, FILE* _fp, bool update_flag)
Database::query(const string _query, ResultSet& _result_set, FILE* _fp, bool update_flag, bool export_flag)
{
string dictionary_store_path = this->store_path + "/dictionary.dc";
@ -1555,6 +1555,11 @@ Database::query(const string _query, ResultSet& _result_set, FILE* _fp, bool upd
//general_evaluation.setStringIndexPointer(&tmpsi);
// this->debug_lock.lock();
if(export_flag)
{
general_evaluation.fp = _fp;
general_evaluation.export_flag = export_flag;
}
bool query_ret = general_evaluation.doQuery();
if(!query_ret)
{
@ -1705,16 +1710,19 @@ Database::query(const string _query, ResultSet& _result_set, FILE* _fp, bool upd
long tv_final = Util::get_cur_time();
cout << "Total time used: " << (tv_final - tv_begin) << "ms." << endl;
//if (general_evaluation.needOutputAnswer())
if (need_output_answer)
if(!export_flag)
{
long long ans_num = max((long long)_result_set.ansNum - _result_set.output_offset, 0LL);
if (_result_set.output_limit != -1)
ans_num = min(ans_num, (long long)_result_set.output_limit);
cout << "There has answer: " << ans_num << endl;
cout << "final result is : " << endl;
_result_set.output(_fp);
fprintf(_fp, "\n");
fflush(_fp); //to empty the output buffer in C (fflush(stdin) not work in GCC)
if (need_output_answer)
{
long long ans_num = max((long long)_result_set.ansNum - _result_set.output_offset, 0LL);
if (_result_set.output_limit != -1)
ans_num = min(ans_num, (long long)_result_set.output_limit);
cout << "There has answer: " << ans_num << endl;
cout << "final result is : " << endl;
_result_set.output(_fp);
fprintf(_fp, "\n");
fflush(_fp); //to empty the output buffer in C (fflush(stdin) not work in GCC)
}
}
#ifdef DEBUG

View File

@ -51,7 +51,7 @@ public:
bool load();
bool unload();
void clear();
int query(const string _query, ResultSet& _result_set, FILE* _fp = stdout, bool update_flag = true);
int query(const string _query, ResultSet& _result_set, FILE* _fp = stdout, bool update_flag = true, bool export_flag = false);
//1. if subject of _triple doesn't exist,
//then assign a new subid, and insert a new SigEntry

View File

@ -15,6 +15,8 @@ Strategy::Strategy()
this->method = 0;
this->kvstore = NULL;
this->vstree = NULL;
this->fp = NULL;
this->export_flag = false;
//this->prepare_handler();
}
@ -31,7 +33,8 @@ Strategy::Strategy(KVstore* _kvstore, VSTree* _vstree, TYPE_TRIPLE_NUM* _pre2num
this->limitID_predicate = _limitID_predicate;
this->limitID_literal = _limitID_literal;
this->limitID_entity = _limitID_entity;
this->fp = NULL;
this->export_flag = false;
//this->prepare_handler();
}
@ -83,7 +86,10 @@ Strategy::handle(SPARQLquery& _query)
}
else if ((*iter)->getTripleNum() == 1 && pre_varNum == 1)
{
this->method = 4;
if(this->export_flag)
this->method = 6;
else
this->method = 4;
}
if (this->method < 0 && pre_varNum == 0 && (*iter)->getTripleNum() == 1) //only one triple and no predicates
@ -138,11 +144,22 @@ Strategy::handle(SPARQLquery& _query)
case 5:
this->handler5(*iter, result_list);
break;
case 6:
this->handler6(*iter, result_list);
break;
default:
cout << "not support this method" << endl;
}
cout << "BasicQuery -- Final result size: " << (*iter)->getResultList().size() << endl;
if(this->method == 6)
{
cout << "BasicQuery -- Final result size: " << (*iter)->getResultList()[0][0] << endl;
(*iter)->getResultList().clear();
}
else
{
cout << "BasicQuery -- Final result size: " << (*iter)->getResultList().size() << endl;
}
}
#else
cout << "this BasicQuery use original query strategy" << endl;
@ -904,3 +921,54 @@ Strategy::handler5(BasicQuery* _bq, vector<unsigned*>& _result_list)
delete[] id_list;
}
void
Strategy::handler6(BasicQuery* _bq, vector<unsigned*>& _result_list)
{
cout << "Special Case:select * and write to stream" << endl;
int varNum = _bq->getVarNum();
//all variables(not including pre vars)
int total_num = _bq->getTotalVarNum();
int pre_varNum = _bq->getPreVarNum();
int selected_pre_var_num = _bq->getSelectedPreVarNum();
int selected_var_num = _bq->getSelectVarNum();
Triple triple = _bq->getTriple(0);
int pvpos = _bq->getSelectedPreVarPosition(triple.predicate);
unsigned* id_list = NULL;
unsigned id_list_len = 0;
_result_list.clear();
int svpos = _bq->getSelectedVarPosition(triple.subject);
int ovpos = _bq->getSelectedVarPosition(triple.object);
cout<<"subject: "<<triple.subject<<" "<<svpos<<endl;
cout<<"object: "<<triple.object<<" "<<ovpos<<endl;
cout<<"predicate: "<<triple.predicate<<" "<<pvpos<<endl;
//very special case, to find all triples, select ?s (?p) ?o where { ?s ?p ?o . }
//filter and join is too costly, should enum all predicates and use p2so
unsigned* rsize = new unsigned[1];
rsize[0] = 0;
for (TYPE_PREDICATE_ID i = 0; i < this->limitID_predicate; ++i)
{
TYPE_PREDICATE_ID pid = i;
string p = this->kvstore->getPredicateByID(pid);
string pre = Util::node2string(p.c_str());
this->kvstore->getsubIDobjIDlistBypreID(pid, id_list, id_list_len);
for (unsigned j = 0; j < id_list_len; j += 2)
{
string s = this->kvstore->getEntityByID(id_list[j]);
string sub = Util::node2string(s.c_str());
string o;
if(id_list[j + 1] >= Util::LITERAL_FIRST_ID)
o = this->kvstore->getLiteralByID(id_list[j + 1]);
else
o = this->kvstore->getEntityByID(id_list[j + 1]);
string obj = Util::node2string(o.c_str());
string record = sub + "\t" + pre + "\t" + obj + ".\n";
fprintf(this->fp, "%s", record.c_str());
rsize[0] += 1;
}
delete[] id_list;
}
id_list = NULL;
_result_list.push_back(rsize);
}

View File

@ -21,6 +21,9 @@
class Strategy
{
public:
FILE* fp;
bool export_flag;
Strategy();
// if there exists a variable with limited matches in the query, then skip the filter of other
// variables as soon as possible
@ -51,6 +54,7 @@ private:
void handler3(BasicQuery*, vector<unsigned*>&);
void handler4(BasicQuery*, vector<unsigned*>&);
void handler5(BasicQuery*, vector<unsigned*>&);
void handler6(BasicQuery*, vector<unsigned*>&);
//QueryHandler *dispatch;
//void prepare_handler();
};

83
Main/gexport.cpp Normal file
View File

@ -0,0 +1,83 @@
/*=============================================================================
# Filename: gexport.cpp
# Author: suxunbin
# Last Modified: 2019-07-23 15:37
# Description: export a database to get .nt file
=============================================================================*/
#include "../Database/Database.h"
#include "../Util/Util.h"
using namespace std;
int
main(int argc, char * argv[])
{
Util util;
string db_name;
string filepath;
if (argc == 1)
{
cout << "You need to input the database name that you want to export." << endl;
return 0;
}
else if (argc == 2)
{
db_name = argv[1];
int len = db_name.length();
if (db_name.length() > 3 && db_name.substr(len - 3, 3) == ".db")
{
cout << "The database name can not end with .db" << endl;
return 0;
}
filepath = db_name + ".nt";
}
else if (argc == 3)
{
db_name = argv[1];
int len = db_name.length();
if (db_name.length() > 3 && db_name.substr(len - 3, 3) == ".db")
{
cout << "The database name can not end with .db" << endl;
return 0;
}
filepath = argv[2];
if(filepath[filepath.length()-1] != '/')
filepath = filepath + "/";
if(!boost::filesystem::exists(filepath))
boost::filesystem::create_directories(filepath);
filepath = filepath + db_name + ".nt";
}
cout << "gexport..." << endl;
Database system_db("system");
system_db.load();
string sparql = "ASK WHERE{<" + db_name + "> <database_status> \"already_built\".}";
ResultSet ask_rs;
FILE* ask_ofp = stdout;
int ret = system_db.query(sparql, ask_rs, ask_ofp);
if (ask_rs.answer[0][0] == "false")
{
cout << "The database does not exist." << endl;
return 0;
}
cout << "start exporting the database......" << endl;
Database _db(db_name);
_db.load();
cout << "finish loading" << endl;
sparql = "select * where{?x ?y ?z.}";
ResultSet _rs;
FILE* ofp = fopen(filepath.c_str(), "w");
ret = _db.query(sparql, _rs, ofp, true, true);
fflush(ofp);
fclose(ofp);
ofp = NULL;
cout << "finish exporting the database." << endl;
return 0;
}

View File

@ -13,10 +13,28 @@ using namespace std;
int main(int argc, char * argv[])
{
string op;
if(argc > 1)
{
if(boost::filesystem::exists("system.db"))
return 0;
op = argv[1];
if(op == "-make")
{
if(boost::filesystem::exists("system.db"))
return 0;
}
else if(op == "-d")
{
if(argc == 2)
{
cout << "You need to input at least one database name." << endl;
return 0;
}
}
else
{
cout << "The initialization option is not correct." << endl;
return 0;
}
}
//build system.db
@ -47,7 +65,22 @@ int main(int argc, char * argv[])
_db = new Database(_db_path);
_db->load();
string time = Util::get_date_time();
string sparql = "INSERT DATA {<system> <built_time> \"" + time + "\".}";
string sparql = "INSERT DATA {<system> <built_time> \"" + time + "\".";
if(argc > 1)
{
op = argv[1];
if(op == "-d")
{
for(int i=2; i<argc; i++)
{
string db_name = argv[i];
sparql = sparql + "<" + db_name + "> <database_status> \"already_built\".";
sparql = sparql + "<" + db_name + "> <built_by> <root>.";
sparql = sparql + "<" + db_name + "> <built_time> \"" + time + "\".";
}
}
}
sparql = sparql + "}";
ResultSet _rs;
FILE* ofp = stdout;
string msg;

View File

@ -1,75 +1,84 @@
#include <curl/curl.h>
#include <string>
#include <cstring>
#include <iostream>
/*=============================================================================
# Filename: gmonitor.cpp
# Author: suxunbin
# Mail: suxunbin@pku.edu.cn
# Last Modified: 2019-07-26 16:00
# Description: used to show information of the database
=============================================================================*/
#include "../Util/Util.h"
#include "../Database/Database.h"
using namespace std;
const string UrlEncode(const string& s)
int main(int argc, char * argv[])
{
string ret;
unsigned char *ptr = (unsigned char *)s.c_str();
ret.reserve(s.length());
Util util;
string db_name;
if (argc == 1)
{
cout << "You need to input the database name that you want to show." << endl;
return 0;
}
else if (argc == 2)
{
db_name = argv[1];
int len = db_name.length();
if (db_name.length() > 3 && db_name.substr(len - 3, 3) == ".db")
{
cout << "The database name can not end with .db" << endl;
return 0;
}
}
else
{
cout << "The number of parameters is not correct." << endl;
return 0;
}
for(int i=0;i<s.length();++i)
Database system_db("system");
system_db.load();
string sparql = "ASK WHERE{<" + db_name + "> <database_status> \"already_built\".}";
ResultSet ask_rs;
FILE* ask_ofp = stdout;
int ret = system_db.query(sparql, ask_rs, ask_ofp);
if (ask_rs.answer[0][0] == "false")
{
cout << "The database does not exist." << endl;
return 0;
}
cout << "start loading the database......" << endl;
Database _db(db_name);
_db.load();
cout << "finish loading" << endl;
sparql = "select ?p ?o where{<" + db_name + "> ?p ?o.}";
ResultSet _rs;
FILE* ofp = stdout;
ret = system_db.query(sparql, _rs, ofp);
string creator;
string built_time;
for (int i = 0; i < _rs.ansNum; i++)
{
if((int(ptr[i])==42) || (int(ptr[i])==45) || (int(ptr[i])==46) || (int(ptr[i])==47) || (int(ptr[i])==58) ||(int(ptr[i])==95))
ret += ptr[i];
else if((int(ptr[i])>=48) && (int(ptr[i])<=57))
ret += ptr[i];
else if((int(ptr[i])>=65) && (int(ptr[i])<=90))
ret += ptr[i];
else if((int(ptr[i])>=97) && (int(ptr[i])<=122))
ret += ptr[i];
else if(int(ptr[i])==32)
ret += '+';
else
{
char buf[5];
memset(buf,0,5);
snprintf(buf,5,"%%%X",ptr[i]);
ret.append(buf);
}
string p = _rs.answer[i][0];
string o = _rs.answer[i][1];
if(p == "<built_by>")
creator = o.substr(1,o.length()-2);
else if(p == "<built_time>")
built_time = o;
}
return ret;
}
size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{
string* str = dynamic_cast<string*>((string *)lpVoid);
if( NULL == str || NULL == buffer )
return -1;
char* pData = (char*)buffer;
str->append(pData, size * nmemb);
return nmemb;
}
int
main(int argc, char * argv[])
{
cout << "argc: " << argc << endl;
cout << "ip: " << argv[1] << endl;
cout << "port: " << argv[2] << endl;
cout << "db_name: " << argv[3] << endl;
unsigned triple_num = _db.getTripleNum();
unsigned entity_num = _db.getEntityNum();
unsigned literal_num = _db.getLiteralNum();
unsigned subject_num = _db.getSubNum();
unsigned predicate_num = _db.getPreNum();
string serverIP = string(argv[1]);
string serverPort = string(argv[2]);
string db_name = string(argv[3]);
const string strUrl = "http://"+serverIP+":"+serverPort+"/?operation=monitor&db_name="+db_name;
string res;
res.clear();
CURLcode ret;
CURL* curl = curl_easy_init();
if(NULL == curl)
return CURLE_FAILED_INIT;
curl_easy_setopt(curl, CURLOPT_URL, UrlEncode(strUrl).c_str());
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&res);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
cout<< res <<endl;
return 0;
}
cout<<"\n========================================\n";
string output = "database: " + db_name + "\ncreator: " + creator + "\nbuilt_time: " + built_time + "\n";
output = output + "triple num: " + Util::int2string(triple_num) + "\nentity num: " + Util::int2string(entity_num) + "\nliteral num: " + Util::int2string(literal_num) + "\nsubject num: " + Util::int2string(subject_num) + "\npredicate num: " + Util::int2string(predicate_num)
+ "\n========================================\n";
cout<<output;
return 0;
}

View File

@ -1,73 +1,85 @@
#include <curl/curl.h>
#include <string>
#include <cstring>
#include <iostream>
/*=============================================================================
# Filename: gshow.cpp
# Author: suxunbin
# Mail: suxunbin@pku.edu.cn
# Last Modified: 2019-07-25 17:00
# Description: used to show all the databases that have already been built
=============================================================================*/
#include "../Util/Util.h"
#include "../Database/Database.h"
using namespace std;
const string UrlEncode(const string& s)
{
string ret;
unsigned char *ptr = (unsigned char *)s.c_str();
ret.reserve(s.length());
struct DBInfo{
public:
string db_name;
string creator;
string built_time;
DBInfo(){
}
DBInfo(string _db_name){
db_name = _db_name;
}
~DBInfo(){
}
};
for(int i=0;i<s.length();++i)
string Getstr(string s)
{
int len = s.length();
return s.substr(1,len-2);
}
int main(int argc, char * argv[])
{
Util util;
Database system_db("system");
system_db.load();
string sparql = "select ?s where{?s <database_status> \"already_built\".}";
ResultSet _rs;
FILE* ofp = stdout;
int ret = system_db.query(sparql, _rs, ofp);
DBInfo* databases = new DBInfo[_rs.ansNum+1];
databases[0].db_name = "<system>";
for (int i = 0; i < _rs.ansNum; i++)
{
if((int(ptr[i])==42) || (int(ptr[i])==45) || (int(ptr[i])==46) || (int(ptr[i])==47) || (int(ptr[i])==58) ||(int(ptr[i])==95))
ret += ptr[i];
else if((int(ptr[i])>=48) && (int(ptr[i])<=57))
ret += ptr[i];
else if((int(ptr[i])>=65) && (int(ptr[i])<=90))
ret += ptr[i];
else if((int(ptr[i])>=97) && (int(ptr[i])<=122))
ret += ptr[i];
else if(int(ptr[i])==32)
ret += '+';
else
databases[i+1].db_name = _rs.answer[i][0];
string sparql1 = "select ?p ?o where{" + _rs.answer[i][0] + " ?p ?o.}";
ResultSet _rs1;
FILE* ofp1 = stdout;
int ret1 = system_db.query(sparql1, _rs1, ofp1);
for (int j = 0; j < _rs1.ansNum; j++)
{
char buf[5];
memset(buf,0,5);
snprintf(buf,5,"%%%X",ptr[i]);
ret.append(buf);
string p = _rs1.answer[j][0];
string o = _rs1.answer[j][1];
if(p == "<built_by>")
databases[i+1].creator = o;
else if(p == "<built_time>")
databases[i+1].built_time = o;
}
}
return ret;
}
size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{
string* str = dynamic_cast<string*>((string *)lpVoid);
if( NULL == str || NULL == buffer )
return -1;
char* pData = (char*)buffer;
str->append(pData, size * nmemb);
return nmemb;
}
int
main(int argc, char * argv[])
{
cout << "argc: " << argc << endl;
cout << "ip: " << argv[1] << endl;
cout << "port: " << argv[2] << endl;
string serverIP = string(argv[1]);
string serverPort = string(argv[2]);
const string strUrl = "http://"+serverIP+":"+serverPort+"/?operation=show";
string res;
res.clear();
CURLcode ret;
CURL* curl = curl_easy_init();
if(NULL == curl)
return CURLE_FAILED_INIT;
curl_easy_setopt(curl, CURLOPT_URL, UrlEncode(strUrl).c_str());
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&res);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
cout<< "database: "<< res <<endl;
string sparql1 = "select ?p ?o where{<system> ?p ?o.}";
ResultSet _rs1;
FILE* ofp1 = stdout;
int ret1 = system_db.query(sparql1, _rs1, ofp1);
for (int j = 0; j < _rs1.ansNum; j++)
{
string p = _rs1.answer[j][0];
string o = _rs1.answer[j][1];
if(p == "<built_by>")
databases[0].creator = o;
else if(p == "<built_time>")
databases[0].built_time = o;
}
cout<<"\n========================================\n";
for (int i = 0; i < _rs.ansNum+1; i++)
{
string output = "database: " + Getstr(databases[i].db_name) + "\ncreator: " + Getstr(databases[i].creator) +
"\nbuilt_time: " + databases[i].built_time + "\n========================================\n";
cout<<output;
}
return 0;
}

View File

@ -730,6 +730,11 @@ TempResultSet* GeneralEvaluation::rewritingBasedQueryEvaluation(int dep)
long tv_fillcand = Util::get_cur_time();
printf("after FillCand, used %ld ms.\n", tv_fillcand - tv_encode);
if(this->export_flag)
{
this->strategy.fp = this->fp;
this->strategy.export_flag = this->export_flag;
}
this->strategy.handle(sparql_query);
long tv_handle = Util::get_cur_time();
printf("after Handle, used %ld ms.\n", tv_handle - tv_fillcand);

View File

@ -42,9 +42,13 @@ class GeneralEvaluation
TYPE_ENTITY_LITERAL_ID limitID_literal;
TYPE_ENTITY_LITERAL_ID limitID_entity;
public:
FILE* fp;
bool export_flag;
public:
GeneralEvaluation(VSTree *_vstree, KVstore *_kvstore, StringIndex *_stringindex, QueryCache *_query_cache, TYPE_TRIPLE_NUM *_pre2num,TYPE_TRIPLE_NUM *_pre2sub, TYPE_TRIPLE_NUM *_pre2obj, TYPE_PREDICATE_ID _limitID_predicate, TYPE_ENTITY_LITERAL_ID _limitID_literal, TYPE_ENTITY_LITERAL_ID _limitID_entity):
vstree(_vstree), kvstore(_kvstore), stringindex(_stringindex), query_cache(_query_cache), pre2num(_pre2num), pre2sub(_pre2sub), pre2obj(_pre2obj), limitID_predicate(_limitID_predicate), limitID_literal(_limitID_literal), limitID_entity(_limitID_entity), temp_result(NULL)
vstree(_vstree), kvstore(_kvstore), stringindex(_stringindex), query_cache(_query_cache), pre2num(_pre2num), pre2sub(_pre2sub), pre2obj(_pre2obj), limitID_predicate(_limitID_predicate), limitID_literal(_limitID_literal), limitID_entity(_limitID_entity), temp_result(NULL), fp(NULL), export_flag(false)
{}
bool parseQuery(const std::string &_query);

View File

@ -113,7 +113,7 @@ inc = -I./tools/libantlr3c-3.4/ -I./tools/libantlr3c-3.4/include
#gtest
TARGET = $(exedir)gbuild $(exedir)gserver $(exedir)gserver_backup_scheduler $(exedir)gclient $(exedir)gquery $(exedir)gconsole $(api_java) $(exedir)gadd $(exedir)gsub $(exedir)ghttp $(exedir)gmonitor $(exedir)gshow $(exedir)shutdown $(exedir)ginit $(exedir)gdrop $(testdir)update_test $(testdir)dataset_test
TARGET = $(exedir)gexport $(exedir)gbuild $(exedir)gserver $(exedir)gserver_backup_scheduler $(exedir)gclient $(exedir)gquery $(exedir)gconsole $(api_java) $(exedir)gadd $(exedir)gsub $(exedir)ghttp $(exedir)gmonitor $(exedir)gshow $(exedir)shutdown $(exedir)ginit $(exedir)gdrop $(testdir)update_test $(testdir)dataset_test
all: $(TARGET)
@echo "Compilation ends successfully!"
@ -126,6 +126,9 @@ all: $(TARGET)
#NOTICE:not include g*.o in objfile due to multiple definitions of main()
$(exedir)gexport: $(lib_antlr) $(objdir)gexport.o $(objfile)
$(CC) $(EXEFLAG) -o $(exedir)gexport $(objdir)gexport.o $(objfile) $(library) $(openmp)
$(exedir)gdrop: $(lib_antlr) $(objdir)gdrop.o $(objfile)
$(CC) $(EXEFLAG) -o $(exedir)gdrop $(objdir)gdrop.o $(objfile) $(library) $(openmp)
@ -172,6 +175,9 @@ $(testdir)dataset_test: $(lib_antlr) $(objdir)dataset_test.o $(objfile)
#objects in Main/ begin
$(objdir)gexport.o: Main/gexport.cpp Database/Database.h Util/Util.h $(lib_antlr)
$(CC) $(CFLAGS) Main/gexport.cpp $(inc) -o $(objdir)gexport.o $(openmp)
$(objdir)gdrop.o: Main/gdrop.cpp Database/Database.h Util/Util.h $(lib_antlr)
$(CC) $(CFLAGS) Main/gdrop.cpp $(inc) -o $(objdir)gdrop.o $(openmp)

View File

@ -3,5 +3,5 @@
#set -v
#initialize system.db
"bin/ginit" "--make" >& /dev/null
"bin/ginit" "-make" >& /dev/null