Browse Source

WIP Unix-level locks.

Frédéric G. MARAND 1 year ago
parent
commit
5c8d4ca7e0
9 changed files with 77 additions and 1534 deletions
  1. 1 0
      .gitignore
  2. 0 21
      .idea/dataSources.local.xml
  3. 0 12
      .idea/dataSources.xml
  4. 0 1469
      .idea/dataSources/3ee63b33-36a4-4ea1-9f10-e087e9b0ded9.xml
  5. 32 30
      .idea/workspace.xml
  6. BIN
      demo.db
  7. 4 1
      go.mod
  8. 2 0
      go.sum
  9. 38 1
      sqlite_concurrent_demo.go

+ 1 - 0
.gitignore

@@ -24,3 +24,4 @@ _testmain.go
 *.test
 *.prof
 
+.idea

+ 0 - 21
.idea/dataSources.local.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="dataSourceStorageLocal" created-in="GO-231.8109.46">
-    <data-source name="Demo" uuid="3ee63b33-36a4-4ea1-9f10-e087e9b0ded9">
-      <database-info product="SQLite" version="3.40.1" jdbc-version="4.2" driver-name="SQLite JDBC" driver-version="3.40.1.0" dbms="SQLITE" exact-version="3.40.1" exact-driver-version="3.40">
-        <identifier-quote-string>&quot;</identifier-quote-string>
-      </database-info>
-      <case-sensitivity plain-identifiers="mixed" quoted-identifiers="mixed" />
-      <secret-storage>master_key</secret-storage>
-      <auth-provider>no-auth</auth-provider>
-      <schema-mapping>
-        <introspection-scope>
-          <node kind="schema">
-            <name qname="@" />
-            <name qname="main" />
-          </node>
-        </introspection-scope>
-      </schema-mapping>
-    </data-source>
-  </component>
-</project>

+ 0 - 12
.idea/dataSources.xml

@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
-    <data-source source="LOCAL" name="Demo" uuid="3ee63b33-36a4-4ea1-9f10-e087e9b0ded9">
-      <driver-ref>sqlite.xerial</driver-ref>
-      <synchronize>true</synchronize>
-      <jdbc-driver>org.sqlite.JDBC</jdbc-driver>
-      <jdbc-url>jdbc:sqlite:demo.Db</jdbc-url>
-      <working-dir>$ProjectFileDir$</working-dir>
-    </data-source>
-  </component>
-</project>

+ 0 - 1469
.idea/dataSources/3ee63b33-36a4-4ea1-9f10-e087e9b0ded9.xml

