DbResult.cc 1005 B

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