Przeglądaj źródła

开始写protobuf mysql orm,目前可以拼凑出insert sql语句

tanghai 14 lat temu
rodzic
commit
1ccb1e5d14

+ 85 - 0
Cpp/Platform/Orm/MessageField.cc

@@ -0,0 +1,85 @@
+#include <glog/logging.h>
+#include "Orm/MessageField.h"
+
+namespace Egametang {
+
+MessageField::MessageField(
+		const google::protobuf::Message& message,
+		const google::protobuf::FieldDescriptor* field):
+	message(message), field(field)
+{
+}
+
+MessageField::~MessageField()
+{
+}
+
+std::string MessageField::ValueToString()
+{
+	const google::protobuf::Reflection* reflection = message.GetReflection();
+	google::protobuf::FieldDescriptor::Type type = field->type();
+	std::string valueStr = "";
+	switch (type)
+	{
+		case google::protobuf::FieldDescriptor::TYPE_BOOL:
+		{
+			bool value = reflection->GetBool(message, field);
+			valueStr = value? "1" : "0";
+			break;
+		}
+		case google::protobuf::FieldDescriptor::TYPE_DOUBLE:
+		{
+			double value = reflection->GetDouble(message, field);
+			valueStr = boost::lexical_cast<std::string>(value);
+			break;
+		}
+		case google::protobuf::FieldDescriptor::TYPE_INT32:
+		{
+			int32 value = reflection->GetInt32(message, field);
+			valueStr = boost::lexical_cast<std::string>(value);
+			break;
+		}
+		case google::protobuf::FieldDescriptor::TYPE_INT64:
+		{
+			int64 value = reflection->GetInt64(message, field);
+			valueStr = boost::lexical_cast<std::string>(value);
+			break;
+		}
+		case google::protobuf::FieldDescriptor::TYPE_UINT32:
+		{
+			uint32 value = reflection->GetUInt32(message, field);
+			valueStr = boost::lexical_cast<std::string>(value);
+			break;
+		}
+		case google::protobuf::FieldDescriptor::TYPE_UINT64:
+		{
+			uint64 value = reflection->GetUInt64(message, field);
+			valueStr = boost::lexical_cast<std::string>(value);
+			break;
+		}
+		case google::protobuf::FieldDescriptor::TYPE_STRING:
+		{
+			valueStr = "'" + reflection->GetString(message, field) + "'";
+			break;
+		}
+		case google::protobuf::FieldDescriptor::TYPE_BYTES:
+		{
+			valueStr = "'" + reflection->GetString(message, field) + "'";
+			break;
+		}
+		case google::protobuf::FieldDescriptor::TYPE_MESSAGE:
+		{
+			google::protobuf::Message& message = reflection->GetMessage(message, field);
+			valueStr = "'" + message.SerializeAsString() + "'";
+			break;
+		}
+		default:
+		{
+			LOG(FATAL) << "no such type";
+			break;
+		}
+	}
+	return valueStr;
+}
+
+} // namespace Egametang

+ 22 - 0
Cpp/Platform/Orm/MessageField.h

@@ -0,0 +1,22 @@
+#ifndef ORM_MESSAGEFIELD_H
+#define ORM_MESSAGEFIELD_H
+
+#include <string>
+
+namespace Egametang {
+
+class MessageField
+{
+private:
+	const google::protobuf::Message& message;
+	const google::protobuf::FieldDescriptor* field;
+
+public:
+	MessageField(const google::protobuf::Message& message,
+			const google::protobuf::FieldDescriptor* field);
+	~MessageField();
+	std::string MessageField::ValueToString();
+};
+
+} // namespace Egametang
+#endif // ORM_MESSAGEFIELD_H

+ 8 - 0
Cpp/Platform/Orm/MessageFieldTest.cc

@@ -0,0 +1,8 @@
+// Copyright 2011 Netease Inc. All Rights Reserved.
+// Author: tanghai@corp.netease.com (tanghai)
+
+#include "MessageField.h"
+
+namespace Egametang {
+
+} // namespace Egametang

+ 61 - 0
Cpp/Platform/Orm/OrmConn.cc

@@ -0,0 +1,61 @@
+#include <google/protobuf/descriptor.h>
+#include <glog/logging.h>
+#include "Orm/OrmConn.h"
+
+namespace Egametang {
+
+OrmConn::OrmConn()
+{
+}
+
+OrmConn::~OrmConn()
+{
+}
+
+// 根据message拼出类似如下的sql语句
+// insert into person(id, name, sex, age, marry) values(1, 'xiaoming', 'M', 18, 1);
+std::string OrmConn::GetInsertSQL(const google::protobuf::Message& message)
+{
+	std::string sql = "";
+	std::string tableName = message.GetTypeName();
+	const google::protobuf::Reflection* reflection = message.GetReflection();
+
+	sql += "insert into " + tableName + "(";
+	std::string columnNames = "";
+	std::string valueString = "";
+	for (int i = 0; i < message.GetDescriptor()->field_count(); ++i)
+	{
+		const google::protobuf::FieldDescriptor* field = message.GetDescriptor()->field(i);
+		if (!reflection->HasField(field))
+		{
+			continue;
+		}
+
+		std::string name = field->name();
+		columnNames += name + ", ";
+
+		MessageField msgField(message, field);
+		valueString += msgField.ValueToString() + ", ";
+	}
+	// 去除最后的逗号
+	columnNames.resize(columnNames.size() - 2);
+	valueString.resize(valueString.size() - 2);
+	sql += columnNames + ") values(";
+	sql += valueString + ");";
+	return sql;
+}
+
+void OrmConn::Select(std::vector<boost::shared_ptr<google::protobuf::Message> >& messages, Condition condition)
+{
+}
+
+void OrmConn::Insert(const google::protobuf::Message& message)
+{
+	std::string sql = GetInsertSQL(message);
+}
+
+void OrmConn::Update(const google::protobuf::Message& message, Condition condition)
+{
+}
+
+} // namespace Egametang

+ 38 - 0
Cpp/Platform/Orm/OrmConn.h

@@ -0,0 +1,38 @@
+#ifndef ORM_ORMCONN_H
+#define ORM_ORMCONN_H
+
+#include <vector>
+#include <boost/shared_ptr.hpp>
+#include <google/protobuf/message.h>
+
+namespace Egametang {
+
+class Condition;
+
+class OrmConn
+{
+private:
+	std::string GetInsertSQL(const google::protobuf::Message& message);
+
+public:
+	OrmConn();
+	virtual ~OrmConn();
+
+	void Select(std::vector<boost::shared_ptr<google::protobuf::Message> >& messages, Condition condition);
+
+	void Insert(const google::protobuf::Message& message);
+
+	void Update(const google::protobuf::Message& message, Condition condition);
+
+	template<typename T>
+	void Delete();
+};
+
+}
+
+template<typename T> inline void Egametang::OrmConn::Delete()
+{
+}
+
+ // namespace Egametang
+#endif  // ORM_ORMCONN_H

+ 5 - 0
Cpp/Platform/Orm/OrmConnTest.cc

@@ -0,0 +1,5 @@
+#include "Orm/OrmConn.h"
+
+namespace Egametang {
+
+} // namespace Egametang