<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<link rel="self" href="/Atom/" />
	<id>http://billmill.org/</id>
	<title>My Name Rhymes</title>
	<subtitle>Bill Mill blogs irregularly</subtitle>
	<updated>2007-12-17T01:13:00Z</updated>
	<author>
		<name>Bill Mill</name>
		<email>bill.mill@gmail.com</email>
		<uri>http://billmill.org/</uri>
	</author>
	<link href="http://billmill.org/" />
	<entry>
		<title>Iterating Over Database Results in C#</title>
		<link href="http://billmill.org/iterate_over_database.html" />	
		<id>http://billmill.org/iterate_over_database.html</id>
		<updated>2007-12-17T01:13:00Z</updated>
		<summary type="html">&lt;p&gt;At my job, we use what is essentially a custom C# ORM. Soon after I arrived, 
we adopted this idiom to pull a DB connection from the pool and run a query:
&lt;div class="highlight"&gt;&lt;pre&gt; &lt;span style="font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;Something&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;int&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;ourIdiom&lt;/span&gt;(&lt;span style="color: #445588; font-weight: bold"&gt;long&lt;/span&gt; identifier)
    &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;using&lt;/span&gt; (DBConnection db = &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; DBConnection())
        &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
            &lt;span style="font-weight: bold"&gt;using&lt;/span&gt; (IDataReader rec = db.execQuery(&lt;span style="color: #bb8844"&gt;@&amp;quot;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;                SELECT some, rows&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;                FROM  Table1 t1, Table2 t2&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;                WHERE t1.t2id = t2.id&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;                AND   t1.id = ?&amp;quot;&lt;/span&gt;,
                identifier))
            &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
                &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; (rec.Read())
                    doSomething();
                &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;;
            &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Which is nice because it disposes of both the connection and the dataReader 
