~ubuntu-branches/ubuntu/feisty/digikam/feisty

« back to all changes in this revision

Viewing changes to digikam/sqlite/copy.c

  • Committer: Bazaar Package Importer
  • Author(s): Achim Bohnet
  • Date: 2005-03-10 02:39:02 UTC
  • mfrom: (1.2.1 upstream) (2.1.1 hoary)
  • Revision ID: james.westby@ubuntu.com-20050310023902-023nymfst5mg696c
Tags: 0.7.2-2
* debian/TODO: clean
* digikam manpage: better --detect-camera description

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
** 2003 April 6
 
3
**
 
4
** The author disclaims copyright to this source code.  In place of
 
5
** a legal notice, here is a blessing:
 
6
**
 
7
**    May you do good and not evil.
 
8
**    May you find forgiveness for yourself and forgive others.
 
9
**    May you share freely, never taking more than you give.
 
10
**
 
11
*************************************************************************
 
12
** This file contains code used to implement the COPY command.
 
13
**
 
14
** $Id: copy.c,v 1.1 2004/07/07 21:25:53 pahlibar Exp $
 
15
*/
 
16
#include "sqliteInt.h"
 
17
 
 
18
/*
 
19
** The COPY command is for compatibility with PostgreSQL and specificially
 
20
** for the ability to read the output of pg_dump.  The format is as
 
21
** follows:
 
22
**
 
23
**    COPY table FROM file [USING DELIMITERS string]
 
24
**
 
25
** "table" is an existing table name.  We will read lines of code from
 
26
** file to fill this table with data.  File might be "stdin".  The optional
 
27
** delimiter string identifies the field separators.  The default is a tab.
 
28
*/
 
29
void sqliteCopy(
 
30
  Parse *pParse,       /* The parser context */
 
31
  SrcList *pTableName, /* The name of the table into which we will insert */
 
32
  Token *pFilename,    /* The file from which to obtain information */
 
33
  Token *pDelimiter,   /* Use this as the field delimiter */
 
34
  int onError          /* What to do if a constraint fails */
 
35
){
 
36
  Table *pTab;
 
37
  int i;
 
38
  Vdbe *v;
 
39
  int addr, end;
 
40
  char *zFile = 0;
 
41
  const char *zDb;
 
42
  sqlite *db = pParse->db;
 
43
 
 
44
 
 
45
  if( sqlite_malloc_failed  ) goto copy_cleanup;
 
46
  assert( pTableName->nSrc==1 );
 
47
  pTab = sqliteSrcListLookup(pParse, pTableName);
 
48
  if( pTab==0 || sqliteIsReadOnly(pParse, pTab, 0) ) goto copy_cleanup;
 
49
  zFile = sqliteStrNDup(pFilename->z, pFilename->n);
 
50
  sqliteDequote(zFile);
 
51
  assert( pTab->iDb<db->nDb );
 
52
  zDb = db->aDb[pTab->iDb].zName;
 
53
  if( sqliteAuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb)
 
54
      || sqliteAuthCheck(pParse, SQLITE_COPY, pTab->zName, zFile, zDb) ){
 
55
    goto copy_cleanup;
 
56
  }
 
57
  v = sqliteGetVdbe(pParse);
 
58
  if( v ){
 
59
    sqliteBeginWriteOperation(pParse, 1, pTab->iDb);
 
60
    addr = sqliteVdbeOp3(v, OP_FileOpen, 0, 0, pFilename->z, pFilename->n);
 
61
    sqliteVdbeDequoteP3(v, addr);
 
62
    sqliteOpenTableAndIndices(pParse, pTab, 0);
 
63
    if( db->flags & SQLITE_CountRows ){
 
64
      sqliteVdbeAddOp(v, OP_Integer, 0, 0);  /* Initialize the row count */
 
65
    }
 
66
    end = sqliteVdbeMakeLabel(v);
 
67
    addr = sqliteVdbeAddOp(v, OP_FileRead, pTab->nCol, end);
 
68
    if( pDelimiter ){
 
69
      sqliteVdbeChangeP3(v, addr, pDelimiter->z, pDelimiter->n);
 
70
      sqliteVdbeDequoteP3(v, addr);
 
71
    }else{
 
72
      sqliteVdbeChangeP3(v, addr, "\t", 1);
 
73
    }
 
74
    if( pTab->iPKey>=0 ){
 
75
      sqliteVdbeAddOp(v, OP_FileColumn, pTab->iPKey, 0);
 
76
      sqliteVdbeAddOp(v, OP_MustBeInt, 0, 0);
 
77
    }else{
 
78
      sqliteVdbeAddOp(v, OP_NewRecno, 0, 0);
 
79
    }
 
80
    for(i=0; i<pTab->nCol; i++){
 
81
      if( i==pTab->iPKey ){
 
82
        /* The integer primary key column is filled with NULL since its
 
83
        ** value is always pulled from the record number */
 
84
        sqliteVdbeAddOp(v, OP_String, 0, 0);
 
85
      }else{
 
86
        sqliteVdbeAddOp(v, OP_FileColumn, i, 0);
 
87
      }
 
88
    }
 
89
    sqliteGenerateConstraintChecks(pParse, pTab, 0, 0, pTab->iPKey>=0, 
 
90
                                   0, onError, addr);
 
91
    sqliteCompleteInsertion(pParse, pTab, 0, 0, 0, 0, -1);
 
92
    if( (db->flags & SQLITE_CountRows)!=0 ){
 
93
      sqliteVdbeAddOp(v, OP_AddImm, 1, 0);  /* Increment row count */
 
94
    }
 
95
    sqliteVdbeAddOp(v, OP_Goto, 0, addr);
 
96
    sqliteVdbeResolveLabel(v, end);
 
97
    sqliteVdbeAddOp(v, OP_Noop, 0, 0);
 
98
    sqliteEndWriteOperation(pParse);
 
99
    if( db->flags & SQLITE_CountRows ){
 
100
      sqliteVdbeAddOp(v, OP_ColumnName, 0, 1);
 
101
      sqliteVdbeChangeP3(v, -1, "rows inserted", P3_STATIC);
 
102
      sqliteVdbeAddOp(v, OP_Callback, 1, 0);
 
103
    }
 
104
  }
 
105
  
 
106
copy_cleanup:
 
107
  sqliteSrcListDelete(pTableName);
 
108
  sqliteFree(zFile);
 
109
  return;
 
110
}