SCM

[#1011005] using 2 NpgsqlCopyIn at the same time

View Trackers | Bugs | Download .csv | Monitor

Date:
2011-03-07 17:14
Priority:
3
State:
Open
Submitted by:
Chupa Kabra (chupakabra)
Assigned to:
Nobody (None)
Npgsql Version:
2.0.11
Category:
None
Group:
None
Resolution:
None
Summary:
using 2 NpgsqlCopyIn at the same time

Detailed description
if an application using two or more NpgsqlCopyIn at the same time and it upload data to tables with different number of columns npsql raise exception ERROR: 22P04: extra data after last expected column

sample code:

var cb = new NpgsqlConnectionStringBuilder("host=127.0.0.1;User Id=postgres;Password=xxxxxx;database=temp");

var connection1 = new NpgsqlConnection(cb.ToString());
var connection2 = new NpgsqlConnection(cb.ToString());

connection1.Open();
connection2.Open();

var copy1 = new NpgsqlCopyIn("COPY table1 FROM STDIN;", connection1);
var copy2 = new NpgsqlCopyIn("COPY table2 FROM STDIN;", connection2);

copy1.Start();
copy2.Start();

NpgsqlCopySerializer cs1 = new NpgsqlCopySerializer(connection1);
//NpgsqlCopySerializer cs2 = new NpgsqlCopySerializer(connection2);

for (int index = 0; index < 10; index ++)
{
cs1.AddInt32(index);
cs1.AddString(string.Format("Index {0} ", index));
cs1.EndRow();

/*cs2.AddInt32(index);
cs2.AddNull();
cs2.AddString(string.Format("Index {0} ", index));
cs2.AddNull();
cs2.AddString("jjjjj");
cs2.AddNull();
cs2.EndRow();*/

}
cs1.Close(); //Exception
//cs2.Close();

copy1.End();
copy2.End();

connection1.Close();
connection2.Close();

database structure:

CREATE TABLE table1
(
id integer,
"name" character varying(100)
)
WITH (
OIDS=FALSE
);
ALTER TABLE table1 OWNER TO postgres;

CREATE TABLE table2
(
id integer,
"null1" integer,
"name" character varying(100),
"null2" integer,
"description" character varying(1000),
"null3" integer
)
WITH (
OIDS=FALSE
);
ALTER TABLE table2 OWNER TO postgres;

you can find more details here (russian) http://www.sql.ru/forum/actualthread.aspx?tid=832312

Followup

Message
Date: 2017-10-22 09:34
Sender: semechkagync semechkagyncGJ

<a href=https://семечка-джа.com/it/%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B0%D0%B2%D1%82%D0%BE%D1%86%D0%B2%D0%B5%D1%82%D1%8B/>Autofiorenti semi di cannabis, in contanti alla consegna</a>
Компания-производитель “Семечка Джа” занимается реализацией отборных семян канабисанаилучших видов и
уже несколько лет является лидером в этом сегменте рынка.

Заметьте как в Европе реализован сбыт семян конопли. Взять хотябы http://www.cannabiscollege.com/ или здесь
https://www.cancer.gov/about-cancer/treatment/cam/hp/cannabis-pdq. Узаконивание проходит во всё большем количестве объектов. Сервис постоянно совершенствуется А что мы видим у на Украине только одинокий интернет магазин отличного сервиса !!! Единственный хороший магазин семян конопли - seedjah.com и тот заблокирован роскомнадзором (((

Мы предлагаем Вам семена только самого
высокого качества, которые имеют потрясающе
высокий коэффициент всхожести. Кроме качества предлагаемого товара, Вас обязательно удивят
наши демократичные цены. Это объясняется тем, что высокий уровень конкуренция среди
производителей, продающих подобного родатовар,
вынуждаетбороться за превосходное качество
продукта и обслуживания и при этом поддерживать самые низкие расценки.
Заказывая семена марихуаны в нашем интернет-магазине, Вы можете быть совершенно уверены, что получите именно тот сорт, который был Вами выбран. Наша фирма доставляем
семена марихуаны как по Украине, так и по России. В случае, если по какой-либо причине заказчик не получаете свой
заказ, мы обещаем возврат сумму, которую Вы заплатили за товар, в полном объеме. сюда <a href=http://семечка-джа.com/%D1%84%D0%B5%D0%BC%D0%B8%D0%BD%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8>http://с емечка-джа.com/%D1%84%D0%B5%D0%BC%D0%B8%D0%BD%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B0 %D0%B2%D1%82%D0%BE%D1%86%D0%B2%D0%B5%D1%82%D1%83%D1%89%D0%B8%D0%B5/minigun_auto_feminished.html</a> Minigun Auto Feminished. Купить семена конопли Мини Ган авто фем. Семена марихуаны наложенным платежом по Украине
И, наконец, касаемо секретности – интернет-магазин “Семечка
Джа” дорожит выбором своих покупателей, поэтому, заказывая семена марихуаны у нас, Вы можете быть полностью уверены, что любая кннтактная информация о покупателе и месте доставки сохранится не будет разглашена.
мы в социалках
https://ok.ru/profile/572871626215
https://www.facebook.com/jah.seed.568
https://twitter.com/?lang=ru
https://www.instagram.com/semena_cannabisa/
https://www.youtube.com/channel/UCN-p65XvEBa1HA_PeWoQ4bQ
https://plus.google.com/communities/114289740677239650133
т. +38(099)76-66-563
Date: 2017-03-06 09:57
Sender: semechkagync semechkagyncGJ

<a href=https://семечка-джа.com/%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B0%D0%B2%D1%82%D0%BE%D1%86%D0%B2%D0%B5%D1%82%D1%8B/ultra-violet-auto.html>Купить семена Ultra-Violet-Auto отличной генетики и высокого качества</a>
Компания-реализатор “Семечка Джа” занимается реализацией качественных семян марихуанылучших сортов и
уже не первый год занимает первую позицию в этой области рынка.

Посмотрите как в Европе сделан рынок семян. Пример http://www.cannabiscollege.com/ или там
https://www.cancer.gov/about-cancer/treatment/cam/hp/cannabis-pdq. Узаконивание происходит во всё большем количестве субъектов. Культура постоянно становиться лучше А что мы видим у в сране только один магазин соответствующий Европейскому уровню !!! Единственный толковый магазин семян конопли - seedjah.com и тот прикрыт роскомнадзором (((

Наша фирма предлагаем нашим покупателям семена только лучшего качества, которые имеют фантастически высокий всхожесть. Кроме качества продукции, Вас несомненно порадуют
наши доступные расценки. Это можно объяснить тем, что очень высокая конкуренция среди
производителей, предлагающих аналогичнуюпродукт,
вынуждаетбороться за максимально высокое качество товара и обслуживания и при этом сохранять невысокие стоимость.
Покупая семена канабиса у нас, Вы можете быть совершенно уверены, что получите именно тот вид, что был Вами выбран. Мы совершаем доставку
семена конопли как по Украине, так и по России. Если так получилось, что по какой-то причине клиент не получаете свой
товар, мы обещаем возвратить сумму, которую Вы заплатили за товар, в полном объеме. ссылке <a href=http://семечка-джа.com/%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5/nirvana_regular.html>http:// семечка-джа.com/%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5/nirvana_regular.html</a> Nirvana. Купить семена конопли Нирвана. Семена марихуаны наложенным платежом по Украине
И, напоследок, касаемо тайности – компания “Семечка Джа” ценит выбор своих клиентов, поэтому, при заказе семян конопли в нашей компании, Вы можете быть полностью уверены, что любая инфа о заказчике и месте доставки останется только между продавцом и покупателем.
соц. сети
https://ok.ru/profile/572871626215
https://www.facebook.com/jah.seed.568
https://twitter.com/?lang=ru
https://www.instagram.com/semena_cannabisa/
https://www.youtube.com/channel/UCN-p65XvEBa1HA_PeWoQ4bQ
https://plus.google.com/communities/114289740677239650133
т. +38(099)76-66-563
Date: 2013-09-17 12:50
Sender: Marcin Głowacki

Hi,

I found some time to tinker and made a workaround for this problem.

I made NpsqlCopyInState ctor public and this change:

@@ -966,7 +966,7 @@ namespace Npgsql
case BackEndMessageCode.CopyInResponse:
// Enter COPY sub protocol and start pushing data to server
NpgsqlEventLog.LogMsg(resman, "Log_ProtocolMessage", LogLevel.Debug, "CopyInResponse");
- ChangeState(context, NpgsqlCopyInState.Instance);
+ ChangeState(context, new NpgsqlCopyInState());
PGUtil.ReadInt32(stream); // length redundant
context.CurrentState.StartCopy(context, ReadCopyHeader(stream));
yield break;

This way number of fields does not get overwritten when using two NpgsqlCopyIn at the same time. I didn't dig too deep so there might be some issues, however I'm able to run two CopyIns from different connections and it works just fine.

Please take a look at it.
Date: 2013-06-08 18:44
Sender: Marcin Głowacki

As Dariusz said NpgsqlCopyInState is a singleton. FieldCount and probably some other data is being overridden when second NpgsqlCopyIn receives a response from server after starting. I'll try to fix it. If you know any reasons as to why these states are singletons let me know please.
Date: 2013-06-08 14:08
Sender: Francisco Figueiredo jr.


Hi, Marcin!

Please, let me know if you find anything which could help solve that situation.

As you are using 2 different connections, I think the problem may be that NpgsqlCopyIn class maybe is using some static data and this is giving trouble when being used by two connections simultaneously.

Also note that the official code repository changed to git. http://git.npgsql.org

I hope it helps.
Date: 2013-06-08 09:45
Sender: Marcin Głowacki

This approach doesn't seem to work and I'm not using NpgsqlCopySerializer class either.

I'm analyzing Npgsql code now and see what the problem is. I'm serializing objects myself so I'm trying to find where the extra data is added.
Date: 2013-06-07 06:34
Sender: Dariusz Dudek

My suggestion for workaround

UTF8Encoding enc = new UTF8Encoding(false);
StreamWriter sw = new StreamWriter(copy1.CopyStream, enc);

for (int index = 0; index < 100; index++)
{
sw.Write(index);
sw.Write('\t');
sw.Write(string.Format("Index {0} ", index));
sw.Write('\n');
}
sw.Flush();


... or change implementation of NpgsqlCopyInState or NpgsqlCopySerializer. NpgsqlCopyInState is singleton, so internal CopyFormat has invalid value in FieldCount from second command NpgsqlCopyIn. NpgsqlCopySerializer.EndRow shouldn't add extra null values.
Date: 2013-06-06 19:17
Sender: Marcin Głowacki

Has anyone found a solution to that problem? I've stumbled upon this today and can't find much information on any workarounds apart from not using 2 NpgsqlCopyIn's at the same time which in my case it's not an option.

I'm getting the same error as above but it's also dependant on amount of data to copy. In my case for each object I need to insert one row to first table (17 columns) and several rows to second table (67 columns). I use one NpgsqlCopyIn for each table. It works fine up to around 600 objects. If I try to copy more at once I get 22P04 error.

First I tried to simulate this situation in a test program which also had 2 tables and everything worked smoothly even though one had 2 columns and other one had 3... so it looks like it's not entirely dependant their number.

Attached Files:

Changes:

No Changes Have Been Made to This Item

Powered By FusionForge