properly on failure, but ugly because it uses a whole bunch of boilerplate.  
Unfortunately, because doSomething() needs to execute inside both 
&lt;code&gt;using&lt;/code&gt; statements, and we weren't using C# 2.0 until a few months 
ago, the only way to avoid the boilerplate would have been to pass in 
delegates.
&lt;p&gt;This would have been just as ugly as keeping the boilerplate in the code, so 
we stuck with the using&lt;sup&gt;2&lt;/sup&gt; idiom.
&lt;p&gt;Since our switchover to 2.0 a few months ago, I've had an idea that I could 
make this idiom more concise and remove some boilerplate that I didn't get a 
chance to try until this week. Using 2.0's iterators, which seem awfully 
familiar from my python work, that can be reduced to:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;Something&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;int&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;ourIdiom&lt;/span&gt;(&lt;span style="color: #445588; font-weight: bold"&gt;long&lt;/span&gt; identifier)
    &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;foreach&lt;/span&gt; (IDataReader rec &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; SQL().Query(&lt;span style="color: #bb8844"&gt;@&amp;quot;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;            SELECT some, rows&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;            FROM  Table1 t1, Table2 t2&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;            WHERE t1.t2id = t2.id&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;            AND   t1.id = ?&amp;quot;&lt;/span&gt;,
            identifier))
        &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
            doSomething();
        &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;;
    &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With some fairly simple code:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;SQL&lt;/span&gt; : 
    System.Collections.Generic.IEnumerable&amp;lt;IDataReader&amp;gt;
    &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt; m_sql;
        ArrayList m_sqlparams;

        &lt;span style="font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;SQL&lt;/span&gt;()
        &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;

        &lt;span style="font-weight: bold"&gt;public&lt;/span&gt; SQL &lt;span style="color: #990000; font-weight: bold"&gt;query&lt;/span&gt;(&lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt; sql, &lt;span style="font-weight: bold"&gt;params&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;object&lt;/span&gt;[] sqlparams)
        &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
            m_sql = sql;
            m_sqlparams = &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; ArrayList(sqlparams);
            &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="font-weight: bold"&gt;this&lt;/span&gt;;
        &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;

        IEnumerator&amp;lt;IDataReader&amp;gt; IEnumerable&amp;lt;IDataReader&amp;gt;.GetEnumerator()
        &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
            &lt;span style="font-weight: bold"&gt;using&lt;/span&gt; (clsDBConnection db = &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; clsDBConnection(m_dbname))
            &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
                &lt;span style="font-weight: bold"&gt;using&lt;/span&gt; (IDataReader rec = db.execQuery(m_sql, m_sqlparams))
                &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
                    &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; (rec.Read())
                        yield &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; rec;
                &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
            &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;

        &lt;span style="color: #999988; font-style: italic"&gt;//this is required because IEnumerable&amp;lt;&amp;gt; inherits IEnumerable. bleh.&lt;/span&gt;
        IEnumerator IEnumerable.GetEnumerator() &lt;span style="font-weight: bold"&gt;{&lt;/span&gt; &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; GetEnumerator() &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This code should come in handy for more reasons than just its cleanliness.  
First off, if you ever need to change the idiom for accessing the DB, it's 
stored conveniently in one place.
&lt;p&gt;Second, It makes a prepared SQL call into something like a &lt;a 
href="http://en.wikipedia.org/wiki/Thunk"&gt;thunk&lt;/a&gt;: a bit of code representing 
a future computation that can then be passed around to be performed later. An 
example:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;void&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;setUpQueries&lt;/span&gt;(nameId, addressId, custId)
&lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
    List&amp;lt;SQL&amp;gt; stringsWeNeed = &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; List(&lt;span style="font-weight: bold"&gt;new&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;object&lt;/span&gt;[]&lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;SQL&lt;/span&gt;().query(&lt;span style="color: #bb8844"&gt;&amp;quot;SELECT name FROM names WHERE id=?&amp;quot;&lt;/span&gt;, nameId),
        &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;SQL&lt;/span&gt;().query(&lt;span style="color: #bb8844"&gt;&amp;quot;SELECT addy FROM addresses WHERE id=?&amp;quot;&lt;/span&gt;, addressId),
        &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;SQL&lt;/span&gt;().query(&lt;span style="color: #bb8844"&gt;&amp;quot;SELECT zip FROM customers WHERE id=?&amp;quot;&lt;/span&gt;, custId)&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;);

    List&amp;lt;&lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt;&amp;gt; strings = getOurStrings(stringsWeNeed);

    mangleStrings(strings);
&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;

List&amp;lt;&lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt;&amp;gt; getOurStrings(List&amp;lt;SQL&amp;gt; queries)
&lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
    List&amp;lt;&lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt;&amp;gt; strings = &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt;&amp;gt;();
    &lt;span style="font-weight: bold"&gt;foreach&lt;/span&gt; (SQL query &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; queries)
    &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;foreach&lt;/span&gt; (IDataReader rec &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; query)
            strings.Add(rec.GetString(&lt;span style="color: #009999"&gt;0&lt;/span&gt;));
    &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; strings;
&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While the example is silly, this property can be exploited to seperate 
declaration from execution, which I often find to be a useful pattern.
&lt;p&gt;Though I am far from the &lt;a 
href="http://www.base4.net/blog.aspx?ID=409"&gt;first person&lt;/a&gt; to discover this 
simplification, I did figure it out on my own and I thought it was neat enough 
to share.
&lt;p&gt;A quick disclaimer: the code here is modified from the original to remove 
some details, and is completely untested, and probably doesn't compile.  You 
may, however, use it or distribute it as you see fit; it's licensed under the 
&lt;a href="http://sam.zoy.org/wtfpl/"&gt;wtfpl&lt;/a&gt;.
&lt;p&gt;UPDATE: added the while(rec.Read()), which I'd forgotten
</summary>
		<content type="html">&lt;p&gt;At my job, we use what is essentially a custom C# ORM. Soon after I arrived, 
we adopted this idiom to pull a DB connection from the pool and run a query:
&lt;div class="highlight"&gt;&lt;pre&gt; &lt;span style="font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;Something&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;int&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;ourIdiom&lt;/span&gt;(&lt;span style="color: #445588; font-weight: bold"&gt;long&lt;/span&gt; identifier)
    &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;using&lt;/span&gt; (DBConnection db = &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; DBConnection())
        &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
            &lt;span style="font-weight: bold"&gt;using&lt;/span&gt; (IDataReader rec = db.execQuery(&lt;span style="color: #bb8844"&gt;@&amp;quot;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;                SELECT some, rows&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;                FROM  Table1 t1, Table2 t2&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;                WHERE t1.t2id = t2.id&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;                AND   t1.id = ?&amp;quot;&lt;/span&gt;,
                identifier))
            &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
                &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; (rec.Read())
                    doSomething();
                &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;;
            &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Which is nice because it disposes of both the connection and the dataReader 
properly on failure, but ugly because it uses a whole bunch of boilerplate.  
Unfortunately, because doSomething() needs to execute inside both 
&lt;code&gt;using&lt;/code&gt; statements, and we weren't using C# 2.0 until a few months 
ago, the only way to avoid the boilerplate would have been to pass in 
delegates.
&lt;p&gt;This would have been just as ugly as keeping the boilerplate in the code, so 
we stuck with the using&lt;sup&gt;2&lt;/sup&gt; idiom.
&lt;p&gt;Since our switchover to 2.0 a few months ago, I've had an idea that I could 
make this idiom more concise and remove some boilerplate that I didn't get a 
chance to try until this week. Using 2.0's iterators, which seem awfully 
familiar from my python work, that can be reduced to:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;Something&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;int&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;ourIdiom&lt;/span&gt;(&lt;span style="color: #445588; font-weight: bold"&gt;long&lt;/span&gt; identifier)
    &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;foreach&lt;/span&gt; (IDataReader rec &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; SQL().Query(&lt;span style="color: #bb8844"&gt;@&amp;quot;&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;            SELECT some, rows&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;            FROM  Table1 t1, Table2 t2&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;            WHERE t1.t2id = t2.id&lt;/span&gt;
&lt;span style="color: #bb8844"&gt;            AND   t1.id = ?&amp;quot;&lt;/span&gt;,
            identifier))
        &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
            doSomething();
        &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;;
    &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With some fairly simple code:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;SQL&lt;/span&gt; : 
    System.Collections.Generic.IEnumerable&amp;lt;IDataReader&amp;gt;
    &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt; m_sql;
        ArrayList m_sqlparams;

        &lt;span style="font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;SQL&lt;/span&gt;()
        &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;

        &lt;span style="font-weight: bold"&gt;public&lt;/span&gt; SQL &lt;span style="color: #990000; font-weight: bold"&gt;query&lt;/span&gt;(&lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt; sql, &lt;span style="font-weight: bold"&gt;params&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;object&lt;/span&gt;[] sqlparams)
        &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
            m_sql = sql;
            m_sqlparams = &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; ArrayList(sqlparams);
            &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="font-weight: bold"&gt;this&lt;/span&gt;;
        &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;

        IEnumerator&amp;lt;IDataReader&amp;gt; IEnumerable&amp;lt;IDataReader&amp;gt;.GetEnumerator()
        &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
            &lt;span style="font-weight: bold"&gt;using&lt;/span&gt; (clsDBConnection db = &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; clsDBConnection(m_dbname))
            &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
                &lt;span style="font-weight: bold"&gt;using&lt;/span&gt; (IDataReader rec = db.execQuery(m_sql, m_sqlparams))
                &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
                    &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; (rec.Read())
                        yield &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; rec;
                &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
            &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;

        &lt;span style="color: #999988; font-style: italic"&gt;//this is required because IEnumerable&amp;lt;&amp;gt; inherits IEnumerable. bleh.&lt;/span&gt;
        IEnumerator IEnumerable.GetEnumerator() &lt;span style="font-weight: bold"&gt;{&lt;/span&gt; &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; GetEnumerator() &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This code should come in handy for more reasons than just its cleanliness.  
First off, if you ever need to change the idiom for accessing the DB, it's 
stored conveniently in one place.
&lt;p&gt;Second, It makes a prepared SQL call into something like a &lt;a 
href="http://en.wikipedia.org/wiki/Thunk"&gt;thunk&lt;/a&gt;: a bit of code representing 
a future computation that can then be passed around to be performed later. An 
example:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;void&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;setUpQueries&lt;/span&gt;(nameId, addressId, custId)
&lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
    List&amp;lt;SQL&amp;gt; stringsWeNeed = &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; List(&lt;span style="font-weight: bold"&gt;new&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;object&lt;/span&gt;[]&lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;SQL&lt;/span&gt;().query(&lt;span style="color: #bb8844"&gt;&amp;quot;SELECT name FROM names WHERE id=?&amp;quot;&lt;/span&gt;, nameId),
        &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;SQL&lt;/span&gt;().query(&lt;span style="color: #bb8844"&gt;&amp;quot;SELECT addy FROM addresses WHERE id=?&amp;quot;&lt;/span&gt;, addressId),
        &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;SQL&lt;/span&gt;().query(&lt;span style="color: #bb8844"&gt;&amp;quot;SELECT zip FROM customers WHERE id=?&amp;quot;&lt;/span&gt;, custId)&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;);

    List&amp;lt;&lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt;&amp;gt; strings = getOurStrings(stringsWeNeed);

    mangleStrings(strings);
&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;

List&amp;lt;&lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt;&amp;gt; getOurStrings(List&amp;lt;SQL&amp;gt; queries)
&lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
    List&amp;lt;&lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt;&amp;gt; strings = &lt;span style="font-weight: bold"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: #445588; font-weight: bold"&gt;string&lt;/span&gt;&amp;gt;();
    &lt;span style="font-weight: bold"&gt;foreach&lt;/span&gt; (SQL query &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; queries)
    &lt;span style="font-weight: bold"&gt;{&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;foreach&lt;/span&gt; (IDataReader rec &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; query)
            strings.Add(rec.GetString(&lt;span style="color: #009999"&gt;0&lt;/span&gt;));
    &lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; strings;
&lt;span style="font-weight: bold"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While the example is silly, this property can be exploited to seperate 
declaration from execution, which I often find to be a useful pattern.
&lt;p&gt;Though I am far from the &lt;a 
href="http://www.base4.net/blog.aspx?ID=409"&gt;first person&lt;/a&gt; to discover this 
simplification, I did figure it out on my own and I thought it was neat enough 
to share.
&lt;p&gt;A quick disclaimer: the code here is modified from the original to remove 
some details, and is completely untested, and probably doesn't compile.  You 
may, however, use it or distribute it as you see fit; it's licensed under the 
&lt;a href="http://sam.zoy.org/wtfpl/"&gt;wtfpl&lt;/a&gt;.
&lt;p&gt;UPDATE: added the while(rec.Read()), which I'd forgotten
</content>
	</entry>
	<entry>
		<title>Reverse File Iterator and Premature Optimization</title>
		<link href="http://billmill.org/reversefile.html" />	
		<id>http://billmill.org/reversefile.html</id>
		<updated>2007-10-03T00:30:00Z</updated>
		<summary type="html">This afternoon, I had a need for a reverse file iterator in a script I was 
writing to process a quite large log file. After some unsuccessful googling 
followed by some quick hacking, I was left with a frustratingly close, but 
nonfunctional, iterator. Instead of fixing it while I was at work, I hacked up 
a solution calling "tail" and left it for a while.&lt;p&gt;
When I came back to finish the job this evening, I figured that I ought to go 
look at the &lt;a 
href="http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/tail"&gt;source&lt;/a&gt; of tail 
for some inspiration. Surely the unix hackers had figured this problem out long 
ago? In &lt;a 
href="http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/tail/reverse.c?rev=1.18&amp;content-type=text/x-cvsweb-markup"&gt;reverse.c&lt;/a&gt;, 
I found the inspiration I needed:&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;    &lt;span style="font-weight: bold"&gt;for&lt;/span&gt; (; pos &lt;span style="font-weight: bold"&gt;&amp;gt;=&lt;/span&gt; start; pos&lt;span style="font-weight: bold"&gt;--&lt;/span&gt;) {
        &lt;span style="color: #999988; font-style: italic"&gt;/* A seek per char isn&amp;#39;t a problem with a smart stdio */&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (fseeko(fp, pos, SEEK_SET) &lt;span style="font-weight: bold"&gt;!=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;) {
        &lt;span style="color: #999988; font-style: italic"&gt;//snip&lt;/span&gt;
            &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; ((ch &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; getc(fp)) &lt;span style="font-weight: bold"&gt;==&lt;/span&gt; &lt;span style="color: #a61717; background-color: #e3d2d2"&gt;&amp;#39;\&lt;/span&gt;n&lt;span style="color: #a61717; background-color: #e3d2d2"&gt;&amp;#39;&lt;/span&gt;)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
I had been reading the file in chunks, splitting the chunk into lines, handling 
a cache of the lines, and compensating for unfinished lines, all because I had 
buried deep down in my lizard brain the idea that an fseek per character was 
"slow". In pure python, for chrissake!&lt;p&gt;
Properly reminded of the fact that premature optimization can sneak up 
anywhere, I ended up with this code:&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;import&lt;/span&gt; &lt;span style="color: #555555"&gt;os&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;reversefile&lt;/span&gt;(&lt;span style="color: #999999"&gt;object&lt;/span&gt;):
    &lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&amp;quot;Iterate backwards through a file. f should be an open file handle&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;__init__&lt;/span&gt;(&lt;span style="color: #999999"&gt;self&lt;/span&gt;, f):
        &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; f
        &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; os&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;stat(f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;name)&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;st_size

    &lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;__iter__&lt;/span&gt;(&lt;span style="color: #999999"&gt;self&lt;/span&gt;): &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;

    &lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;next&lt;/span&gt;(&lt;span style="color: #999999"&gt;self&lt;/span&gt;):
        &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end &lt;span style="font-weight: bold"&gt;==&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;:
            &lt;span style="font-weight: bold"&gt;raise&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;StopIteration&lt;/span&gt;

        pos &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; pos &lt;span style="font-weight: bold"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;:
            &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;seek(pos)
            &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;read(&lt;span style="color: #009999"&gt;1&lt;/span&gt;) &lt;span style="font-weight: bold"&gt;==&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;:
                end &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end
                &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; pos
                &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;read(end &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; pos &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;)
            pos &lt;span style="font-weight: bold"&gt;-=&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;

        end &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end
        &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;
        &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;seek(&lt;span style="color: #009999"&gt;0&lt;/span&gt;)
        &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;read(end)&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;strip(&lt;span style="color: #bb8844"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
You can see the whole thing, with source and some very brief tests I hacked up, 
&lt;a 
href="http://billmill.org:9561/personal_code/browser/python/reversefile/reversefile.py?rev=57"&gt;here&lt;/a&gt;.

&lt;h2&gt;update:&lt;/h2&gt;
Reddit user Brian &lt;a href="http://reddit.com/r/Python/info/6hj75/comments/c03vms4"&gt;posts a solution&lt;/a&gt; that goes much faster on his platform (I've
done no performance testing of my code, it wasn't important for me) and handles
platform linebreaks better. In other words, it's better for all purposes. Thanks
Brian, I wish I'd found that when I was googling!
</summary>
		<content type="html">This afternoon, I had a need for a reverse file iterator in a script I was 
writing to process a quite large log file. After some unsuccessful googling 
followed by some quick hacking, I was left with a frustratingly close, but 
nonfunctional, iterator. Instead of fixing it while I was at work, I hacked up 
a solution calling "tail" and left it for a while.&lt;p&gt;
When I came back to finish the job this evening, I figured that I ought to go 
look at the &lt;a 
href="http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/tail"&gt;source&lt;/a&gt; of tail 
for some inspiration. Surely the unix hackers had figured this problem out long 
ago? In &lt;a 
href="http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/tail/reverse.c?rev=1.18&amp;content-type=text/x-cvsweb-markup"&gt;reverse.c&lt;/a&gt;, 
I found the inspiration I needed:&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;    &lt;span style="font-weight: bold"&gt;for&lt;/span&gt; (; pos &lt;span style="font-weight: bold"&gt;&amp;gt;=&lt;/span&gt; start; pos&lt;span style="font-weight: bold"&gt;--&lt;/span&gt;) {
        &lt;span style="color: #999988; font-style: italic"&gt;/* A seek per char isn&amp;#39;t a problem with a smart stdio */&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; (fseeko(fp, pos, SEEK_SET) &lt;span style="font-weight: bold"&gt;!=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;) {
        &lt;span style="color: #999988; font-style: italic"&gt;//snip&lt;/span&gt;
            &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; ((ch &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; getc(fp)) &lt;span style="font-weight: bold"&gt;==&lt;/span&gt; &lt;span style="color: #a61717; background-color: #e3d2d2"&gt;&amp;#39;\&lt;/span&gt;n&lt;span style="color: #a61717; background-color: #e3d2d2"&gt;&amp;#39;&lt;/span&gt;)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
I had been reading the file in chunks, splitting the chunk into lines, handling 
a cache of the lines, and compensating for unfinished lines, all because I had 
buried deep down in my lizard brain the idea that an fseek per character was 
"slow". In pure python, for chrissake!&lt;p&gt;
Properly reminded of the fact that premature optimization can sneak up 
anywhere, I ended up with this code:&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;import&lt;/span&gt; &lt;span style="color: #555555"&gt;os&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;reversefile&lt;/span&gt;(&lt;span style="color: #999999"&gt;object&lt;/span&gt;):
    &lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&amp;quot;Iterate backwards through a file. f should be an open file handle&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;__init__&lt;/span&gt;(&lt;span style="color: #999999"&gt;self&lt;/span&gt;, f):
        &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; f
        &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; os&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;stat(f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;name)&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;st_size

    &lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;__iter__&lt;/span&gt;(&lt;span style="color: #999999"&gt;self&lt;/span&gt;): &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;

    &lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;next&lt;/span&gt;(&lt;span style="color: #999999"&gt;self&lt;/span&gt;):
        &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end &lt;span style="font-weight: bold"&gt;==&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;:
            &lt;span style="font-weight: bold"&gt;raise&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;StopIteration&lt;/span&gt;

        pos &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;
        &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; pos &lt;span style="font-weight: bold"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;:
            &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;seek(pos)
            &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;read(&lt;span style="color: #009999"&gt;1&lt;/span&gt;) &lt;span style="font-weight: bold"&gt;==&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;:
                end &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end
                &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; pos
                &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;read(end &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; pos &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;)
            pos &lt;span style="font-weight: bold"&gt;-=&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;

        end &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end
        &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;end &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;
        &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;seek(&lt;span style="color: #009999"&gt;0&lt;/span&gt;)
        &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #999999"&gt;self&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;_f&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;read(end)&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;strip(&lt;span style="color: #bb8844"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
You can see the whole thing, with source and some very brief tests I hacked up, 
&lt;a 
href="http://billmill.org:9561/personal_code/browser/python/reversefile/reversefile.py?rev=57"&gt;here&lt;/a&gt;.

&lt;h2&gt;update:&lt;/h2&gt;
Reddit user Brian &lt;a href="http://reddit.com/r/Python/info/6hj75/comments/c03vms4"&gt;posts a solution&lt;/a&gt; that goes much faster on his platform (I've
done no performance testing of my code, it wasn't important for me) and handles
platform linebreaks better. In other words, it's better for all purposes. Thanks
Brian, I wish I'd found that when I was googling!
</content>
	</entry>
</feed>