@@ -1,1469 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<dataSource name="Demo">
-  <database-model serializer="dbm" dbms="SQLITE" family-id="SQLITE" format-version="4.48">
-    <root id="1">
-      <ServerVersion>3.40.1</ServerVersion>
-    </root>
-    <collation id="2" parent="1" name="RTRIM"/>
-    <collation id="3" parent="1" name="NOCASE"/>
-    <collation id="4" parent="1" name="BINARY"/>
-    <package id="5" parent="1" name="json_tree"/>
-    <package id="6" parent="1" name="json_each"/>
-    <package id="7" parent="1" name="fts4aux"/>
-    <package id="8" parent="1" name="fts3"/>
-    <package id="9" parent="1" name="fts4"/>
-    <package id="10" parent="1" name="fts3tokenize"/>
-    <package id="11" parent="1" name="fts5vocab"/>
-    <package id="12" parent="1" name="rtree_i32"/>
-    <package id="13" parent="1" name="fts5"/>
-    <package id="14" parent="1" name="rtree"/>
-    <package id="15" parent="1" name="dbstat"/>
-    <routine id="16" parent="1" name="julianday">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="17" parent="1" name="json_array">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="18" parent="1" name="json_remove">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="19" parent="1" name="json_object">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="20" parent="1" name="json_insert">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="21" parent="1" name="printf">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="22" parent="1" name="json_replace">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="23" parent="1" name="json_extract">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="24" parent="1" name="time">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="25" parent="1" name="strftime">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="26" parent="1" name="char">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="27" parent="1" name="unixepoch">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="28" parent="1" name="date">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="29" parent="1" name="coalesce">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="30" parent="1" name="format">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="31" parent="1" name="datetime">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="32" parent="1" name="lag">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="33" parent="1" name="max">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="34" parent="1" name="min">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="35" parent="1" name="lead">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="36" parent="1" name="json_set">
-      <Deterministic>1</Deterministic>
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="37" parent="1" name="regexp">
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="38" parent="1" name="snippet">
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="39" parent="1" name="matchinfo"/>
-    <routine id="40" parent="1" name="rtreecheck">
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="41" parent="1" name="highlight">
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="42" parent="1" name="bm25">
-      <Variadic>1</Variadic>
-    </routine>
-    <routine id="43" parent="1" name="charindex"/>
-    <routine id="44" parent="1" name="fts3_tokenizer"/>
-    <routine id="45" parent="1" name="pow">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="46" parent="1" name="group_concat">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="47" parent="1" name="json_type">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="48" parent="1" name="ntile">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="49" parent="1" name="nullif">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="50" parent="1" name="sqlite_compileoption_get"/>
-    <routine id="51" parent="1" name="json_valid">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="52" parent="1" name="json_quote">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="53" parent="1" name="json_patch">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="54" parent="1" name="-&gt;">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="55" parent="1" name="current_timestamp"/>
-    <routine id="56" parent="1" name="power">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="57" parent="1" name="sqlite_compileoption_used"/>
-    <routine id="58" parent="1" name="-&gt;&gt;">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="59" parent="1" name="sin">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="60" parent="1" name="sum">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="61" parent="1" name="quote">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="62" parent="1" name="likelihood">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="63" parent="1" name="last_value">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="64" parent="1" name="rank">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="65" parent="1" name="sign">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="66" parent="1" name="sqrt">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="67" parent="1" name="sinh">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="68" parent="1" name="tan">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="69" parent="1" name="round">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="70" parent="1" name="rtrim">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="71" parent="1" name="nth_value">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="72" parent="1" name="tanh">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="73" parent="1" name="random"/>
-    <routine id="74" parent="1" name="trim">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="75" parent="1" name="radians">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="76" parent="1" name="trunc">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="77" parent="1" name="total">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="78" parent="1" name="substr">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="79" parent="1" name="replace">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="80" parent="1" name="upper">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="81" parent="1" name="subtype">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="82" parent="1" name="typeof">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="83" parent="1" name="load_extension"/>
-    <routine id="84" parent="1" name="json_group_array">
-      <Deterministic>1</Deterministic>
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="85" parent="1" name="avg">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="86" parent="1" name="abs">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="87" parent="1" name="json_group_object">
-      <Deterministic>1</Deterministic>
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="88" parent="1" name="json_array_length">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="89" parent="1" name="atan">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="90" parent="1" name="asin">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="91" parent="1" name="acos">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="92" parent="1" name="substring">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="93" parent="1" name="randomblob"/>
-    <routine id="94" parent="1" name="unicode">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="95" parent="1" name="percent_rank">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="96" parent="1" name="row_number">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="97" parent="1" name="atanh">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="98" parent="1" name="asinh">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="99" parent="1" name="acosh">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="100" parent="1" name="cos">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="101" parent="1" name="atan2">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="102" parent="1" name="last_insert_rowid"/>
-    <routine id="103" parent="1" name="sqlite_log">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="104" parent="1" name="unlikely">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="105" parent="1" name="cosh">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="106" parent="1" name="ceil">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="107" parent="1" name="exp">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="108" parent="1" name="count">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="109" parent="1" name="ceiling">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="110" parent="1" name="total_changes"/>
-    <routine id="111" parent="1" name="changes"/>
-    <routine id="112" parent="1" name="sqlite_version"/>
-    <routine id="113" parent="1" name="degrees">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="114" parent="1" name="floor">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="115" parent="1" name="glob">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="116" parent="1" name="zeroblob">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="117" parent="1" name="hex">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="118" parent="1" name="iif">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="119" parent="1" name="sqlite_source_id"/>
-    <routine id="120" parent="1" name="cume_dist">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="121" parent="1" name="ln">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="122" parent="1" name="instr">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="123" parent="1" name="json">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="124" parent="1" name="dense_rank">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="125" parent="1" name="log">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="126" parent="1" name="ifnull">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="127" parent="1" name="current_date"/>
-    <routine id="128" parent="1" name="current_time"/>
-    <routine id="129" parent="1" name="lag">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="130" parent="1" name="mod">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="131" parent="1" name="log2">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="132" parent="1" name="like">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="133" parent="1" name="max">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="134" parent="1" name="min">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="135" parent="1" name="lead">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="136" parent="1" name="log10">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="137" parent="1" name="lower">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="138" parent="1" name="ltrim">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="139" parent="1" name="first_value">
-      <FunctionType>window</FunctionType>
-    </routine>
-    <routine id="140" parent="1" name="pi">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="141" parent="1" name="length">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="142" parent="1" name="likely">
-      <Deterministic>1</Deterministic>
-    </routine>
-    <routine id="143" parent="1" name="upper_quartile">
-      <FunctionType>aggregate</FunctionType>
-    </routine>
-    <routine id="144" parent="1" name="median">
-      <FunctionType>aggregate</FunctionType>
-    </routine>
-    <routine id="145" parent="1" name="stdev">
-      <FunctionType>aggregate</FunctionType>
-    </routine>
-    <routine id="146" parent="1" name="rightstr"/>
-    <routine id="147" parent="1" name="leftstr"/>
-    <routine id="148" parent="1" name="mode">
-      <FunctionType>aggregate</FunctionType>
-    </routine>
-    <routine id="149" parent="1" name="replicate"/>
-    <routine id="150" parent="1" name="padl"/>
-    <routine id="151" parent="1" name="square"/>
-    <routine id="152" parent="1" name="strfilter"/>
-    <routine id="153" parent="1" name="difference"/>
-    <routine id="154" parent="1" name="lower_quartile">
-      <FunctionType>aggregate</FunctionType>
-    </routine>
-    <routine id="155" parent="1" name="padr"/>
-    <routine id="156" parent="1" name="rtreedepth"/>
-    <routine id="157" parent="1" name="atn2"/>
-    <routine id="158" parent="1" name="match"/>
-    <routine id="159" parent="1" name="coth"/>
-    <routine id="160" parent="1" name="fts5_source_id"/>
-    <routine id="161" parent="1" name="offsets"/>
-    <routine id="162" parent="1" name="matchinfo"/>
-    <routine id="163" parent="1" name="variance">
-      <FunctionType>aggregate</FunctionType>
-    </routine>
-    <routine id="164" parent="1" name="optimize"/>
-    <routine id="165" parent="1" name="padc"/>
-    <routine id="166" parent="1" name="proper"/>
-    <routine id="167" parent="1" name="reverse"/>
-    <routine id="168" parent="1" name="rtreenode"/>
-    <routine id="169" parent="1" name="charindex"/>
-    <routine id="170" parent="1" name="cot"/>
-    <routine id="171" parent="1" name="fts3_tokenizer"/>
-    <routine id="172" parent="1" name="fts5"/>
-    <schema id="173" parent="1" name="main">
-      <Current>1</Current>
-    </schema>
-    <argument id="174" parent="16">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="175" parent="17">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="176" parent="18">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="177" parent="19">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="178" parent="20">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="179" parent="21">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="180" parent="22">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="181" parent="23">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="182" parent="24">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="183" parent="25">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="184" parent="26">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="185" parent="27">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="186" parent="28">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="187" parent="29">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="188" parent="30">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="189" parent="31">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="190" parent="32">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="191" parent="32">
-      <Position>1</Position>
-    </argument>
-    <argument id="192" parent="32">
-      <Position>2</Position>
-    </argument>
-    <argument id="193" parent="32">
-      <Position>3</Position>
-    </argument>
-    <argument id="194" parent="33">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="195" parent="34">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="196" parent="35">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="197" parent="35">
-      <Position>1</Position>
-    </argument>
-    <argument id="198" parent="35">
-      <Position>2</Position>
-    </argument>
-    <argument id="199" parent="35">
-      <Position>3</Position>
-    </argument>
-    <argument id="200" parent="36">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="201" parent="37">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="202" parent="38">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="203" parent="39">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="204" parent="39">
-      <Position>1</Position>
-    </argument>
-    <argument id="205" parent="39">
-      <Position>2</Position>
-    </argument>
-    <argument id="206" parent="40">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="207" parent="41">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="208" parent="42">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="209" parent="43">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="210" parent="43">
-      <Position>1</Position>
-    </argument>
-    <argument id="211" parent="43">
-      <Position>2</Position>
-    </argument>
-    <argument id="212" parent="43">
-      <Position>3</Position>
-    </argument>
-    <argument id="213" parent="44">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="214" parent="44">
-      <Position>1</Position>
-    </argument>
-    <argument id="215" parent="44">
-      <Position>2</Position>
-    </argument>
-    <argument id="216" parent="45">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="217" parent="45">
-      <Position>1</Position>
-    </argument>
-    <argument id="218" parent="45">
-      <Position>2</Position>
-    </argument>
-    <argument id="219" parent="46">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="220" parent="46">
-      <Position>1</Position>
-    </argument>
-    <argument id="221" parent="46">
-      <Position>2</Position>
-    </argument>
-    <argument id="222" parent="47">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="223" parent="47">
-      <Position>1</Position>
-    </argument>
-    <argument id="224" parent="47">
-      <Position>2</Position>
-    </argument>
-    <argument id="225" parent="48">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="226" parent="48">
-      <Position>1</Position>
-    </argument>
-    <argument id="227" parent="49">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="228" parent="49">
-      <Position>1</Position>
-    </argument>
-    <argument id="229" parent="49">
-      <Position>2</Position>
-    </argument>
-    <argument id="230" parent="50">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="231" parent="50">
-      <Position>1</Position>
-    </argument>
-    <argument id="232" parent="51">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="233" parent="51">
-      <Position>1</Position>
-    </argument>
-    <argument id="234" parent="52">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="235" parent="52">
-      <Position>1</Position>
-    </argument>
-    <argument id="236" parent="53">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="237" parent="53">
-      <Position>1</Position>
-    </argument>
-    <argument id="238" parent="53">
-      <Position>2</Position>
-    </argument>
-    <argument id="239" parent="54">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="240" parent="54">
-      <Position>1</Position>
-    </argument>
-    <argument id="241" parent="54">
-      <Position>2</Position>
-    </argument>
-    <argument id="242" parent="55">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="243" parent="56">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="244" parent="56">
-      <Position>1</Position>
-    </argument>
-    <argument id="245" parent="56">
-      <Position>2</Position>
-    </argument>
-    <argument id="246" parent="57">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="247" parent="57">
-      <Position>1</Position>
-    </argument>
-    <argument id="248" parent="58">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="249" parent="58">
-      <Position>1</Position>
-    </argument>
-    <argument id="250" parent="58">
-      <Position>2</Position>
-    </argument>
-    <argument id="251" parent="59">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="252" parent="59">
-      <Position>1</Position>
-    </argument>
-    <argument id="253" parent="60">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="254" parent="60">
-      <Position>1</Position>
-    </argument>
-    <argument id="255" parent="61">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="256" parent="61">
-      <Position>1</Position>
-    </argument>
-    <argument id="257" parent="62">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="258" parent="62">
-      <Position>1</Position>
-    </argument>
-    <argument id="259" parent="62">
-      <Position>2</Position>
-    </argument>
-    <argument id="260" parent="63">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="261" parent="63">
-      <Position>1</Position>
-    </argument>
-    <argument id="262" parent="64">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="263" parent="65">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="264" parent="65">
-      <Position>1</Position>
-    </argument>
-    <argument id="265" parent="66">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="266" parent="66">
-      <Position>1</Position>
-    </argument>
-    <argument id="267" parent="67">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="268" parent="67">
-      <Position>1</Position>
-    </argument>
-    <argument id="269" parent="68">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="270" parent="68">
-      <Position>1</Position>
-    </argument>
-    <argument id="271" parent="69">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="272" parent="69">
-      <Position>1</Position>
-    </argument>
-    <argument id="273" parent="69">
-      <Position>2</Position>
-    </argument>
-    <argument id="274" parent="70">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="275" parent="70">
-      <Position>1</Position>
-    </argument>
-    <argument id="276" parent="70">
-      <Position>2</Position>
-    </argument>
-    <argument id="277" parent="71">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="278" parent="71">
-      <Position>1</Position>
-    </argument>
-    <argument id="279" parent="71">
-      <Position>2</Position>
-    </argument>
-    <argument id="280" parent="72">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="281" parent="72">
-      <Position>1</Position>
-    </argument>
-    <argument id="282" parent="73">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="283" parent="74">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="284" parent="74">
-      <Position>1</Position>
-    </argument>
-    <argument id="285" parent="74">
-      <Position>2</Position>
-    </argument>
-    <argument id="286" parent="75">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="287" parent="75">
-      <Position>1</Position>
-    </argument>
-    <argument id="288" parent="76">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="289" parent="76">
-      <Position>1</Position>
-    </argument>
-    <argument id="290" parent="77">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="291" parent="77">
-      <Position>1</Position>
-    </argument>
-    <argument id="292" parent="78">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="293" parent="78">
-      <Position>1</Position>
-    </argument>
-    <argument id="294" parent="78">
-      <Position>2</Position>
-    </argument>
-    <argument id="295" parent="78">
-      <Position>3</Position>
-    </argument>
-    <argument id="296" parent="79">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="297" parent="79">
-      <Position>1</Position>
-    </argument>
-    <argument id="298" parent="79">
-      <Position>2</Position>
-    </argument>
-    <argument id="299" parent="79">
-      <Position>3</Position>
-    </argument>
-    <argument id="300" parent="80">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="301" parent="80">
-      <Position>1</Position>
-    </argument>
-    <argument id="302" parent="81">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="303" parent="81">
-      <Position>1</Position>
-    </argument>
-    <argument id="304" parent="82">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="305" parent="82">
-      <Position>1</Position>
-    </argument>
-    <argument id="306" parent="83">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="307" parent="83">
-      <Position>1</Position>
-    </argument>
-    <argument id="308" parent="83">
-      <Position>2</Position>
-    </argument>
-    <argument id="309" parent="84">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="310" parent="84">
-      <Position>1</Position>
-    </argument>
-    <argument id="311" parent="85">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="312" parent="85">
-      <Position>1</Position>
-    </argument>
-    <argument id="313" parent="86">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="314" parent="86">
-      <Position>1</Position>
-    </argument>
-    <argument id="315" parent="87">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="316" parent="87">
-      <Position>1</Position>
-    </argument>
-    <argument id="317" parent="87">
-      <Position>2</Position>
-    </argument>
-    <argument id="318" parent="88">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="319" parent="88">
-      <Position>1</Position>
-    </argument>
-    <argument id="320" parent="88">
-      <Position>2</Position>
-    </argument>
-    <argument id="321" parent="89">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="322" parent="89">
-      <Position>1</Position>
-    </argument>
-    <argument id="323" parent="90">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="324" parent="90">
-      <Position>1</Position>
-    </argument>
-    <argument id="325" parent="91">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="326" parent="91">
-      <Position>1</Position>
-    </argument>
-    <argument id="327" parent="92">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="328" parent="92">
-      <Position>1</Position>
-    </argument>
-    <argument id="329" parent="92">
-      <Position>2</Position>
-    </argument>
-    <argument id="330" parent="92">
-      <Position>3</Position>
-    </argument>
-    <argument id="331" parent="93">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="332" parent="93">
-      <Position>1</Position>
-    </argument>
-    <argument id="333" parent="94">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="334" parent="94">
-      <Position>1</Position>
-    </argument>
-    <argument id="335" parent="95">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="336" parent="96">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="337" parent="97">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="338" parent="97">
-      <Position>1</Position>
-    </argument>
-    <argument id="339" parent="98">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="340" parent="98">
-      <Position>1</Position>
-    </argument>
-    <argument id="341" parent="99">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="342" parent="99">
-      <Position>1</Position>
-    </argument>
-    <argument id="343" parent="100">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="344" parent="100">
-      <Position>1</Position>
-    </argument>
-    <argument id="345" parent="101">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="346" parent="101">
-      <Position>1</Position>
-    </argument>
-    <argument id="347" parent="101">
-      <Position>2</Position>
-    </argument>
-    <argument id="348" parent="102">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="349" parent="103">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="350" parent="103">
-      <Position>1</Position>
-    </argument>
-    <argument id="351" parent="103">
-      <Position>2</Position>
-    </argument>
-    <argument id="352" parent="104">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="353" parent="104">
-      <Position>1</Position>
-    </argument>
-    <argument id="354" parent="105">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="355" parent="105">
-      <Position>1</Position>
-    </argument>
-    <argument id="356" parent="106">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="357" parent="106">
-      <Position>1</Position>
-    </argument>
-    <argument id="358" parent="107">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="359" parent="107">
-      <Position>1</Position>
-    </argument>
-    <argument id="360" parent="108">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="361" parent="108">
-      <Position>1</Position>
-    </argument>
-    <argument id="362" parent="109">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="363" parent="109">
-      <Position>1</Position>
-    </argument>
-    <argument id="364" parent="110">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="365" parent="111">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="366" parent="112">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="367" parent="113">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="368" parent="113">
-      <Position>1</Position>
-    </argument>
-    <argument id="369" parent="114">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="370" parent="114">
-      <Position>1</Position>
-    </argument>
-    <argument id="371" parent="115">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="372" parent="115">
-      <Position>1</Position>
-    </argument>
-    <argument id="373" parent="115">
-      <Position>2</Position>
-    </argument>
-    <argument id="374" parent="116">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="375" parent="116">
-      <Position>1</Position>
-    </argument>
-    <argument id="376" parent="117">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="377" parent="117">
-      <Position>1</Position>
-    </argument>
-    <argument id="378" parent="118">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="379" parent="118">
-      <Position>1</Position>
-    </argument>
-    <argument id="380" parent="118">
-      <Position>2</Position>
-    </argument>
-    <argument id="381" parent="118">
-      <Position>3</Position>
-    </argument>
-    <argument id="382" parent="119">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="383" parent="120">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="384" parent="121">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="385" parent="121">
-      <Position>1</Position>
-    </argument>
-    <argument id="386" parent="122">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="387" parent="122">
-      <Position>1</Position>
-    </argument>
-    <argument id="388" parent="122">
-      <Position>2</Position>
-    </argument>
-    <argument id="389" parent="123">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="390" parent="123">
-      <Position>1</Position>
-    </argument>
-    <argument id="391" parent="124">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="392" parent="125">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="393" parent="125">
-      <Position>1</Position>
-    </argument>
-    <argument id="394" parent="125">
-      <Position>2</Position>
-    </argument>
-    <argument id="395" parent="126">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="396" parent="126">
-      <Position>1</Position>
-    </argument>
-    <argument id="397" parent="126">
-      <Position>2</Position>
-    </argument>
-    <argument id="398" parent="127">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="399" parent="128">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="400" parent="129">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="401" parent="129">
-      <Position>1</Position>
-    </argument>
-    <argument id="402" parent="129">
-      <Position>2</Position>
-    </argument>
-    <argument id="403" parent="130">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="404" parent="130">
-      <Position>1</Position>
-    </argument>
-    <argument id="405" parent="130">
-      <Position>2</Position>
-    </argument>
-    <argument id="406" parent="131">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="407" parent="131">
-      <Position>1</Position>
-    </argument>
-    <argument id="408" parent="132">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="409" parent="132">
-      <Position>1</Position>
-    </argument>
-    <argument id="410" parent="132">
-      <Position>2</Position>
-    </argument>
-    <argument id="411" parent="132">
-      <Position>3</Position>
-    </argument>
-    <argument id="412" parent="133">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="413" parent="133">
-      <Position>1</Position>
-    </argument>
-    <argument id="414" parent="134">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="415" parent="134">
-      <Position>1</Position>
-    </argument>
-    <argument id="416" parent="135">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="417" parent="135">
-      <Position>1</Position>
-    </argument>
-    <argument id="418" parent="135">
-      <Position>2</Position>
-    </argument>
-    <argument id="419" parent="136">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="420" parent="136">
-      <Position>1</Position>
-    </argument>
-    <argument id="421" parent="137">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="422" parent="137">
-      <Position>1</Position>
-    </argument>
-    <argument id="423" parent="138">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="424" parent="138">
-      <Position>1</Position>
-    </argument>
-    <argument id="425" parent="138">
-      <Position>2</Position>
-    </argument>
-    <argument id="426" parent="139">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="427" parent="139">
-      <Position>1</Position>
-    </argument>
-    <argument id="428" parent="140">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="429" parent="141">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="430" parent="141">
-      <Position>1</Position>
-    </argument>
-    <argument id="431" parent="142">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="432" parent="142">
-      <Position>1</Position>
-    </argument>
-    <argument id="433" parent="143">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="434" parent="143">
-      <Position>1</Position>
-    </argument>
-    <argument id="435" parent="144">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="436" parent="144">
-      <Position>1</Position>
-    </argument>
-    <argument id="437" parent="145">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="438" parent="145">
-      <Position>1</Position>
-    </argument>
-    <argument id="439" parent="146">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="440" parent="146">
-      <Position>1</Position>
-    </argument>
-    <argument id="441" parent="146">
-      <Position>2</Position>
-    </argument>
-    <argument id="442" parent="147">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="443" parent="147">
-      <Position>1</Position>
-    </argument>
-    <argument id="444" parent="147">
-      <Position>2</Position>
-    </argument>
-    <argument id="445" parent="148">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="446" parent="148">
-      <Position>1</Position>
-    </argument>
-    <argument id="447" parent="149">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="448" parent="149">
-      <Position>1</Position>
-    </argument>
-    <argument id="449" parent="149">
-      <Position>2</Position>
-    </argument>
-    <argument id="450" parent="150">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="451" parent="150">
-      <Position>1</Position>
-    </argument>
-    <argument id="452" parent="150">
-      <Position>2</Position>
-    </argument>
-    <argument id="453" parent="151">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="454" parent="151">
-      <Position>1</Position>
-    </argument>
-    <argument id="455" parent="152">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="456" parent="152">
-      <Position>1</Position>
-    </argument>
-    <argument id="457" parent="152">
-      <Position>2</Position>
-    </argument>
-    <argument id="458" parent="153">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="459" parent="153">
-      <Position>1</Position>
-    </argument>
-    <argument id="460" parent="153">
-      <Position>2</Position>
-    </argument>
-    <argument id="461" parent="154">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="462" parent="154">
-      <Position>1</Position>
-    </argument>
-    <argument id="463" parent="155">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="464" parent="155">
-      <Position>1</Position>
-    </argument>
-    <argument id="465" parent="155">
-      <Position>2</Position>
-    </argument>
-    <argument id="466" parent="156">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="467" parent="156">
-      <Position>1</Position>
-    </argument>
-    <argument id="468" parent="157">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="469" parent="157">
-      <Position>1</Position>
-    </argument>
-    <argument id="470" parent="157">
-      <Position>2</Position>
-    </argument>
-    <argument id="471" parent="158">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="472" parent="158">
-      <Position>1</Position>
-    </argument>
-    <argument id="473" parent="158">
-      <Position>2</Position>
-    </argument>
-    <argument id="474" parent="159">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="475" parent="159">
-      <Position>1</Position>
-    </argument>
-    <argument id="476" parent="160">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="477" parent="161">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="478" parent="161">
-      <Position>1</Position>
-    </argument>
-    <argument id="479" parent="162">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="480" parent="162">
-      <Position>1</Position>
-    </argument>
-    <argument id="481" parent="163">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="482" parent="163">
-      <Position>1</Position>
-    </argument>
-    <argument id="483" parent="164">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="484" parent="164">
-      <Position>1</Position>
-    </argument>
-    <argument id="485" parent="165">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="486" parent="165">
-      <Position>1</Position>
-    </argument>
-    <argument id="487" parent="165">
-      <Position>2</Position>
-    </argument>
-    <argument id="488" parent="166">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="489" parent="166">
-      <Position>1</Position>
-    </argument>
-    <argument id="490" parent="167">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="491" parent="167">
-      <Position>1</Position>
-    </argument>
-    <argument id="492" parent="168">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="493" parent="168">
-      <Position>1</Position>
-    </argument>
-    <argument id="494" parent="168">
-      <Position>2</Position>
-    </argument>
-    <argument id="495" parent="169">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="496" parent="169">
-      <Position>1</Position>
-    </argument>
-    <argument id="497" parent="169">
-      <Position>2</Position>
-    </argument>
-    <argument id="498" parent="170">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="499" parent="170">
-      <Position>1</Position>
-    </argument>
-    <argument id="500" parent="171">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="501" parent="171">
-      <Position>1</Position>
-    </argument>
-    <argument id="502" parent="172">
-      <ArgumentDirection>R</ArgumentDirection>
-    </argument>
-    <argument id="503" parent="172">
-      <Position>1</Position>
-    </argument>
-    <table id="504" parent="173" name="foo"/>
-    <table id="505" parent="173" name="sqlite_master">
-      <System>1</System>
-    </table>
-    <column id="506" parent="504" name="id">
-      <DasType>serial|0s</DasType>
-      <Position>1</Position>
-    </column>
-    <column id="507" parent="504" name="description">
-      <DasType>varchar(255)|0s</DasType>
-      <Position>2</Position>
-    </column>
-    <index id="508" parent="504" name="sqlite_autoindex_foo_1">
-      <ColNames>id</ColNames>
-      <NameSurrogate>1</NameSurrogate>
-      <Unique>1</Unique>
-    </index>
-    <key id="509" parent="504">
-      <ColNames>id</ColNames>
-      <Primary>1</Primary>
-      <UnderlyingIndexName>sqlite_autoindex_foo_1</UnderlyingIndexName>
-    </key>
-    <column id="510" parent="505" name="type">
-      <DasType>TEXT|0s</DasType>
-      <Position>1</Position>
-    </column>
-    <column id="511" parent="505" name="name">
-      <DasType>TEXT|0s</DasType>
-      <Position>2</Position>
-    </column>
-    <column id="512" parent="505" name="tbl_name">
-      <DasType>TEXT|0s</DasType>
-      <Position>3</Position>
-    </column>
-    <column id="513" parent="505" name="rootpage">
-      <DasType>INT|0s</DasType>
-      <Position>4</Position>
-    </column>
-    <column id="514" parent="505" name="sql">
-      <DasType>TEXT|0s</DasType>
-      <Position>5</Position>
-    </column>
-  </database-model>
-</dataSource>

