DbResult.cc 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. // Copyright: All Rights Reserved
  2. // Author: egametang@gmail.com (tanghai)
  3. #include <glog/logging.h>
  4. #include <google/protobuf/descriptor.h>
  5. #include "Orm/DbResult.h"
  6. #include "Orm/MessageField.h"
  7. #include "Orm/Exception.h"
  8. namespace Egametang {
  9. DbResult::DbResult(ResultSetPtr resultSet): resultSet(resultSet)
  10. {
  11. }
  12. void DbResult::FillMessage(ProtobufMessagePtr message)
  13. {
  14. const google::protobuf::Descriptor* descriptor = message->GetDescriptor();
  15. for (int i = 0; i < descriptor->field_count(); ++i)
  16. {
  17. if (resultSet->isNull(i + 1))
  18. {
  19. continue;
  20. }
  21. const google::protobuf::FieldDescriptor* field = descriptor->field(i);
  22. MessageField messageField(*message, field);
  23. messageField.SetField(resultSet);
  24. }
  25. }
  26. void DbResult::One(ProtobufMessagePtr message)
  27. {
  28. if (resultSet->rowsCount() == 0)
  29. {
  30. throw SqlNoDataException() << SqlNoDataErrStr("sql return no data");
  31. }
  32. if (resultSet->next())
  33. {
  34. FillMessage(message);
  35. }
  36. }
  37. std::size_t DbResult::Count()
  38. {
  39. return resultSet->rowsCount();
  40. }
  41. } // namespace Egametang