//使用原始sqlite API

/*
在AAuto中声明的API已经加入了各自的名字空间,
例如原来的sqlite3_bind_double(因为在C语言中不支持名字空间,才有这种写法) ,
在AAuto中声明为 sqlite.bind.double

下面的示例仅用于模仿传统的用法,以方便大家阅读理解网上的sqlite文章
不建议大家直接使用sqlite原始API( 推荐使用面向对象的sqlite类对象操作数据库 )
*/

import sqlite;


io.open();


//打开数据库
//-------------------------------------------------------------------
var dbConnection = sqlite.open("/dbConnection.dbConnection") 
io.print("成功连接到数据库",dbConnection);

//创建表
if( ! sqlite.exec( dbConnection,"create table film(title, length, year, starring);") ){
    //插入数据
    sqlite.exec(dbConnection, "insert into film values ('Silence of the Lambs, The', 118, 1991, 'Jodie Foster');")
    sqlite.exec(dbConnection,"insert into film values ('Contact', 153, 1997, 'Jodie Foster');")
    sqlite.exec(dbConnection,"insert into film values ('Crouching Tiger, Hidden Dragon', 120, 2000, 'Yun-Fat Chow');")
}

// 用回调函数方式 查询数据库
//-------------------------------------------------------------------
io.print("回调函数方式 查询数据库 sqlite3_exec")

//第2个参数代表数据结果集中有几列数据
//第3个参数代表列数据的字符串数组，第4个参数代表列名的字符串数组
callback = function(notused,argc,value,name){ 
  tname = raw.toarray( argc,"string" )
  tvalue = raw.toarray( argc,"string" )
  raw.convert( name, tname);
  raw.convert( value, tvalue);
  
  for(i=1;argc){
    io.print(tname.array[ i ],tvalue.array[ i ])
  } 
} 

//创建回调函数 cdcel调用约定
callback_c = raw.tocdecl( callback,"int(pointer,int,pointer argv,pointer azColName)") 

//创建表
if( ! sqlite.exec(dbConnection,"create table film(title, length, year, starring);") ){
    //插入数据
    sqlite.exec(dbConnection,"insert into film values ('Silence of the Lambs, The', 118, 1991, 'Jodie Foster');")
    sqlite.exec(dbConnection,"insert into film values ('Contact', 153, 1997, 'Jodie Foster');")
    sqlite.exec(dbConnection,"insert into film values ('Crouching Tiger, Hidden Dragon', 120, 2000, 'Yun-Fat Chow');")
}

re,err =  sqlite.exec(dbConnection,"select * from film",callback_c, /*第4个参数是个随意指针，用途可用户指定，它将传给回调函数的第1个参数*/  );
//对于返回错误信息的API,应断言此错误信息指针,
//此指针可以获取错误信息并必须释放,sqlite.assertf会帮你处理好所有的事
sqlite.assertf(err) //检查API调用是否正确

//不使用回调函数 查询数据库的方法 之一
//-------------------------------------------------------------------
io.print("不使用回调函数 查询数据库的方法 之一  sqlite.prepare")


var sql = string.fromto(  "select * from film;",0,65001);
var ret,pstmt = sqlite.prepare(dbConnection, sql, #sql );
sqlite.assertf(ret)  //检查API调用是否正确

while( 1 ) {

    ret = sqlite.step(pstmt);  
    if( ret != sqlite.ROW ) 
                break;

    title = sqlite.column.text(pstmt, 0); 
    length = sqlite.column.int(pstmt, 1);   
    year = sqlite.column.int(pstmt, 2); 
    starring = sqlite.column.text(pstmt, 3); 
    
    io.print(title,length,year,starring); 
}

//不使用回调函数 查询数据库的方法 之二 
//-------------------------------------------------------------------
io.print("
不使用回调函数 查询数据库的方法 之二 sqlite.table.get
------------------------------------------------")

re,result,row,col,err = sqlite.table.get(dbConnection, "select * from film", null , 0, 0 );

result_c = raw.toarray( (row+1)*col,"string" );
raw.convert(result,result_c);//转换指针为动态数组

for( r=1;row+1 ){ 
    for( c=1;col ){ 
		io.stdout.write(string.format("%s     ",result_c.array[(r-1)*col+c]));
	}
	io.print("");
}

//释放为记录集分配的内存，如果返回了空记录集并不会发生错误
sqlite.table.free(result);

sqlite.exec(dbConnection,"drop table film")

execute("pause") //按任意键继续
io.close();//关闭控制台
