Commit 8a676116 authored by yiwenshao's avatar yiwenshao

add comments

parent d5b01d7f
...@@ -70,7 +70,7 @@ static class ANON : public CItemSubtypeIT<Item_string, ...@@ -70,7 +70,7 @@ static class ANON : public CItemSubtypeIT<Item_string,
LOG(cdb_v) << "do_rewrite_type String item " << i << std::endl; LOG(cdb_v) << "do_rewrite_type String item " << i << std::endl;
return encrypt_item(i, constr, a); return encrypt_item(i, constr, a);
} }
//Rewrite item_string in insert query.
virtual void virtual void
do_rewrite_insert_type(const Item_string &i, const FieldMeta &fm, do_rewrite_insert_type(const Item_string &i, const FieldMeta &fm,
Analysis &a, std::vector<Item *> *l) const Analysis &a, std::vector<Item *> *l) const
...@@ -97,7 +97,7 @@ static class ANON : public CItemSubtypeIT<Item_float, ...@@ -97,7 +97,7 @@ static class ANON : public CItemSubtypeIT<Item_float,
LOG(cdb_v) << "do_rewrite_type Float item " << i << std::endl; LOG(cdb_v) << "do_rewrite_type Float item " << i << std::endl;
return encrypt_item(i, constr, a); return encrypt_item(i, constr, a);
} }
//Rewrite item_float in insert query.
virtual void virtual void
do_rewrite_insert_type(const Item_float &i, const FieldMeta &fm, do_rewrite_insert_type(const Item_float &i, const FieldMeta &fm,
Analysis &a, std::vector<Item *> *l) const Analysis &a, std::vector<Item *> *l) const
...@@ -132,6 +132,7 @@ static class ANON : public CItemSubtypeIT<Item_int, Item::Type::INT_ITEM> { ...@@ -132,6 +132,7 @@ static class ANON : public CItemSubtypeIT<Item_int, Item::Type::INT_ITEM> {
return encrypt_item(i, constr, a); return encrypt_item(i, constr, a);
} }
//Rewrite item_int in insert query.
virtual void virtual void
do_rewrite_insert_type(const Item_int &i, const FieldMeta &fm, do_rewrite_insert_type(const Item_int &i, const FieldMeta &fm,
Analysis &a, std::vector<Item *> *l) const Analysis &a, std::vector<Item *> *l) const
...@@ -166,7 +167,7 @@ static class ANON : public CItemSubtypeIT<Item_decimal, ...@@ -166,7 +167,7 @@ static class ANON : public CItemSubtypeIT<Item_decimal,
return encrypt_item(i, constr, a); return encrypt_item(i, constr, a);
} }
//Rewrite item_decimal in insert query.
virtual void virtual void
do_rewrite_insert_type(const Item_decimal &i, const FieldMeta &fm, do_rewrite_insert_type(const Item_decimal &i, const FieldMeta &fm,
Analysis &a, std::vector<Item *> *l) const Analysis &a, std::vector<Item *> *l) const
......
...@@ -59,7 +59,7 @@ deductPlainTableName(const std::string &field_name, ...@@ -59,7 +59,7 @@ deductPlainTableName(const std::string &field_name,
return deductPlainTableName(field_name, context->outer_context, a); return deductPlainTableName(field_name, context->outer_context, a);
} }
//对于select的选择域, 由于是FIELD_ITEM类型, 会使用到这个类的. //In 'select fields from table', fields has the type FIELD_ITEM, which can be rewritten by this class.
class ANON : public CItemSubtypeIT<Item_field, Item::Type::FIELD_ITEM> { class ANON : public CItemSubtypeIT<Item_field, Item::Type::FIELD_ITEM> {
virtual RewritePlan * virtual RewritePlan *
do_gather_type(const Item_field &i, Analysis &a) const do_gather_type(const Item_field &i, Analysis &a) const
...@@ -79,7 +79,7 @@ class ANON : public CItemSubtypeIT<Item_field, Item::Type::FIELD_ITEM> { ...@@ -79,7 +79,7 @@ class ANON : public CItemSubtypeIT<Item_field, Item::Type::FIELD_ITEM> {
return new RewritePlan(es, rsn); return new RewritePlan(es, rsn);
} }
//select的选择域rewrite的时候会用到, 从全局的rewrite调用. //'select fields from table.'; fields can be rewritten by this function.
virtual Item * virtual Item *
do_rewrite_type(const Item_field &i, const OLK &constr, do_rewrite_type(const Item_field &i, const OLK &constr,
const RewritePlan &rp, Analysis &a) const RewritePlan &rp, Analysis &a)
...@@ -137,6 +137,7 @@ class ANON : public CItemSubtypeIT<Item_field, Item::Type::FIELD_ITEM> { ...@@ -137,6 +137,7 @@ class ANON : public CItemSubtypeIT<Item_field, Item::Type::FIELD_ITEM> {
return res; return res;
} }
//'insert into fields values xxx'; fields can be rewritten by this function.
virtual void virtual void
do_rewrite_insert_type(const Item_field &i, const FieldMeta &fm, do_rewrite_insert_type(const Item_field &i, const FieldMeta &fm,
Analysis &a, std::vector<Item *> *l) const Analysis &a, std::vector<Item *> *l) const
......
...@@ -203,7 +203,7 @@ static class ANON : public CItemSubtypeFT<Item_func_neg, Item_func::Functype::NE ...@@ -203,7 +203,7 @@ static class ANON : public CItemSubtypeFT<Item_func_neg, Item_func::Functype::NE
{ {
return do_optimize_type_self_and_args(i, a); return do_optimize_type_self_and_args(i, a);
} }
//Rewrite item_func_neg in insert query.
virtual void virtual void
do_rewrite_insert_type(const Item_func_neg &i, const FieldMeta &fm, do_rewrite_insert_type(const Item_func_neg &i, const FieldMeta &fm,
Analysis &a, std::vector<Item *> *l) const Analysis &a, std::vector<Item *> *l) const
......
...@@ -135,7 +135,7 @@ class CItemSubtype : public CItemType { ...@@ -135,7 +135,7 @@ class CItemSubtype : public CItemType {
{ {
return do_rewrite_type(static_cast<const T &>(i), constr, rp, a); return do_rewrite_type(static_cast<const T &>(i), constr, rp, a);
} }
//Rewrite item. If the item is item_field, then rewrite the name and add salt if needed.
virtual void do_rewrite_insert(const Item &i, const FieldMeta &fm, virtual void do_rewrite_insert(const Item &i, const FieldMeta &fm,
Analysis &a, Analysis &a,
std::vector<Item *> *l) const std::vector<Item *> *l) const
......
...@@ -378,6 +378,7 @@ static class ANON : public CItemSubtypeIT<Item_null, Item::Type::NULL_ITEM> { ...@@ -378,6 +378,7 @@ static class ANON : public CItemSubtypeIT<Item_null, Item::Type::NULL_ITEM> {
return RiboldMYSQL::clone_item(i); return RiboldMYSQL::clone_item(i);
} }
//rewrite item null in insert query.
virtual void virtual void
do_rewrite_insert_type(const Item_null &i, const FieldMeta &fm, do_rewrite_insert_type(const Item_null &i, const FieldMeta &fm,
Analysis &a, std::vector<Item *> *l) const Analysis &a, std::vector<Item *> *l) const
......
...@@ -634,14 +634,12 @@ Item * ...@@ -634,14 +634,12 @@ Item *
encrypt_item_layers(const Item &i, onion o, const OnionMeta &om, encrypt_item_layers(const Item &i, onion o, const OnionMeta &om,
const Analysis &a, uint64_t IV) { const Analysis &a, uint64_t IV) {
assert(!RiboldMYSQL::is_null(i)); assert(!RiboldMYSQL::is_null(i));
//这里是onionMeta中的vector, enclayers.也就是洋葱不同层次的加解密通过Onionmeta以及 //enc_layers is stored in onionMeta actually.
//encLary中的加解密算法来完成.
const auto &enc_layers = a.getEncLayers(om); const auto &enc_layers = a.getEncLayers(om);
assert_s(enc_layers.size() > 0, "onion must have at least one layer"); assert_s(enc_layers.size() > 0, "onion must have at least one layer");
const Item *enc = &i; const Item *enc = &i;
Item *new_enc = NULL; Item *new_enc = NULL;
//这段代码体现了层次加密,也就是说, 通过IV,每个洋葱的层次通过enclayer来表示 //This is layers of encryption
//直接调用其加密和解密函数, 就可以完成加密工作. 加密以后获得的是Item,最后返回加密以后的结果
for (const auto &it : enc_layers) { for (const auto &it : enc_layers) {
LOG(encl) << "encrypt layer " LOG(encl) << "encrypt layer "
<< TypeText<SECLEVEL>::toText(it->level()) << "\n"; << TypeText<SECLEVEL>::toText(it->level()) << "\n";
...@@ -671,31 +669,25 @@ void ...@@ -671,31 +669,25 @@ void
encrypt_item_all_onions(const Item &i, const FieldMeta &fm, encrypt_item_all_onions(const Item &i, const FieldMeta &fm,
uint64_t IV, Analysis &a, std::vector<Item*> *l) uint64_t IV, Analysis &a, std::vector<Item*> *l)
{ {
for (auto it : fm.orderedOnionMetas()) { //each fieldmeta represents a field, which contains many onions. The onions are stored as
//kv pairs in the form <onionmetekey,onoinmeta>. onionmetakey is the enum type of the onion,
//and the value is the onionmeta.
for (auto it : fm.orderedOnionMetas()) {
const onion o = it.first->getValue(); const onion o = it.first->getValue();
OnionMeta * const om = it.second; OnionMeta * const om = it.second;
//一个fieldmeta表示一个field, 内部的不同洋葱表现在onionMeta,每个onionMeta的不同层次表现 //om can be NULL for backup workload
//在enclyer. 而保持的时候, 是onometekey,onoinmeta这种pair来让我们知道这个onionMeta是哪种 if(om!=NULL)
//枚举的洋葱类型.
if(om!=NULL)//om could be NULL for backup workload
l->push_back(encrypt_item_layers(i, o, *om, a, IV)); l->push_back(encrypt_item_layers(i, o, *om, a, IV));
else l->push_back(NULL); else l->push_back(NULL);
} }
} }
//Called by do_rewrite_insert_type
void void
typical_rewrite_insert_type(const Item &i, const FieldMeta &fm, typical_rewrite_insert_type(const Item &i, const FieldMeta &fm,
Analysis &a, std::vector<Item *> *l) { Analysis &a, std::vector<Item *> *l) {
const uint64_t salt = fm.getHasSalt() ? randomValue() : 0; const uint64_t salt = fm.getHasSalt() ? randomValue() : 0;
encrypt_item_all_onions(i, fm, salt, a, l); encrypt_item_all_onions(i, fm, salt, a, l);
//对于每种类型, 除了保存加密的洋葱, 还把fm中的salt也变成Int类型保存起来了, 所以会出现奇怪的多了一组数据的情况, 就看
//这个东西是什么时候应用.
if (fm.getHasSalt()) { if (fm.getHasSalt()) {
l->push_back(new Item_int(static_cast<ulonglong>(salt))); l->push_back(new Item_int(static_cast<ulonglong>(salt)));
} }
......
#include <iostream>
#include <vector>
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <main/Connect.hh>
#include <main/rewrite_util.hh>
#include <main/sql_handler.hh>
#include <main/dml_handler.hh>
#include <main/ddl_handler.hh>
#include <main/CryptoHandlers.hh>
static std::string embeddedDir="/t/cryt/shadow";
static void testInsertHandler(std::string query){
std::unique_ptr<Connect> e_conn(Connect::getEmbedded(embeddedDir));
std::unique_ptr<SchemaInfo> schema(new SchemaInfo());
std::function<DBMeta *(DBMeta *const)> loadChildren =
[&loadChildren, &e_conn](DBMeta *const parent) {
auto kids = parent->fetchChildren(e_conn);
for (auto it : kids) {
loadChildren(it);
}
return parent;
};
//load all metadata and then store it in schema
loadChildren(schema.get());
const std::unique_ptr<AES_KEY> &TK = std::unique_ptr<AES_KEY>(getKey(std::string("113341234")));
//just like what we do in Rewrite::rewrite,dispatchOnLex
Analysis analysis(std::string("tdb"),*schema,TK,
SECURITY_RATING::SENSITIVE);
DMLHandler *h = new InsertHandler();
std::unique_ptr<query_parse> p;
p = std::unique_ptr<query_parse>(
new query_parse("tdb", query));
LEX *const lex = p->lex();
auto executor = h->transformLex(analysis,lex);
std::cout<<((DMLQueryExecutor*)executor)->getQuery()<<std::endl;
}
int
main() {
char *buffer;
if((buffer = getcwd(NULL, 0)) == NULL){
perror("getcwd error");
}
embeddedDir = std::string(buffer)+"/shadow";
const std::string master_key = "113341234";
ConnectionInfo ci("localhost", "root", "letmein",3306);
SharedProxyState *shared_ps = new SharedProxyState(ci, embeddedDir , master_key, determineSecurityRating());
assert(shared_ps!=NULL);
std::string query1 = "insert into student values(NULL)";
std::vector<std::string> querys{query1};
for(auto item:querys){
std::cout<<item<<std::endl;
testInsertHandler(item);
std::cout<<std::endl;
}
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment