|
|
Comments and Discussions
|
|
 |
|

|
Tutorial - Get it working with 64 bit Winform
REF:
Brief tutorial: http://www.codeproject.com/Articles/9445/Embedded-Firebird-Full-Featured-Embedded-Database
Embedded Firebird: http://www.firebirdsql.org/en/firebird-2-5-1/#Win64
Firebird provider src: http://www.firebirdsql.org/en/net-provider/
Firebird doc: http://www.firebirdsql.org/en/documentation/
Firebird Language reference: http://www.firebirdsql.org/file/documentation/reference_manuals/reference_material/html/langrefupd25.html
Firebird DataType (Compare to M$SQL): http://www.firebirdsql.org/manual/migration-mssql-data-types.html
Firebird Language Reference - CREATE TABLE: http://www.firebirdsql.org/refdocs/langrefupd15-create-table.html
STEP 1. Download Firebird embedded dll's - in this example, "Firebird-2.5.1.26351-0_x64_embed" from \Download\Firebird 2.5\Win64\64-bit Embedded
http://www.firebirdsql.org/en/firebird-2-5-1/#Win64
Extract the package. You'd later need to copy "fbembed.dll" and other dll's into your application root directory.
STEP 2. Download .NET Provider
In this example, NETProvider-2.7.5-src. Extract the package and compile with [target=x64] from Visual Studio
http://www.firebirdsql.org/en/net-provider/
Your "Provider" can be found here:
...\ClientProviderSrc\source\FirebirdSql\Data\bin\Debug\FirebirdSql.Data.FirebirdClient.dll
STEP 3. Create a dummy .NET Winform project,
STEP 3.1 add reference to your Firebird provider:
...\ClientProviderSrc\source\FirebirdSql\Data\bin\Debug\FirebirdSql.Data.FirebirdClient.dll
Also, put all dll's from Firebird-2.5.1.26351-0_x64_embed package (STEP 1) under application root.
STEP 3.2 From Form1.cs,
using FirebirdSql.Data.FirebirdClient;
STEP 3.3 Add a button, try out basic moves ...
string connectionString = "ServerType=1;User=SYSDBA;Password=masterkey;Dialect=3;Database=";
// REF: http://www.codeproject.com/Articles/9445/Embedded-Firebird-Full-Featured-Embedded-Database?msg=4252054#xx4252054xx
private void button1_Click(object sender, System.EventArgs e)
{
string DbFilePath = @"C:\...\EmbeddedDB\Firebird\Sample\EmbeddedFirebirdExample\bin\x64\Debug\TestingDatabase.FDB";
string FullConnString = this.connectionString + DbFilePath;
// STEP 1. Create (or Re-create) database and database file
if (!System.IO.File.Exists(DbFilePath))
{
FbConnection.CreateDatabase(FullConnString);
}
FbConnection conn = new FbConnection(FullConnString);
conn.Open();
// STEP 2. Change default SYSDBA pwd? No!
// This will not work on embedded Firebird!
/*
string AlterPwdCmdSQL = "alter user SYSDBA password 'xyzabc123'";
FbCommand AlterPwdCmd = conn.CreateCommand();
AlterPwdCmd.CommandText = AlterPwdCmdSQL;
AlterPwdCmd.ExecuteNonQuery();
*/
// STEP 3. Create a table
// NOTE: Can only do this once!
// REF 1: http://web.firebirdsql.org/dotnetfirebird/blog/2005/01/creating-database-programmatically.html
// REF 2: http://www.firebirdfaq.org/faq69/
// STEP 3.1 Check if table exists - CAUTION: Table name upper case!!!
string SimpleCheckIfTableExists = "select count(1) from rdb$relations where rdb$relation_name = 'EIK'";
FbCommand CheckTableExistCmd = conn.CreateCommand();
CheckTableExistCmd.CommandText = SimpleCheckIfTableExists;
int CountTable = (int)CheckTableExistCmd.ExecuteScalar();
if (CountTable > 0)
{
// Drop table
string SimpleDropTableIfExists = "drop table EIK;";
FbCommand DropTableCmd = conn.CreateCommand();
DropTableCmd.CommandText = SimpleDropTableIfExists;
DropTableCmd.ExecuteNonQuery();
}
// STEP 3.2 Re-create the table
// CAUTION:
// (a) "Timestamp" is a reserved keyword for Firebird.
// (b) Table name "eik" -- Actual created table name = "EIK"
string SimpleCreateTableSQL = "create table eik (a int not null primary key, b int not null unique, c timestamp default current_timestamp);";
FbCommand CreateTableCmd = conn.CreateCommand();
CreateTableCmd.CommandText = SimpleCreateTableSQL;
CreateTableCmd.ExecuteNonQuery();
// STEP 4. Insert row
// NOTE: Can only do this once! (PK constraint!)
string SimpleInsertSQL = "insert into eik (a,b) values (123,456);";
FbCommand InsertRowCmd = conn.CreateCommand();
InsertRowCmd.CommandText = SimpleInsertSQL;
InsertRowCmd.ExecuteNonQuery();
// STEP 5. A simple select
FbDataAdapter da = new FbDataAdapter("SELECT * FROM eik", FullConnString);
// FbDataAdapter da = new FbDataAdapter("SELECT * FROM table1", this.connectionString + this.textBox1.Text);
DataTable dt = new DataTable();
da.Fill(dt);
this.dataGrid1.DataSource = dt;
}
STEP 4. Bulk Insert?
With SQL Server,
DataRow[] RowsImported = LoadFromSomeDataTable(MyData);
bc = new System.Data.SqlClient.SqlBulkCopy(Conn);
bc.BulkCopyTimeout = 60 * 60;
bc.DestinationTableName = SomeName;
bc.WriteToServer(RowsImported);
With Firebird, you have to make do with external table, quoting - http://www.firebirdfaq.org/faq209/
CREATE TABLE ext1 EXTERNAL 'c:\myfile.txt'
(
field1 char(20),
field2 smallint
);
To do quick import into regular table, do something like this:
INSERT INTO realtable1 (field1, field2)
SELECT field1, field2 FROM ext1;
This insert would still check constraints, foreign keys, fire triggers and build indexes. If you can, it is wise to deactivate indexes and triggers while loading and activate them when done.
STEP 5. You can't change SYSDBA pwd for embedded Firebird - in fact there's no need to do so. The following won't work!
string DbFilePath = @"D:\...\SampleData.FDB";
string FullConnString = this.connectionString + DbFilePath;
FbConnection conn = new FbConnection(FullConnString);
conn.Open();
string AlterPwdCmdSQL = "alter user SYSDBA password 'xyzabc123'";
FbCommand AlterPwdCmd = conn.CreateCommand();
AlterPwdCmd.CommandText = AlterPwdCmdSQL;
AlterPwdCmd.ExecuteNonQuery();
Upon ExecuteNonQuery -
+ ex {"unsuccessful metadata update\r\nI/O error during \"CreateFile (open)\" operation for file \"C:\\...\\EMBEDDEDFIREBIRDEXAMPLE\\BIN\\X64\\DEBUG\\SECURITY2.FDB\"\r\nError while trying to open file"} FirebirdSql.Data.Common.IscException
Seems like I'm not the first person running into this problem:
http://tech.groups.yahoo.com/group/firebird-support/message/83729
Now, quoting here http://www.firebirdsql.org/manual/ufb-cs-embedded.html
The Windows Embedded Server is a Superserver engine plus client rolled into one library, called fbembed.dll. It is available as a separate download package. The embedded server (introduced with Firebird 1.5) was specifically designed to facilitate deployment of applications that ship with a Firebird server included. Installation is just a matter of unpacking the DLL and a few other files to the desired location. The security database is not used at all: anyone can connect to any database, as long as the user running the application has filesystem-level access rights to the database(s) in question... The embedded server has no facility to accept any network connections. Only true local access is possible, with a connect string that doesn't contain a host name (not even localhost).
So, there's nothing you can do to secure an embedded Firebird - you can only secure the Windows machine/OS on which the Firebird db resides.
STEP 6. DbProviderFactories.GetFactory will fail unless you reference the dll from app.config!
DbProviderFactories.GetFactory("FirebirdSql.Data.FirebirdClient"); <-- This will blow up!
To do this,
STEP 6.1 - determine public key token
D:\...\Firebird\ClientProviderSrc\source\FirebirdSql\Data\bin\Debug>gacutil /i FirebirdSql.Data.FirebirdClient.dll
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Assembly successfully added to the cache
Now, /u will tell you public key of the dll!
D:\...Firebird\ClientProviderSrc\source\FirebirdSql\Data\bin\Debug>gacutil /u FirebirdSql.Data.FirebirdClient
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
D:\...\Firebird\ClientProviderSrc\source\FirebirdSql\Data\bin\x64\Debug>gacutil /u FirebirdSql.Data.FirebirdClient
Assembly: FirebirdSql.Data.FirebirdClient, Version=2.7.5.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=AMD64
Uninstalled: FirebirdSql.Data.FirebirdClient, Version=2.7.5.0, Culture=neutral,
PublicKeyToken=3750abcc3150b00c, processorArchitecture=AMD64
Number of assemblies uninstalled = 1
Number of failures = 0
STEP 6.2
... other stuff ...
<!-- rao: Firebird driver; prefer locally placed driver (any version)-->
... other stuff ...
REF: http://programming.2be-it.com/?p=160
dev
modified 16-May-12 4:16am.
|
|
|
|

|
hi,
error:
Could not load file or assembly 'System.Data.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.
scenario:
used embedded firebird ado.net service provider for databse conectivity.
no issues with firebird's dll coz able to use classes such as FbDataAdapter,FbConnection,FbCommand but when tries to read with FbDataReader or fill dataset with FbDataAdapter it gives this error
i tried using excel database n it works fine...
i hav downloaded firebird installed then added refrance n copied fbembed.dll in \bin\Debug following your tutorial on this site n then jus used namespace FirebirdSql.Data.FirebirdClient; so after that i m able to acces FbDataAdapter etc;
this procedure is fine or somthng missin???
|
|
|
|

|
Hello
I´m developing an application using Firebird Embedded, and I would like to know how I can maintain the connection open, in other words, I would like through a Module to open the connection with the database and then close when the application stop.
Oww sorry, I´m using VB.NET 2008.
Thnks
Rafael Brasil
|
|
|
|

|
I've been planing to implement this in to a small program that I'm writing (which I may release on CodeProject) but it appears that Embedded Firebird is not longer supported.
I found this:
http://www.firebirdsql.org/dotnetfirebird/index.html[^] which is different from the link given to the article.
In short, the project was donated to the Core Firebird project. I thought that this was great, it might mean tighter integration.
However after some more sifting around, it appears that the project has never been updated.
To the best of my ability I've been able to determine this embedded package supports Firebird 2.0.1 on .NET 2.0. But I was hoping to use Firebird 2.1 on .NET 3.5.
But quite simply does anyone know one way or another if this project is still supported?
Thank you,
Frank
|
|
|
|
|
|

|
this is not working for firebird 2 might be because of version of dlls,
any idea???
ujjwal
|
|
|
|

|
Hi, i switched from Super Server 2.0 to embedded version.
Everything almost ok, select, inserts, deletes work fine. However, stored procedures won't work at all, which of course worked well on the SuperServer.
Is this normal? Is there something to change on those procedures in order to get them working?
Thanks for your time folks.
Daniel Sovino
|
|
|
|

|
How can I change .fdb files?
|
|
|
|

|
.fdb stands for firebird database.
You "change" it by using firebirdsql to access it, sending mysql commands to edit,add to, and remove from it.
|
|
|
|

|
Please, help!
When compile example sources myself, at runtime exception occured
"Unable to load DLL 'fbembed'"
I put fbembed.dll in bin/Debug path, but still not work((
|
|
|
|

|
jet85 wrote: When compile example sources myself, at runtime exception occured
"Unable to load DLL 'fbembed'"
I put fbembed.dll in bin/Debug path, but still not work((
I am having the same problem. I am working with C#, .NET 2.0. The Firebird DB is version 2. I can connect to the embedded database with IBExpert. I have the embedded engine and Firebird client installed and a reference to it added to my project. Is there something else I'm missing?
Thanks!
TC
|
|
|
|

|
I solved this problem.
Files icudt30.dll, icuin30.dll, icuuc30.dll must also putted in work directory.
I think it relevant only for Firebird version 2.
What is mission of these files? And how to use fb without them?
|
|
|
|

|
I forgot I had posted this question. I figured it out yesterday morning and got my connection to open! Now I just need to figure out how to add the Firebird db to my data sources in VS 2005...
TC
|
|
|
|

|
In some cases this still is not enough. For example on a win2003 server it's impossible to get such an application run. I've trying now to include also the irectory Intl from the FBEmbed setup...
Also someone said that putting the above mentioned DLLs (fbemned, icuuc30, etc.) to the windows\system32 will solve the problem, but didnt
C#, ASPX, SQL, novice to NHibernate
|
|
|
|

|
dude u rock!, solved my daily headacke...
|
|
|
|

|
From the Firebird FAQ[^] it seems that Firebird uses a DLL called Fbembed.dll that is not managed. That is, embedding Firebird is unsafe in the C# / common language infrastructure sense of "unsafe". This means that an application that embeds Firebird cannot be installed in scenarios that require safe (trusted) applications. I wanted to point this out in case anyone else, like me, was searching for a safe embeddable SQL database setup.
SQLite with System.Data.SQLite seems to have the same characteristics.
The search continues..
By the way, does the term "embedded database" used in this article have a standard meaning? There is no Wikipedia entry for it.
|
|
|
|

|
Is it possible to change the password (masterkey) for the embedded?
|
|
|
|

|
Since the password for the Firebird database is not stored in the db there is no
point of doing that. If someone copies your db she/he will be able to open it with
the default sysdba/masterkey. The user/password has a meaning and point when remote
users are connecting to a Firebird server (when you can't get physical access to the db).
I think this is how it works on Fb.
|
|
|
|

|
Do you have any suggestions for database protection?
So nobody can easily open the firebird database file.
Thanks,
|
|
|
|

|
Firebird Defaults: User = "SYSDBA" Pass = "masterkey"
You can add new users or change password sysadmin user in
+ With Firebird 1.x: security.fdb
+ With Firebird 2.x: secutity2.fdb
You can find them in Firebird Folder.
Best regards
|
|
|
|

|
HUm... I was trying to
string DbFilePath = @"D:\...\SampleData.FDB";
string FullConnString = this.connectionString + DbFilePath;
// FbConnection.CreateDatabase(FullConnString);
FbConnection conn = new FbConnection(FullConnString);
conn.Open();
string AlterPwdCmdSQL = "alter user SYSDBA password 'xyzabc123'";
FbCommand AlterPwdCmd = conn.CreateCommand();
AlterPwdCmd.CommandText = AlterPwdCmdSQL;
AlterPwdCmd.ExecuteNonQuery();
Upon ExecuteNonQuery -
+ ex {"unsuccessful metadata update\r\nI/O error during \"CreateFile (open)\" operation for file \"C:\\...\\EMBEDDEDFIREBIRDEXAMPLE\\BIN\\X64\\DEBUG\\SECURITY2.FDB\"\r\nError while trying to open file"} FirebirdSql.Data.Common.IscException
I'm not sure how to ALTER USER and change SYSDBA pwd programmatically... (For Embedded Firebird, not standalone server), Anyone any clue?
Seems like I'm not the first person running into this problem:
http://tech.groups.yahoo.com/group/firebird-support/message/83729[^]
Now, quoting here[^]
The Windows Embedded Server is a Superserver engine plus client rolled into one library, called fbembed.dll. It is available as a separate download package. The embedded server (introduced with Firebird 1.5) was specifically designed to facilitate deployment of applications that ship with a Firebird server included. Installation is just a matter of unpacking the DLL and a few other files to the desired location. The security database is not used at all: anyone can connect to any database, as long as the user running the application has filesystem-level access rights to the database(s) in question... The embedded server has no facility to accept any network connections. Only true local access is possible, with a connect string that doesn't contain a host name (not even localhost).
Sounds like there's nothing you can do to secure an embedded Firebird - you can only secure the Windows machine/OS on which the Firebird db resides.
REF: Firebird Quickstart Guide (Scroll to page 16)[^]
dev
modified 15-May-12 21:10pm.
|
|
|
|

|
Hi;
I need some help connecting to a regular 1.5 Firebird database using VB.Net. Here's a sample of what I have and the error I'm getting. (I should point that I'm totally new to VB.Net)
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myConnection As FbConnection
Dim myCommand As FbCommand
.....
The errors tell me that the FbConnection and FbCommand are undefined types. I have FirebirdClient-2.0 installed. I'm obviously leaving out whatever defines FbConnection and FbCommand, however I have know idea what I'm missing and could use a bit of assistance.
Thanks
|
|
|
|
|

|
I installed the demo source for this article,
Embedded Firebird: Full-Featured Embedded Database with 2 MB Runtime
By Dan Letecky.
when I build the application I get this error
Error 1 The type or namespace name 'FirebirdSql' could not be found (are you missing a using directive or an assembly reference?) C:\firebirdASP\EmbeddedFirebirdExample\Form1.cs 7 7 EmbeddedFirebirdExample
I installed the ado.net provider, the using directive is there, and the assembly reference
what am I missing?? in visual studio 2005, how should I check if the provider is properly installed?
is there another demo code somewhere with detailled steps on installing the provider?
I am new at this, and probably missing a step
can somebody please help
Daniel
|
|
|
|

|
You need to install the Firebird.Net provider too.
Usually it installs to C:\Program Files\FirebirdNETProvider1.7
Then you need to add a reference to the "FirebirdSql.Data.Firebird.dll" file.
It is just like using any other assembly.
|
|
|
|

|
Thanks for the reply
isn't
FireBirdSQL.Data.FirebirdClient not the provider for .net 2.0?
or I need to install both?
if not what is it?
Daniel
|
|
|
|

|
When you're adding the reference you will see something similar "Firebird .Net Data Provider" after you installed the Firebird .Net provider.
newgendb wrote: FireBirdSQL.Data.FirebirdClient not the provider for .net 2.0?
or I need to install both?
From where you got that ?
|
|
|
|

|
thanks
from here, it just confuse me
http://firebird.sourceforge.net/index.php?op=files&id=netprovider
Daniel
|
|
|
|

|
After you install from there you just need to add the reference to Firebird provider to the project.
|
|
|
|

|
I didn't know firebird was this good. I always thought it was one of those legacy databases that you shouldn't use anymore in the modern .NET world, but I guess I was wrong.
Having an embedded database engine makes life a lot easier when having to create a setup for an application that makes use of the engine.
WM
|
|
|
|

|
This demo program works on all computer but my program doesnt work any other computer. It gıves this error: Value cannot be null
parameter name keyword
Why it gives this error? there is an already embedded database and I just want to connect to it. I connect it on my comp but not in any other comp.
Please Help
Thanks
|
|
|
|

|
Don't know that anybody answered this, but i was trying to get this error, and did when the database i wanted to connect to was NOT in the same directory as the .exe
Just thought i'd throw that out there...
|
|
|
|

|
Dan,
I saw this post[^] regarding the use of FireBird in ASP.NET applications. Does this limitation still stand?
-HoyaSaxa93
|
|
|
|

|
Hi,
If there a way to synchronize between two firebird databases assuming that both databases have the same structure and one database has more rows (data rows in its tables) than the other ?
I'm looking for a way to do this without an additional software.
Gilad.
|
|
|
|

|
To be honest that shouldn't be to hard for you to do in a simple function.
"SELECT defaultkeyname FROM database"
Replacing defaultkeyname with the primary key for that table, and database with your database name.
From there, for comparing, you can either
a) pull the other database list the same way, and keep track of which items occur in one and not the other, then send a command to pull each entry from the database that has it and update the one that doesn't...
or
b) for each item you pulled with your original list,
"SELECT otherdatabaseitem FROM database WHERE defaultkeyname = 'defaultkeyname'"
If it returns something, the other database has it, if it doesn't return something it doesn't have it and you can send the information to that database to sync it.
Then do the same thing for the other database.
One takes alot more commands sent to the database, and the other takes more brainwork on your end.
Either way, you don't have to BUY software to sync them, but i don't know that there's a built in function...
|
|
|
|

|
Dan,
It appears that you’re quite well versed in Firebird, what are the differences between Firebird and SQLite? Or are they comparable?
I have an up coming small db project and would like to try something new…
Thanks for your time...
|
|
|
|

|
SQLite is much more lightweight. What would be my list to consider:
- SQLite is file-system based (it provides much worse concurrency when under load because it locks the database)
- SQLite doesn't support stored procedures (essential for clean database design IMHO)
- Firebird ADO.NET provider has an excellent support provided by its author, Carlos Guzmán Álvarez.
- Firebird allows you to reuse your code and knowledge for both client-server and embedded scenarios.
While SQLite is a replacement for XML files, parsing plain text, etc. Firebird is rather a replacement for something like MSDE.
--
My sites for smart .NET developers:
DayPilot - Open-source Outlook-like calendar control for ASP.NET
DotLucene - The fastest open source fulltext search engine for .NET
Seekafile Server - Flexible open-source search server
DotNetFirebird - Using Firebird SQL in .NET
|
|
|
|

|
Cool, Thanks for the information.
I wasn't aware SQLites scope was so small.
|
|
|
|

|
Is the embedded server ability available on Linux?
|
|
|
|
|

|
Thank you for your clarification, it helped alot.
|
|
|
|

|
Hi,
I want to use an imbedded DB technology
from an old application written in C++ MFC using ODBC.
The application is running over win2003
Can I use Firebird in my case,
Also the application is muli-thread so that I should also
my connection (from within the same process) to the database ?
Are you aware to the performance of Firebird comparing to other in-memory technologies like timesTen and AntsDB ?
Many thanks
|
|
|
|

|
I am accessing Firebird from a C++ MFC application using a utility SQLAPI (http://www.sqlapi.com). This way I can avoid the OLEDB and ODBC hassles, and it works very well for me.
There is also an ODBC driver for Firebird available (http://www.firebirdsql.org/index.php?op=files&id=odbc).
|
|
|
|

|
we can read every Database info if only we get the db file(*.fdb/), even the db file is create in server with the username&password.
-- modified at 0:09 Thursday 8th September, 2005
|
|
|
|
|

|
Hi:
Using your code on dotnetfirebird.org to create DB:
FbConnection cnn = new FbConnection("ServerType=1;User=SYSDBA;Pooling=false;" +
"Password=masterkey;Dialect=3;Database=D:/abcdd.fdb");
Hashtable parameters = new Hashtable();
parameters.Add("User", "SYSDBA");
parameters.Add("Password", "masterkey");
parameters.Add("Database", @"D:\abcdd.fdb");
parameters.Add("ServerType", 1);
FbConnection.CreateDatabase(parameters);
always got error:
FirebirdSql.Data.Firebird.FbException: I/O error for file CreateFile (open) "D:\abcdd.fdb"
Error while trying to open file
Cna you tell me what's wrong?
The DLL I use is 1.7a, size of DLL:628K
|
|
|
|

|
i had the same message.
regroup your programm. first create the database, then connect to it.
like this
Hashtable parameters = new Hashtable();
parameters.Add("User", "SYSDBA");
parameters.Add("Password", "masterkey");
parameters.Add("Database", @"mydb.fdb");
parameters.Add("ServerType", 1);
FbConnection.CreateDatabase(parameters);
FbConnection c = new FbConnection("ServerType=1;User=SYSDBA;" +
"Password=masterkey;Dialect=3;Database=mydb.fdb");
Once your database is created, you will get a new error-message when you start your pragramm the second time. It tells you there already exists a database.
Greetings,
Ton
|
|
|
|

|
I have no luck with creating db too.
My first attempt is failed because I have rename the fbembed.dll to gds32.dll (as mentioned inside the readme file).
Then I rename it back, and I get this exactly message. I've try to modify the path to somewhere else, even with another name, still get no luck.
I've try to search through my hdd to locate the created db file. Surprisingly, not found.
Please someone tell me why and how, or point me to the related topics, thanks.
-- modified at 17:37 Wednesday 5th April, 2006
|
|
|
|
 |
|
|
General News Suggestion Question Bug Answer Joke Rant Admin
|
An example that shows how Firebird database excels in embedding.
| Type | Article |
| Licence | |
| First Posted | 28 Jan 2005 |
| Views | 308,000 |
| Bookmarked | 180 times |
|
|