+ 32 - 30
.idea/workspace.xml

@@ -4,55 +4,46 @@
     <option name="autoReloadType" value="ALL" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="539df32a-79aa-4468-8c23-71eb129e7b9a" name="Changes" comment="">
-      <change afterPath="$PROJECT_DIR$/sqlite_concurrent_demo.go" afterDir="false" />
+    <list default="true" id="588ecd00-2543-4fc1-b614-66bf4d2b44de" name="Changes" comment="">
+      <change beforePath="$PROJECT_DIR$/.idea/dataSources.local.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/dataSources.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/dataSources/3ee63b33-36a4-4ea1-9f10-e087e9b0ded9.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/demo.db" beforeDir="false" afterPath="$PROJECT_DIR$/demo.db" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/go.mod" beforeDir="false" afterPath="$PROJECT_DIR$/go.mod" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/go.sum" beforeDir="false" afterPath="$PROJECT_DIR$/go.sum" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/sqlite_concurrent_demo.go" beforeDir="false" afterPath="$PROJECT_DIR$/sqlite_concurrent_demo.go" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
     <option name="LAST_RESOLUTION" value="IGNORE" />
   </component>
-  <component name="FileTemplateManagerImpl">
-    <option name="RECENT_TEMPLATES">
-      <list>
-        <option value="Go Application" />
-      </list>
-    </option>
-  </component>
   <component name="GOROOT" url="file:///opt/homebrew/Cellar/go/1.20.2/libexec" />
   <component name="Git.Settings">
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
-  <component name="GoLibraries">
-    <option name="indexEntireGoPath" value="true" />
-  </component>
   <component name="MarkdownSettingsMigration">
     <option name="stateVersion" value="1" />
   </component>
