sogou / workflow

C++ Parallel Computing and Asynchronous Networking Framework
Apache License 2.0
13.05k stars 2.41k forks source link

支持PostgreSQL协议的讨论帖 #1546

Open oisin9 opened 5 months ago

oisin9 commented 5 months ago

PostgreSQL数据库是一个流行的开源关系型数据库,计划为workflow框架增加对PostgreSQL协议的支持。后续的进展和讨论将会放到这个Issue中进行。

开发workflow的PG协议的Fork仓库地址: https://github.com/oisin9/workflow/tree/feature-pg

Barenboim commented 2 months ago

我们自己连Postgres server都没有。还是希望有用户可以一起合作搞点东西。

另外,你的项目在哪儿啊?

519984307 commented 2 months ago

我发你邮箱附件中,这个测试我来测试也可以的,不过我是在qt的creator下测试的还是在window版本

Barenboim commented 2 months ago

我发你邮箱附件中,这个测试我来测试也可以的,不过我是在qt的creator下测试的还是在window版本

我建议还是单独开一个项目吧,我也可以上去直接改代码和讨论。我们这边没有postgres的项目,没有办法独立维护。而且感觉你现在做的东西也挺多的了,如果没有做起来也很可惜。

建议用现在的master分支建一个项目,代码应该和windows版是通用的。方便大家调试。

519984307 commented 2 months ago

经过调试发现,找到原因了,现在还有个问题,想请教大佬,image这个set_query()函数我看例子,是set_query()函数的, buf_到encode函数编码,是不是要和seqid_对应在一起,现在是认证成功后,发送一个空的数据包给服务端,导致报错,你的提议挺好的我准备下载个乌班图系统抽空试试

Barenboim commented 2 months ago

经过调试发现,找到原因了,现在还有个问题,想请教大佬,image这个set_query()函数我看例子,是set_query()函数的, buf_到encode函数编码,是不是要和seqid_对应在一起,现在是认证成功后,发送一个空的数据包给服务端,导致报错,你的提议挺好的我准备下载个乌班图系统抽空试试

我觉得你好像不太理解我们的玩法。set_query是用户自己设置好了的,如果用户没有设置,确实可能是发送一个空请求,所以用户肯定要在create_postgres_task()之后,通过task->get_req()->set_query()接口来设置好SQL语句。然后任务被发起:

1、当task被启动,我们并不能主动选择用哪个连接。所以会先通过set_info()让目标管理的模块来选择一个通讯目标(对应一个连接池),这一段模仿MySQL那么写就可以了。

2、之后我们依然不能主动选择连接池里的连接,而是被动得到了一个连接。所以要判断连接的seqid。如果seqid为0,说明这是一个新连接,我们则需要先执行认证部分,认证完,通过finish_once()返回false,让task重新发送一次。重复这个过程,直到拿到一个seqid不为0的连接。

3、在seqid不为0的连接上发送用户请求,完成之后,finish_once()返回true。

也就是说,一个task的运行过程,可能完成了多个连接的认证。因为你并不能保证认证完之后,重新发起任务一定会拿到刚刚认证完的连接。你有可能拿到另外一个认证过的连接,也可能又拿到一个新连接。但无论如何,一定是在你拿到一个认证过的连接的时候,才会发起真正的用户请求。

519984307 commented 2 months ago

谢谢大佬的指导,现在用户查询也成功了,还有点东西要完善一下,等我抽空整理一下,发出来试试还有什么问题

Barenboim commented 2 months ago

谢谢大佬的指导,现在用户查询也成功了,还有点东西要完善一下,等我抽空整理一下,发出来试试还有什么问题

太感谢了!之后做好了,可以建一个插件式的项目让用户安装。