-  <component name="ProjectId" id="2N8oPKG8xl9GvirQcrIgj4nKach" />
+  <component name="ProjectId" id="2N94t2hxb40YT6ZgvDBXdlvkPz9" />
   <component name="ProjectViewState">
     <option name="hideEmptyMiddlePackages" value="true" />
     <option name="showLibraryContents" value="true" />
     <option name="sortByType" value="true" />
   </component>
-  <component name="PropertiesComponent">{
-  &quot;keyToString&quot;: {
-    &quot;DefaultGoTemplateProperty&quot;: &quot;Go Application&quot;,
-    &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
-    &quot;RunOnceActivity.go.formatter.settings.were.checked&quot;: &quot;true&quot;,
-    &quot;RunOnceActivity.go.migrated.go.modules.settings&quot;: &quot;true&quot;,
-    &quot;RunOnceActivity.go.modules.go.list.on.any.changes.was.set&quot;: &quot;true&quot;,
-    &quot;go.import.settings.migrated&quot;: &quot;true&quot;,
-    &quot;go.sdk.automatically.set&quot;: &quot;true&quot;,
-    &quot;last_opened_file_path&quot;: &quot;/Users/frederic.marand.ext&quot;,
-    &quot;settings.editor.selected.configurable&quot;: &quot;go.vgo&quot;
-  },
-  &quot;keyToStringList&quot;: {
-    &quot;DatabaseDriversLRU&quot;: [
-      &quot;sqlite&quot;
-    ]
+  <component name="PropertiesComponent"><![CDATA[{
+  "keyToString": {
+    "RunOnceActivity.OpenProjectViewOnStart": "true",
+    "RunOnceActivity.ShowReadmeOnStart": "true",
+    "RunOnceActivity.go.formatter.settings.were.checked": "true",
+    "RunOnceActivity.go.migrated.go.modules.settings": "true",
+    "RunOnceActivity.go.modules.go.list.on.any.changes.was.set": "true",
+    "go.import.settings.migrated": "true",
+    "go.sdk.automatically.set": "true",
+    "last_opened_file_path": "/Users/frederic.marand.ext"
   }
-}</component>
+}]]></component>
   <component name="RunManager">
     <configuration name="go build code.osinet.fr/fgm/sqlite_concurrent_demo" type="GoApplicationRunConfiguration" factoryName="Go Application" temporary="true" nameIsGenerated="true">
       <module name="sqlite_concurrent_demo" />
@@ -73,4 +64,15 @@
   <component name="VgoProject">
     <settings-migrated>true</settings-migrated>
   </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager>
+      <breakpoints>
+        <line-breakpoint enabled="true" type="DlvLineBreakpoint">
+          <url>file://$PROJECT_DIR$/sqlite_concurrent_demo.go</url>
+          <line>61</line>
+          <option name="timeStamp" value="1" />
+        </line-breakpoint>
+      </breakpoints>
+    </breakpoint-manager>
+  </component>
 </project>

BIN
demo.db


+ 4 - 1
go.mod

@@ -2,4 +2,7 @@ module code.osinet.fr/fgm/sqlite_concurrent_demo
 
 go 1.20
 
-require github.com/mattn/go-sqlite3 v1.14.16
+require (
+	github.com/mattn/go-sqlite3 v1.14.16
+	golang.org/x/sys v0.6.0
+)

+ 2 - 0
go.sum

@@ -1,2 +1,4 @@
 github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
 github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
+golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

+ 38 - 1
sqlite_concurrent_demo.go

@@ -2,13 +2,16 @@ package main
 
 import (
 	"database/sql"
+	"io"
 	"log"
 	"os"
 	"strconv"
 	"sync"
+	"syscall"
 	"time"
 
 	_ "github.com/mattn/go-sqlite3"
+	"golang.org/x/sys/unix"
 )
 
 const (
@@ -44,10 +47,44 @@ func ping(wg *sync.WaitGroup, id int, start, linger time.Duration) {
 		wg.Done()
 	}()
 	time.Sleep(start)
+	f, err := os.Open(File)
+	if err != nil {
+		logger.Fatalf("file open: %v", err)
+	}
+	lock := unix.Flock_t{
+		Start:  0,
+		Len:    0,
+		Pid:    int32(os.Getpid()),
+		Type:   syscall.F_WRLCK,
+		Whence: io.SeekStart,
+	}
+	for {
+		if err := unix.FcntlFlock(f.Fd(), unix.F_GETLK, &lock); err != nil {
+			logger.Fatalf("file get lock info: %v", err)
+		}
+		// if err := unix.Flock(int(f.Fd()), unix.LOCK_SH); err != nil {
+		// 	logger.Fatalf("file lock: %v", err)
+		// }
+		if int(lock.Type) == syscall.F_UNLCK {
+			logger.Println("locked DB")
+			break
+		}
+		logger.Println("attempted to locked DB, but it was locked")
+		time.Sleep(100 * time.Millisecond)
+	}
+	defer func() {
+		if err := unix.FcntlFlock(f.Fd(), unix.F_SETLK, &lock); err != nil {
+			logger.Fatalf("file unlock: %v", err)
+		}
+		logger.Println("unlocked DB")
+	}()
+
 	db, err := sql.Open("sqlite3", DSN)
 	if err != nil {
-		logger.Fatalf("open: %v", err)
+		logger.Fatalf("sql open: %v", err)
 	}
+	defer db.Close()
+
 	logger.Println("open: OK")
 	res, err := db.Exec(`
 INSERT INTO foo(id, description)